본문 바로가기
[코드쉐도잉]/산업

[LTV] E-Commerce predicting customer lifetime value

by 에디터 윤슬 2025. 1. 6.

링크

https://www.kaggle.com/code/dhimananubhav/e-commerce-predicting-customer-lifetime-value#Creating-RFM-Matrix-based-on-transaction-log

 

E-Commerce predicting customer lifetime value

Explore and run machine learning code with Kaggle Notebooks | Using data from Brazilian E-Commerce Public Dataset by Olist

www.kaggle.com

 

라이브러리 임포트

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import lifetimes

#Let's make this notebook reproducible 
np.random.seed(42)

import random
random.seed(42)

import warnings
warnings.filterwarnings('ignore')

 

# Make the default figures a bit bigger
plt.rcParams['figure.figsize'] = (7,4.5) 
plt.rcParams["figure.dpi"] = 140 

sns.set(style="ticks")
sns.set_context("poster", font_scale = .5, rc={"grid.linewidth": 5})

 

Read DATA

df1 = pd.read_csv('olist_orders_dataset.csv')
df2 = pd.read_csv('olist_customers_dataset.csv')
df3 = pd.read_csv('olist_order_payments_dataset.csv')

# 주문 데이터에서 필요한 열만 선택
cols = ['customer_id', 'order_id', 'order_purchase_timestamp']
orders = df1[cols]
orders = orders.set_index('customer_id') # 고객별로 데이터를 정리하기 위함
orders.drop_duplicates(inplace=True) # 중복된 행 제거

# 결제 데이터에서 필요한 열만 선택
cols = ['order_id', 'payment_value']
payment = df3[cols]
payment = payment.set_index('order_id') # 주문별로 데이터를 정리하기 위함
payment.drop_duplicates(inplace=True) # 중복된 행을 제거하여 유일한 결제 정보만 남김

# 고객 데이터 전처리
# 고객 데이터에서 필요한 열만 선택
cols = ['customer_id', 'customer_unique_id']
customers = df2[cols]
customers = customers.set_index('customer_id') # 고객별로 데이터 정리

# 주문과 고객 데이터 병합
elog = pd.concat([orders,customers], axis=1, join='inner')
elog.reset_index(inplace=True)

# 필요 열 선택 및 날짜 처리
cols = ['customer_unique_id', 'order_purchase_timestamp']
elog = elog[cols]
elog['order_purchase_timestamp'] = pd.to_datetime(elog['order_purchase_timestamp'])
elog['order_date'] = elog.order_purchase_timestamp.dt.date
elog['order_date'] = pd.to_datetime(elog['order_date'])

# 열 이름 변경 및 최종 정리
cols = ['customer_unique_id', 'order_date']
elog = elog[cols]
elog.columns = ['CUSTOMER_ID', 'ORDER_DATE']

# 데이터 확인
elog.info()
display(elog.sample(5))

  • Date range of orders
elog.ORDER_DATE.describe()

 

 

RFM 베이스 거래 로그 확인

  • CLV(고객 생애 가치) 분석에서 사용되는 BG/NBD 모델 준비
%%time
calibration_period_ends = '2018-06-30'

from lifetimes.utils import calibration_and_holdout_data

summary_cal_holdout = calibration_and_holdout_data(elog, 
                                                   customer_id_col = 'CUSTOMER_ID', 
                                                   datetime_col = 'ORDER_DATE', 
                                                   freq = 'D', #days
                                        calibration_period_end=calibration_period_ends,
                                        observation_period_end='2018-09-28' )

1. Calibration과 Holdout 데이터란?
	•	Calibration 데이터:
		•고객의 과거 구매 데이터를 기반으로 모델을 학습하는 데 사용됩니다.
		•예: 2018년 1월 1일부터 2018년 6월 30일까지의 구매 기록.
	•	Holdout 데이터:
		•모델이 학습되지 않은 데이터로, 모델의 예측 성능을 검증하는 데 사용됩니다.
		•예: 2018년 7월 1일부터 2018년 9월 28일까지의 구매 기록.
        
•	`lifetimes`:
	•	고객 생애 가치(CLV) 분석에 널리 사용되는 Python 라이브러리입니다.
