데이터로그😎

[코호트 분석 1] 개념 & 실습 본문

통계

[코호트 분석 1] 개념 & 실습

지연v'_'v 2023. 12. 14. 13:32

# 코호트 분석이란?

  • 코호트(Cohort)는 같은 특색이나 행동 양식을 공유하는 집단을 의미한다. 따라서 코호트 분석은 같은 특색을 띄는 집단의 특징과 행동 패턴을 분석하는 것이다.
  • 비슷한 시기에 비슷한 경험을 한 그룹을 만들어서, 그 그룹의 특징과 행동을 분석하는 방법
  • 특정 기간이나 조건에서 어떤 그룹이 더 좋은 결과를 보이는지 알 수 있다.
  • 예) 온라인 판매 업체가 새로운 고객을 확보하기 위해 여러 마케팅 채널을 사용하고 있다고 가정해봅시다. 이 회사는 매월 새로 가입한 고객들을 기록하고, 이들을 등록한 날짜에 따라 다양한 코호트로 나눌 수 있습니다.
      • 코호트 형성: 예를 들어, 2022년 1월에 가입한 고객들, 2월에 가입한 고객들, 3월에 가입한 고객들 등과 같이 각각의 월을 기준으로 코호트를 형성합니다.
      • 지표 추적: 각 코호트의 고객들을 추적하여 다양한 마케팅 성과 지표를 기록합니다. 이 지표에는 이용자 유지율, 평균 주문액, 구매 빈도, 이탈률 등이 포함될 수 있습니다.
      • 분석 및 의사결정: 시간이 흐름에 따라 각 코호트의 지표를 비교하여 특정 기간 동안의 마케팅 전략이나 캠페인의 성과를 이해할 수 있습니다.
        • 이용자 유지율: 1월 가입 코호트 > 3월 가입 코호트
        • 1월에 시행된 마케팅 전략이 더 효과적이었을 가능성이 있음
      • 최적화: 코호트 분석을 기반으로 한 마케팅 전략의 성과를 분석하여, 성공적으로 수행된 전략을 강화하고 실패한 전략을 수정하는 등의 최적화 작업을 수행할 수 있습니다.

 

# 코호트 분석 실습

소비자의 구매 데이터를 바탕으로 코호트 분석을 해보자. 코호트 분석의 목표는 아래와 같다.

  • [목표1] 월별로 소비자들의 재구매율을 판단하여, 2~3달 이내에 가장 많이 이탈한 집단을 발견하기
    1. 코호트 형성: 월별 소비자
    2. 지표: 재구매율
      • 재구매율 = (재구매한 고객 수/ 이전에 구매한 전체 고객 수) * 100
        • 특정 기간 동안 얼마나 많은 고객이 다시 구매를 하는가?
        • 이전에 구매한 전체 고객 수: 해당 기간 전에 이미 최소 한 번 이상 구매를 한 전체 고객 수
        • 재구매한 고객 수: 특정 기간 동안 다시 구매를 한 고객의 수
    1.  
  • [목표2] 소비자 집단 별로 수익성을 판단하여, 어떤 집단의 재방문 및 재구매율을 촉진시켜야 하는지 선정하기
    1. 코호트 형성: 월별 소비자
    2. 지표: 수익성 (총 수익)

 

0. 데이터 로드

import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')


df = pd.read_excel('https://github.com/springcoil/marsmodelling/blob/master/relay-foods.xlsx?raw=true', 
                 sheet_name='Purchase Data - Full Study')

 

1. 데이터 확인

  • 컬럼
    • OrderId: 주문 번호
    • OrderDate: 주문 일자
    • UserId: 사용자 ID
    • TotalCharges: 주문 비용
    • CommonId, PupId, PickupDate: 사용X

 

 

 

2. 데이터 전처리

# 필요없는 컬럼 삭제하기
df = df.drop(['CommonId','PupId', 'PickupDate'],axis=1)
df.columns

# 구매주기를 월별로 계산할 수 있도록, OrderDate컬럼을 '년-월' 형식으로 변경하기
df['OrderCycle'] = df['OrderDate'].dt.strftime('%Y-%m')
df

 

 

 

3. 코호트 분석에 필요한 변수 생성하기

필요한 변수 : 1) 첫 구매일자 

# 유저별로 가장 오래된 구매일 계산 
first_order = df.groupby(['UserId']).min().OrderCycle
first_order.name = 'first_order'

# first_order를 기존 df에 붙이기
df = pd.merge(df, first_order, left_on='UserId', right_on=first_order.index, how='left')
df

 

 

 

4. 월별로 구매 고객 데이터 치환하기

4-1. 주기별 구매한 User 수 계산

아래 표 중에서 index 4를 해석해보자면, 2009-01월에 첫 주문을 하고 2009-05년에도 주문을 한 user는 총 10명이다. 그럼 이들은 5개월 간 회원으로 유지된 것이다.

