당신의 CRM 캠페인은 안녕하신가요? RFM 개념부터 Python 실전 분석까지

당신의 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 Example

이제 고객별 RFM 점수화(Scoring)와 세분화(Segment)를 수행할 준비가 끝났습니다.

다음 글에서는 RFM 값을 기반으로 고객 점수를 부여하는 방법과, 세분화 분류 전략을 알아보겠습니다.