[데이터 분석 실무] Cohort Analysis, 코호트 분석 Python

고객, 유저를 특정기준에 따라 그룹을 나눠 분석하는 코호트 분석을 정리합니다.

코호트 분석 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
    1. Acquisition Cohorts : 유저가 유입된 시점(Acqusition Period)를 기준
    2. 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

코호트 분석 예시

  1. Cohorts: 리뷰를 읽음 / 읽지않음 ⇒ "H0 : 리뷰를 읽은 사람이 더 conversion rate이 높을 것이다." ⇒ 가설검증
  2. 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');