RFM?
Recency(얼마나 최근에 구매했는가), Frequency(얼마나 자주 구매했는가), Monetary(얼마나 소비했는가)를 바탕으로 고객을 여러 segment로 분류하는 세그먼테이션 기법
EDA에서 파악한 고객 특성을 기반으로 R,F,M 각각의 기준 수립
처음에는 Recency와 Monetary는 2단계, Frequency는 3단계로 설정했지만,
보다 구체적인 분류를 위해 세 지표 모두 3단계로 구분
1 : 최근 3개월 내 구매
2 : 최근 1년 내 구매
3 : 최근 1년 구매 없음
1 : 9회 이상 구매
2 : 2~8회 구매
3 : 1회 구매
1 : 총 구매금액 상위 10%
2 : 총 구매금액 평균~상위 10% 미만
3 : 총 구매금액 평균 미만
import pandas as pd
import numpy as np
from datetime import datetime
from dateutil.relativedelta import relativedelta
# Recency 구하기(날짜 형태)
df1 = df[['customer_id', 't_dat']]
df1 = df1.groupby('customer_id').max()
df1 = df1.reset_index()
# 연도, 분기 생성
df1['t_dat'] = pd.to_datetime(df1['t_dat'], yearfirst=True)
df1['year']= df1['t_dat'].dt.year
df1['quarter'] = df1['t_dat'].dt.quarter
# Recency column 생성
df1['recency'] = 3
df1.loc[df1['t_dat'] >= (max(df2['t_dat']) - relativedelta(years=1)), 'recency'] = 2
df1.loc[(df1['year']==2020)&(df1['quarter']==3), 'recency'] = 1
df['frequency'] = 2
df.loc[df['nop'] == 1, 'frequency'] = 3
df.loc[df['nop'] > 8, 'frequency'] = 1
# Monetary 구하기
df2 = df[['customer_id']]
df2['sales_total'] = df['quantity']*df1['actual_price']
df3 = df2.groupby('customer_id')['sales_total'].sum().reset_index()
# Monetary 평균 및 상위 10%값 구하기
m_avg = np.mean(sum(df4['sales_total'])/(df4['customer_id'].count()))
print(a)
m_10per = df4['sales_total'].quantile(0.9)
print(b)
# Monetary column 생성
df2['monetary'] = 3
df2.loc[(df2['sales_total'] > m_avg) & (df2['sales_total'] < m_10per), 'monetary'] = 2
df2.loc[df2['sales_total'] >= m_10per, 'monetary'] = 1
3*3*3 총 27개의 세그먼트가 생성되었다! 이제 집단별 특징을 파악하고 묶어 이름을 붙여줄 일이 남았다