- 코호트 : 소비자를 시간의 흐름과 사용하는 서비스의 단계 등으로 나누어 같은 성질의 집단으로 구분한 것
- 코호트 분석 : 동일한 기간동안 동일한 특성을 가진 사람들을 모아 분석하는 일종의 행동 분석 방법
- 코호트 차트 : 소비자의 전환율을 시간의 흐름 / 서비스 단계나 재사용 등 두가지 요인을 복합적으로 보여줄 수 있는 차트
1) 8월 2주 차 개강반부터 새로 제작된 3주차 콘텐츠를 듣기 시작하였음
8월 둘째 주 부터 변경된 3주 차 강의의 완주율이 현저히 떨어졌을 것이다
cohort = pd.read_csv("cohort_data.csv")
cohort.head()
- user_id : 수강생 고유 id
- created_at : 수강 등록 시점
- name : 수강생 이름
- progress_rate : 진도율
cohort.info()
cohort['created_at'] = pd.to_datetime(cohort['created_at'])
cohort.info()
.dt.isocalendar().week : 날짜를 주(week)로 변경
cohort['start_week']= cohort['created_at'].dt.isocalendar().week
cohort.tail()
0주차 : 0 ~4 .11%
1주차 : 4.12% ~ 26.03%
2주차 : 26.04% ~ 41.10%
3주차 : 41.11% ~ 61.64%
4주차 : 61.65% ~ 80.82%
5주차 : 80.83% ~ 100%
progress_rate = list(cohort['progress_rate'])
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
cohort['week'] = cuts
cohort.head()
group = cohort.groupby(['start_week','week'])
cohort_data = group['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head()
f=31 # 첫번째 주차
for i in range(6): # 처음 수강 시작한 주의 범위가 {31,32,33,34,35,36}의 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.head()
cohort_data = cohort_data.reset_index()
cohort_counts = cohort_data.pivot(index = 'start_week',columns = 'week',
values = 'user_id')
cohort_counts
retention = cohort_counts
cohort_sizes = cohort_counts.iloc[:,0]
# 최초 수강생의 수로 나눠 각 주당 수강생 수강율 표현
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention.round(3)*100
plt.figure(figsize=(10,8))
sns.heatmap(data=retention,
annot=True,
fmt='.0%',
vmin=0,
vmax=1,
cmap="BuGn")
plt.xlabel('주차', fontsize=14,labelpad=30)
plt.ylabel('개강일', fontsize=14,rotation=360,labelpad=30)
plt.yticks(rotation=360)
plt.show()
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