본문 바로가기
AI SCHOOL/TIL

[DAY 48] RFM - 과거 내역을 통해 고객의 미래 가치를 추출하는 분석 방법

2023. 3. 6.

고객의 과거 데이터를 통해 미래 가치를 추출하고 계산하며 고객을 분류할 수 있는 간단하고 유용한 방법인 RFM에 대해 공부했다.

분석 과정을 통해 데이터를 의미 있는 정보로 전환하여 마케팅에 가장 많이 사용되고 있다.

RFM

RFM은 고객의 가치를 아래 세 가지 기준에 근거해 계산한다.
1. Recency : 거래의 최근성
- 고객이 얼마나 최근에 구입했는가?
2. Frequency : 거래 빈도
- 고객이 얼마나 빈번하게 구입했는가?
3. Monetary : 거래 규모
- 고객이 구입한 총 금액은 어느 정도인가?

RFM의 개념을 익힌 후 이를 적용해 데이터를 분석했다.

데이터 준비

영국 온라인 소매점 거래 데이터셋을 이용했다.

raw = pd.read_csv('online_retail.csv')
raw.shape

# 실행 결과
(541909, 8)


541909행의 데이터 중 유효하지 않은 데이터는 사용하지 않는다.

raw_valid = raw.loc[(raw['CustomerID'].notnull()) & (raw['Quantity'] > 0) & (raw['UnitPrice'] > 0)].copy()
raw_valid

고객ID가 NULL이 아니고, 수량과 가격이 0보다 큰 구매 건만 남기도록했다.

valid

 

raw_valid["TotalPrice"] = raw_valid['Quantity'] * raw_valid['UnitPrice']
df = raw_valid.drop_duplicates().copy()
df

거래 한 건에 대한 구매 금액 TotalPrice를 계산하고, 중복 데이터를 제거하여 df에 대입하였다.

total

RFM을 적용하여 활용할 데이터프레임이 준비되었다.

RFM 계산

거래 데이터를 통해 CustomerID를 기준으로 groupby하여 고객별 RFM 값을 구했다.

rfm

Recency : 전체 최근 거래 기준일 - 고객별 최근 거래 날짜
Frequency : 총 구매 빈도수
MonetaryValue :  총 구매 금액

RFM 모형
RFM의 요인을 각각 등간격으로 5등분하여 분류하는 방법인 Scoring 기법을 사용한다.

pandas의 qcut을 이용하여 R, F, M 변수를 만들 것이다.
cut과 qcut의 차이는 다음과 같다.

qcut
출처 : http://rfriend.tistory.com

cut()은 히스토그램의 bins와 같이 같은 길이로 구간을 나눈다.
- 예시) 절대평가 - 점수로 학점을 분류
qcut()은 같은 개수로 구간을 나누며 길이가 다를 수 있다
- 예시) 상대평가 - 상위n명, 그다음n명,...으로 학점을 분류

1점이 낮게, 5점이 높은 의미로 고객의 RFM을 5구간으로 나눈다.

r_labels = list(range(5, 0, -1))
f_labels = list(range(1, 6))
m_labels = list(range(1, 6))
cut_size = 5

r_cut = pd.qcut(rfm['Recency'], cut_size, labels=r_labels)
f_cut = pd.qcut(rfm['Frequency'], cut_size, labels=f_labels)
m_cut = pd.qcut(rfm['MonetaryValue'], cut_size, labels=m_labels)

rfm = rfm.assign(R=r_cut, F=f_cut, M=m_cut)
rfm.head()

Recency가 낮을수록(최근에 구매했을수록) R값이 높게, Frequency와 MonetaryValue는 높을수록(더 많은 횟수, 더 많은 금액) F, M 값이 높게 만들었다.

rfm2

Recency, Frequency, MonetaryValue에 따라 R, F, M이 잘 만들어졌다.

히스토그램을 그려 보면

hist

기존에 몰려있던 데이터가 구간화를 통해 균일한 분포로 나타남을 볼 수 있다.

3D 시각화 : Recency, Frequency, MonetaryValue

ax = plt.axes(projection='3d')
ax.scatter3D(rfm["Recency"], rfm["Frequency"], rfm["MonetaryValue"])

 

scatter2

구간화 하기 전 Recency, Frequency, MonetaryValue 값에 따라서는 편향된 것을 확인할 수 있지만

3D 시각화 : R, F, M

ax = plt.axes(projection='3d')
ax.scatter3D(rfm['R'], rfm['F'], rfm['M'])

 

3dscatter

구간화 한 후엔 R, F, M 값에 편향되지 않고 균일한 분포를 확인할 수 있다.

RFM 활용

rfm["RFM_score"] = rfm[['R', 'F', 'M']].sum(axis=1)
rfm["RFM_class"] = pd.qcut(rfm['RFM_score'], 3, ['silver', 'gold', 'platinum'])

고객별 R, F, M 값을 더한 RFM_score를 계산하고, 이를 다시 qcut을 이용해 3등분하여 silver, gold, platinum 등급으로 고객군을 나눈다.

rfm.groupby('RFM_class')['RFM_score'].describe()

RFM_class별로 그룹핑한 후 RFM_score의 기술통계를 확인하면

describe

RFM_score가 3~7점이면 silver, 8~11점이면 gold, 12~15점이면 platinum으로 나누어진 것을 확인할 수 있다.

아래처럼 seaborn pointplot을 그려 각 RFM_class별로 R, F, M 값에 따라 RFM_score가 어떻게 나타나는지 확인 가능하다.

rscore
등급별 R에 따른 RFM_score

 

fscore
등급별 F에 따른 RFM_score

 

mscore
등급별 M에 따른 RFM_score


Recency, Frequency, MonetaryValue, RFM_score의 pairplot을 RFM_class별로 확인하면 아래와 같다.

pairplot

silver, gold, platinum 회원 등급별로 뚜렷한 특징의 차이를 보여준다.

어떻게 RFM 분석을 활용하는지 익혔고, 왜 마케팅에 많이 사용되는지 알 수 있었다.

반응형

댓글