Mímisbrunnr知恵の泉

← マーケティングサイエンス 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 関連:顧客獲得コスト(CAC)とLTV/CAC | 前提:マーケティングデータとKPIの体系

要点(BLUF)

1. LTV とは:粗利の生涯総和

**LTV(Lifetime Value)は、1人の顧客が「取引を続けてくれる間に、自社にもたらす粗利の合計」です。ポイントは、売上ではなく粗利(貢献利益=売上 − 変動費・原価)**で測ること。割引や送料・原価で利益が薄い顧客は、売上が大きくても LTV は小さくなります。

いちばん素朴な形は、こうです。

LTV(素朴版)=1期あたり粗利×期待継続期間\text{LTV(素朴版)} = \text{1期あたり粗利} \times \text{期待継続期間}

「期待継続期間」は、継続率 rr(次の期も取引を続ける確率)が一定なら計算できます。獲得直後を第0期として、顧客が第 tt 期まで生き残っている確率は rtr^t。アクティブな期数の期待値は、生存確率を足し上げた幾何級数です。

期待継続期間=t=0rt=11r\text{期待継続期間} = \sum_{t=0}^{\infty} r^{t} = \frac{1}{1-r}

たとえば毎期の粗利 m=3000m=3000 円、継続率 r=0.8r=0.8 なら、期待継続期間は 1/(10.8)=51/(1-0.8)=5 期、素朴版 LTV は 3000×5=150003000 \times 5 = 15000 円です。

2. 割引を入れた LTV(数式)

将来の粗利は、いま手にする粗利より価値が低い(お金の時間価値)。そこで期間割引率 dd で現在価値に割り引きます。前提(規約)を明示します。

すると第 tt 期がもたらす「割引後・期待粗利」は mrt/(1+d)t=m(r/(1+d))tm \cdot r^t / (1+d)^t = m\,(r/(1+d))^t。これを全期間で足すと、公比 q=r/(1+d)q = r/(1+d) の幾何級数になります。0r<1, d00 \le r < 1,\ d \ge 0 なら 0q<10 \le q < 1 で収束し、t=0qt=1/(1q)\sum_{t=0}^{\infty} q^t = 1/(1-q) なので、

LTV=t=0m(r1+d)t=m1r1+d=m(1+d)1+dr\text{LTV} = \sum_{t=0}^{\infty} m\left(\frac{r}{1+d}\right)^t = \frac{m}{1 - \dfrac{r}{1+d}} = \frac{m(1+d)}{1+d-r}

割引を無視(d=0d=0)すると LTV=m/(1r)\text{LTV} = m/(1-r) となり、§1 の素朴版と一致します。

flowchart LR
  P0["第0期:粗利 m(生存確率 1)"] --> P1["第1期:m × r /(1+d)"]
  P1 --> P2["第2期:m × r^2 /(1+d)^2"]
  P2 --> Pn["… → 幾何級数で総和 = LTV"]

規約の明記:この定義は獲得直後(第0期)の初回粗利も LTV に含めます。つまり LTV は「獲得した瞬間からの粗利の現在価値合計」です。次ノートで CAC(獲得コスト)と比べるとき、この起点を揃えておくことが重要です。

3. 級数和と閉形式は一致する(コード)

幾何級数を直接 t=0t=0 から大きな TT まで足した値と、閉形式 m(1+d)/(1+dr)m(1+d)/(1+d-r) が一致するかを確かめます。さらに継続率 rr を動かし、LTV が rr について(1 に近づくほど急増)であることを表で見ます。

数式の対応:公比 q=r/(1+d)q = r/(1+d)LTV=m/(1q)=m(1+d)/(1+dr)\text{LTV} = m/(1-q) = m(1+d)/(1+d-r)

import numpy as np
import pandas as pd

# 1顧客の前提:各期首にもたらす粗利 m、期間継続率 r、期間割引率 d
m = 3000.0   # 1期あたりの粗利(貢献利益、円)
r = 0.80     # 継続率(次の期も継続する確率)
d = 0.10     # 期間割引率

# (a) 級数を t=0..T で数値合計:第t期の割引後・期待粗利 = m * (r/(1+d))**t
T = 1000
t = np.arange(T + 1)
series_ltv = np.sum(m * (r / (1 + d)) ** t)

# (b) 閉形式 LTV = m(1+d)/(1+d-r)
closed_ltv = m * (1 + d) / (1 + d - r)

print(f"級数和(t=0..{T})      = {series_ltv:,.2f} 円")
print(f"閉形式 m(1+d)/(1+d-r) = {closed_ltv:,.2f} 円")
print(f"無割引 d=0 の m/(1-r) = {m / (1 - r):,.2f} 円")

# 継続率 r を動かして LTV の凸性を見る(m, d は固定)
rows = []
for rr in [0.6, 0.7, 0.8, 0.9]:
    rows.append({
        "継続率r": rr,
        "期待継続期間": 1 / (1 - rr),   # 無割引の素朴な期待継続期間 1/(1-r)
        "LTV": m * (1 + d) / (1 + d - rr),
    })
tbl = pd.DataFrame(rows)

print("\n=== 継続率 r と LTV(m=3000, d=0.10 固定)===")
print(tbl.to_string(index=False, formatters={
    "継続率r": "{:.2f}".format,
    "期待継続期間": "{:.2f}".format,
    "LTV": "{:,.0f}".format}))

出力:

級数和(t=0..1000)      = 11,000.00 円
閉形式 m(1+d)/(1+d-r) = 11,000.00 円
無割引 d=0 の m/(1-r) = 15,000.00 円

=== 継続率 r と LTV(m=3000, d=0.10 固定)===
継続率r 期待継続期間    LTV
0.60   2.50  6,600
0.70   3.33  8,250
0.80   5.00 11,000
0.90  10.00 16,500

出力の意味:まず級数和と閉形式がともに 11,000 円で一致しました(公比 q<1q<1 なので T=1000T=1000 で完全に収束)。一方、割引を無視した m/(1r)=15,000m/(1-r)=15{,}000 円より、割引後の 11,000 円は小さい——将来の粗利を割り引くぶん LTV は控えめになります。下の表が肝心です。rr を 0.6 → 0.9 と上げると、LTV は 6,600 → 8,250 → 11,000 → 16,500 と増えますが、増分が 1,650 → 2,750 → 5,500 と加速しています。これは期待継続期間 1/(1r)1/(1-r) が 2.5 → 10 へ非線形に伸びるためで、LTV は rr について凸。継続率を「あと数ポイント」上げる施策が、なぜ価値に大きく効くのかが数字で見えます。

⚠️ よくある誤解

関連ノート