•	`calibration_and_holdout_data`:
	•	데이터를 Calibration(학습) 기간과 Holdout(검증) 기간으로 나누는 함수입니다.


주요 파라미터:
	1.	`elog`:
		•	입력 데이터프레임으로, 고객별 구매 기록을 포함합니다.
		•	여기서 `elog`는 이전에 생성된 데이터프레임으로, 각 고객(`CUSTOMER_ID`)의 주문 날짜(`ORDER_DATE`)를 포함합니다.
	2.	`customer_id_col='CUSTOMER_ID'`:
		•	고객 식별자 열 이름입니다. 여기서는 `CUSTOMER_ID`.
	3.	`datetime_col='ORDER_DATE'`:
		•	주문 날짜를 나타내는 열 이름입니다. 여기서는 `ORDER_DATE`.
	4.	`freq='D'`:
		•	시간 단위로, 여기서는 일 단위(`D`)를 사용합니다.
		•	다른 옵션으로 주 단위(`W`), 월 단위(`M`) 등을 사용할 수도 있습니다.
	5.	`calibration_period_end=calibration_period_ends`:
		•	Calibration(학습) 기간의 종료 날짜를 지정합니다.
		•	여기서는 `'2018-06-30'`, 즉 학습 기간은 이 날짜까지의 데이터를 포함합니다.
	6.	`observation_period_end='2018-09-28'`:
		•	전체 관찰 기간의 종료 날짜를 지정합니다.
		•	Holdout(검증) 기간은 Calibration 종료 이후부터 이 날짜까지의 데이터를 포함합니다.
        
함수 동작:
	•	이 함수는 다음 정보를 계산하여 반환합니다:
		•	각 고객이 Calibration 및 Holdout 기간 동안 구매한 횟수.
		•	각 고객이 마지막으로 구매한 날짜와 관찰 종료 날짜 사이의 시간 간격.

 

  • Feature Set
summary_cal_holdout.head()

 

Training Model - MBG/NBD

  • 모델 가정:



%%time 

from lifetimes import ModifiedBetaGeoFitter

mbgnbd = ModifiedBetaGeoFitter(penalizer_coef=0.01)
mbgnbd.fit(summary_cal_holdout['frequency_cal'], 
        summary_cal_holdout['recency_cal'], 
        summary_cal_holdout['T_cal'],
       verbose=True)
       
       
	•	`lifetimes`:
		•	고객 생애 가치 분석에 널리 사용되는 Python 라이브러리입니다.
	•	`ModifiedBetaGeoFitter`:
		•	MBG/NBD 모델을 구현한 클래스입니다.
		•	이 모델은 고객의 구매 패턴과 이탈 가능성을 예측하는 데 사용됩니다.
    
	•	`ModifiedBetaGeoFitter()`:
		•	MBG/NBD 모델 객체를 생성합니다.
	•	`penalizer_coef=0.01`:
		•	정규화(regularization) 강도를 설정합니다.
		•	과적합(overfitting)을 방지하기 위해 패널티 항을 추가하며, 값이 클수록 모델이 더 간단해집니다.
        
주요 파라미터:
	1.	`frequency_cal`:
		•	Calibration(학습) 기간 동안 고객이 구매한 총 횟수.
		•	예: 고객 A가 학습 기간 동안 3번 구매했다면 `frequency_cal = 3`.
	2.	`recency_cal`:
		•	Calibration 기간 동안 고객이 마지막으로 구매한 날짜와 관찰 시작 날짜 사이의 시간 간격(일 단위).
		•	예: 고객 A가 학습 기간 시작 후 120일째에 마지막으로 구매했다면 `recency_cal = 120`.
	3.	`T_cal`:
		•	Calibration 기간 동안 관찰된 총 시간(일 단위).
		•	예: 학습 기간이 총 180일이었다면 `T_cal = 180`.
	4.	`verbose=True`:
		•	학습 진행 상태를 출력합니다.
함수 동작:
	•	MBG/NBD 모델은 입력 데이터를 바탕으로 다음 매개변수를 추정합니다:
		1.	: 구매율()의 감마 분포의 형태(shape) 매개변수.
		2.	: 구매율()의 감마 분포의 스케일(scale) 매개변수.
		3.	: 이탈 확률()의 감마 분포의 형태(shape) 매개변수.
		4.	: 이탈 확률()의 감마 분포의 스케일(scale) 매개변수.

 

  • print(mbgnbd)
