[참고 게시글]
[IT 교육/데이터 분석] - 데이터분석 | 완주율을 높이는 요인 | 적절한 타겟 설정 | 프로덕트 개선
>> 위 게시물과 이어지는 실습
0. 가설 설정
▶ 가설
위 [참고게시글]의 마지막 파트에서 구했던 {개강 주차 별-수강 주차}의 비율은
해당 개강 주차(개강일)의 첫 주차 대비 그 이후 모든 주차의 수강률이 어떤지 구해줬었음
(= 해당 주차 수강생 수 / 첫 주차 수강생 수)
그래서 왼쪽 그림과 같이 주차를 거듭할수록(시간이 갈수록) 수강률이 점차 떨어지는 히트맵이 나옴
하지만 이건 너무 당연한 결과를 보여주는 것에 불과함
따라서, 오른쪽 그림과 같이 직전 주차 대비 다음 주차 수강률이 어떤지 구해보고자 함
(= 해당 주차 수강생 수 / 직전 주차 수강생 수)
1. 분석할 데이터 가져오기
▶ 한글 깨짐 방지 코드
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
▶ 라이브러리 가져오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
▶ [참고게시글]의 '가설3' 내용 코드 가져오기
: 여기에서 무엇을 추가해야 직전 주차 대비 해당 주차 수강생 비율을 구할 수 있을까?
sparta_data = pd.read_table('/content/cohort_data.csv',sep=',')
#spart_data.info()
# 'created_at 데이터를 문자->날짜 데이터로 변경하기
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format=format,infer_datetime_format=True)
# 수강 시작 주 구하기
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()
# set() 함수로 고유한 요소 가리기
category_range = set(sparta_data['start_week'])
# 범주화할 데이터 리스트로 만들기
progress_rate = list(sparta_data['progress_rate'])
# bins = 진도율 리스트(0주차 수강 시 생성되는 진도율 -> 0 ~ 4.11% ,, 이런 식)
bins = [0, 4.11, 26.03, 41.10, 61.64, 80.82, 100]
# 구분한 범주의 라벨
labels=[0,1,2,3,4,5]
# 범주화에 사용하는 함수 pd.cut
cuts = pd.cut(progress_rate, bins, right=True, include_lowest=True, labels=labels)
# 결과물을 테이블로 변경하기
cuts = pd.DataFrame(cuts)
# concat() 함수로 sparta_data 테이블 + cuts 테이블 병합
sparta_data = pd.concat([sparta_data, cuts], axis=1, join='inner')
# 컬럼 이름 작성(바꾸고 싶은 컬럼 뿐만 아니라 모든 컬럼 이름 다 적어줘야 함)
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
# 기존의 테이블을, start_week와, week로 묶어줍니다!
grouping = sparta_data.groupby(['start_week','week'])
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
# 첫 주 = 31, 수강 시작 주 범위는 {31,32,33,34,35,36}
# 총 5주차 수업임
f=31
for i in range(6):
for j in range(5, 0, -1):
cohort_data.at[(f,j-1), 'user_id'] = int(cohort_data.at[(f,j),'user_id']) + int(cohort_data.at[(f,j-1),'user_id'])
f=f+1
# cohort_data 인덱스 설정하기
cohort_data = cohort_data.reset_index()
# 피벗테이블 만들기
cohort_counts = cohort_data.pivot(index="start_week",
columns="week",
values="user_id")
# 수강 첫 주 총 인원 구하기
# 앞서 만든 피벗 테이블을 retention 변수에 저장하기
retention = cohort_counts
# 각 주(week) 별 최초 수강생 수만 가져오기 (나눠줄때, 분모가 되는 부분!)
cohort_sizes = cohort_counts.iloc[:,0] # iloc(모든행, 0번째 열)
# 최초 수강생 수를 각 데이터에 나눠주기
retention = cohort_counts.divide(cohort_sizes, axis=0)
#각 수치 퍼센트로 변경하기
retention.round(3)*100
>> 최초 수강생 대비 해당 주차 별 현재 잔존하고 있는 수강생의 비율(퍼센트)
2. 데이터 분석하기 (상단 코드 뒤에 추가될 부분)
▶ 직전 주차 대비 해당 수강생 비율 구하기
: 주차 별 수강 전환율 구하기
: 이미 퍼센트는 위에서 구해놨으니 바로 각 주차 별 전환율을 직전 주차 전환율로 나누면 됨
: 현재 잔존하고 있는 수강생은 직전 주차에 비해 몇 퍼센트인지 구하는 것
w=31
for i in range(6):
for j in range(5, 1, -1):
retention.at[(w,j)] = retention.at[(w,j)]/retention.at[(w,j-1)]
w=w+1
retention
3. 데이터 시각화하기
▶ 분석한 데이터 시각화하기
#주차별 수강 전환율 히트맵
plt.figure(figsize = (10,8))
sns.heatmap(data = retention,
annot = True,
fmt = '.0%',
vmin = 0,
vmax = 1,
cmap = "BuGn")
plt.title('개강일별 주차 간 전환율', fontsize=20)
plt.xlabel('주차', fontsize=14,labelpad=30)
plt.ylabel('개강일', fontsize=14,rotation=360,labelpad=30)
plt.yticks(rotation=360)
plt.show()
5. 최종 결론
▶ 결론
[참고 게시글] 가설을 참고해보면
32주차 개강반의 3주차 강의 교안이 바뀐 것 때문에 4주차부터 수강생 수가 줄었다고 생각해서 이런 분석을 실시하게 됨.
그런데 위의 결과를 살펴보니 32주차 개강반의 4주차 수강생 수만 줄었지 그 이후의 32주차부터 36주차 개강반의 4주차 수강생의 수는 오히려 더 많았음.
즉, 3주차 강의 교안이 바뀐 것은 수강생 비율과 관련이 없기 때문에 그대로 두고 사용해도 됨.
'데이터분석 과정 > 데이터 분석' 카테고리의 다른 글
데이터 리터러시 | 문제정의의 중요성 | 문제정의 방법론 | 문제정의 핵심, 팁 (1) | 2024.01.23 |
---|---|
데이터 리터러시 | 데이터분석가의 필수 역량_데이터 리터러시란? (2) | 2024.01.23 |
데이터분석 실습 | 할인율이 높을수록 결제전환율이 올라갈까? (1) | 2024.01.22 |
데이터분석 실습 | 최적의 즉문즉답 시간대 찾기 (0) | 2024.01.21 |
데이터분석 실습 | 당뇨병에 가장 영향을 미치는 요인은 무엇일까? (0) | 2024.01.21 |
댓글