co1 = df.groupby(['first_order','OrderCycle']).UserId.nunique()
co1 = co1.reset_index()
co1.rename({'UserId':'TotalUsers'}, axis=1, inplace=True)
co1

 

 

4-2. 주기별 구매한 총 금액 계산

아래 표 중 index 4를 해석해보자. 2009-01월에 첫 구매를 하고 2009년 5월에도 구매를 한 User들의 총 구매액은 1575달러이다.

co2 = df.groupby(['first_order','OrderCycle']).TotalCharges.sum()
co2 = co2.reset_index()
co2.rename({'TotalCharges':'PurchaseAmnt'},axis=1, inplace=True)
co2

 

 

4-3. 데이터 병합 (4-1, 4-2 테이블 병합)

co = pd.merge(co1, co2, on=['first_order','OrderCycle'])
co.head()

 

 

5. 코호트 기간 계산 및 데이터 최종 완성

5-1. 코호트 기간 (CohortPeriod)  = 구매월 - 첫 구매

co_list=[]
for i in range(len(co)):
    f_first_order = pd.to_datetime(co.first_order[i]).to_period('M')
    f_order_cycle = pd.to_datetime(co.OrderCycle[i]).to_period('M')

    month_diff = (f_order_cycle-f_first_order).n
    co_list.append(month_diff)

co['CohortPeriod'] = co_list

 

 

 

5-2. 코호트 데이터 형태 최종 완성

[목표1]을 위해 재방문율 계산

  • unstack기능을 통해 CohortPeriod를 column으로 전환
  • 첫 구매일자와 코호트 기간에 따른 user 수
co_retention = co.set_index(['first_order','CohortPeriod'])
co_retention = co_retention.TotalUsers.unstack(1)
co_retention

 

co_retention

 

 

재방문율 = cohort period 별 유저 수/ cohort period가 0일때의 유저 수 (첫 구매일에 따른 유저 수)

retention = co_retention.div(co_retention[0], axis=0)
retention

 

retention

 

 

[목표2]를 위한 '총 구매액'

co_purchase = co.set_index(['first_order','CohortPeriod'])
co_purchase = co_purchase.PurchaseAmnt.unstack(1)
co_purchase

 

 

6. 코호트 분석 시각화

# 재방문율 시각화
plt.rcParams['figure.figsize']=(12,8)
sns.heatmap(retention, annot=True, fmt='.0%')
plt.show()


plt.rcParams['figure.figsize']=(20,12)
sns.heatmap(co_purchase, annot= True)
plt.yticks(rotation=360);

재방문

 

 

총 수익

 

7. 해석

[목표1] 월별로 소비자들의 재구매율을 판단하여, 2~3달 이내에 가장 많이 이탈한 집단을 발견하기

Cohort Period = 1을 기준으로 살펴보겠다. 2010년 02월에 첫 구매를 한 집단이 다음 달에 다시 구매할 확률은 불과 19%밖에 되지 않는다. 

retention[1].sort_values(ascending=True).head(5)

재구매율

 

 

 

[목표2] 소비자 집단 별로 수익성을 판단하여, 어떤 Group의 재방문 및 재구매율을 촉진시켜야 하는지 선정하기

총 수익을 기반으로 retention을 재고해야 할 집단을 선

### 목표2: 수익성 기반으로 Retention을 재고 해야할 집단 선정
co_purchase[0].sort_values(ascending=False).head(5)

 

총 수익

 

[최종 해석] 재구매율과 총 수익을 모두 살펴봤을 때, 아래의 집단들은  '재구매율 ↓ 총 수익 ↑' 이라는 특성을 띈다고 볼 수 있다. 즉, 해당 집단들의 구매력(수익성)은 높으나, 재방문율이 낮아 이탈률이 높다고 볼 수 있다. 따라서 이들의 이탈로 인해 장기적인 수익의 손실이 발생할 수 있다. 이를 방지하기 위해 2010-02월, 2009-11월, 2009-12월에 가입한 user들에게 뉴스레터, 푸시 알림 등을 활용해 이벤트 정보를 제공하거나, 쿠폰을 뿌려 다시 구매를 유도할 수도 있겠다. 

  • 2010-02월 첫 구매 고객
  • 2009-11월 첫 구매 고객
  • 2009-12월 첫 구매 고객

모든 내용은 아래 블로그를 참고했습니다.

 

[Python] COHORT 분석 개념부터 실전 코드까지 (feat. 분석 예제 포함)

이번 글에서는 Cohort분석을 통해서 고객들이 웹사이트/앱에 얼마나 재방문을 하는지 파악하는 방법을 알아보고자 한다. COHORT 분석의 기초 개념부터 시작하여, 실제 어떻게 코드로 구현할 수 있

data-marketing-bk.tistory.com

 

자세한 코드 정보는 아래 깃헙을 방문해주세요

https://github.com/JeeyeonKim00/TIL/blob/c9675b17f73f9329bb7851beb3e331758110976b/%ED%86%B5%EA%B3%84/01_COHORT%EB%B6%84%EC%84%9D.ipynb