본문 바로가기
Data/[스파르타 내일배움캠프]

[TIL]본캠프 43일차(심화 프로젝트 2일차)

by MIN_JOON 2024. 6. 18.
  • 파이썬을 이용한 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 시각화

log 변환 이전

  • 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]);