RFM 분석¶
왜 이 분석을?¶
문제: 모든 고객에게 같은 마케팅을 하면 효율이 떨어진다.
RFM은 고객을 세분화하여 타겟 마케팅을 가능하게 한다: - Recency: 얼마나 최근에 구매했는가 - Frequency: 얼마나 자주 구매하는가 - Monetary: 얼마나 많이 쓰는가
전체 고객 100만 명
└── VIP (5%) → 전용 혜택, 프리미엄 서비스
└── 이탈 위험 (15%) → 재구매 유도 캠페인
└── 신규 유망 (10%) → 온보딩 강화
└── 휴면 (30%) → 재활성화 or 포기
└── 일반 (40%) → 기본 마케팅
어떤 가설?¶
가설 예시¶
| 가설 | 검증 방법 | 예상 액션 |
|---|---|---|
| VIP가 이탈하면 매출 타격이 크다 | VIP 이탈률 vs 매출 감소 상관관계 | VIP 전담 CS, 이탈 징후 모니터링 |
| 최근 30일 미구매 고객은 이탈 가능성이 높다 | R점수 1점 고객의 재구매율 추적 | 7일/14일/21일 리마인드 푸시 |
| F점수가 높은 고객은 할인 없이도 재구매한다 | F점수별 쿠폰 사용률 비교 | 고빈도 고객 쿠폰 제외 (마진 확보) |
| M점수가 낮아도 F점수가 높으면 가치가 있다 | 저M고F 고객의 LTV 계산 | 객단가 상승 캠페인 (번들, 업셀) |
분석 방법¶
1. 점수 산정¶
import pandas as pd
# 기준일 설정
snapshot_date = pd.Timestamp('2024-01-01')
# 고객별 RFM 계산
rfm = df.groupby('customer_id').agg({
'order_date': lambda x: (snapshot_date - x.max()).days, # Recency
'order_id': 'count', # Frequency
'amount': 'sum' # Monetary
})
rfm.columns = ['recency', 'frequency', 'monetary']
# 5분위 점수 (5가 가장 좋음)
rfm['R'] = pd.qcut(rfm['recency'], 5, labels=[5,4,3,2,1]) # 낮을수록 좋음
rfm['F'] = pd.qcut(rfm['frequency'].rank(method='first'), 5, labels=[1,2,3,4,5])
rfm['M'] = pd.qcut(rfm['monetary'].rank(method='first'), 5, labels=[1,2,3,4,5])
rfm['RFM_Score'] = rfm['R'].astype(str) + rfm['F'].astype(str) + rfm['M'].astype(str)
2. 세그먼트 정의¶
| 세그먼트 | RFM 조건 | 특징 |
|---|---|---|
| Champions | R=5, F=5, M=5 | 최근 구매, 자주, 많이 |
| Loyal | F>=4 | 자주 구매하는 단골 |
| Potential Loyal | R>=4, F=2-3 | 최근 활발, 빈도 상승 가능 |
| New Customers | R=5, F=1 | 최근 첫 구매 |
| At Risk | R=2-3, F>=3 | 과거 단골, 최근 뜸함 |
| Hibernating | R=1-2, F=1-2 | 오래 전 구매, 드묾 |
| Lost | R=1, F=1 | 거의 이탈 |
def segment(row):
r, f, m = int(row['R']), int(row['F']), int(row['M'])
if r >= 4 and f >= 4:
return 'Champions'
elif f >= 4:
return 'Loyal'
elif r >= 4 and f <= 2:
return 'New Customers'
elif r <= 2 and f >= 3:
return 'At Risk'
elif r <= 2 and f <= 2:
return 'Lost'
else:
return 'Others'
rfm['segment'] = rfm.apply(segment, axis=1)
비즈니스 액션¶
세그먼트별 전략¶
| 세그먼트 | 목표 | 액션 |
|---|---|---|
| Champions | 유지 + 확산 | VIP 혜택, 리뷰/추천 유도, 신상품 조기 접근 |
| Loyal | 객단가 상승 | 번들 제안, 프리미엄 라인 추천 |
| Potential Loyal | 빈도 상승 | 재구매 시점 푸시, 멤버십 가입 유도 |
| New Customers | 2회차 전환 | 첫 구매 후 7일 내 쿠폰, 온보딩 가이드 |
| At Risk | 재활성화 | "보고 싶어요" 메시지, 한정 쿠폰 |
| Lost | ROI 판단 | 대규모 할인 or 포기 (비용 대비 효과 계산) |
실제 적용 예시¶
문제: 재구매율이 전월 대비 5% 하락
분석:
가설: At Risk 고객 대상 리텐션 활동 부족
액션: 1. At Risk 고객 대상 "돌아와 주세요" 캠페인 (10% 쿠폰) 2. New Customers 대상 첫 구매 후 3일/7일 자동 푸시 설정 3. 2주 후 재구매율 변화 모니터링
주의사항¶
함정¶
- 점수만 보고 행동을 안 봄
- M점수가 높아도 반품률이 높으면 실제 가치는 낮다
-
해결: 순매출 기준으로 M 계산
-
모든 비즈니스에 같은 기준 적용
- 가구(저빈도) vs 식품(고빈도)는 F 기준이 달라야 함
-
해결: 산업/카테고리별 기준 조정
-
세그먼트 고정 관점
- 고객은 계속 이동한다 (Loyal → At Risk)
- 해결: 월별 세그먼트 변화 추적
보완 분석¶
| 한계 | 보완 방법 |
|---|---|
| 미래 예측 불가 | LTV 분석과 결합 |
| 이탈 원인 모름 | VoC 분석, 퍼널 분석 |
| 행동 맥락 부재 | 세션 분석, 클릭스트림 |