Data/[스파르타 내일배움캠프]
[TIL]본캠프 43일차(심화 프로젝트 2일차)
MIN_JOON
2024. 6. 18. 21:03
- 파이썬을 이용한 RFM 분석
- Recency: 얼마나 최근에 구매를 했는가
- Frequency: 얼마나 자주 구매를 했는가
- Monetary: 총 얼마를 구매했는가
#RFM 계산
snapshot_date = main_data['order_purchase_timestamp'].max() + dt.timedelta(days=1)
rfm = main_data.groupby('customer_id',as_index=False).agg({'order_purchase_timestamp': lambda x: (snapshot_date - x.max()).days,
'order_id': 'count',
'price': 'sum'})
rfm = rfm.rename(columns={'order_purchase_timestamp': 'recency',
'order_id': 'frequency',
'price': 'monetary'})
- RFM 시각화
- frequency와 monetary에서 데이터가 한 쪽으로 몰려있는 왜도를 보임
- 추후 log_scale 변환을 통해서 왜도 문제를 해소할 필요가 보임
log 변환 이후 - log 변환 이후 monetary의 왜도문제는 해소됐지만 frequency와 recency의 왜도는 해결되지 않음
- 다른 해결 방식을 통해 접근할 필요가 보임
#RFM 시각화
fig, ax = plt.subplots(1,3,figsize=(15,5))
sns.distplot(rfm['frequency'] , ax=ax[0]);
sns.distplot(rfm['recency'] , ax=ax[1]);
sns.distplot(rfm['monetary'] , ax=ax[2]);
#RFM 시각화 (로그변환)
fig, ax = plt.subplots(1,3,figsize=(15,5))
sns.distplot(np.log(rfm['frequency']) , ax=ax[0]);
sns.distplot(np.log(rfm['recency']) , ax=ax[1]);
sns.distplot(np.log(rfm['monetary']) , ax=ax[2]);