당신의 CRM 캠페인은 안녕하신가요? RFM 개념부터 Python 실전 분석까지
이번 글에서는 SQL과 Python을 활용해 RFM 분석을 자동화하는 방법과, 이를 CRM 전략에 어떻게 실질적으로 적용할 수 있는지를 단계별로 소개합니다.
CRM 전략을 수행할 때 가장 먼저 고려해야하는 것은 유저의 충성도와, 구매 전환 여부, 행동 패턴에 따라 각각 다른 메시지를 전달해야 한다는 것입니다. 이 때 유용하게 사용되는 것이 바로 RFM 분석입니다.
RFM 은 유저를 구매 시점(Recency), 구매 빈도(Frequency), 구매 금액(Monetary) 기준으로 나누어, 유저 행동 기반의 세분화(Segmentation)를 가능하게 합니다.
본 보스팅에서는 Python을 활용해 RFM 분석을 구현하고, 이를 실제 CRM 전략에 연결할 수 있는지를 간략하게 설명해보려고 합니다. CRM 마케터와 데이터 분석가, 기획자 등 여러 분야에 걸친 이해관계자들이 하나의 전략을 가지고 소통하는 계기가 될 수 있었으면 좋겠습니다.
1. RFM 분석이란?
RFM 은 세 가지 핵심 지표를 기반으로 유저를 세분화 합니다.
- Recency : 최근 구매일
- 유저가 마지막으로 상품을 구매한 날짜
- 구매일이 최근일수록 '관심이 있는 유저'일 가능성이 높음
- Frequency : 구매 빈도
- 일정 기간 동안 얼마나 자주 구매했는지
- 자주 구매하는 유저일수록 '충성도 높은 유저'일 가능성이 높음
- Monetary : 총 구매
- 누적 구매 금액
- 전채 메출에 얼마나 기여했는지를 나타냄
이 세 지표를 수치화 하고 점수화(Score)한 뒤, 이를 기반으로 유저를 다양한 그룹으로 분류하면 CRM 전략을 보다 정밀하게 타게팅 할 수 있습니다.
예를 들어, 아래와 같은 지표를 기반으로 유저를 세분화 할 수 있습니다.
- 최근 구매 + 구매 빈도 + 구매 금액이 모두 높은 유저는 Champions 으로 편성
- 오래 방문하지 않고 구매 금액도 낮은 유저는 Hibernating 으로 편성
2. 데이터 준비
본 포스팅에서는 아래의 데이터 세트를 활용합니다.
주요 컬럼 설명
- InvoiceNo : 거래 번호 (취소 거래는 ‘C’로 시작)
- StockCode : 제품 코드
- Description : 제품 이름
- Quantity: 구매 수량
- InvoiceDate: 거래
- UnitPrice : 단가 (£).
- CustomerID : 유저 ID
- Country : 국가 정보
RFM 분석을 위해 필요한 정보는 다음과 같습니다.
InvoiceDate(Recency 계산용), InvoiceNo(Frequency 계산용), CustomerID(개별 유저 구분용), Quantity x UnitPrice(Monetary 계산용)
만약, 서비스의 실제 데이터를 추출하고 싶을 때는 아래와 같은 방식(예시)으로 데이터를 추출할 수 있겠습니다.
WITH recent_payments AS (
SELECT
p.invoice_id,
p.product_id,
p.user_id,
p.quantity,
p.invoice_datetime
FROM
payments p -- 구매 정보 테이블
WHERE
p.invoice_datetime BETWEEN '2010-12-01 00:00:00' AND '2010-12-01 23:59:59'
),
product_info AS (
SELECT
product_id,
description,
price
FROM
products -- 제품 정보 테이블
),
user_info AS (
SELECT
user_id,
country
FROM
users -- 유저 정보 테이블
)
SELECT
rp.invoice_id AS Invoice,
rp.product_id AS StockCode,
pi.description AS Description,
rp.quantity AS Quantity,
rp.invoice_datetime AS InvoiceDate,
pi.price AS Price,
rp.user_id AS CustomerID,
ui.country AS Country
FROM
recent_payments rp
JOIN
product_info pi ON rp.product_id = pi.product_id
JOIN
user_info ui ON rp.user_id = ui.user_id
3. RFM 지표 계산하기
앞서 준비한 거래 데이터를 기반으로, 이제 본격적으로 RFM 지표를 계산해보겠습니다.
a. 분석 기준일(today_date) 설정
Recency 는 분석을 하는 '오늘 날짜' 기준으로 마지막 구매일과의 차이를 계산하는 지표 입니다. 실제 운영중인 서비스라면 today_date 는 분석 실행일로 자동 설정하면 되겠지만, 본 예제에서는 데이터의 마지막 날짜를 기준으로 고정된 날짜를 설정하겠습니다.
import pandas as pd
import datetime as dt
# InvoiceDate를 datetime 형식으로 변환
df["InvoiceDate"] = pd.to_datetime(df["InvoiceDate"])
# 분석 기준일 설정 (데이터 마지막 날짜 + 1일)
today_date = dt.datetime(2010, 12, 11)
b. 고객별 RFM 계산
# 고객별로 그룹화하여 RFM 지표 계산
rfm = df.groupby("Customer ID").agg({
"InvoiceDate": lambda x: (today_date - x.max()).days, # Recency
"Invoice": "nunique", # Frequency
"TotalPrice": "sum" # Monetary
})
# 컬럼 이름 정리
rfm.columns = ["recency", "frequency", "monetary"]
# 결과 확인
rfm.head()
주의할 점은 다음과 같습니다.
- Recency 는 날짜의 차이이므로 작을수록 최근에 방문한 고객입니다. 추후 점수화(Scoring) 단계에서 즉 날짜의 차이가 작을수록 높은 점수를 부여합니다.
- Monetary 는 Quentity x Price 를 곱한 총 구매 금액인 TotalPrice 를 미리 계산해둬야 합니다.
# 거래별 총 금액 컬럼 생성
df["TotalPrice"] = df["Quantity"] * df["Price"]
예시 출력,

이제 고객별 RFM 점수화(Scoring)와 세분화(Segment)를 수행할 준비가 끝났습니다.
다음 글에서는 RFM 값을 기반으로 고객 점수를 부여하는 방법과, 세분화 분류 전략을 알아보겠습니다.