RFM 분석

XTHK·2025년 3월 20일

Anaysis

목록 보기
7/23
  • R : Recency
  • F : Frequency
  • M : Monetary
  • 최근성 / 빈도 / 금액을 기준으로 고객을 분류

최근성 (Recency)

  • 얼마나 최근에 주문했는가
  • 즉 일수가 작을 수록 좋음 (최근에 주문했다는 뜻이므로, 애용하는 고객)
  • '가장 최근의 주문일자(기준일) - 개별 주문일자'
df1['Recency'] = max(df1['주문일자_dt']) - df1['주문일자_dt']
p_r = df1.pivot_table(index = '주문자ID', values = 'Recency',
                      aggfunc = 'min').reset_index()
p_r['Recency_int'] = p_r['Recency'].apply(func1) # 일수만 가져오기

빈도 (Frequency)

  • 얼마나 많이(자주) 주문하는가
  • 수가 클수록 좋음 (많이 구매했다는 뜻)
df1['Frequency'] = 1 # 기본값 설정
p_f['Frequency'] = df1.pivot_table(index='주문자ID', 					values='Frequency', aggfunc='sum'].reset_index()

금액 (Moneytary)

  • 얼마나 많이 주문하는가 (돈을 많이 썼는가)
  • 수가 클수록 좋음
p_m = df1.pivot_table(index='주문자ID', values='상품주문금액', aggfunc='sum').reset_index()
p_m.rename(columns={'상품주문금액':'Monetary'}, inplace=True)

RFM 병합

m1 = pd.concat(p_r, p_f, on='주문자ID', how='inner')
m2 = pd.concat(m1, p_m, on='주문자ID', how='inner')

RFM 계산

  • 계산식 : -0.4 R + 0.3 F + 0.3 M
m2['total'] = (-0.4 * m2['Recency_int']) + (0.3*m2['Frequency']) + (0.3*m2['Monetary'])
  • 로그형식 숫자 바꾸기
pd.options.display.float_format = '{:.2f}'.format

고객 등급 분류

# 비율 별로 고객 등급화
cond1 = m2['total'] > m2['total'].quantile(0.9)
cond2 = m2['total'] > m2['total'].quantile(0.7)
cond3 = m2['total'] > m2['total'].quantile(0.5)

m2['rank'] = 'D'
m2.loc[cond3, 'rank'] = 'C'
m2.loc[cond2, 'rank'] = 'B'
m2.loc[cond1, 'rank'] = 'A'
  • quantile() : 비율
    • ()안에 들어가는 수 : 상위 n%
      • ...quantile(0.9) : 상위 90%

      • ...quantile(0.7) : 상위 70%

      • ...quantile(0.5) : 상위 50%

profile
Analyse the world

0개의 댓글