데이터로그😎
[코호트 분석 1] 개념 & 실습 본문
# 코호트 분석이란?
- 코호트(Cohort)는 같은 특색이나 행동 양식을 공유하는 집단을 의미한다. 따라서 코호트 분석은 같은 특색을 띄는 집단의 특징과 행동 패턴을 분석하는 것이다.
- 비슷한 시기에 비슷한 경험을 한 그룹을 만들어서, 그 그룹의 특징과 행동을 분석하는 방법
- 특정 기간이나 조건에서 어떤 그룹이 더 좋은 결과를 보이는지 알 수 있다.
- 예) 온라인 판매 업체가 새로운 고객을 확보하기 위해 여러 마케팅 채널을 사용하고 있다고 가정해봅시다. 이 회사는 매월 새로 가입한 고객들을 기록하고, 이들을 등록한 날짜에 따라 다양한 코호트로 나눌 수 있습니다.
-
- 코호트 형성: 예를 들어, 2022년 1월에 가입한 고객들, 2월에 가입한 고객들, 3월에 가입한 고객들 등과 같이 각각의 월을 기준으로 코호트를 형성합니다.
- 지표 추적: 각 코호트의 고객들을 추적하여 다양한 마케팅 성과 지표를 기록합니다. 이 지표에는 이용자 유지율, 평균 주문액, 구매 빈도, 이탈률 등이 포함될 수 있습니다.
- 분석 및 의사결정: 시간이 흐름에 따라 각 코호트의 지표를 비교하여 특정 기간 동안의 마케팅 전략이나 캠페인의 성과를 이해할 수 있습니다.
- 이용자 유지율: 1월 가입 코호트 > 3월 가입 코호트
- 1월에 시행된 마케팅 전략이 더 효과적이었을 가능성이 있음
- 최적화: 코호트 분석을 기반으로 한 마케팅 전략의 성과를 분석하여, 성공적으로 수행된 전략을 강화하고 실패한 전략을 수정하는 등의 최적화 작업을 수행할 수 있습니다.
-
# 코호트 분석 실습
소비자의 구매 데이터를 바탕으로 코호트 분석을 해보자. 코호트 분석의 목표는 아래와 같다.
- [목표1] 월별로 소비자들의 재구매율을 판단하여, 2~3달 이내에 가장 많이 이탈한 집단을 발견하기
- 코호트 형성: 월별 소비자
- 지표: 재구매율
- 재구매율 = (재구매한 고객 수/ 이전에 구매한 전체 고객 수) * 100
- 특정 기간 동안 얼마나 많은 고객이 다시 구매를 하는가?
- 이전에 구매한 전체 고객 수: 해당 기간 전에 이미 최소 한 번 이상 구매를 한 전체 고객 수
- 재구매한 고객 수: 특정 기간 동안 다시 구매를 한 고객의 수
- 재구매율 = (재구매한 고객 수/ 이전에 구매한 전체 고객 수) * 100
-
- [목표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
재방문율 = cohort period 별 유저 수/ cohort period가 0일때의 유저 수 (첫 구매일에 따른 유저 수)
retention = co_retention.div(co_retention[0], axis=0)
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월 첫 구매 고객
모든 내용은 아래 블로그를 참고했습니다.
자세한 코드 정보는 아래 깃헙을 방문해주세요