交差点に立って車が通過するのを数えています。1台目の車が来るまでの待ち時間は指数分布に従います。では、$\alpha$ 台目の車が来るまでの待ち時間はどんな分布に従うでしょうか?
この「$\alpha$ 個のイベントが発生するまでの待ち時間」の分布がガンマ分布(gamma distribution)です。指数分布($\alpha = 1$のガンマ分布)を一般化した連続分布であり、正の値を取る確率変数のモデリングに広く使われます。
ガンマ分布を理解すると、以下のような応用に活用できます。
- 信頼性工学: 機器の寿命や故障までの時間のモデリング
- ベイズ統計: ポアソン分布の共役事前分布
- 統計的推測: カイ二乗分布はガンマ分布の特殊ケースであり、検定や信頼区間に不可欠
- 待ち行列理論: サービス時間の分布
- 保険数理: 保険金請求額の分布
本記事の内容
- ガンマ関数の定義と性質
- ガンマ分布の定義とポアソン過程からの導出
- 期待値・分散・MGFの計算
- 指数分布・カイ二乗分布との関係
- 再生性
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- ポアソン分布 — ポアソン過程の基礎
- 確率母関数・積率母関数 — MGFの計算
ガンマ関数 — 階乗の連続版
定義
ガンマ分布を定義する前に、その名前の由来であるガンマ関数を導入します。
$$ \begin{equation} \Gamma(\alpha) = \int_0^{\infty} t^{\alpha-1} e^{-t} \, dt, \quad \alpha > 0 \end{equation} $$
ガンマ関数は階乗を実数(さらには複素数)に拡張したものです。
重要な性質
再帰関係: 部分積分により $\Gamma(\alpha + 1) = \alpha \Gamma(\alpha)$
階乗との関係: 正の整数 $n$ に対して $\Gamma(n) = (n-1)!$
特殊値: $\Gamma(1) = 1$、$\Gamma(1/2) = \sqrt{\pi}$
$\Gamma(1/2) = \sqrt{\pi}$ という結果は、ガウス積分 $\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$ から導かれる美しい結果です。
ガンマ関数が定義できたところで、ガンマ分布を導入しましょう。
ガンマ分布の定義
確率密度関数
$X$ がパラメータ $\alpha > 0$(形状パラメータ)と $\beta > 0$(レートパラメータ)のガンマ分布に従う($X \sim \text{Gamma}(\alpha, \beta)$)とき
$$ \begin{equation} f(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} x^{\alpha-1} e^{-\beta x}, \quad x > 0 \end{equation} $$
正規化定数 $\beta^\alpha / \Gamma(\alpha)$ は $\int_0^{\infty} f(x) dx = 1$ を保証します。$u = \beta x$ と置換すれば
$$ \int_0^{\infty} \frac{\beta^\alpha}{\Gamma(\alpha)} x^{\alpha-1} e^{-\beta x} dx = \frac{1}{\Gamma(\alpha)} \int_0^{\infty} u^{\alpha-1} e^{-u} du = \frac{\Gamma(\alpha)}{\Gamma(\alpha)} = 1 $$
パラメータの2つの慣習
ガンマ分布には2つのパラメトリゼーションがあるため注意が必要です。
レートパラメトリゼーション: $\text{Gamma}(\alpha, \beta)$ — $\beta$ はレート(rate)で、密度は $\beta^\alpha x^{\alpha-1} e^{-\beta x} / \Gamma(\alpha)$
スケールパラメトリゼーション: $\text{Gamma}(\alpha, \theta)$ — $\theta = 1/\beta$ はスケール(scale)で、密度は $x^{\alpha-1} e^{-x/\theta} / (\theta^\alpha \Gamma(\alpha))$
本記事ではレートパラメトリゼーションを主に使います。
ポアソン過程からの導出
ポアソン過程(レート $\lambda$)で $\alpha$ 番目のイベントが発生するまでの待ち時間 $T_\alpha$ は、$\text{Gamma}(\alpha, \lambda)$ に従います。
$T_\alpha \leq t$ であることと、時間 $[0, t]$ にイベントが $\alpha$ 個以上発生することは同値なので
$$ P(T_\alpha \leq t) = P(N(t) \geq \alpha) = 1 – \sum_{k=0}^{\alpha-1} \frac{(\lambda t)^k e^{-\lambda t}}{k!} $$
これを $t$ で微分するとガンマ分布の密度が得られます。
期待値と分散の導出
期待値
$$ E[X] = \int_0^{\infty} x \cdot \frac{\beta^\alpha}{\Gamma(\alpha)} x^{\alpha-1} e^{-\beta x} dx = \frac{\beta^\alpha}{\Gamma(\alpha)} \int_0^{\infty} x^\alpha e^{-\beta x} dx $$
$u = \beta x$ と置換すると $dx = du/\beta$、$x = u/\beta$ なので
$$ = \frac{\beta^\alpha}{\Gamma(\alpha)} \cdot \frac{1}{\beta^{\alpha+1}} \int_0^{\infty} u^\alpha e^{-u} du = \frac{1}{\beta \Gamma(\alpha)} \Gamma(\alpha + 1) = \frac{\alpha \Gamma(\alpha)}{\beta \Gamma(\alpha)} = \frac{\alpha}{\beta} $$
$$ \begin{equation} E[X] = \frac{\alpha}{\beta} \end{equation} $$
分散
同様に $E[X^2]$ を計算すると
$$ E[X^2] = \frac{\alpha(\alpha+1)}{\beta^2} $$
$$ \text{Var}(X) = E[X^2] – (E[X])^2 = \frac{\alpha(\alpha+1)}{\beta^2} – \frac{\alpha^2}{\beta^2} = \frac{\alpha}{\beta^2} $$
$$ \begin{equation} \text{Var}(X) = \frac{\alpha}{\beta^2} \end{equation} $$
積率母関数
$$ M_X(t) = E[e^{tX}] = \frac{\beta^\alpha}{\Gamma(\alpha)} \int_0^{\infty} x^{\alpha-1} e^{-(\beta-t)x} dx = \left(\frac{\beta}{\beta – t}\right)^\alpha, \quad t < \beta $$
特殊ケースと他の分布との関係
指数分布: $\alpha = 1$ のとき $\text{Gamma}(1, \beta) = \text{Exp}(\beta)$
カイ二乗分布: 自由度 $\nu$ のカイ二乗分布は $\chi^2(\nu) = \text{Gamma}(\nu/2, 1/2)$
アーラン分布: $\alpha$ が正の整数のとき、ガンマ分布はアーラン分布と呼ばれる
再生性
独立な $X \sim \text{Gamma}(\alpha_1, \beta)$、$Y \sim \text{Gamma}(\alpha_2, \beta)$ に対して
$$ X + Y \sim \text{Gamma}(\alpha_1 + \alpha_2, \beta) $$
同じレートパラメータを持つガンマ分布の和は、形状パラメータを足し合わせたガンマ分布です。
Pythonでの実装と可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# (a) 異なるα,βでのPDF
ax = axes[0, 0]
x = np.linspace(0.01, 20, 500)
params = [(1, 0.5), (2, 0.5), (3, 0.5), (5, 1), (9, 2)]
for alpha, beta in params:
pdf = stats.gamma.pdf(x, alpha, scale=1/beta)
ax.plot(x, pdf, linewidth=2,
label=f'$\\alpha$={alpha}, $\\beta$={beta}')
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)
ax.set_title('Gamma Distribution PDF', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 0.5)
# (b) カイ二乗分布との関係
ax = axes[0, 1]
x = np.linspace(0.01, 20, 500)
dfs = [1, 2, 3, 5, 10]
for df in dfs:
pdf_chi2 = stats.chi2.pdf(x, df)
pdf_gamma = stats.gamma.pdf(x, df/2, scale=2)
ax.plot(x, pdf_chi2, linewidth=2, label=f'$\\chi^2$({df})')
ax.plot(x, pdf_gamma, '--', linewidth=1, alpha=0.7)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('f(x)', fontsize=12)
ax.set_title('Chi-squared = Gamma($\\nu$/2, 1/2)\nSolid: $\\chi^2$, Dashed: Gamma',
fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 0.5)
# (c) ポアソン過程からの導出
ax = axes[1, 0]
np.random.seed(42)
lam = 2 # ポアソン過程のレート
n_sim = 50000
alpha_vals = [1, 2, 3, 5]
x = np.linspace(0, 6, 300)
for alpha in alpha_vals:
# α個の指数分布の和をシミュレーション
wait_times = np.sum(np.random.exponential(1/lam, (n_sim, alpha)), axis=1)
ax.hist(wait_times, bins=80, density=True, alpha=0.4,
edgecolor='gray', linewidth=0.3,
label=f'Sim: sum of {alpha} Exp({lam})')
# 理論PDF
ax.plot(x, stats.gamma.pdf(x, alpha, scale=1/lam), linewidth=2)
ax.set_xlabel('x (waiting time)', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title(f'Sum of Exp($\\lambda$={lam}) → Gamma\n'
'(Poisson process waiting time)', fontsize=12)
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
# (d) ベイズ推論のイメージ(共役事前分布)
ax = axes[1, 1]
x = np.linspace(0, 10, 300)
# 事前分布: Gamma(2, 1)
alpha_prior, beta_prior = 2, 1
prior = stats.gamma.pdf(x, alpha_prior, scale=1/beta_prior)
ax.plot(x, prior, 'b-', linewidth=2, label='Prior: Gamma(2, 1)')
ax.fill_between(x, prior, alpha=0.1, color='blue')
# データ: n=5, sum_x=15 → 事後: Gamma(2+5, 1+15)
alpha_post, beta_post = 2+5, 1+5
posterior = stats.gamma.pdf(x, alpha_post, scale=1/beta_post)
ax.plot(x, posterior, 'r-', linewidth=2,
label=f'Posterior: Gamma({alpha_post}, {beta_post})')
ax.fill_between(x, posterior, alpha=0.1, color='red')
# 最尤推定値
mle = 5 / 5 # sum_x / n
ax.axvline(mle, color='green', linestyle='--', linewidth=2,
label=f'MLE = {mle:.1f}')
ax.set_xlabel('$\\lambda$', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Bayesian Update: Gamma as Conjugate Prior\n'
'for Poisson Likelihood', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('gamma_distribution.png', dpi=150, bbox_inches='tight')
plt.show()
この可視化から、ガンマ分布の性質と応用が確認できます。
-
左上(PDF): $\alpha = 1$ は指数分布(単調減少)、$\alpha > 1$ は山型で $\alpha$ が大きいほどピークが右に移動し、形が対称的になります。$\alpha$ は形状を、$\beta$ はスケールを制御しています。
-
右上(カイ二乗分布): カイ二乗分布(実線)とガンマ分布(破線)が完全に重なっており、$\chi^2(\nu) = \text{Gamma}(\nu/2, 1/2)$ の関係が確認できます。
-
左下(ポアソン過程): $\alpha$ 個の独立な指数分布の和(ヒストグラム)がガンマ分布のPDF(実線)とよく一致しており、ポアソン過程の待ち時間としてのガンマ分布の解釈が確認できます。
-
右下(ベイズ推論): ガンマ分布がポアソン尤度の共役事前分布であることを示しています。事前分布(青)が弱い情報を持ち、データ観測後に事後分布(赤)がより集中した形に更新されています。
まとめ
本記事では、ガンマ分布の定義・導出・性質・応用を解説しました。
- ガンマ分布 $f(x) = \beta^\alpha x^{\alpha-1} e^{-\beta x} / \Gamma(\alpha)$ は正の連続確率変数の汎用的な分布
- 期待値 $\alpha/\beta$、分散 $\alpha/\beta^2$
- ポアソン過程の$\alpha$番目のイベントまでの待ち時間として自然に導出される
- 指数分布($\alpha=1$)とカイ二乗分布($\alpha=\nu/2, \beta=1/2$)は特殊ケース
- 再生性: 同じ $\beta$ を持つガンマ分布の和はガンマ分布
- ポアソン分布の共役事前分布としてベイズ統計で重要
次のステップとして、以下の記事も参考にしてください。