1. BG/NBD 모델이란?
- BG/NBD(Beta-Geometric/Negative Binomial Distribution) 모델은 **고객의 생애 가치(Customer Lifetime Value, CLV)**를 추정하는 데 사용되는 확률적 모델입니다.
- 특히 고객이 반복 구매를 할지, 아니면 더 이상 활동하지 않을지를 추정하는 데 유용합니다. 이 모델은 고객의 구매 행태를 두 가지 중요한 개념으로 나눕니다:
- 고객은 활성(active) 상태일 때 일정한 확률로 구매를 한다.
- 고객은 일정 시점 이후 비활성(inactive) 상태로 전환할 수 있으며, 이 상태로 전환하면 더 이상 구매하지 않습니다.
- BG/NBD 모델은 이 두 가지 과정을 추정하여, 향후 고객의 구매 횟수나 지속 기간을 예측할 수 있습니다.
2. BG/NBD 모델의 수식적 정의
- BG/NBD 모델은 두 가지 확률 분포를 결합한 모델입니다:
- 고객의 구매 행동: 고객이 활동 중일 때, 구매는 **Negative Binomial Distribution(음이항 분포)**을 따릅니다.
- **Negative Binomial Distribution (음이항 분포)**의 확률 밀도 함수(PDF)는 성공을 거두기까지의 실패 횟수를 모델링하는 확률 분포입니다. 음이항 분포는 파라미터 $r$ (성공 횟수)와 $p$ (성공 확률)를 사용해 정의됩니다.$$P(X = k) = \binom{k + r - 1}{r - 1} p^r (1 - p)^k$$
- $P(X = k)$: $k$번 실패가 발생할 확률
- $r$: 성공해야 하는 횟수
- $p$: 각 시도에서 성공할 확률
- $k$: 실패한 횟수 (0, 1, 2, ...)
- $\binom{k + r - 1}{r - 1}$은 이항 계수로, $k$번 실패하기 전까지 $r$번의 성공을 얻기 위한 조합의 개수를 나타냅니다
- 고객의 이탈 가능성: 고객이 활동 상태에서 비활성 상태로 전환되는 확률은 **Geometric Distribution(기하 분포)**를 따릅니다.
- **Geometric Distribution (기하 분포)**는 성공할 때까지 실패한 횟수를 모델링하는 이산 확률 분포입니다. 기하 분포는 Bernoulli 시행(성공 또는 실패로 정의되는 독립적인 시도들)에서 첫 성공이 나타나기까지의 실패 횟수를 다룹니다. $$P(X = k) = (1 - p)^k \cdot p$$
- $P(X = k)$: k번 실패 후에 첫 번째 성공이 나타날 확률
- $k$: 첫 번째 성공 이전에 발생한 실패 횟수 (0, 1, 2, ...)
- $p$: 각 시도에서 성공할 확률
- 기하 분포에서 $X$는 첫 번째 성공이 발생하기 전의 실패 횟수입니다. 예를 들어, 동전을 던졌을 때 앞면(성공)이 나올 때까지 뒷면(실패)이 나온 횟수를 모델링할 수 있습니다.
- 기하 분포는 메모리리스(memoryless) 성질을 가지고 있습니다. 즉, 각 시행이 독립적이기 때문에 과거의 실패 횟수가 미래의 성공 확률에 영향을 미치지 않습니다.
- 기대값 (Expected Value): $\frac{1 - p}{p}$
- 분산 (Variance): $\frac{1 - p}{p^2}$
- 기하 분포는 성공 확률 $p$가 작을수록 기대값이 커지며, 이는 성공이 발생하기 전에 더 많은 실패가 있을 것으로 예상된다는 의미입니다.
|
기하 분포 |
이항 분포 |
모델링 대상 |
첫 번째 성공 전까지의 실패 횟수 |
고정된 시행 횟수 중 성공한 횟수 |
시행 수 |
무한히 진행될 수 있음 (첫 성공 시 종료) |
고정된 시행 횟수 |
질문 |
"첫 성공까지 몇 번의 실패가 발생할까?" |
"고정된 시행 횟수 중 몇 번 성공할까?" |
확률 함수 |
$P(X = k) = (1 - p)^k \cdot p$ |
$P(X = k) = \binom{n}{k} p^k (1 - p)^{n-k}$ |
- 각 고객의 구매 빈도를 나타내는 모델의 수식은 다음과 같습니다 $$P(X(t) = x \mid r, \alpha, p, \beta) = \binom{x + r - 1}{r - 1} \left( \frac{\alpha}{\alpha + t} \right)^r \left( \frac{t}{\alpha + t} \right)^x$$
- $r,α$는 구매 빈도와 관련된 매개변수입니다.
- $p,β$는 이탈 가능성을 나타내는 매개변수입니다.
- $X(t)$는 시간 $t$까지의 구매 횟수입니다.
- BG/NBD 모델은 고객의 구매 행동과 이탈 행동을 독립적으로 모델링한 후, 이 두 과정을 결합하여 고객이 특정 시점까지 구매할 확률과 구매 횟수를 동시에 설명합니다. 즉, 이 모델은 고객이 비활성 상태로 전환하기 전까지 구매할 확률을 기반으로 예측을 수행합니다.$$P(X = x, T = t \mid r, \alpha, a, b) = P(X = x \mid r, \alpha) \cdot P(T = t \mid a, b)$$
- $P(X = x \mid r, \alpha)$ : NBD
- $P(T = t \mid a, b)$ : BG
- Online Food Delivery Platform에서는 BG/NBD 모델을 사용하여 고객의 재구매 가능성과 고객의 활성 상태 지속 기간을 예측할 수 있습니다. 예를 들어, BG/NBD 모델을 통해 다음과 같은 비즈니스 질문을 해결할 수 있습니다:
- 특정 고객이 다음 달에 재주문할 가능성은 얼마인가?
- 고객이 이탈하지 않고 얼마나 오랜 기간 동안 활성 상태를 유지할까?
- 전체 고객 중 어떤 고객이 이탈할 가능성이 높은가?
- 이를 통해 고객 세그먼트화를 수행하고, 이탈 가능성이 높은 고객에게 **리텐션 마케팅(재방문 유도 프로모션)**을 제공할 수 있습니다. 예를 들어, 최근 3개월 동안 주문 빈도가 줄어든 고객에게 할인 쿠폰을 제공하는 등의 전략을 통해 고객의 재활성화를 유도할 수 있습니다.
4. 장점과 단점
장점
- 고객 이탈 및 재구매 패턴 예측: 고객의 이탈 가능성과 재구매 패턴을 모델링할 수 있어, 고객 생애 가치(CLV)를 정확하게 예측할 수 있습니다.
- 실제 비즈니스 적용: 다양한 업계, 특히 온라인 플랫폼에서 고객 행동을 분석하고 마케팅 전략을 수립하는 데 적합합니다.
단점
- 데이터의 정확도 의존: BG/NBD 모델의 성능은 고객의 구매 이력 데이터에 크게 의존합니다. 데이터가 부족하거나 왜곡된 경우, 예측 성능이 저하될 수 있습니다.
- 복잡성: 모델의 수식이 복잡하고, 해석에 어려움이 있을 수 있습니다.
5. 전제조건
- 고객 행동의 독립성
- 전제조건: 각 고객은 다른 고객과 독립적으로 행동하며, 한 고객의 행동이 다른 고객의 행동에 영향을 미치지 않는다고 가정합니다.
- 의미: 이 가정은 고객 개개인의 구매 및 이탈 패턴이 서로 독립적으로 일어난다는 것을 의미합니다. 예를 들어, 한 고객의 재구매 여부가 다른 고객의 구매 행동에 영향을 미쳐서는 안 됩니다.
- 고객의 활동 상태는 비관측성
- 전제조건: 고객이 활성 상태인지 비활성 상태인지를 명확히 알 수 없다는 가정입니다. 대신, 고객의 과거 구매 데이터를 바탕으로 그들이 여전히 활성 상태에 있는지 추정하게 됩니다.
- 의미: 고객이 한동안 구매하지 않았다고 해서 그들이 반드시 비활성화된 것이 아니며, 그들은 여전히 활성 상태일 수 있습니다. 따라서 BG/NBD 모델은 이러한 불확실성을 고려하여 고객의 활성/비활성 상태를 추정합니다.
- 이탈 후 더 이상의 구매는 없음
- 전제조건: 고객이 한 번 비활성 상태로 전환되면, 더 이상 구매를 하지 않는다는 가정입니다.
- 의미: 고객이 이탈하면 다시 활동 상태로 돌아오지 않는다는 가정입니다. 이는 많은 고객 생애 주기 모델에서 자주 사용되는 전제입니다. 예를 들어, 구독 서비스에서 구독을 취소한 고객은 다시 활성 상태로 전환되지 않음을 가정합니다.
- 구매 간의 시간은 무기한으로 계속될 수 있음
- 전제조건: 고객이 활성 상태일 때 구매 간의 시간은 일정한 확률로 발생하며, 고객이 구매를 하지 않고 활동 상태를 유지하는 기간은 무기한으로 연장될 수 있습니다.
- 의미: 고객이 구매를 하지 않더라도, 그들이 여전히 활성 상태에 있을 수 있음을 반영합니다. 고객의 활동 상태를 추적하기 위한 기간에는 명확한 상한이 없습니다.
- 고정된 구매 확률
- 전제조건: 고객이 활성 상태일 때, 각 시도에서 구매할 확률은 일정하다는 가정입니다.
- 의미: 활성 상태에 있는 고객이 특정 시간 간격 내에서 구매할 확률은 일정하며, 시간이 지남에 따라 변화하지 않는다고 가정합니다. 즉, 구매 확률은 시간이 지나도 변하지 않고 동일한 확률로 유지됩니다.
- 고정된 이탈 확률
- 전제조건: 고객이 활성 상태에서 비활성 상태로 전환될 확률은 일정하다는 가정입니다.
- 의미: 고객이 특정 기간 내에서 이탈할 확률은 동일하게 유지됩니다. 즉, 고객의 이탈 확률이 시간이 지남에 따라 변화하지 않는다고 가정합니다.
6. 대안
- Gamma-Gamma 모델: 고객의 구매 금액을 예측하는 데 사용됩니다.
- Pareto/NBD 모델: 고객의 구매 행동을 추정하는 또 다른 확률적 모델입니다.
7. 코드
- BG/NBD 모델을 사용하여 고객의 과거 구매 이력(구매 빈도와 마지막 구매일)을 바탕으로 향후 30일간 예상되는 구매 횟수를 예측하는 모델입니다. 최대우도추정(MLE)을 사용해 고객의 구매 패턴과 이탈 가능성을 추정한 후, 이를 기반으로 고객별 구매 예측을 수행합니다
import numpy as np
import pandas as pd
from scipy.optimize import minimize
from scipy.special import gammaln
import matplotlib.pyplot as plt
# 가상의 데이터 생성
np.random.seed(42)
data = {
'customer_id': np.arange(1, 101),
'frequency': np.random.poisson(2, 100), # 고객의 총 구매 횟수
'recency': np.random.uniform(1, 365, 100), # 마지막 구매 후 경과 일수
'T': np.random.uniform(365, 730, 100) # 관찰 기간
}
df = pd.DataFrame(data)
# BG/NBD 모델의 로그우도 함수 정의
def log_likelihood(params, frequency, recency, T):
r, alpha, a, b = params
# Negative Binomial likelihood (구매 빈도)
term1 = gammaln(r + frequency) - gammaln(r) + r * np.log(alpha) + frequency * np.log(T - recency + alpha)
# Beta Geometric likelihood (고객 이탈)
term2 = np.log(a) + (a - 1) * np.log(T - recency + b) - (r + frequency) * np.log(alpha + T)
return -(np.sum(term1 + term2))
# 초기 추정값 설정
initial_params = [1, 1, 1, 1]
# MLE를 사용하여 매개변수 추정
result = minimize(
log_likelihood,
initial_params,
args=(df['frequency'].values, df['recency'].values, df['T'].values),
method='L-BFGS-B',
bounds=[(0.01, None), (0.01, None), (0.01, None), (0.01, None)]
)
r_est, alpha_est, a_est, b_est = result.x
print(f"Estimated parameters: r={r_est}, alpha={alpha_est}, a={a_est}, b={b_est}")
# 고객별 다음 30일 구매 횟수 예측 함수 정의
def expected_purchases_up_to_time(t, frequency, recency, T, r, alpha, a, b):
"""
고객이 향후 t 일 동안 구매할 것으로 예상되는 구매 횟수 계산
"""
term1 = r * (alpha + T) ** (r - 1)
term2 = (T - recency + alpha) ** (-r - 1)
term3 = a / (a + b)
expected_purchases = term1 * term2 * term3 * t
return expected_purchases
# 30일 동안의 예상 구매 횟수 계산
df['predicted_purchases'] = expected_purchases_up_to_time(
t=30,
frequency=df['frequency'].values,
recency=df['recency'].values,
T=df['T'].values,
r=r_est,
alpha=alpha_est,
a=a_est,
b=b_est
)
# 결과 출력
print(df[['customer_id', 'frequency', 'recency', 'T', 'predicted_purchases']].head())
# 모든 고객에 대한 히스토그램
df['predicted_purchases'].plot(kind='hist', bins=30, alpha=0.6)
plt.title('Predicted Purchases in Next 30 Days')
plt.xlabel('Number of Purchases')
plt.ylabel('Frequency')
plt.show()