LTV(顧客生涯価値)分析
「離反率5%のインパクトは理解できた。だが、経営層を動かすには具体的な金額で話す必要がある。」
田中VPoEが続ける。
「顧客1人の離反がいくらの損失になるのか。セグメントによってどう違うのか。LTVで定量化してくれ。」
あなたはLTV分析に取りかかることにした。
LTV(Customer Lifetime Value)とは
LTVは、1人の顧客が取引期間全体を通じて企業にもたらす総収益を表す指標である。
基本的なLTV計算
# シンプルなLTV計算
def calculate_ltv(arpu, churn_rate):
"""
ARPU: Average Revenue Per User(月間)
churn_rate: 月間離反率
"""
average_lifetime_months = 1 / churn_rate
ltv = arpu * average_lifetime_months
return ltv, average_lifetime_months
# NetShop社のケース
arpu = 5000 # 月額5,000円
churn_rate = 0.05 # 月間5%
ltv, lifetime = calculate_ltv(arpu, churn_rate)
print(f"平均顧客寿命: {lifetime:.0f}ヶ月")
print(f"LTV: ¥{ltv:,.0f}")
# 出力: 平均顧客寿命: 20ヶ月
# 出力: LTV: ¥100,000
割引率を考慮したLTV
将来の収益は現在価値に割り引く必要がある。
def calculate_discounted_ltv(arpu, churn_rate, discount_rate=0.01):
"""
discount_rate: 月間割引率(年率12%なら月率約1%)
"""
ltv = arpu / (churn_rate + discount_rate)
return ltv
discounted_ltv = calculate_discounted_ltv(5000, 0.05, 0.01)
print(f"割引後LTV: ¥{discounted_ltv:,.0f}")
# 出力: 割引後LTV: ¥83,333
セグメント別LTV分析
顧客は一様ではない。セグメントごとにLTVを計算することで、離反防止施策の優先度を決定できる。
import pandas as pd
segments = pd.DataFrame({
'セグメント': ['プレミアム', 'スタンダード', 'ライト'],
'ARPU': [15000, 5000, 2000],
'月間離反率': [0.02, 0.05, 0.08],
'顧客数': [1000, 5000, 4000],
})
segments['平均寿命(月)'] = 1 / segments['月間離反率']
segments['LTV'] = segments['ARPU'] * segments['平均寿命(月)']
segments['セグメント総価値'] = segments['LTV'] * segments['顧客数']
print(segments.to_string(index=False))
| セグメント | ARPU | 月間離反率 | 顧客数 | 平均寿命 | LTV | セグメント総価値 |
|---|---|---|---|---|---|---|
| プレミアム | ¥15,000 | 2% | 1,000 | 50ヶ月 | ¥750,000 | ¥7.5億 |
| スタンダード | ¥5,000 | 5% | 5,000 | 20ヶ月 | ¥100,000 | ¥5.0億 |
| ライト | ¥2,000 | 8% | 4,000 | 12.5ヶ月 | ¥25,000 | ¥1.0億 |
離反コストの定量化
離反が発生した場合の損失を計算する。
def calculate_churn_cost(segment_data):
"""離反1人あたりのコスト = 残存LTV + 再獲得コスト"""
results = []
for _, row in segment_data.iterrows():
remaining_ltv = row['LTV'] * 0.5 # 平均して残存期間の半分と仮定
reacquisition_cost = row['ARPU'] * 3 # 再獲得コスト = 3ヶ月分の売上
total_cost = remaining_ltv + reacquisition_cost
monthly_loss = row['顧客数'] * row['月間離反率'] * total_cost
results.append({
'セグメント': row['セグメント'],
'1人あたり離反コスト': total_cost,
'月間離反人数': row['顧客数'] * row['月間離反率'],
'月間損失額': monthly_loss
})
return pd.DataFrame(results)
churn_cost = calculate_churn_cost(segments)
print(churn_cost.to_string(index=False))
離反率改善のインパクト
離反率を1%改善した場合の効果を算出する。
def improvement_impact(arpu, current_churn, improved_churn, customer_count):
current_ltv = arpu / current_churn
improved_ltv = arpu / improved_churn
ltv_increase = improved_ltv - current_ltv
total_impact = ltv_increase * customer_count
return {
'LTV増加額': ltv_increase,
'総インパクト': total_impact
}
# スタンダードセグメントで離反率を5%→4%に改善
impact = improvement_impact(5000, 0.05, 0.04, 5000)
print(f"LTV増加: ¥{impact['LTV増加額']:,.0f}/人")
print(f"総インパクト: ¥{impact['総インパクト']:,.0f}")
# 出力: LTV増加: ¥25,000/人
# 出力: 総インパクト: ¥125,000,000(1.25億円)
LTV分析のフレームワーク
LTV分析の実践手順:
1. セグメント定義 → 顧客を意味のあるグループに分類
2. ARPU算出 → セグメント別の月間平均収益を計算
3. 離反率測定 → セグメント別の月間離反率を測定
4. LTV計算 → ARPU / 離反率(割引率考慮)
5. コスト試算 → 離反コスト × 離反人数 = 月間損失額
6. 施策優先度 → 損失額の大きいセグメントから着手
まとめ
| 項目 | ポイント |
|---|---|
| LTV基本式 | ARPU / 月間離反率 |
| 割引LTV | ARPU / (離反率 + 割引率) |
| セグメント分析 | 顧客を分類しセグメント別にLTVを比較 |
| 離反コスト | 残存LTV + 再獲得コスト |
| 改善インパクト | 離反率1%改善で億単位の効果もありうる |
チェックリスト
- LTVの基本的な計算式を説明できる
- 割引率を考慮したLTV計算ができる
- セグメント別のLTV分析を実施できる
- 離反コストを定量化できる
- 離反率改善のビジネスインパクトを算出できる
次のステップへ
LTVによる定量化ができたところで、次は離反要因の仮説構築に進み、どのような要因が離反に影響するのかを体系的に整理しよう。
推定読了時間: 30分