고객, 유저를 특정기준에 따라 그룹을 나눠 분석하는 코호트 분석을 정리합니다.
코호트 분석 Cohort Analysis
코호트 분석은 유저를 특정 기준에 따라 related group, cohort
그룹으로 나눠 분석하는 기법이다.
- 목적 : 코호트별 리텐션, best time to re-engage with users, the point they are churning** 파악 등
- 특정 기준 how to break the group of users into cohorts
- Acquisition Cohorts : 유저가 유입된 시점(Acqusition Period)를 기준
- Behavioral Cohorts : 특정 기간에 유저행동(events/actions)을 기준
- The behaviors they have/haven't taken in the app within a given time period
- Discrete actions : App install, launch, uninstall, transaction/charged
- Combination of actions ex. Within first 3 days of app use
코호트 분석 예시
- Cohorts: 리뷰를 읽음 / 읽지않음 ⇒ "H0 : 리뷰를 읽은 사람이 더 conversion rate이 높을 것이다." ⇒ 가설검증
- Cohorts: 구매함 / 하지않음(abondoned a cart) ⇒ "H0 : 리뷰를 읽은 사람이 더 Retention Rate이 높을 것이다." ⇒ 가설검증
리뷰를 읽거나 구매하는 행동을 기준Behavioral Cohorts
으로 유저를 나눠 가설 설정, 비교 지표 설정 후 검증한다.
코호트 분석 시각화
첫 구매월기준 Cohort별 리텐션 분석 시각화
df_retention = df.sort_values(['user_id','date']).reset_index(drop=True).copy()
# 2020년 첫 구매일자
df_retention_first= pd.DataFrame(df_retention.groupby('user_id')['date'].min()).reset_index()
df_retention_first.columns=['user_id','first']
# 첫구매일자정보 추가
df_retention = df_retention.merge(df_retention_first, on='user_id', how='left')
df_retention['isrepeated'] = np.where(df_retention['date'] != df_retention['first'],1,0)
df_retention['first']= pd.to_datetime(df_retention['first'])
# cohort_month : 첫 구매 월
df_retention['cohort_month'] = df_retention['first'].dt.month
# count_month : 구매 월
df_retention['date']= pd.to_datetime(df_retention['date'])
df_retention['count_month']=df_retention['date'].dt.month
# roll up data by cohort group(첫구매월) & count_month(구매월)
# 결제 횟수 count > sum
df_retention_cohorts = df_retention.groupby(['cohort_month', 'count_month']).agg({'user_id': pd.Series.nunique,'count': np.sum})
df_retention_cohorts = df_retention_cohorts.rename(columns={'user_id': 'total_users', 'count':'total_counts'})
# 첫 구매월 이후 기간 생성 1~12
def cohort_period(df):
df['cohort_period'] = np.arange(len(df)) + 1
return df
df_retention_cohorts = df_retention_cohorts.groupby(level=0).apply(cohort_period)
df_retention_cohorts.reset_index(inplace=True)
df_retention_cohorts.set_index(['cohort_month', 'cohort_period'], inplace=True)
# cohort group별 user수 (size) > pct 계산을 위해
cohort_group_size = df_retention_cohorts['total_users'].groupby(level=0).first()
df_retention_cohorts_pct = df_retention_cohorts['total_users'].unstack(0).divide(cohort_group_size, axis=1)
sns.set(style='white')
colormap = plt.cm.PuBu
plt.figure(figsize=(12, 8))
plt.title('Cohorts: User Retention')
sns.heatmap(df_retention_cohorts_pct.T,
mask=df_retention_cohorts_pct.T.isnull(),
annot=True, fmt='.0%', cmap='YlGnBu');
# 시작월 제외
sns.set(style='white')
colormap = plt.cm.PuBu plt.figure(figsize=(12, 8))
plt.title('Cohorts: User Retention')
sns.heatmap(df_retention_cohorts_pct.T.iloc[0:11,1:11],
mask=df_retention_cohorts_pct.T.iloc[0:11,1:11].isnull(),
annot=True, fmt='.0%', cmap='YlGnBu');
'Data Science > Product analytics' 카테고리의 다른 글
[Paper Review] 링크드인 사례 - Detecting interference: An A/B test of A/B tests (0) | 2021.08.11 |
---|---|
[데이터분석 실무] 로그 분석 (0) | 2021.07.17 |
[데이터 분석 실무] 고객 리텐션 분석 (Spark SQL) (0) | 2021.04.02 |
[ 데이터 분석 실무 ] A/B Testing (0) | 2021.03.26 |
[데이터 분석 실무] 웹 퍼널 분석 (Bounce Rate, Conversion Rate) - MySQL (0) | 2021.03.26 |