<lifetimes.ModifiedBetaGeoFitter: fitted with 83748 subjects, a: 0.22, alpha: 218.07, b: 0.12, r: 0.10>

 

 

Gamma-Gamma model LTV 예측

  • 감마-감마 모델을 이용한 고객평생가치 추정
    • 감마-감마 모델 및 독립 가정:
    • 모델은 금전적 가치와 구매 빈도 사이에 관계가 없다고 가정합니다. 실제로 이 모델을 사용하려면 두 벡터 간의 Pearson 상관 관계가 0에 가까운지 확인해야 합니다.
  • 미래 구매 횟수 예측
t = 90 # days to predict in the future 
summary_cal_holdout['predicted_purchases'] = mbgnbd.conditional_expected_number_of_purchases_up_to_time(t, 
                                                                                      summary_cal_holdout['frequency_cal'], 
                                                                                      summary_cal_holdout['recency_cal'], 
                                                                                      summary_cal_holdout['T_cal'])


•	`t = 90`:
	•	미래 90일 동안의 예상 구매 횟수를 예측합니다.
	•	`t`는 예측 기간(일 단위)입니다.

•	`mbgnbd.conditional_expected_number_of_purchases_up_to_time()`:
	•	BG/NBD 모델을 사용하여 각 고객이 지정된 기간(`t`) 동안 구매할 것으로 예상되는 횟수를 계산합니다.
	•	입력값:
		•	`frequency_cal`: Calibration 기간 동안의 구매 횟수.
		•	`recency_cal`: 마지막 구매 시점과 Calibration 시작 시점 사이의 시간 간격(일 단위).
		•	`T_cal`: Calibration 기간 동안 관찰된 총 시간(일 단위).
•	결과:
	•	`summary_cal_holdout'predicted_purchases'`: 각 고객이 향후 90일 동안 구매할 것으로 예상되는 횟수가 저장됩니다.

 

  • 고객 생존 확률 계산
summary_cal_holdout['p_alive'] = mbgnbd.conditional_probability_alive(summary_cal_holdout['frequency_cal'], 
                                                                         summary_cal_holdout['recency_cal'], 
                                                                         summary_cal_holdout['T_cal'])
# 확률 정규화 및 반올림
summary_cal_holdout['p_alive'] = np.round(summary_cal_holdout['p_alive'] / summary_cal_holdout['p_alive'].max(), 2)

•	`mbgnbd.conditional_probability_alive()`:
	•	BG/NBD 모델을 사용하여 각 고객이 현재 활성 상태(즉, 이탈하지 않은 상태)일 확률을 계산합니다.
	•	입력값:
		•	`frequency_cal`: Calibration 기간 동안의 구매 횟수.
		•	`recency_cal`: 마지막 구매 시점과 Calibration 시작 시점 사이의 시간 간격(일 단위).
		•	`T_cal`: Calibration 기간 동안 관찰된 총 시간(일 단위).
•	결과:
	•	`summary_cal_holdout'p_alive'`: 각 고객이 현재 활성 상태일 확률(0~1 범위)이 저장됩니다.
    
•	모든 고객의 생존 확률을 최대값으로 나누어 정규화합니다.
•	정규화된 값을 소수점 둘째 자리에서 반올림합니다.

 

  • CLV 계산
summary_cal_holdout['clv'] = gg.customer_lifetime_value(
   mbgnbd, #the model to use to predict the number of future transactions
   summary_cal_holdout['frequency_cal'],
   summary_cal_holdout['recency_cal'],
   summary_cal_holdout['T_cal'],
   summary_cal_holdout['monetary_value_cal'],
   time=3, # months
   discount_rate=0 #0.0025 # = 0.03/12 monthly discount rate ~ 3% annually
)
summary_cal_holdout['clv'] += (-1*summary_cal_holdout['clv'].min())


