🎓 レベル:標準 | 重要度:A(必須)
📎 前提:ベータ二項モデル | 数理:共役事前分布(統計)・ポアソン分布(統計)・指数分布・ガンマ分布・ベータ分布(統計)
要点(BLUF)
- 発生率 の共役事前はガンマ分布。ポアソン尤度でも指数尤度でも事後は再びガンマになります。「比率の事前=ベータ、カウント・待ち時間の事前=ガンマ」と覚えます。
- 更新則は一見ちがって見えますが、 には総発生数、 には総観測量(期間・時間)を足すと統一的に読めます。事後平均 発生数 / 観測量。
- ポアソンの事後予測は負の二項分布になり、 の不確実性ぶん過分散(分散 > 平均)が生じます。点推定のポアソン予測は分散を過小評価します。
1. ガンマ–ポアソン:カウントの共役
単位期間あたりの平均発生回数 を推定します。観測 が独立にポアソン分布に従うとします(ポアソン分布)。
尤度のカーネル( は を含まない定数):
事前のカーネル(ガンマ、レート表記 ):
事後 = 積。肩の指数を足すだけ:
これは のカーネル。よって
import numpy as np
from scipy import stats
from scipy.integrate import trapezoid # numpy 2.0+ で np.trapz は廃止
counts = np.array([3, 1, 4, 2, 3, 0, 2, 5, 1, 2]) # n=10 日ぶんの発生数
n = len(counts); S = counts.sum()
alpha, beta = 2.0, 1.0 # 事前 Gamma(2,1)(レート表記)
a_post, b_post = alpha + S, beta + n # 事後 Gamma(α+Σx, β+n)
post = stats.gamma(a=a_post, scale=1/b_post) # scipy は scale=1/rate
lo, hi = post.interval(0.95)
print(f"Σx={S}, n={n} → 事後 Gamma({a_post:.0f}, {b_post:.0f})")
print(f"事前平均(発生率)={alpha/beta:.3f} 事後平均={post.mean():.4f} (=25/11)")
print(f"95%信用区間 = [{lo:.3f}, {hi:.3f}]")
# 閉じた式 vs 数値積分で事後一致を確認
lam = np.linspace(1e-4, 8, 4000)
like = np.exp(-n*lam) * lam**S # ポアソン尤度カーネル
pri = stats.gamma(a=alpha, scale=1/beta).pdf(lam)
post_num = (like*pri) / trapezoid(like*pri, lam)
print(f"閉じた式 vs 数値積分 の最大差 = {np.max(np.abs(post_num - post.pdf(lam))):.2e}")
出力:
Σx=23, n=10 → 事後 Gamma(25, 11)
事前平均(発生率)=2.000 事後平均=2.2727 (=25/11)
95%信用区間 = [1.471, 3.246]
閉じた式 vs 数値積分 の最大差 = 1.31e-14
出力の意味:事前 (事前平均の発生率 )に、10日で計23件のデータが入って、事後 、事後平均 件/日。事前平均 とデータの平均 の間に落ち着きます。閉じた式とグリッド数値積分の差は で、ベータ–二項と同じく完全一致です。
2. ガンマ–指数:待ち時間の共役
今度は事象の待ち時間(指数分布、レート )からレートを推定します。指数分布の尤度は
同じガンマ事前 を掛けると、
すなわち 。ポアソンとは足し先が入れ替わっています——指数では が形状 に、 がレート に足されます。
import numpy as np
from scipy import stats
waits = np.array([0.8, 2.1, 0.5, 1.7, 0.9, 1.3, 2.4, 0.3]) # n=8 の待ち時間
n = len(waits); T = waits.sum()
alpha, beta = 2.0, 2.0 # 事前 Gamma(2,2)
a_post, b_post = alpha + n, beta + T # 事後 Gamma(α+n, β+Σx)
post = stats.gamma(a=a_post, scale=1/b_post)
print(f"Σx={T:.1f}, n={n} → 事後 Gamma({a_post:.0f}, {b_post:.1f})")
print(f"事後平均(レート λ) = {post.mean():.4f}")
print(f"平均待ち時間 1/λ の事後平均 = {b_post/(a_post-1):.4f}") # E[1/λ]=β/(α-1)
出力:
Σx=10.0, n=8 → 事後 Gamma(10, 12.0)
事後平均(レート λ) = 0.8333
平均待ち時間 1/λ の事後平均 = 1.3333
出力の意味:8件の事象を観測するのに計 かかったので、事後 、発生レートの事後平均 件/単位時間。逆数の平均待ち時間は 単位時間( は逆ガンマ分布に従い、その平均が )。
なお、指数尤度の事後予測(次の待ち時間 )は を事後ガンマで積分するとロマックス分布(パレート第II種)になります。 の結果で、指数分布より裾が重い(まれに非常に長い待ち時間が出る)。ポアソンの予測が過分散の負の二項になったのと同じ理屈で、レートの不確実性が予測の裾を伸ばします。
3. 統一的な読み方:α=総発生数、β=総観測量
ポアソンとガンマで足し先が入れ替わって見えるのは、「1観測が何を運ぶか」が違うだけです。どちらも
と読めます。
| ポアソン(カウント) | 指数(待ち時間) | |
|---|---|---|
| 1観測 が運ぶもの | 発生数 件・期間 1 | 発生 1 件・時間 |
| 総発生数 → に加算 | ||
| 総観測量 → に加算 | ||
| 事後平均 |
要するに発生率 = 総発生数 / 総観測量であり、ハイパーパラメータ は「事前に見込んだ仮想の発生数・観測量」(擬似観測)。 が事前平均レート、 が大きいほど事前が強い、と ベータ二項モデル と同じ構図で読めます。
4. 事後予測は負の二項分布:過分散が生まれる
ポアソンの事後予測(次の期間の発生数 )は、 を事後で積分すると閉じた形の負の二項分布になります。
ポアソンは「分散 = 平均」(等分散)ですが、 がまだ不確かなぶん、予測には余分なばらつきが乗って過分散(分散 > 平均)になります。これは現実のカウントデータがしばしばポアソンより散らばる理由の一つです。
import numpy as np
from scipy import stats
a_post, b_post = 25, 11 # §1 の事後 Gamma(25,11)
# 事後予測 = 負の二項 NB(r=α', p=β'/(β'+1))
pp = stats.nbinom(n=a_post, p=b_post/(b_post + 1))
# プラグイン:λ を事後平均に固定した素朴なポアソン予測
plug = stats.poisson(a_post / b_post)
print(f"事後予測 NB: 平均={pp.mean():.3f}, 分散={pp.var():.3f}")
print(f"プラグイン Poisson: 平均={plug.mean():.3f}, 分散={plug.var():.3f}")
出力:
事後予測 NB: 平均=2.273, 分散=2.479
プラグイン Poisson: 平均=2.273, 分散=2.273
出力の意味:平均はどちらも ですが、事後予測の分散 は、プラグインのポアソン分散 (=平均、等分散)より大きい。差の が「 をまだ確定できていない不確実性」のぶんです。点推定のポアソンで予測区間を作ると、この過分散を取りこぼして過信します(信用区間と事後予測分布 と同じ構図がカウントでも起こる)。
⚠️ よくある誤解
- 「ポアソンも指数も更新は同じ」ではない:足し先が逆です。ポアソンは 、指数は 。「=総発生数、=総観測量」で覚えれば取り違えません。
- レート とスケール の取り違え:ガンマには「レート 」と「スケール 」の2流儀。更新則 はレート表記。SciPy の
stats.gammaはscale(=)を取るので、scale=1/rateと渡します。 - 「事後予測はポアソンのまま」ではない: の不確実性を積分すると負の二項になり、過分散します。等分散のポアソンで予測区間を作るのは過信。
- 「 が事後平均なら待ち時間も逆数でよい」ではない: の事後平均は ではなく 。非線形変換の平均は取り違えやすい点です。
関連ノート
- ベータ二項モデル
- 正規正規モデル(次のトピック・連続値の平均の共役)
- 信用区間と事後予測分布(事後予測の一般式・過分散の背景)
- 共役事前分布(統計・完全導出と試験での問われ方)
- ポアソン分布(統計・ポアソン尤度側)
- 指数分布・ガンマ分布・ベータ分布(統計・指数/ガンマの素性)
- 第2章 共役事前分布 目次
- ベイズ統計テキスト 全体目次