ポアソン分布(poisson distribution)は、時間的にランダムに発生するような事象を記述するような確率分布です。
単位時間に何回イベントが発生するかを記述できる確率分布なので、例えばよくポアソン分布を用いて表現されるのが、1日に何回メールが来るかといった現象や、1回の釣りにいった時に何匹魚が釣れたか、などの分布を表すために使われます。
今回は確率・統計学を学び始めた人を対象に、ポアソン分布の基本的な成立や統計量である期待値・分散について解説していきます。またポアソン分布についてイメージを持てるように、Pythonを用いてポアソン分布を可視化していきます。
ポアソン分布の概要
ポアソン分布は非負の整数を生成する確率分布で、待ち行列理論などでも頻繁に登場する確率分布です。
ポアソン分布は、確率分布の表現にたった1つのパラメータ $\lambda$をとり、この$\lambda$の値によって、ポアソン分布の形状は変わります。
ポアソン分布の定義は下記のようになっています。
\begin{equation} Poi(x | \lambda ) = \frac {\lambda^{x}}{x !} e^{- \lambda} \end{equation}
パラメータである$\lambda$は、単位時間に事象が発生する回数を示しています。
つまり、冒頭の例で出したように1日に到着するメールの数を予測したいような時には、今まで1日に到着したメールの数がわかれば、その平均を計算して(1)式の$\lamnbda$に入れ込むことで、確率分布として表現でき、明日何件メールが来るだろう、ということが確率的に表現できるようになります。
(1)式を見ると、ポアソン分布は、指数と階乗と、物々しいパーツでできていますが、実際上非常に重要であるので、ある程度、どんな形状をしているか、などは理解しておきましょう。
\begin{equation} lnPoi(x | \lambda) = x ln(\lambda) - \lambda - ln(x!) \end{equation}
また、(1)式を見るとわかるように、分母に階乗が含まれています。階乗は非負の整数にしか定義されないので、ポアソン分布に従う 確率変数$x$は自ずと整数値しかとることがでいない制約があることから、ポアソン分布は離散的確率質量関数になります。
ポアソン分布は、定義式(1)にあるように、指数部分が非常に多い確率質量関数となっているので、対数をとった形で利用されることが多いです。(1)の両辺に対数をとると、下記のようになります。
Pythonでポアソン分布の外観を図示
確率質量関数が出てきたら、まず外観を確かめると良いでしょう。
今回は可視化のために、Pythonのライブラリであるscipyを用いてポアソン分布を図示してみます。
from scipy.stats import poisson
import matplotlib.pylab as plt
import numpy as np
xs = np.arange(0, 50)
pmf10 = [poisson.pmf(x, 10) for x in xs]
pmf20 = [poisson.pmf(x, 20) for x in xs]
pmf30 = [poisson.pmf(x, 30) for x in xs]
plt.bar(xs, pmf10, label="$\lambda$ = 10")
plt.bar(xs, pmf20, label="$\lambda$ = 20")
plt.bar(xs, pmf30, label="$\lambda$ = 30")
plt.legend()
上のコードを実行すると、このような確率質量関数(pmf, Probability Mass Function)を得ることができます。

ざっくりですが、パラメータである$\lambda$が大きくなるにつれて、分布が右に寄って低くなっている傾向が見られます。このため、この図を見るとなんとなく、期待値は$\lambda$に比例して大きくなっていることが予想されます。また裾野も広くなっている感じがするので、分散も$\lambda$に付随して大きくなっていることが予想されます。
もちろんここまでは予想なので、次でポアソン分布の期待値と分散を導出してみましょう。
ポアソン分布の期待値の導出
まず、ポアソン分布の期待値はこのようになっています。
E[Poi(x | \lambda )] = \lambda
実はポアソン分布の期待値は、モデルパラメータの$\lambda$になります。もともとポアソン分布は、一定時間に何回程度のイベントが起こるかを表す分布で、その平均を$\lambda$と与えているので、この結果は当然といえば当然ですね。
ポアソン分布の期待値を導出します。確率質量関数の期待値は、
\begin{split} E[Poi(x | \lambda)] &= \sum_{k = 0}^{ N } k Poi(x | \lambda) \\ &= \sum_{k = 0}^{ N } k \frac {\lambda^{k}}{k !} e^{- \lambda} \\ &= \sum_{k = 0}^{ N } \frac {\lambda^{k}}{(k - 1) !} e^{- \lambda} \\ &= \lambda \sum_{k = 0}^{ N } \frac {\lambda^{k-1}}{(k - 1) !} e^{- \lambda} \\ &= \lambda \end{split}
ここで、最後の式変形がもっとも分かりにくいと思います。しかし、これは $k-1 = k’$と変数を取り直した時、(1)式とポアソン分布の確率質量関数と全く同じ形式になり、その総和は確率質量関数の定義から必ず1になるので、このような式変形をすることができます。
\begin{split} \sum_{k = 0}^{ N } \frac {\lambda^{k-1}}{(k - 1) !} e^{- \lambda} &= \sum_{k = 0}^{ N } \frac {\lambda^{k'}}{(k') !} e^{- \lambda} \\ &= 1 \end{split}
ポアソン分布の分散を導出
続いてポアソン分布の分散についてです。ポアソン分布の分散はこのようになっています。
Var[Poi(x | \lambda)]= \lambda
こちらのポアソン分布の分散についても、導入してみましょう。
分散の定義式から直接導出することもできますが、確率変数の期待値と分散において成り立つ下記の関係式を利用すると良いでしょう。
\begin{equation} V[X] = E[X^2] - E[X]^2 \end{equation}
この式は、あらゆる確率分布の分散の導出によく使われるので覚えておくと良いでしょう。
ここで、すでに$E[X]$は期待値として導出できているので、あとは$E[X^2]$を計算すれば、(3)式から分散を導出できます。(これはいかなる確率変数においても成り立つので、(3)式は覚えておくと良いでしょう。
\begin{split} E[Poi(x | \lambda)^2] &= \sum_{k = 0}^{ N } k^2 Poi(x | \lambda) \\ &= \sum_{k = 0}^{ N } k^2 \frac {\lambda^{k}}{k !} e^{- \lambda} \\ &= \sum_{k = 0}^{ N } \{k(k-1) + k \} \frac {\lambda^{k}}{k !} e^{- \lambda} \\ &= \sum_{k = 0}^{ N } k(k-1) \frac {\lambda^{k}}{k !} e^{- \lambda} + \lambda \sum_{k = 0}^{ N } \frac {\lambda^{k-1}}{(k-1) !} e^{- \lambda} \\ &= \lambda ^2 \sum_{k = 0}^{ N } \frac {\lambda^{k-2}}{(k-2) !} e^{- \lambda} + \lambda \\ &= \lambda ^2 + \lambda \end{split}
これより、(3)式から、
Var[Poi(x | \lambda)]= \lambda^2 + \lambda - (\lambda)^2 = \lambda
を得ることができました。