1.	Gamma-Gamma 모델과 BG/NBD 모델 결합:
	•	Gamma-Gamma 모델(`gg`)과 BG/NBD 모델(`mbgnbd`)을 결합하여 CLV를 계산합니다.
	•	Gamma-Gamma 모델은 평균 구매 금액(Monetary)을 기반으로 CLV를 추정합니다.
    
2.	입력값:
	•	`mbgnbd`: BG/NBD 모델 객체로, 미래 구매 횟수를 예측합니다.
	•	`frequency_cal`, `recency_cal`, `T_cal`: Calibration 데이터에서 계산된 값.
	•	`monetary_value_cal`: 고객의 평균 구매 금액(필수).
	•	`time=3`: CLV를 예측할 기간(여기서는 향후 3개월).
	•	`discount_rate=0`: 할인율(여기서는 할인율 없음).
    
3.	CLV 정규화:
	•	CLV 값이 음수가 되는 것을 방지하기 위해 최소값을 조정합니다.

 

 

모델 평가

  • Frequency of Repeat Transactions
%%time 

from lifetimes.plotting import plot_period_transactions
ax = plot_period_transactions(mbgnbd, max_frequency=7)
ax.set_yscale('log')
sns.despine();

1. 라이브러리 임포트
	•	`plot_period_transactions`:
		•`lifetimes` 라이브러리에서 제공하는 함수로, BG/NBD 모델의 적합도를 시각적으로 평가하기 위해 사용됩니다.
		•이 함수는 실제 데이터와 모델이 예측한 거래 횟수 분포를 비교하는 플롯을 생성합니다.
        
2. 기간별 거래 분포 플롯 생성
주요 파라미터:
	1.	`mbgnbd`:
		•	학습된 BG/NBD 모델 객체입니다.
		•	이 모델은 고객의 구매 패턴(거래 빈도 및 이탈 가능성)을 기반으로 거래 횟수를 예측합니다.
	2.	`max_frequency=7`:
		•	그래프에서 표시할 최대 거래 횟수입니다.
		•	예를 들어, `max_frequency=7`이면 0회, 1회, …, 7회 거래한 고객의 분포만 표시됩니다.
		•	이를 통해 지나치게 드문 거래 횟수를 제외하고 주요 패턴에 집중할 수 있습니다.
함수 동작:
	•	이 함수는 다음 두 가지 데이터를 비교하는 히스토그램을 생성합니다:
	1.	실제 데이터:
		•	Calibration 기간 동안 각 고객의 실제 거래 횟수 분포.
	2.	모델 예측값:
		•	BG/NBD 모델이 예측한 거래 횟수 분포.
		•	결과적으로, 두 분포가 얼마나 잘 일치하는지 시각적으로 확인할 수 있습니다.

3. Y축 스케일 설정
	•	Y축(거래 횟수 분포)을 로그 스케일로 설정합니다.
	•	로그 스케일은 값의 범위가 클 때 작은 값과 큰 값을 동시에 시각화하기에 적합합니다.
	•	예를 들어, 거래 횟수가 적은 고객이 많고, 거래 횟수가 많은 고객이 적은 경우 로그 스케일을 사용하면 두 그룹을 더 잘 비교할 수 있습니다.

4. 그래프 미세 조정
	•	Seaborn의 `despine()` 함수는 그래프의 상단과 오른쪽 축선을 제거하여 깔끔한 시각화를 제공합니다.
	•	이는 그래프를 더 간결하고 읽기 쉽게 만듭니다.

 

 

  • Actual Purchases in Holdout Period vs Predicted Purchases
%%time 

from lifetimes.plotting import plot_calibration_purchases_vs_holdout_purchases

plot_calibration_purchases_vs_holdout_purchases(mbgnbd, summary_cal_holdout)
sns.despine();


1. 라이브러리 임포트
	•	`plot_calibration_purchases_vs_holdout_purchases`:
		•`lifetimes` 라이브러리에서 제공하는 함수로, BG/NBD 모델이 Holdout 데이터(검증 데이터)에서 구매 횟수를 얼마나 잘 예측했는지 시각화합니다.
		•Calibration 데이터(학습 데이터)를 기반으로 모델을 학습한 후, Holdout 데이터와 비교하여 모델의 성능을 평가합니다.
        
