Post

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


출처

This post is licensed under CC BY 4.0 by the author.