0. 가설 설정하기
▶ 가설1 : 가장 적절한 고객관리 타이밍은?
강의 완주율 개선을 위한 고객관리 메시지를 보낼 최적의 시간대 찾기
- 온라인 강의를 수강생들이 가장 많이 혹은 가장 적게 듣는 요일과 시간 찾기
1. 분석할 데이터 가져오기
▶ 라이브러리 가져오기
import pandas as pd
▶ 스파르타 데이터 읽어오기
sparta_data = pd.read_table('/content/access_detail.csv', sep = ',')
sparta_data.head()
- lecture_id : 수강 강의 id
- access_date : 접속 시작 날짜 및 시간
- user_id : 유저 id
2. 데이터 전처리하기
우리가 필요한 데이터는 '요일'과 '시간' 데이터
access_date (처리 일자) 데이터에서 뽑아내기
2-1) access_date (처리 일자) 의 데이터타입을 문자(str) → 시간(time)으로 바꾸기
▶ access_date (처리 일자) 데이터 타입 확인하기
print(type(sparta_data['access_date'][0]))
▶ to.datetime() 함수로 (처리 일자) 를 '시간' 타입으로 바꾸기
- %Y: 연도
- %m: 월
- %d: 일
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format)
sparta_data.tail(5)
▶ access_date (처리 일자) 데이터 타입 다시 확인하기
print(type(sparta_data['access_date_time'][0]))
2-2) access_date_time (처리 일자 시간) 데이터로 요일 별 수강생 수 구하기
▶ dt.day_name() 함수로 요일 추출, dt.hour로 시간 추출하기
sparta_data['access_date_time_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data['access_date_time_hour'] = sparta_data['access_date_time'].dt.hour
sparta_data.tail(5)
3. 데이터 분석하기
3-1) 요일 별 수강생 수 구하기
▶ 요일 별로 그룹화해서 데이터 수 세주기
: groupby('컬럼명')을 사용하면 데이터를 특정 기준으로 그룹화해서 처리할 수 있음
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
weekdata
+ 여기에 agg('변수')를 이용하면 변수 안의 데이터 별 합계를 구할 수 있음
: weeks의 리스트에 따라 데이터들을 다시 한 번 재배열 할 수 있음
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = weekdata.agg(weeks)
weekdata
3-2) 시간 별 수강생 수 구하기
▶ 시간 별로 그룹화해서 데이터 수 세준 뒤 정렬하기
sort_index() 해당 데이터를 오름차순으로 정렬해주는 기능
sort_index(ascending=False) 해당 데이터를 내림차순으로 정렬해주는 기능
hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count()
hourdata = hourdata.sort_index(ascending = False)
hourdata
4. 데이터 시각화하기
▶ 라이브러리 가져오기
import matplotlib.pyplot as plt
import numpy as np
4-1) 그래프 그리기
▶ weekdata (요일 별 수강생 수) 데이터로 그래프 그리기
#그래프 사이즈
plt.figure(figsize=(10,5))
#그래프 x축 y축
plt.bar(weekdata.index, weekdata)
#그래프 명
plt.title('요일별 수강 완료 수강생 수')
#그래프 x축 레이블
plt.xlabel('요일')
#그래프 y축 레이블
plt.ylabel('수강생(명)')
#x축 레이블을 90도로 변환
plt.xticks(rotation=90)
#그래프 출력
plt.show()
>> 화요일, 일요일에 수강을 완료하는 인원이 제일 많음
>> 금요일, 수요일에 수강을 완료하는 인원이 제일 적음
▶ hourdata (시간 별 수강생 수) 데이터로 그래프 그리기
#그래프 사이즈 변경
plt.figure(figsize=(10,5))
#그래프 x축 y축
plt.plot(hourdata.index, hourdata)
#그래프 명
plt.title('시간별 수강 완료 사용자 수')
#그래프 x축 레이블
plt.xlabel('시간')
#그래프 y축 레이블
plt.ylabel('사용자(명)')
#x축 눈금 표시 하기
plt.xticks(np.arange(24))
#그래프 출력
plt.show()
>> 저녁 18시 경에 수강 완료 수가 제일 많았고, 밤 21시쯤에 감소하는 추세를 보임. 그리고 다시 오전 7시부터 수강 완료 수가 올라가는 추세를 보임.
▶ (참고) np.arange() 함수로 숫자 세기
print(np.arange(24))
4-2) 피벗테이블 그리기
▶ 피벗테이블 만들기
pd.pivot_table() 함수
#values : 열에 들어 가는 부분
#index : 행에 들어가는 부분
#aggfunc : 데이터 축약시 사용할 함수
sparta_data_pivot_table = pd.pivot_table(sparta_data, values='user_id',
index=['access_date_time_weekday'],
columns=['access_date_time_hour'],
aggfunc="count").agg(weeks)
sparta_data_pivot_table
4-3) 피벗테이블을 이용해 히트맵 그리기
#그래프 사이즈 변경
plt.figure(figsize=(14,5))
#pcolor를 이용하여 heatmap 그리기
plt.pcolor(sparta_data_pivot_table)
#히트맵에서의 x축 # np.arange(시작, 끝, 간격)
plt.xticks(np.arange(0.5, len(sparta_data_pivot_table.columns), 1), sparta_data_pivot_table.columns)
#히트맵에서의 y축
plt.yticks(np.arange(0.5, len(sparta_data_pivot_table.index), 1), sparta_data_pivot_table.index)
#그래프 명
plt.title('요일별 종료 시간 히트맵')
#그래프 x축 레이블
plt.xlabel('시간')
#그래프 y축 레이블
plt.ylabel('요일')
#plt.colorbar() 명령어를 추가하면 그래프 옆에 숫자별 색상값을 나타내는 컬러바를 보여 줍니다
plt.colorbar()
plt.show()
>> 요일별, 시간대 별로 살펴봐도 화요일 18시 경에 수강 완료자가 가장 많은 것을 알 수 있음
5. 최종 결론
▶ 결론1
강의 완주율이 가장 높은 요일은 화요일, 일요일 순이고, 강의 완주율이 가장 높은 시간대는 저녁 18시 경임.
반대로 강의 완주율이 가장 낮은 요일은 금요일, 수요일이었음. 강의 완주율은 밤 21시부터 떨어지다가 오전 7시부터는 다시 올라가는 추세를 보임.
요일 별, 시간대 별로 살펴보았을 때는 화요일 18시 경이 가장 강의 완주율이 높은 시간이라는 것을 알 수 있음.
따라서 강의 완주를 위한 독려 문자는 화요일과 일요일 저녁시간 쯤, 동기부여 문자는 금요일과 수요일 오전에 보내는 것이 좋겠다고 생각함.
0. 가설 설정하기
▶ 가설2 : 가장 수강을 많이 하는 지역 찾기
제품 수요가 많은 지역을 찾으면 광고를 더 효율적으로 집행할 수 있을 것 같음
- 수강 신청을 많이 하는 지역 살펴보기
- 지역별 수강생 수 구하기
1. 분석할 데이터 가져오기
▶ 라이브러리 가져오기
import pandas as pd
▶ 스파르타 데이터 읽어오기
sparta_data = pd.read_table('/content/students_area_detail.csv',sep=',')
- lecture_id : 수강 강의 id
- area : 접속지역
- latitude : 해당 지역 위도
- longtitude : 해당 지역 경도
- user_id : 유저 id
2. 데이터 전처리하기
▶ area (지역) 데이터 목록 확인하기
: set()으로 중복값이 없는 데이터 목록 살펴보기
category_range = set(sparta_data['area'])
print(category_range, len(category_range))
3. 데이터 분석하기
3-1) 지역 별 위도, 경도 표 만들기
▶ 지역 정보로만 이루어진 새로운 테이블 만들기
: 필요한 데이터(접속지역, 해당 지역 위도, 해당 지역 경도)로 이루어진 새 테이블 만들기
area_info = sparta_data[['area','latitude','longitude']]
▶ 중복 지역이름 삭제하기
: drop_duplicates('컬럼명')으로 area(지역) 컬럼의 중복 데이터 처리
area_info=area_info.drop_duplicates(['area'])
▶ .sort_values() 함수로 정렬하기
: by = area (지역) 데이터 기준으로 정렬
: ascending = True 오름차순 정렬
area_info = area_info.sort_values(by=["area"], ascending=[True]) # False면 내림차순
▶ .reset_index() 함수로 인덱스 정리해주기
area_info = area_info.reset_index()
3-2) 지역별 수강생 수 구하기
▶ .groupby() 함수 + 집계함수 콜라보
: area (지역) 데이터로 묶은 뒤
: user_id (사용자 아이디) 데이터를 .count() 하기
number_of_students = pd.DataFrame(sparta_data.groupby('area')['user_id'].count())
3-3) [지역별 위도, 경도 표]와 [지역별 수강생 수 표] 합치기
▶ .merge() 함수로 [3-1]표와 [3-2]표 합치기
result = pd.merge(area_info, number_of_students, on="area")
4. 데이터 시각화하기
▶ 라이브러리 가져오기
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지
4-1) 지역별 수강생 수 그래프 그리기
#그래프 사이즈 변경
plt.figure(figsize=(10,5))
#그래프 x축 y축
plt.plot(result['area'], result['user_id'])
#그래프 명
plt.title('지역별 사용자 수')
#그래프 x축 레이블
plt.xlabel('지역')
#그래프 y축 레이블
plt.ylabel('사용자(명)')
#x축 눈금 수
plt.xticks(np.arange(13))
#그래프 출력
plt.show()
>> 서울 지역의 수강생 수가 제일 많고, 그 다음은 대전, 부산 지역 순으로 수강생이 분포되어 있음
※ 한글 폰트가 깨질 경우 사용
# 코드 실행 후 [런타임_재시작] 하기
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
# plt.rc('font', family='NanumBarunGothic')
4-2) 지역별 수강생 수 지도에 표시하기
▶ 라이브러리 가져오기
- 폴리움(Folium): 분석한 데이터의 결과를 지도에 그려주는 라이브러리
- 마커 클러스터(MarkerCluster): 가까운 거리의 marker들을 군집시켜, 해당 건수를 표현해줌
import folium
from folium.plugins import MarkerCluster
▶ 대한민국 위도, 경도 설정하기
m = folium.Map(location=[37.5536067,126.9674308],
zoom_start=8)
▶ result 데이터를 반복문으로 읽어서 지도에 찍기
: 12개 지역의 위도, 경도와 해당 지역의 수강생 수를 반복문으로 마킹해주기
for n in result.index:
radius = result.loc[n,'user_id']
# loc[n, "열 이름"] >> loc[]로 n번째 열 조회 가능
# 즉, n번째의 user_id 수를 가져 오는 것
folium.CircleMarker([result['latitude'][n],result['longitude'][n]],
radius = radius/50, fill=True).add_to(m)
#.add_to(m)로 지정해 두었던 우리나라 지도 가져오기
5. 최종 결론
▶ 결론2
서울 지역의 수강생 수가 제일 많고, 대전, 부산 순으로 수강생 수가 많음
서울 지역을 중심으로 수강생 수가 많은 지역을 중심으로 광고비를 더 집중해도 좋겠다고 생각함
'데이터분석 과정 > 데이터 분석' 카테고리의 다른 글
데이터분석 | 완주율을 높이는 요인 | 적절한 타겟 설정 | 프로덕트 개선 (1) | 2024.01.15 |
---|---|
데이터분석 | 광고 효율이 나지 않는 매체 찾기 | 패키지 상품 기획하기 (0) | 2024.01.15 |
데이터분석 | 타이타닉 생존자의 비밀 파헤치기 | 생존율과 가장 관련이 깊은 요인은? (1) | 2024.01.15 |
데이터분석 5주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2023.02.15 |
데이터분석 4주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2023.02.13 |
댓글