2. 모델 평가 그래프 생성
주요 파라미터:
	1.	`mbgnbd`:
		•	학습된 BG/NBD 모델 객체입니다.
		•	이 모델은 고객의 구매 패턴(구매 빈도 및 이탈 가능성)을 기반으로 Holdout 기간 동안의 구매 횟수를 예측합니다.
	2.	`summary_cal_holdout`:
		•	Calibration 및 Holdout 데이터를 포함하는 데이터프레임입니다.
		•	이 데이터프레임에는 다음과 같은 열이 포함됩니다:
			•	`frequency_cal`: Calibration 기간 동안의 구매 횟수.
			•	`recency_cal`: 마지막 구매 시점과 Calibration 시작 시점 사이의 시간 간격(일 단위).
			•	`T_cal`: Calibration 기간 동안 관찰된 총 시간(일 단위).
			•	`frequency_holdout`: Holdout 기간 동안의 실제 구매 횟수.
함수 동작:
	•	이 함수는 다음 두 가지 데이터를 비교하는 그래프를 생성합니다:
	1.	모델 예측값:
		•	BG/NBD 모델이 예측한 Holdout 기간 동안의 구매 횟수.
	2.	실제 값:
		•	Holdout 데이터에서 관찰된 실제 구매 횟수.

 

Customer 확률 기록

from lifetimes.plotting import plot_history_alive
from datetime import date
from pylab import figure, text, scatter, show

individual = summary_cal_holdout.iloc[4942]

id = individual.name
t = 365*50

today = date.today()
two_year_ago = today.replace(year=today.year - 2)
one_year_from_now = today.replace(year=today.year + 1)

sp_trans = elog.loc[elog['CUSTOMER_ID'] == id]

from lifetimes.utils import calculate_alive_path

t = (today - sp_trans.ORDER_DATE.min().date()).days
p_alive_today = pd.DataFrame(calculate_alive_path(mbgnbd, sp_trans, 'ORDER_DATE', t, freq='D'))[0].tail(1).values
p_alive_today = np.round(p_alive_today[0], 2)
print('Probability that customer is alive today is', p_alive_today)

t = (one_year_from_now - sp_trans.ORDER_DATE.min().date()).days
ax = plot_history_alive(mbgnbd, t, sp_trans, 'ORDER_DATE', start_date=two_year_ago) #, start_date='2016-01-01'
ax.vlines(x=today, ymin=0, ymax=1.05, colors='#4C4C4C')
ax.hlines(y=0.8, xmin=two_year_ago, xmax=one_year_from_now, colors='#4C4C4C')

ax.set_xlim(two_year_ago, one_year_from_now) # sp_trans.ORDER_DATE.min()
ax.set_ylim(0, 1.05)

plt.xticks(rotation=-90)
text(0.75, 0.1, p_alive_today, ha='center', va='center', transform=ax.transAxes)

sns.despine()
  • 특정 고객 데이터 선택
individual = summary_cal_holdout.iloc[4942]
id = individual.name


•	`summary_cal_holdout.iloc`:
	•	`summary_cal_holdout` 데이터프레임에서 4942번째 고객의 데이터를 선택합니다.
	•	이 고객은 분석 대상이 됩니다.
•	`id = individual.name`:
	•	선택된 고객의 ID를 저장합니다.

 

  • 날짜 설정
today = date.today()
two_year_ago = today.replace(year=today.year - 2)
one_year_from_now = today.replace(year=today.year + 1)

•	`today`:
	•	현재 날짜를 가져옵니다.
•	`two_year_ago`:
	•	현재 날짜에서 2년 전 날짜를 계산합니다.
•	`one_year_from_now`:
	•	현재 날짜에서 1년 후 날짜를 계산합니다.
•	이 날짜들은 그래프의 X축 범위와 생존 확률 계산에 사용됩니다.

 

  • 특정 고객의 거래 데이터 필터링
sp_trans = elog.loc[elog['CUSTOMER_ID'] == id]

•	`elog.loc...`:
	•	`elog` 데이터프레임에서 분석 대상 고객(`id`)의 거래 데이터를 필터링합니다.
•	결과:
	•	해당 고객의 모든 거래 기록이 포함된 데이터프레임(`sp_trans`)이 생성됩니다.

 

  • 현재 생존 확률 계산
