ポアソン分布の導出と応用 — 二項分布からの極限で理解する

1日に交差点で起きる事故の件数、1時間にコールセンターにかかる電話の本数、1ページあたりの誤植の数 — これらに共通するのは、「一定の時間や空間の中で、ランダムにイベントが発生する回数」を数えているという点です。

このような「稀な事象のカウント」を記述する確率分布がポアソン分布(Poisson distribution)です。フランスの数学者シメオン・ドニ・ポアソンにちなんで名付けられました。

ポアソン分布は、確率論と統計学において最も重要な離散分布の一つであり、以下のような広範な応用があります。

  • 品質管理: 製品の欠陥数のモデリング
  • 待ち行列理論: サーバーへのリクエスト到着回数
  • 疫学: 一定期間の疾病発生件数
  • 物理学: 放射性崩壊のカウント、光子検出
  • 自然言語処理: 文書中の特定の単語の出現回数
  • 保険数理: 保険金請求の件数

本記事の内容

  • 二項分布からポアソン分布への極限導出
  • ポアソン分布の数学的性質(期待値、分散、MGF)
  • ポアソン過程の概念
  • 再生性と和の分布
  • Pythonでの実装と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

ポアソン分布の導出 — 二項分布の極限

二項分布からの出発

ポアソン分布は二項分布の「$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)}$ から直ちに従います。

ポアソン過程との関係

ポアソン分布はポアソン過程から自然に生まれます。ポアソン過程は以下の条件を満たす点過程です。

  1. 重なりのない時間区間でのイベント数は独立
  2. 微小区間 $[t, t+\Delta t)$ でのイベント発生確率は $\lambda \Delta t + o(\Delta t)$
  3. 微小区間で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()

この可視化から、ポアソン分布の基本的な性質が確認できます。

  1. 左上(PMF): $\lambda$ が小さいとき(1-3)は右に歪んだ形ですが、$\lambda$ が大きくなると(10-20)対称的な釣鐘型に近づきます。これは中心極限定理の効果であり、$\lambda$ が大きいとき正規近似 $N(\lambda, \lambda)$ が使えます。

  2. 右上(二項分布からの収束): $n$ が増えるにつれて二項分布がポアソン分布(黒い四角)に収束しています。$n = 50$ で既にほぼ完全に一致しており、ポアソン近似の有効性が確認できます。

  3. 左下(ポアソン過程): ランダムなイベント発生(赤い縦線)の累積カウントが階段関数として描かれています。赤い破線は理論的な平均 $E[N(t)] = \lambda t$ で、実際の累積カウントはこの周りにランダムに揺らいでいます。

  4. 右下(平均=分散): 異なる $\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)$ が有効

次のステップとして、以下の記事も参考にしてください。