UPDATE: 2022-12-01 22:32:22

はじめに

ここではSaaSの記事でよく見かける顧客の平均継続期間は\(1/ChurnRate\)という話を幾何分布の観点から考える。幾何分布ではない観点の話は下記に書かれているので、参照願います。

なぜ幾何分布の話が出てくるのかというと、幾何分布の期待値の計算式\(1/p\)\(1/ChurnRate\)が同じであるため、幾何分布の観点からこの話を理解できると思ったため。

平均継続期間とLTV

ビジネスの文脈で、LTVを計算するために平均継続期間が必要になる。これは「ユーザの延べ継続期間 / ユーザ数」で求めることができ、この「平均継続期間」に「ARPU(Average Revenue Per User)」という1ユーザあたりの売上(=一定期間の売上/ユーザ数)をかけることで「LTV」が計算される。つまり、1人のユーザーがこれくらいの金額で、これくらいの期間サービスをつかうので、これを掛け合わせたら1人のユーザーがサービスにかける金額を計算できるでしょう、という感じで話が進められる。

そこで唐突に「平均継続期間」は\(1/ChurnRate\)で計算できる、と言われる。例えば、解約率が10%だったら平均継続期間は10ヶ月だし、解約率が30%だったら平均継続期間は3ヶ月だし、解約率が5%だったら平均継続期間は20ヶ月となる。ここらへんの詳しい話は冒頭のブログで説明されているので、ここでは扱わない。

なぜここで幾何分布の話を持ち出すのかと言うと、\(ChurnRate=p\)すると、幾何分布の期待値\(1/p\)と同じなので、幾何分布の期待値の観点からも解釈できると思ったからである。正しいかどうかは知らない。

そもそも、\(1/ChurnRate\)で算出される平均継続期間は、「特定の2点間のユーザー数から解約率を算出し、解約率が変動しないものとして扱う」など、色々と問題が指摘されているので、生存分析を用いたLTVの計算方法やその他にも色々算出方法があるので、そちらのほうが適切かもしれない。幾何分布で考えても、この問題が解消されるわけではない。

幾何分布

幾何分布は、特定の事象が発生するまでに必要な試行回数の分布として説明される。成功確率を\(p\)、失敗確率を\(q=1-p\)とすると確率質量関数は

\[ f(X=k) = p(1-p)^{k-1}, k = 1,2,3... \]

であり、期待値\(E(X)\)は、

\[ E(X) = \frac{1}{p} \]

である。期待値の証明は検索すれば出てくるのでここでは扱わない。

幾何分布の期待値は平均継続期間

この話をSaaSビジネスの文脈で置き換えてみる。まず幾何分布の確率を、特定の2点間でユーザーがサービスを解約した確率として考える。100ユーザーのうち5人が解約すれば、解約率は5/100=0.05(=5%)である。ここでは期間の単位は月単位とすると、1ヶ月後に解約するユーザーの解約率の確率\(p\)は、

\[ P(X=1) = 0.05 \] と表わせる。2ヶ月後に解約する確率\(p\)は、1ヶ月後は契約していたので、

\[ P(X=2) = 0.95×0.05=0.0475 \]

と表わせる(つまり4.7%)。3ヶ月後に解約す確率\(p\)は、1ヶ月、2ヶ月後は契約していたので、

\[ P(X=3) = 0.95×0.95×0.05=0.045125 \] と表わせる(つまり4.5%)。では12ヶ月後に解約す確率\(p\)は、11ヶ月後までは契約していたので2.8%となる。

\[ P(X=12) = 0.95^{11}×0.05=0.02844 \]

幾何分布の観点からは、解約という事象が発生するまでに、契約が継続する回数を表していると言える。\((1-p)=0.95, p = 0.05, k = 12\)とすれば、まさに幾何分布である。

\[ f(X=12) = 0.05×(1-0.05)^{12-1} = 0.95^{11}×0.05=0.02844 \]

これをRの関数で計算してみる。しかし、数値が合わない。

dgeom(x = 12, prob = 0.05)
## [1] 0.027018

これはRの幾何分布の定義の問題で、試行を繰り返して初めて成功させるまでの失敗回数の分布として定義されているため。冒頭から扱っている幾何分布は俗にシフトされた幾何分布と呼ばれる。

\[ P(Y=k) = p(1-p)^{k} \] ここでは冒頭の定義に修正したdgeom1を利用する。

dgeom1 <- function(x, ...){ dgeom(x - 1, ...) }
# pgeom1 <- function(q, ...){ pgeom(q - 1, ...) }
# qgeom1 <- function(p, ...){ qgeom(p, ...) + 1 }
# rgeom1 <- function(n, ...){ rgeom(n, ...) + 1 }

dgeom1(x = 12, prob = 0.05)
## [1] 0.02844

解約率を5%として、各月ごとにこの確率をプロットすると、ユーザーが1ヶ月、2ヶ月、…36ヶ月後に解約する可能性を可視化できる。また、幾何分布の期待値は\(1/p=1/ChurnRate\)なので、平均継続月数は赤い棒グラフが示す20ヶ月ということになる。

library(tidyverse)

t <- 100
churnrate <- 0.05
m <- 1/churnrate
df <- tibble(
  x = 1:t,
  p = dgeom1(x, prob = churnrate),
  flg = if_else(x == m, FALSE, TRUE),
  flg_label = if_else(x == m, p, NA_real_),
  )

df %>% 
  ggplot(., aes(x, p, fill = flg)) + 
  geom_bar(stat = "identity") + 
  geom_text(aes(x, p+0.001, label = round(flg_label,3))) + 
  scale_x_continuous(breaks = seq(0, t, 5), limits = c(0, 25)) + 
  scale_y_continuous(breaks = seq(0, 0.2, 0.01)) + 
  theme_bw() + 
  theme(legend.position = "none")

この分布自体は直感的に解釈できる。つまり、月が経過するにつれて、ユーザーが継続する可能性が減少していく過程を可視化しており、この分布の期待値を求めるということは、長短あれば、ユーザーが平均的に契約し続けてくれるであろう月数を計算していることになる。平均継続月数は赤い棒グラフが示す20ヶ月である。

期待値は\(1/p\)で計算しても良いが、定義に従って、月数と確率を掛け合わせて足し込めば計算できる。ここでは\(t=100\)としているので、少し小さいが…

df %>% 
  mutate(m = x * p) %>% 
  summarise(`E(X)` = sum(m))
## # A tibble: 1 × 1
##   `E(X)`
##    <dbl>
## 1   19.3

理論的には\(1/0.05=20\)となる。\(t=500\)と大きく取れば20に収束する。

t1 <- 500
sum(1:t1 * dgeom1(1:t1, 0.05))
## [1] 20

冒頭で触れたように、このモデルは解約率が一定であることを仮定している。つまり、ユーザーが先月更新したかどうかに関係なく、解約率は5%とされる。通常、SaaSのサブスクリプション系のプロダクトであれば、長く使うほど解約率は下がりそうである。つまり、契約継続と解約の関係は、コイン投げのような独立した試行ではない。

ただ、ビジネスの文脈では、時間も無ければ、お金もない、人もいないケースはざらなので、LTVを計算する際に、ないよりはあったほうが良いし、それをたたき台として改善していけばよいので、ないよりはあったほうがよい、という意味ではビジネスでは有用かもしれない。