t = (today - sp_trans.ORDER_DATE.min().date()).days
p_alive_today = pd.DataFrame(calculate_alive_path(mbgnbd, sp_trans, 'ORDER_DATE', t, freq='D'))[0].tail(1).values
p_alive_today = np.round(p_alive_today[0], 2)
print('Probability that customer is alive today is', p_alive_today)

1.	현재 시점까지 경과한 일수 계산:
	•	고객의 첫 거래일(`sp_trans.ORDER_DATE.min()`)부터 오늘까지 경과한 일수를 계산합니다.    

2.	생존 확률 경로 계산:
	•	`calculate_alive_path`: BG/NBD 모델을 사용하여 특정 고객의 생존 확률 경로를 계산합니다.
	•	입력값:
		•	`mbgnbd`: 학습된 BG/NBD 모델 객체.
		•	`sp_trans`: 고객의 거래 데이터.
		•	`'ORDER_DATE'`: 거래 날짜 열 이름.
		•	`t`: 경과 일수.
		•	`freq='D'`: 일 단위로 계산.
        
3.	현재 생존 확률 추출:
	•	생존 확률 경로에서 마지막 값(현재 시점)을 추출합니다.
	•	`np.round(p_alive_today, 2)`: 소수점 둘째 자리까지 반올림합니다.
    
4.	결과 출력:
	•	예: `"Probability that customer is alive today is 0.85"`

 

  • 미래 생존 확률 시각화
t = (one_year_from_now - sp_trans.ORDER_DATE.min().date()).days
ax = plot_history_alive(mbgnbd, t, sp_trans, 'ORDER_DATE', start_date=two_year_ago)
ax.vlines(x=today, ymin=0, ymax=1.05, colors='#4C4C4C')
ax.hlines(y=0.8, xmin=two_year_ago, xmax=one_year_from_now, colors='#4C4C4C')

ax.set_xlim(two_year_ago, one_year_from_now)
ax.set_ylim(0, 1.05)

plt.xticks(rotation=-90)
text(0.75, 0.1, p_alive_today, ha='center', va='center', transform=ax.transAxes)

sns.despine()


1.	미래 특정 시점까지 경과한 일수 계산:
	•	고객의 첫 거래일부터 현재로부터 1년 후까지 경과한 일수를 계산합니다.
    
2.	생존 확률 경로 시각화:
	•	`plot_history_alive`: BG/NBD 모델을 사용하여 특정 고객의 생존 확률 경로를 시각화합니다.
	•	입력값:
		•	`mbgnbd`: 학습된 BG/NBD 모델 객체.
		•	`t`: 미래 특정 시점까지 경과한 일수.
		•	`sp_trans`: 고객의 거래 데이터.
		•	`'ORDER_DATE'`: 거래 날짜 열 이름.
		•	`start_date=two_year_ago`: 그래프 시작 날짜(2년 전).
        
주요 작업:
	1.	현재 시점을 강조 표시:
    	•	현재 날짜(`today`)에 수직선을 그려 현재 시점을 강조합니다.
    2.	생존 확률 임계값 표시:
    	•	생존 확률이 80%인 임계값에 수평선을 그립니다.
    3.	그래프 범위 설정:
    	•	X축: 그래프 시작 날짜(2년 전)부터 종료 날짜(1년 후).
		•	Y축: 생존 확률 범위(0~1).
	4.	현재 생존 확률 표시:
    	•	그래프에 현재 생존 확률(`p_alive_today`) 값을 텍스트로 표시합니다.
	5.	그래프 스타일 조정:
    	•	그래프 상단 및 오른쪽 축선을 제거하여 깔끔하게 표현합니다.

  • 시간에 따른 거래 예측
elog.columns = ['CUSTOMER_ID', 'date']

%%time
# Get expected and actual repeated cumulative transactions.

from lifetimes.utils import expected_cumulative_transactions

t = (elog.date.max() - elog.date.min()).days
df = expected_cumulative_transactions(mbgnbd, elog, 'date', 'CUSTOMER_ID', t)


