[TIL] RFM - Segmentation (2024-08-05)

SHU·2024년 8월 9일
0

H&M 데이터 분석

목록 보기
6/8

RFM?

Recency(얼마나 최근에 구매했는가), Frequency(얼마나 자주 구매했는가), Monetary(얼마나 소비했는가)를 바탕으로 고객을 여러 segment로 분류하는 세그먼테이션 기법

RFM 기준 정하기

EDA에서 파악한 고객 특성을 기반으로 R,F,M 각각의 기준 수립
처음에는 Recency와 Monetary는 2단계, Frequency는 3단계로 설정했지만,
보다 구체적인 분류를 위해 세 지표 모두 3단계로 구분

Recency

1 : 최근 3개월 내 구매
2 : 최근 1년 내 구매
3 : 최근 1년 구매 없음

  • 전체 고객의 평균 구매 주기가 89일로 약 3개월이었으므로, 3개월 이내 구매자에 1순위 부여
  • 3개월 주기로 재구매가 이루어진다고 가정했을 때, 1년 이내 방문은 이탈 고객으로 보기 어렵다는 판단에 의해 2순위 부여
  • 1년 이내 재구매 없는 경우 이탈로 간주, 3순위 부여

Frequency

1 : 9회 이상 구매
2 : 2~8회 구매
3 : 1회 구매

  • 전체 기간 2년 중 3개월 주기로 매번 재구매한다면 8번 구매 가능. 8회를 초과하여 구매했다면 재구매 빈도가 매우 높다 간주하여 1순위 부여
  • 1회만 구매한 고객에 3순위 부여하여 재구매가 있는 고객(2순위)과 구분

Monetary

1 : 총 구매금액 상위 10%
2 : 총 구매금액 평균~상위 10% 미만
3 : 총 구매금액 평균 미만

  • 고객별 총 구매금액의 Box plot을 그려보니, 윗 수염을 벗어난 고객들의 수 또한 상당하여 상위 10%를 별도로 1순위 부여
  • 평균 이상 소비한 고객에 2순위, 그 아래 고객에 3순위 부여

RFM with Python

Recency

  • Recency의 경우 데이터가 분기 단위로 나누어 떨어졌기 때문에 분기를 기준으로 구함
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

Frequency

  • 기존에 구해두었던 nop를 활용하여 산출
df['frequency'] = 2
df.loc[df['nop'] == 1, 'frequency'] = 3
df.loc[df['nop'] > 8, 'frequency'] = 1

Monetary

# 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개의 세그먼트가 생성되었다! 이제 집단별 특징을 파악하고 묶어 이름을 붙여줄 일이 남았다

profile
슈의 코드뜨개질

0개의 댓글