1日に交差点で起きる事故の件数、1時間にコールセンターにかかる電話の本数、1ページあたりの誤植の数 — これらに共通するのは、「一定の時間や空間の中で、ランダムにイベントが発生する回数」を数えているという点です。
このような「稀な事象のカウント」を記述する確率分布がポアソン分布(Poisson distribution)です。フランスの数学者シメオン・ドニ・ポアソンにちなんで名付けられました。
ポアソン分布は、確率論と統計学において最も重要な離散分布の一つであり、以下のような広範な応用があります。
- 品質管理: 製品の欠陥数のモデリング
- 待ち行列理論: サーバーへのリクエスト到着回数
- 疫学: 一定期間の疾病発生件数
- 物理学: 放射性崩壊のカウント、光子検出
- 自然言語処理: 文書中の特定の単語の出現回数
- 保険数理: 保険金請求の件数
本記事の内容
- 二項分布からポアソン分布への極限導出
- ポアソン分布の数学的性質(期待値、分散、MGF)
- ポアソン過程の概念
- 再生性と和の分布
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 確率母関数・積率母関数 — MGFの計算
- 幾何分布 — 離散分布の基本
ポアソン分布の導出 — 二項分布の極限
二項分布からの出発
ポアソン分布は二項分布の「$n$ が大きく $p$ が小さい」極限として自然に導出できます。
ある交差点で1日に起きる事故の数を考えます。1日を $n$ 個の短い時間区間に分割し、各区間で事故が起きる確率を $p$ とします。$n$ が十分大きく $p$ が十分小さければ、各区間で起きる事故は高々1件と考えてよく、1日の事故件数 $X$ は $\text{Binomial}(n, p)$ に近似できます。
$n \to \infty$ かつ $np = \lambda$(一定)のもとで二項分布の極限を取ると、ポアソン分布が得られます。
極限の計算
$X \sim \text{Binomial}(n, p)$ で $p = \lambda/n$ として $n \to \infty$ の極限を取ります。
$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} = \binom{n}{k} \left(\frac{\lambda}{n}\right)^k \left(1 – \frac{\lambda}{n}\right)^{n-k} $$
二項係数を展開すると
$$ \binom{n}{k} = \frac{n!}{k!(n-k)!} = \frac{n(n-1)\cdots(n-k+1)}{k!} $$
$\lambda^k / n^k$ と掛け合わせると
$$ \frac{n(n-1)\cdots(n-k+1)}{n^k} \cdot \frac{\lambda^k}{k!} $$
$n \to \infty$ で $n(n-1)\cdots(n-k+1)/n^k \to 1$(各因子 $(n-i)/n \to 1$)
また $(1 – \lambda/n)^{n-k} \to e^{-\lambda}$(指数関数の定義)
したがって
$$ \lim_{n \to \infty} P(X = k) = \frac{\lambda^k}{k!} e^{-\lambda} $$
ポアソン分布の定義
確率変数 $X$ がパラメータ $\lambda > 0$ のポアソン分布に従う($X \sim \text{Poisson}(\lambda)$)とき
$$ \begin{equation} P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0, 1, 2, \ldots \end{equation} $$
正規化の確認
$$ \sum_{k=0}^{\infty} \frac{\lambda^k e^{-\lambda}}{k!} = e^{-\lambda} \sum_{k=0}^{\infty} \frac{\lambda^k}{k!} = e^{-\lambda} \cdot e^{\lambda} = 1 $$
$e^x$ のテイラー展開 $e^x = \sum_{k=0}^{\infty} x^k / k!$ を使いました。
期待値と分散の導出
期待値
$$ E[X] = \sum_{k=0}^{\infty} k \cdot \frac{\lambda^k e^{-\lambda}}{k!} = \sum_{k=1}^{\infty} \frac{\lambda^k e^{-\lambda}}{(k-1)!} $$
$j = k – 1$ と置換すると
$$ = \lambda e^{-\lambda} \sum_{j=0}^{\infty} \frac{\lambda^j}{j!} = \lambda e^{-\lambda} \cdot e^{\lambda} = \lambda $$
$$ \begin{equation} E[X] = \lambda \end{equation} $$
パラメータ $\lambda$ がそのまま期待値です。
分散
$E[X(X-1)]$ を計算します。
$$ E[X(X-1)] = \sum_{k=2}^{\infty} k(k-1) \frac{\lambda^k e^{-\lambda}}{k!} = \lambda^2 e^{-\lambda} \sum_{j=0}^{\infty} \frac{\lambda^j}{j!} = \lambda^2 $$
$E[X^2] = E[X(X-1)] + E[X] = \lambda^2 + \lambda$ より
$$ \text{Var}(X) = E[X^2] – (E[X])^2 = \lambda^2 + \lambda – \lambda^2 = \lambda $$
$$ \begin{equation} \text{Var}(X) = \lambda \end{equation} $$
ポアソン分布の重要な特徴は平均と分散が等しいことです。この性質(equidispersion)はデータがポアソン分布に従うかどうかの簡易的な診断に使えます。
積率母関数
$$ M_X(t) = E[e^{tX}] = \sum_{k=0}^{\infty} e^{tk} \frac{\lambda^k e^{-\lambda}}{k!} = e^{-\lambda} \sum_{k=0}^{\infty} \frac{(\lambda e^t)^k}{k!} = e^{-\lambda} e^{\lambda e^t} $$
$$ M_X(t) = e^{\lambda(e^t – 1)} $$
ポアソン分布の性質
再生性
独立なポアソン分布の和もポアソン分布に従います。$X \sim \text{Poisson}(\lambda_1)$、$Y \sim \text{Poisson}(\lambda_2)$ が独立のとき
$$ X + Y \sim \text{Poisson}(\lambda_1 + \lambda_2) $$
MGFの積 $e^{\lambda_1(e^t-1)} \cdot e^{\lambda_2(e^t-1)} = e^{(\lambda_1+\lambda_2)(e^t-1)}$ から直ちに従います。
ポアソン過程との関係
ポアソン分布はポアソン過程から自然に生まれます。ポアソン過程は以下の条件を満たす点過程です。
- 重なりのない時間区間でのイベント数は独立
- 微小区間 $[t, t+\Delta t)$ でのイベント発生確率は $\lambda \Delta t + o(\Delta t)$
- 微小区間で2件以上のイベントが発生する確率は $o(\Delta t)$
この条件のもとで、時間区間 $[0, T]$ でのイベント数 $N(T)$ は $\text{Poisson}(\lambda T)$ に従います。そしてイベント間の待ち時間は指数分布 $\text{Exp}(\lambda)$ に従います。
Pythonでの実装と可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# (a) 異なるλでのPMF
ax = axes[0, 0]
lambdas = [1, 3, 5, 10, 20]
k = np.arange(0, 35)
for lam in lambdas:
pmf = stats.poisson.pmf(k, lam)
ax.plot(k, pmf, 'o-', markersize=4, linewidth=1.5,
label=f'$\\lambda$ = {lam}')
ax.set_xlabel('k', fontsize=12)
ax.set_ylabel('P(X = k)', fontsize=12)
ax.set_title('Poisson Distribution PMF', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
# (b) 二項分布からの収束
ax = axes[0, 1]
lam = 5
n_values = [10, 20, 50, 200]
k = np.arange(0, 15)
for n in n_values:
p = lam / n
binom_pmf = stats.binom.pmf(k, n, p)
ax.plot(k, binom_pmf, 'o-', markersize=5, linewidth=1.5,
label=f'Binomial(n={n}, p={lam/n:.3f})')
ax.plot(k, stats.poisson.pmf(k, lam), 'ks--', markersize=8,
linewidth=2.5, label=f'Poisson({lam})', zorder=0)
ax.set_xlabel('k', fontsize=12)
ax.set_ylabel('P(X = k)', fontsize=12)
ax.set_title(f'Binomial → Poisson (λ={lam} fixed)', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
# (c) ポアソン過程のシミュレーション
ax = axes[1, 0]
np.random.seed(42)
lam_rate = 3 # 単位時間あたりの平均イベント数
T = 10 # 時間範囲
# イベント間隔を指数分布で生成
intervals = np.random.exponential(1/lam_rate, 200)
times = np.cumsum(intervals)
times = times[times <= T]
# 累積カウント
ax.step(times, range(1, len(times)+1), 'b-', linewidth=1.5, where='post')
ax.set_xlabel('Time', fontsize=12)
ax.set_ylabel('Cumulative count N(t)', fontsize=12)
ax.set_title(f'Poisson Process ($\\lambda$={lam_rate})\n'
f'Events in [0,{T}]: {len(times)}', fontsize=12)
ax.grid(True, alpha=0.3)
# イベント発生点をマーク
for t in times:
ax.plot(t, 0, 'r|', markersize=15, markeredgewidth=2)
# 理論的な期待値
ax.plot([0, T], [0, lam_rate*T], 'r--', linewidth=1.5, alpha=0.5,
label=f'E[N(t)] = {lam_rate}t')
ax.legend(fontsize=10)
# (d) 平均=分散の性質の確認
ax = axes[1, 1]
np.random.seed(42)
lambdas_test = np.linspace(0.5, 20, 20)
sample_means = []
sample_vars = []
for lam in lambdas_test:
samples = np.random.poisson(lam, 10000)
sample_means.append(np.mean(samples))
sample_vars.append(np.var(samples))
ax.scatter(sample_means, sample_vars, s=60, color='steelblue',
edgecolors='gray', linewidth=0.5, label='Poisson samples')
ax.plot([0, 22], [0, 22], 'r--', linewidth=2,
label='Mean = Variance (equidispersion)')
ax.set_xlabel('Sample Mean', fontsize=12)
ax.set_ylabel('Sample Variance', fontsize=12)
ax.set_title('Poisson: Mean = Variance', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
ax.set_xlim(0, 22)
ax.set_ylim(0, 22)
plt.tight_layout()
plt.savefig('poisson_distribution.png', dpi=150, bbox_inches='tight')
plt.show()
この可視化から、ポアソン分布の基本的な性質が確認できます。
-
左上(PMF): $\lambda$ が小さいとき(1-3)は右に歪んだ形ですが、$\lambda$ が大きくなると(10-20)対称的な釣鐘型に近づきます。これは中心極限定理の効果であり、$\lambda$ が大きいとき正規近似 $N(\lambda, \lambda)$ が使えます。
-
右上(二項分布からの収束): $n$ が増えるにつれて二項分布がポアソン分布(黒い四角)に収束しています。$n = 50$ で既にほぼ完全に一致しており、ポアソン近似の有効性が確認できます。
-
左下(ポアソン過程): ランダムなイベント発生(赤い縦線)の累積カウントが階段関数として描かれています。赤い破線は理論的な平均 $E[N(t)] = \lambda t$ で、実際の累積カウントはこの周りにランダムに揺らいでいます。
-
右下(平均=分散): 異なる $\lambda$ でのサンプル平均とサンプル分散が対角線(赤い破線)上にほぼ正確に並んでおり、ポアソン分布の等分散性(平均=分散)が数値的に確認されています。
まとめ
本記事では、ポアソン分布の導出から性質、応用まで解説しました。
- ポアソン分布 $P(X = k) = \lambda^k e^{-\lambda} / k!$ は、二項分布の $n \to \infty$, $p \to 0$, $np = \lambda$ の極限として導出される
- 期待値 $E[X] = \lambda$、分散 $\text{Var}(X) = \lambda$: 平均と分散が等しいのが特徴
- 再生性: 独立なポアソン分布の和もポアソン分布(パラメータは和)
- ポアソン過程から自然に生まれ、イベント間隔は指数分布に従う
- $\lambda$ が大きいとき正規近似 $N(\lambda, \lambda)$ が有効
次のステップとして、以下の記事も参考にしてください。