1. 데이터 준비
	•	`elog` 데이터프레임:
	•	고객별 거래 데이터를 포함하는 데이터프레임입니다.
	•	열 이름을 `CUSTOMER_ID`와 `date`로 변경하여 명확하게 정의합니다.
		•	`CUSTOMER_ID`: 고객 고유 ID.
		•	`date`: 거래 날짜.

2. 라이브러리 임포트
	•	`expected_cumulative_transactions`:
		•	`lifetimes` 라이브러리에서 제공하는 함수로, BG/NBD 모델을 사용하여 누적 거래 횟수를 예측합니다.
		•	이 함수는 시간 경과에 따른 누적 거래 횟수를 계산하며, 실제 데이터와 모델 예측값을 비교할 수 있도록 합니다.

3. 전체 기간 계산
•	기간 계산:
	•	`elog.date.max()`: 가장 최근 거래 날짜.
	•	`elog.date.min()`: 가장 오래된 거래 날짜.
	•	`(elog.date.max() - elog.date.min()).days`: 전체 관찰 기간을 일 단위로 계산합니다.
•	예:
	•	가장 오래된 거래 날짜가 `2020-01-01`, 가장 최근 거래 날짜가 `2022-01-01`이라면:
    t = (2022-01-01 - 2020-01-01).days = 730일

4. BG/NBD 모델을 사용한 누적 거래 횟수 계산
1.	`mbgnbd`:
	•	학습된 BG/NBD 모델 객체입니다.
	•	이 모델은 고객의 구매 패턴(구매 빈도 및 이탈 가능성)을 기반으로 누적 거래 횟수를 예측합니다.
	2.	`elog`:
	•	고객별 거래 데이터를 포함하는 데이터프레임입니다.
	•	여기서는 `CUSTOMER_ID`와 `date` 열만 필요합니다.
	3.	`'date'`:
	•	거래 날짜를 나타내는 열 이름입니다.
	4.	`'CUSTOMER_ID'`:
	•	고객 식별자를 나타내는 열 이름입니다.
	5.	`t`:
	•	전체 관찰 기간(일 단위).
	•	위에서 계산한 값으로, 가장 오래된 거래부터 가장 최근 거래까지의 기간입니다.
함수 동작:
	•	이 함수는 다음 두 가지 데이터를 생성합니다:
	1.	실제 누적 거래 횟수:
	•	관찰된 데이터(`elog`)에서 계산된 시간 경과에 따른 실제 누적 거래 횟수.
	2.	예측 누적 거래 횟수:
	•	BG/NBD 모델이 예측한 시간 경과에 따른 누적 거래 횟수.

 

  • 시각화
%%time
# Calibration period = 2016-09-04 to 2017-09-30
from datetime import datetime

cal = datetime.strptime('2018-06-30', '%Y-%m-%d')

from lifetimes.plotting import plot_cumulative_transactions
t = (elog.date.max() - elog.date.min()).days
t_cal = (cal - elog.date.min()).days
plot_cumulative_transactions(mbgnbd, elog, 'date', 'CUSTOMER_ID', t, t_cal, freq='D')
sns.despine()


1. Calibration 종료 날짜 정의
•	`datetime.strptime()`:
    •	문자열 형식의 날짜를 `datetime` 객체로 변환합니다.
    •	여기서는 Calibration 기간의 종료 날짜를 `'2018-06-30'`으로 설정합니다.
•	Calibration 기간:
	•	`elog.date.min()`부터 `'2018-06-30'`까지의 데이터가 Calibration(모델 학습) 기간에 해당합니다.
    
2. 전체 관찰기간 계산
	•	`elog.date.max()`: 가장 최근 거래 날짜.
	•	`elog.date.min()`: 가장 오래된 거래 날짜.
	•	`(elog.date.max() - elog.date.min()).days`: 전체 관찰 기간을 일 단위로 계산합니다.
	•	예:
	•	가장 오래된 거래 날짜가 `2016-09-04`, 가장 최근 거래 날짜가 `2017-09-30`이라면:
    t = (2017-09-30 - 2016-09-04).days = 391일

