Customer Lifetime Value(LTV)
고객생애가치(Customer Lifetime Value, LTV)1란?
- 고객과 회사의 관계를 통해 회사가 얻을 수 있는 수익(또는 이익)의 가치
- 신규 고객을 확보하거나 기존 고객을 유지하고자 할 때 얼마나 비용을 들이는게 적절한지 설명하는 개념
고객획득비용(Customer Acquisition Cost, CAC): 신규 고객을 획득하는 데 드는 비용을 측정
- LTV를 기반으로 CAC을 책정하여 신규 고객을 확보
- 할인이나 혜택 등의 고객 유지 전략의 비용 결정
- LTV와 CAC를 비교하여 제품의 수익성을 점검
LTV 공식
한 고객의 LTV는 고객이 회사와의 관계를 유지하는 동안의 총 매출 또는 순이익을 의미한다.
- Margin * RetentionRate / (1 + DiscountRate - RetentionRate)2
- (Avg Monthly Revenue per Customer * Gross Margin per Customer) / Monthly Churn Rate3
- ARPU * (Average Lifespan)4
- ARPU (Average Revenue Per User): Average monthly revenue per customer.
- Average Lifespan: The average duration customers stay with the company.
- ARPU * GrossMargin * CustomerLifetime5
- Gross Margin %: Accounts for costs related to providing services.
실습
데이터: https://www.kaggle.com/datasets/blastchar/telco-customer-churn
Notebook code: https://www.kaggle.com/code/yehoonlee/customer-behavior-analysis
Naive Approach
1
2
3
4
5
6
7
8
9
# (Avg Monthly Revenue per Customer * Gross Margin per Customer) / Monthly Churn Rate
gross_margin = 0.6151
revenue = df['MonthlyCharges'].mean()
churn_rate = len(df[df['Churn'] == 1]) / len(df)
ltv = revenue * gross_margin / churn_rate
print(f'Avg Monthly Revenue per Customer: ${revenue:.2f}' )
print(f'Gross Margin per Customer: {gross_margin*100:.2f}%')
print(f'Monthly Churn Rate: {churn_rate*100:.2f}%')
print(f'Lifetime Value (LTV): {ltv:.2f}')
1
2
3
4
Avg Monthly Revenue per Customer: $64.76
Gross Margin per Customer: 61.51%
Monthly Churn Rate: 26.54%
Lifetime Value (LTV): 150.11
Historical LTV for churned customers
1
2
3
4
5
6
7
8
9
# ARPU * (Average Lifespan)
churned_df = df[df['Churn'] == 1]
churned_revenue = churned_df['TotalCharges'] / churned_df['tenure']
arpu = churned_revenue.mean()
average_lifespan = churned_df['tenure'].mean()
historical_ltv = arpu * average_lifespan
print(f"ARPU: ${arpu:.2f}")
print(f"Average Customer Lifespan: {average_lifespan:.2f} months")
print(f'Historical LTV: ${historical_ltv:.2f}')
1
2
3
ARPU: $74.43
Average Customer Lifespan: 17.98 months
Historical LTV: $1338.24
Naive Approach와 Historical LTV for churned customers 사이의 괴리
- Naive Approach에서의 부정확한 Churn Rate
- Average Customer Lifespan = 1 / Churn Rate
(대안책) Churn 예측을 통해 Churn Rate 파생하여 LTV 계산
사용 기간에 따른 Churn Rate 예측
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
X = df[['tenure']]
y = df['Churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
활성 사용자에 대한 LTV 예측
1
2
3
4
5
6
7
# Naive Approach
# 실제로는 사용기간에 따라 Churn Rate의 변동이 있지만,
# 일정하다고 가정하고 LTV 계산
gross_margin = 0.6151
active_df['ltv'] = active_df['MonthlyCharges'] * gross_margin / active_df['predicted_churn_rate'] + active_df['TotalCharges'] * gross_margin
print(f"Mean of predicted LTV for active users: ${active_df['ltv'].mean():0.2f}")
active_df[['MonthlyCharges', 'tenure', 'predicted_churn_rate', 'ltv']].head()
1
Mean of predicted LTV for active users: $1865.90
출처
https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B0%9D%EC%83%9D%EC%95%A0%EA%B0%80%EC%B9%98 ↩
https://en.wikipedia.org/wiki/Customer_lifetime_value#cite_ref-Marketing_Metrics_2-5:~:text=the%20lifetime%20value%20of%20a%20customer%20relationship ↩
https://en.wikipedia.org/wiki/Customer_lifetime_value#cite_ref-Marketing_Metrics_2-5:~:text=(Avg%20Monthly%20Revenue%20per%20Customer%20*%20Gross%20Margin%20per%20Customer)%20%C3%B7%20Monthly%20Churn%20Rate ↩
https://umbrex.com/resources/how-to-analyze-a-saas-company/customer-lifetime-value-clv-analysis/#:~:text=CLV%20%3D%20ARPU%20x%20Average%20Customer%20Lifespan ↩
https://umbrex.com/resources/how-to-analyze-a-saas-company/customer-lifetime-value-clv-analysis/#:~:text=CLV%20%3D%20(ARPU%20x%20Average%20Customer%20Lifespan)%20x%20Gross%20Margin ↩