3. Calibration 기간 계산
	•	`cal`: Calibration 종료 날짜(`2018-06-30`).
	•	`(cal - elog.date.min()).days`: Calibration 시작일(`elog.date.min()`)부터 종료일(`cal`)까지의 기간을 일 단위로 계산합니다.
	•	예:
	•	가장 오래된 거래 날짜가 `2016-09-04`, Calibration 종료 날짜가 `2017-09-30`이라면:
    t_cal = (2017-09-30 - 2016-09-04).days = 391일

4. 누적 거래 횟수 시각화
주요 파라미터:
	1.	`mbgnbd`:
	•	학습된 BG/NBD 모델 객체입니다.
	•	이 모델은 고객의 구매 패턴(구매 빈도 및 이탈 가능성)을 기반으로 누적 거래 횟수를 예측합니다.
	2.	`elog`:
	•	고객별 거래 데이터를 포함하는 데이터프레임입니다.
	•	여기서는 `CUSTOMER_ID`와 `date` 열만 필요합니다.
	3.	`'date'`:
	•	거래 날짜를 나타내는 열 이름입니다.
	4.	`'CUSTOMER_ID'`:
	•	고객 식별자를 나타내는 열 이름입니다.
	5.	`t`:
	•	전체 관찰 기간(일 단위).
	•	위에서 계산한 값으로, 가장 오래된 거래일부터 가장 최근 거래일까지의 기간입니다.
	6.	`t_cal`:
	•	Calibration(모델 학습) 기간(일 단위).
	•	위에서 계산한 값으로, 가장 오래된 거래일부터 Calibration 종료일까지의 기간입니다.
	7.	`freq='D'`:
	•	시간 단위로, 여기서는 일 단위(`D`)를 사용합니다.
함수 동작:
	•	이 함수는 다음 두 가지 데이터를 비교하는 그래프를 생성합니다:
	1.	실제 누적 거래 횟수:
	•	관찰된 데이터(`elog`)에서 계산된 시간 경과에 따른 실제 누적 거래 횟수.
	2.	예측 누적 거래 횟수:
	•	BG/NBD 모델이 예측한 시간 경과에 따른 누적 거래 횟수.

 

%%time 

from lifetimes.plotting import plot_incremental_transactions
plot_incremental_transactions(mbgnbd, elog, 'date', 'CUSTOMER_ID', t, t_cal, freq='D')
sns.despine()


1. 라이브러리 임포트
	•	`plot_incremental_transactions`:
		•	`lifetimes` 라이브러리에서 제공하는 함수로, BG/NBD 모델을 사용하여 시간 경과에 따른 증가 거래 횟수를 시각화합니다.
		•	이 함수는 실제 데이터와 모델 예측값 간의 차이를 비교하여 모델 성능을 평가하는 데 사용됩니다.

2. 증가 거래 횟수 시각화
주요 파라미터:
	1.	`mbgnbd`:
	•	학습된 BG/NBD 모델 객체입니다.
	•	이 모델은 고객의 구매 패턴(구매 빈도 및 이탈 가능성)을 기반으로 증가 거래 횟수를 예측합니다.
	2.	`elog`:
	•	고객별 거래 데이터를 포함하는 데이터프레임입니다.
	•	여기서는 `CUSTOMER_ID`와 `date` 열만 필요합니다.
	3.	`'date'`:
	•	거래 날짜를 나타내는 열 이름입니다.
	4.	`'CUSTOMER_ID'`:
	•	고객 식별자를 나타내는 열 이름입니다.
	5.	`t`:
	•	전체 관찰 기간(일 단위).
	•	가장 오래된 거래일부터 가장 최근 거래일까지의 기간입니다.
	6.	`t_cal`:
	•	Calibration(모델 학습) 기간(일 단위).
	•	가장 오래된 거래일부터 Calibration 종료일까지의 기간입니다.
	7.	`freq='D'`:
	•	시간 단위로, 여기서는 일 단위(`D`)를 사용합니다.
함수 동작:
	•	이 함수는 다음 두 가지 데이터를 비교하는 그래프를 생성합니다:
	1.	실제 증가 거래 횟수:
	•	관찰된 데이터(`elog`)에서 계산된 시간 경과에 따른 실제 증가 거래 횟수.
	2.	예측 증가 거래 횟수:
	•	BG/NBD 모델이 예측한 시간 경과에 따른 증가 거래 횟수.