コインを10回投げて7回表が出たとします。「このコインは公平か?」という問いに答えたいとき、統計学には2つの全く異なるアプローチがあります。
頻度主義の立場では、コインの表が出る確率 $\theta$ は「未知だが固定された定数」です。手元のデータから $\theta$ の最尤推定値 $\hat{\theta} = 0.7$ を計算し、「$\theta = 0.5$ という帰無仮説のもとで、10回中7回以上表が出る確率(p値)」を求めます。
ベイズ統計の立場では、$\theta$ は「不確実な量」であり、確率分布で記述します。まず $\theta$ についての事前分布を設定し、データを観測した後にベイズの定理で事後分布を計算します。事後分布を見れば、$\theta$ がどの範囲にありそうかが直接わかります。
この2つのアプローチ — ベイズ統計と頻度主義 — は、同じ問題に対して異なる問いを立て、異なる手続きで答えを出します。時に同じ結論に至ることもありますが、特に小標本や事前情報がある場面では、両者の違いが顕著に現れます。
両アプローチの違いを正しく理解すると、以下の判断が可能になります。
- 手法の選択: 問題の性質に応じてどちらが適切かを判断できる
- 結果の正しい解釈: 信頼区間と信用区間、p値とベイズファクターの意味の違いを区別できる
- 事前情報の活用: いつ、どのように事前分布を使うべきかがわかる
- 学術論文や実務での議論: 統計的な議論の背景にある思想を理解できる
本記事の内容
- 確率の解釈の違い: 頻度確率 vs 主観確率
- パラメータ推定の比較: MLE vs MAP推定 / 事後分布
- 区間推定の比較: 信頼区間 vs 信用区間
- 仮説検定の比較: p値 vs ベイズファクター
- Pythonでのコイン投げ問題の比較実装
- 事前分布の影響とデータ量による収束
- それぞれの長所と使い分けのガイドライン
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
確率の解釈 — 2つの哲学
ベイズ統計と頻度主義の最も根本的な違いは、「確率とは何か」という問いに対する答えです。この哲学的な違いが、推定・検定・区間推定の全てに波及していきます。
頻度主義の確率 — 長期的な相対頻度
頻度主義(frequentism)では、確率は同じ実験を無限回繰り返したときの相対頻度として定義されます。
「サイコロで1が出る確率が $1/6$」とは、サイコロを無限回振ったとき、1が出る割合が $1/6$ に収束するということです。この定義は「繰り返し可能な実験」に対して明確に意味を持ちます。
では、「明日の降水確率が70%」はどう解釈されるでしょうか。頻度主義的には、「過去の膨大なデータのうち、今日と同じ気象条件の日の70%で翌日に雨が降った」という意味になります。明日という特定の日は1回しか訪れないため、厳密な意味での頻度確率にはなじみにくい概念です。
頻度主義で最も重要な帰結は、パラメータは固定された定数であり、パラメータに確率を割り当てることはできないという点です。コインの表が出る確率 $\theta$ は、何らかの固定された値(例えば 0.5 や 0.7)を持っており、「$\theta$ が 0.6 から 0.8 の間にある確率」という表現は頻度主義の枠組みでは意味を持ちません。
ベイズの確率 — 不確実性の度合い
ベイズ統計(Bayesian statistics)では、確率は不確実性に対する主観的な確信度として定義されます。
「明日の降水確率が70%」は、「私の知識と情報に基づいて、明日雨が降ることに70%の確信を持っている」という意味です。この定義は繰り返し実験に限定されず、一回限りの事象にも適用できます。
ベイズの枠組みでは、パラメータ $\theta$ は確率変数として扱われます。$\theta$ の値を直接知ることはできないため、その不確実性を確率分布で表現するのです。データを観測する前の不確実性が「事前分布」、観測した後の不確実性が「事後分布」です。
ベイズ的確率の重要な特徴は、確率が主観的な量であることを積極的に認める点です。同じデータを見ても、事前知識の異なる2人の研究者は異なる事後分布を得ます。これは欠点ではなく、「利用可能な情報が異なれば結論も異なるべきだ」という合理的な立場の反映です。
2つの確率観の比較
| 観点 | 頻度主義 | ベイズ |
|---|---|---|
| 確率の定義 | 長期的な相対頻度 | 主観的な確信度 |
| パラメータ $\theta$ | 固定された未知の定数 | 確率変数(分布で記述) |
| データ $x$ | 確率変数(実験の実現値) | 観測済みの固定された値 |
| 事前情報 | 使わない(データだけが情報源) | 事前分布として明示的に組み込む |
| 推論の方向 | $P(\text{data}|\theta)$ を使って $\theta$ を推定 | $P(\theta|\text{data})$ を計算する |
ここで注目すべきは、データとパラメータの「確率変数」としての立場が逆転していることです。頻度主義ではデータが確率変数でパラメータが定数、ベイズではデータが既知の定数でパラメータが確率変数です。
この根本的な違いが、推定・検定・区間推定の全てに影響を及ぼします。次に、パラメータ推定でこの違いがどう現れるかを見ていきましょう。
パラメータ推定の比較
頻度主義: 最尤推定法(MLE)
頻度主義で最も広く使われる推定手法が最尤推定法(Maximum Likelihood Estimation, MLE)です。
最尤推定法は、「観測されたデータが最も生じやすい(尤もらしい)パラメータ値を選ぶ」というシンプルな原理に基づいています。数学的には、尤度関数を最大化するパラメータ値を求めます。
$$ \hat{\theta}_{\text{MLE}} = \arg\max_{\theta} \, L(\theta) = \arg\max_{\theta} \, P(\text{data} | \theta) $$
たとえば、コインを $n$ 回投げて $k$ 回表が出た場合、尤度関数は
$$ L(\theta) = \binom{n}{k} \theta^k (1 – \theta)^{n – k} $$
対数尤度をとってから $\theta$ で微分し、ゼロとおくと
$$ \frac{d}{d\theta} \log L(\theta) = \frac{k}{\theta} – \frac{n – k}{1 – \theta} = 0 $$
これを $\theta$ について解くと
$$ \hat{\theta}_{\text{MLE}} = \frac{k}{n} $$
10回投げて7回表なら $\hat{\theta}_{\text{MLE}} = 0.7$ です。MLEは直感的にも自然な推定値を与えます。
MLEの特徴を整理しておきましょう。
- 客観的: 事前分布の選択という主観的要素が入らない
- 漸近的に最適: データが十分に多いとき、不偏で効率的な推定量になる(漸近正規性)
- 小標本での不安定性: データが少ないと推定値が極端になりやすい(例: 3回投げて3回表なら $\hat{\theta} = 1.0$)
- 点推定しか返さない: 推定値の不確実性は別途計算が必要(標準誤差や信頼区間)
ベイズ: MAP推定と事後分布
ベイズ推定では、ベイズの定理を使って事後分布を計算します。
$$ p(\theta | \text{data}) \propto p(\text{data} | \theta) \cdot p(\theta) $$
事後分布はパラメータ $\theta$ の確率分布であり、$\theta$ がどの範囲にありそうか、どれくらいの不確実性があるかを完全に記述します。
事後分布からの代表的な点推定には以下の2つがあります。
MAP推定(Maximum A Posteriori): 事後分布のモード(最頻値)を取ります。
$$ \hat{\theta}_{\text{MAP}} = \arg\max_{\theta} \, p(\theta | \text{data}) = \arg\max_{\theta} \, p(\text{data} | \theta) \cdot p(\theta) $$
事後平均: 事後分布の期待値を取ります。
$$ \hat{\theta}_{\text{PM}} = E[\theta | \text{data}] = \int \theta \cdot p(\theta | \text{data}) \, d\theta $$
コインの例で、事前分布として $\text{Beta}(\alpha, \beta)$ を使うと、事後分布は $\text{Beta}(\alpha + k, \beta + n – k)$ になります(共役性)。事後平均は
$$ \hat{\theta}_{\text{PM}} = \frac{\alpha + k}{\alpha + \beta + n} $$
$\text{Beta}(1, 1)$(一様分布)を事前分布にすると、$\hat{\theta}_{\text{PM}} = (1 + 7) / (2 + 10) = 8/12 \approx 0.667$ です。MLEの $0.7$ と異なりますが、事前分布が $\theta = 0.5$ の方に引っ張っていることがわかります。
ベイズ推定の特徴を整理します。
- 事前情報の活用: 過去の経験や専門知識を事前分布として組み込める
- 不確実性の完全な記述: 事後分布が推定の不確実性を自然に表現する
- 小標本でも安定: 事前分布が正則化の役割を果たし、極端な推定値を防ぐ
- 事前分布の選択に主観が入る: 事前分布の設定が結果に影響する
MLE と MAP の関係
両者には重要な数学的関係があります。一様事前分布($p(\theta) = \text{const}$)を使った場合、MAP推定はMLEと一致します。
$$ \hat{\theta}_{\text{MAP}} = \arg\max_{\theta} \, p(\text{data} | \theta) \cdot \text{const} = \arg\max_{\theta} \, p(\text{data} | \theta) = \hat{\theta}_{\text{MLE}} $$
つまり、MLEは「何も知らない(一様な)事前分布を暗黙に使ったベイズ推定」と見なすことができます。
さらに深い対応があります。MAP推定における事前分布は、機械学習でいう正則化に対応しています。
- 事前分布 $p(\theta) \propto \exp\!\bigl(-\frac{\lambda}{2}\|\theta\|^2\bigr)$ → L2正則化(リッジ回帰)
- 事前分布 $p(\theta) \propto \exp(-\lambda\|\theta\|_1)$ → L1正則化(ラッソ)
正則化パラメータ $\lambda$ は事前分布の「強さ」を制御しており、ベイズ的には「事前情報をどれだけ信じるか」に対応しています。この対応関係は、頻度主義とベイズの間に意外な接点があることを示しています。
推定の比較を見たところで、次は区間推定における2つのアプローチの違いを見ていきましょう。区間推定は実用上非常に重要であり、両者の解釈の違いが最も混同されやすい領域です。
区間推定の比較: 信頼区間 vs 信用区間
信頼区間(Confidence Interval) — 頻度主義
95%信頼区間の正確な解釈は、「この手続きを無限回繰り返したとき、計算された区間の95%が真の $\theta$ を含む」です。
注意すべきは、「特定の信頼区間の中に $\theta$ が入る確率が95%」とは言えないことです。頻度主義では $\theta$ は定数であり、特定の区間 $[a, b]$ に対して「$\theta \in [a, b]$」は真か偽のどちらかであり、確率を語れません。
あるアナロジーで説明しましょう。信頼区間は「釣り竿」のようなものです。100回釣り竿を投げれば95回は魚(真の $\theta$)に当たりますが、今回の1投が当たっているかどうかは、確率では語れません。
信用区間(Credible Interval) — ベイズ
95%ベイズ信用区間の解釈は、「パラメータ $\theta$ がこの区間内にある事後確率が95%」です。
これは多くの人が信頼区間に期待する解釈そのものです。ベイズでは $\theta$ が確率変数なので、「$\theta$ がある区間に入る確率」を直接語ることができるのです。
両者が一致する場合と異なる場合
無情報事前分布を使うと、多くの場合、信頼区間と信用区間は数値的にほぼ一致します。しかし、以下の状況では両者が異なります。
情報的事前分布を使うとき: ベイズ信用区間は事前分布の情報を反映するため、データだけから計算される信頼区間とずれます。事前分布がデータと整合的であれば信用区間の方が狭く(精度が高く)なり、不整合であれば引っ張られます。
パラメータ空間に制約があるとき: たとえば $\theta > 0$ であることがわかっている場合、頻度論の信頼区間は負の値を含むことがありますが、ベイズ信用区間は自然にパラメータ空間内に収まります。
非対称な尤度の場合: 尤度関数が歪んでいるとき、信頼区間と信用区間のカバレッジ特性(真の値を含む割合)が異なることがあります。
解釈の比較表
| 観点 | 信頼区間(頻度論) | 信用区間(ベイズ) |
|---|---|---|
| 対象 | 手続きの信頼性 | パラメータの確率 |
| 解釈 | 手続きを繰り返すと95%が真値を含む | この区間にパラメータがいる確率が95% |
| パラメータ | 固定された定数(確率を語れない) | 確率変数(確率を語れる) |
| 事前情報 | 使わない | 反映される |
| 直感的さ | やや非直感的 | 多くの人が求める解釈に合致 |
多くの統計学の入門書で、信頼区間を「パラメータがこの区間にある確率が95%」と誤って説明していることがありますが、それはベイズ信用区間の解釈です。この混同は、統計教育における最もありふれた誤解の一つです。
区間推定の違いを理解したところで、次は仮説検定における2つのアプローチの違いを見ていきましょう。
仮説検定の比較: p値 vs ベイズファクター
p値(頻度主義)
頻度主義の仮説検定では、帰無仮説 $H_0$ のもとでのp値を計算します。
$$ p\text{-value} = P(\text{データ以上に極端な結果} \mid H_0) $$
p値は「帰無仮説が正しいとき、このようなデータ(またはそれ以上に極端なデータ)が偶然に得られる確率」です。
p値について最もよくある誤解は、「p値は帰無仮説が正しい確率だ」という解釈です。p値は $P(\text{data} | H_0)$ の一種であり、$P(H_0 | \text{data})$ ではありません。この2つは一般に等しくありません。
たとえば、p値が0.03だとしましょう。これは「$H_0$ が正しいとき、このデータが得られる確率が3%」であって、「$H_0$ が正しい確率が3%」ではないのです。「$H_0$ が正しい確率」はベイズの枠組みでないと計算できません。
ベイズファクター(ベイズ)
ベイズ的な仮説検定では、2つの仮説の相対的な支持度をベイズファクターで評価します。
$$ \text{BF}_{10} = \frac{P(\text{data} | H_1)}{P(\text{data} | H_0)} $$
ベイズファクターは「データが $H_1$ のもとで $H_0$ のもとの何倍生じやすいか」を表します。
- $\text{BF}_{10} > 1$: データは $H_1$ を支持
- $\text{BF}_{10} < 1$: データは $H_0$ を支持
- $\text{BF}_{10} = 1$: どちらの仮説もデータを同程度に説明する
Jeffreysの基準では、$\text{BF}_{10} > 10$ で「強い証拠」、$\text{BF}_{10} > 100$ で「決定的な証拠」とされます。
ベイズファクターの重要な利点は、帰無仮説を支持する方向の証拠も定量化できることです。p値は「$H_0$ に反する方向の証拠の強さ」しか測定できませんが、ベイズファクターは「$H_0$ と $H_1$ のどちらがデータをよりよく説明するか」を対称的に評価します。
Lindleyのパラドクス
p値とベイズファクターが矛盾する有名な例として、Lindleyのパラドクスがあります。
大標本でわずかな差を検出した場合に生じます。
- p値は非常に小さい → 「統計的に有意」
- ベイズファクターは $H_0$ を支持 → 「実質的な差はない」
これは両者が異なる問いに答えているためです。p値は「$H_0$ のもとでのデータの稀さ」を測定しており、大標本ではわずかな差でも「稀」と判定します。一方、ベイズファクターは「$H_0$ と $H_1$ のどちらがデータを説明するか」を比較しており、$H_1$ が広い範囲のパラメータを想定している場合、わずかな差に対して $H_1$ は「非効率」な説明を提供するため、$H_0$ が支持されるのです。
検定方法の比較表
| 観点 | p値(頻度論) | ベイズファクター |
|---|---|---|
| 答える問い | $H_0$ のもとでデータはどれだけ稀か | $H_0$ と $H_1$ のどちらがデータを説明するか |
| $H_0$ の支持 | 直接的には不可 | 可能($\text{BF}_{10} < 1$) |
| 事前分布 | 不要 | 必要($H_1$ のパラメータ空間に対する事前分布) |
| 解釈の直感性 | 非直感的(よく誤解される) | 比較的直感的 |
| サンプルサイズ依存 | 大標本で必ず $H_0$ を棄却 | サンプルサイズに対してより安定 |
仮説検定における違いを理解したところで、Python を使って具体的な問題に両アプローチを適用し、結果を比較しましょう。
Python でコイン投げ問題を両アプローチで解く
頻度主義とベイズの推定の比較
同じデータに対する両者の推定を並べて可視化します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
# コイン投げの観測: n回中k回表
n = 20
k = 14
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
p_grid = np.linspace(0, 1, 500)
# --- (a) 尤度関数と事後分布の比較 ---
ax = axes[0]
# 尤度関数
likelihood = stats.binom.pmf(k, n, p_grid)
likelihood_norm = likelihood / np.max(likelihood)
# ベイズ: 一様事前分布 Beta(1,1)
posterior_flat = stats.beta.pdf(p_grid, 1 + k, 1 + n - k)
posterior_flat_norm = posterior_flat / np.max(posterior_flat)
# ベイズ: 情報的事前分布 Beta(5,5)
prior_info = stats.beta.pdf(p_grid, 5, 5)
posterior_info = stats.beta.pdf(p_grid, 5 + k, 5 + n - k)
posterior_info_norm = posterior_info / np.max(posterior_info)
ax.plot(p_grid, likelihood_norm, 'k-', linewidth=2, label='Likelihood (MLE view)')
ax.plot(p_grid, posterior_flat_norm, 'b-', linewidth=2,
label='Posterior (flat prior)')
ax.plot(p_grid, posterior_info_norm, 'r-', linewidth=2,
label='Posterior (Beta(5,5))')
ax.fill_between(p_grid, posterior_info_norm, alpha=0.1, color='red')
# 各推定値を表示
p_mle = k / n
pm_flat = (1 + k) / (2 + n)
pm_info = (5 + k) / (10 + n)
ax.axvline(p_mle, color='black', linestyle=':', linewidth=1.5,
label=f'MLE = {p_mle:.3f}')
ax.axvline(pm_flat, color='blue', linestyle=':', linewidth=1.5,
label=f'Post.mean (flat) = {pm_flat:.3f}')
ax.axvline(pm_info, color='red', linestyle=':', linewidth=1.5,
label=f'Post.mean (info) = {pm_info:.3f}')
ax.set_xlabel('$\\theta$', fontsize=12)
ax.set_ylabel('Normalized density', fontsize=12)
ax.set_title(f'Estimation: {k}/{n} heads', fontsize=13)
ax.legend(fontsize=7, loc='upper left')
ax.grid(True, alpha=0.3)
# --- (b) 信頼区間 vs 信用区間 ---
ax = axes[1]
# 頻度論: Clopper-Pearson 正確信頼区間
ci_lower = stats.beta.ppf(0.025, k, n - k + 1)
ci_upper = stats.beta.ppf(0.975, k + 1, n - k)
# ベイズ: 95%信用区間(一様事前分布)
cri_lower_flat = stats.beta.ppf(0.025, 1 + k, 1 + n - k)
cri_upper_flat = stats.beta.ppf(0.975, 1 + k, 1 + n - k)
# ベイズ: 95%信用区間(情報的事前分布)
cri_lower_info = stats.beta.ppf(0.025, 5 + k, 5 + n - k)
cri_upper_info = stats.beta.ppf(0.975, 5 + k, 5 + n - k)
intervals = [
('Freq. CI\n(Clopper-Pearson)', ci_lower, ci_upper, 'green'),
('Bayes CrI\n(flat prior)', cri_lower_flat, cri_upper_flat, 'blue'),
('Bayes CrI\n(Beta(5,5))', cri_lower_info, cri_upper_info, 'red'),
]
for i, (name, lo, hi, color) in enumerate(intervals):
mid = (lo + hi) / 2
ax.barh(i, hi - lo, left=lo, height=0.4,
color=color, alpha=0.5, edgecolor=color)
ax.plot(mid, i, 'o', color=color, markersize=8)
ax.text(hi + 0.02, i, f'[{lo:.3f}, {hi:.3f}]',
va='center', fontsize=9)
ax.axvline(0.5, color='gray', linewidth=1.5, linestyle='--',
alpha=0.5, label='$\\theta=0.5$')
ax.set_xlabel('$\\theta$', fontsize=12)
ax.set_yticks(range(len(intervals)))
ax.set_yticklabels([x[0] for x in intervals], fontsize=9)
ax.set_title('95% Intervals Comparison', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3, axis='x')
ax.set_xlim(0.3, 1.0)
# --- (c) サンプルサイズによる収束 ---
ax = axes[2]
n_range = np.arange(5, 201)
p_true = 0.7
mle_list = []
pm_flat_list = []
pm_info_list = []
for n_test in n_range:
k_test = int(n_test * p_true)
mle_list.append(k_test / n_test)
pm_flat_list.append((1 + k_test) / (2 + n_test))
pm_info_list.append((5 + k_test) / (10 + n_test))
ax.plot(n_range, mle_list, 'g-', linewidth=2, label='MLE')
ax.plot(n_range, pm_flat_list, 'b--', linewidth=2,
label='Posterior mean (flat)')
ax.plot(n_range, pm_info_list, 'r--', linewidth=2,
label='Posterior mean (Beta(5,5))')
ax.axhline(p_true, color='black', linewidth=1.5, linestyle=':',
label=f'True $\\theta={p_true}$')
ax.set_xlabel('Sample size $n$', fontsize=12)
ax.set_ylabel('Point estimate', fontsize=12)
ax.set_title('Convergence of Estimates', fontsize=13)
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('bayesian_vs_frequentist_estimation.png', dpi=150,
bbox_inches='tight')
plt.show()
このグラフから、両アプローチの違いと共通点が明確に読み取れます。
-
左図(推定の比較): 一様事前分布の事後分布(青)は尤度関数(黒)とほぼ同じ形をしています。これはMLE=0.700に対し、事後平均=0.682とわずかに0.5方向にシフトしているものの、概ね一致していることを示しています。一方、情報的事前分布Beta(5,5)を使うと(赤)、事後平均は0.633まで下がり、事前分布による縮小効果が顕著に現れています。
-
中央図(区間推定の比較): 頻度論のClopper-Pearson信頼区間と、一様事前分布のベイズ信用区間はほぼ同じ幅・位置です。これは無情報事前分布ではベイズと頻度論が近い結論を出すことの具体例です。情報的事前分布の信用区間は0.5方向にシフトし、幅もやや狭くなっています。
-
右図(サンプルサイズと収束): サンプルサイズ $n$ が小さいとき($n < 30$)、情報的事前分布の事後平均(赤)は真の値0.7から離れています。しかし $n$ が大きくなるにつれて、3つの推定量は全て真の値に収束していきます。大標本ではMLE、一様事前分布のベイズ、情報的事前分布のベイズの全てが同じ結果を与えるのです。
Python で事前分布の影響をデータ量ごとに比較する
事前分布の影響がデータ量によってどう変化するかを、より詳しく見てみましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
true_theta = 0.7
theta_grid = np.linspace(0, 1, 500)
# 3つの事前分布
priors = [
('Beta(1,1)', 1, 1, 'blue'),
('Beta(5,5)', 5, 5, 'red'),
('Beta(2,8)', 2, 8, 'green'),
]
# 4つのデータ量
data_sizes = [5, 20, 50, 200]
fig, axes = plt.subplots(len(priors), len(data_sizes),
figsize=(16, 10))
for i, (prior_name, a_prior, b_prior, color) in enumerate(priors):
for j, n in enumerate(data_sizes):
ax = axes[i, j]
k = int(n * true_theta)
# 事前分布
prior_pdf = stats.beta.pdf(theta_grid, a_prior, b_prior)
prior_scaled = prior_pdf / np.max(prior_pdf)
# 事後分布
a_post = a_prior + k
b_post = b_prior + (n - k)
post_pdf = stats.beta.pdf(theta_grid, a_post, b_post)
post_scaled = post_pdf / np.max(post_pdf)
# MLE
mle = k / n
ax.plot(theta_grid, prior_scaled, '--', color=color,
linewidth=1.5, alpha=0.5, label='Prior')
ax.plot(theta_grid, post_scaled, '-', color=color,
linewidth=2.5, label='Posterior')
ax.axvline(true_theta, color='black', linestyle=':',
linewidth=1.5, alpha=0.5)
ax.axvline(mle, color='gray', linestyle='--',
linewidth=1, alpha=0.5)
post_mean = a_post / (a_post + b_post)
ax.set_title(f'{prior_name}, n={n}\n'
f'MLE={mle:.3f}, PM={post_mean:.3f}',
fontsize=9)
ax.set_xlim(0, 1)
ax.grid(True, alpha=0.2)
if j == 0:
ax.set_ylabel(prior_name, fontsize=11, fontweight='bold')
if i == len(priors) - 1:
ax.set_xlabel('$\\theta$', fontsize=10)
if i == 0 and j == 0:
ax.legend(fontsize=7)
plt.suptitle('Effect of Prior and Sample Size on Posterior\n'
f'(True $\\theta$ = {true_theta})',
fontsize=14, y=1.02)
plt.tight_layout()
plt.savefig('prior_vs_data_grid.png', dpi=150, bbox_inches='tight')
plt.show()
この格子状のグラフから、事前分布とデータ量の相互作用がよくわかります。
-
$n=5$(左列): データが少ないため、事前分布の影響が支配的です。Beta(2,8)のように「$\theta$ は小さい」という事前信念を持つと、事後分布はデータ($k/n = 0.6$ ないし $0.8$)と事前分布の中間に位置します。この段階では事前分布の選択が推定結果を大きく左右します。
-
$n=20$(中左列): 事前分布の影響がまだ残っていますが、薄まり始めています。3つの事前分布から出発した事後分布のピーク位置のばらつきが、$n=5$ のときよりも小さくなっています。
-
$n=50, 200$(右列): データが十分に多いと、どの事前分布から出発しても事後分布はほぼ同じ形になります。$n=200$ では3つの行で事後平均がほぼ一致し、全てが真の値 $\theta = 0.7$ に集中しています。
この結果は「十分なデータがあれば、事前分布の選択はほとんど結論に影響しない」というベイズ統計学の重要な性質を示しています。逆に言えば、データが少ないときこそ事前分布の選択が重要であり、慎重な設定が求められます。
Python で両アプローチによる検定を比較する
次に、仮説検定における両アプローチの振る舞いを比較します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from scipy.special import betaln
np.random.seed(42)
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# --- (a) p値 vs 事後確率の散布図 ---
ax = axes[0]
n_obs = 30
n_sim = 1000
p_values = []
post_probs = []
for _ in range(n_sim):
# 真の theta をランダムに生成
theta_true = np.random.uniform(0.3, 0.9)
k_sim = np.random.binomial(n_obs, theta_true)
# 頻度論: H0: theta = 0.5 の二項検定
pval = stats.binom_test(k_sim, n_obs, 0.5)
p_values.append(pval)
# ベイズ: P(theta > 0.5 | data) (一様事前分布)
a_post = 1 + k_sim
b_post = 1 + n_obs - k_sim
post_prob = 1 - stats.beta.cdf(0.5, a_post, b_post)
post_probs.append(post_prob)
ax.scatter(p_values, post_probs, alpha=0.3, s=15, color='steelblue')
ax.axvline(0.05, color='red', linestyle='--', linewidth=1.5,
label='p = 0.05')
ax.axhline(0.95, color='green', linestyle='--', linewidth=1.5,
label='P($\\theta > 0.5$ | data) = 0.95')
ax.set_xlabel('p-value (Frequentist)', fontsize=12)
ax.set_ylabel('P($\\theta > 0.5$ | data) (Bayesian)', fontsize=12)
ax.set_title('p-value vs Bayesian Posterior\nProbability', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
# --- (b) サンプルサイズと判定の違い ---
ax = axes[1]
theta_test = 0.55 # わずかに 0.5 からずれた値
n_range = np.arange(10, 501, 5)
freq_reject = []
bayes_reject = []
for n_test in n_range:
n_reject_freq = 0
n_reject_bayes = 0
n_trials = 500
for _ in range(n_trials):
k_sim = np.random.binomial(n_test, theta_test)
# 頻度論
pval = stats.binom_test(k_sim, n_test, 0.5)
if pval < 0.05:
n_reject_freq += 1
# ベイズ
a_post = 1 + k_sim
b_post = 1 + n_test - k_sim
pp = 1 - stats.beta.cdf(0.5, a_post, b_post)
if pp > 0.95:
n_reject_bayes += 1
freq_reject.append(n_reject_freq / n_trials)
bayes_reject.append(n_reject_bayes / n_trials)
ax.plot(n_range, freq_reject, 'g-', linewidth=2,
label='Freq: reject $H_0$ (p<0.05)')
ax.plot(n_range, bayes_reject, 'b-', linewidth=2,
label='Bayes: P($\\theta$>0.5|data)>0.95')
ax.axhline(0.05, color='gray', linestyle=':', alpha=0.5,
label='Type I error = 0.05')
ax.set_xlabel('Sample size $n$', fontsize=12)
ax.set_ylabel('Detection rate', fontsize=12)
ax.set_title(f'Power Curve ($\\theta$={theta_test})\n'
'Freq vs Bayes', fontsize=13)
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
# --- (c) 事後分布による検定の可視化 ---
ax = axes[2]
n_demo = 30
k_demo = 18 # 30回中18回表
# 事後分布
a_post = 1 + k_demo
b_post = 1 + n_demo - k_demo
post_pdf = stats.beta.pdf(theta_grid, a_post, b_post)
# 二項検定のp値
pval_demo = stats.binom_test(k_demo, n_demo, 0.5)
# P(theta > 0.5 | data)
pp_demo = 1 - stats.beta.cdf(0.5, a_post, b_post)
theta_grid_plot = np.linspace(0, 1, 500)
post_pdf_plot = stats.beta.pdf(theta_grid_plot, a_post, b_post)
ax.plot(theta_grid_plot, post_pdf_plot, 'b-', linewidth=2.5,
label=f'Posterior Beta({a_post},{b_post})')
ax.fill_between(theta_grid_plot, post_pdf_plot,
where=(theta_grid_plot > 0.5), alpha=0.2,
color='green',
label=f'P($\\theta$>0.5|data) = {pp_demo:.3f}')
ax.fill_between(theta_grid_plot, post_pdf_plot,
where=(theta_grid_plot <= 0.5), alpha=0.2,
color='red',
label=f'P($\\theta\\leq$0.5|data) = {1-pp_demo:.3f}')
ax.axvline(0.5, color='black', linestyle='--', linewidth=1.5)
# 95% 信用区間
cri_lo = stats.beta.ppf(0.025, a_post, b_post)
cri_hi = stats.beta.ppf(0.975, a_post, b_post)
ax.axvspan(cri_lo, cri_hi, alpha=0.08, color='blue',
label=f'95% CrI: [{cri_lo:.3f}, {cri_hi:.3f}]')
# p値を注記
ax.text(0.98, 0.95,
f'Binomial test:\np = {pval_demo:.4f}',
transform=ax.transAxes, ha='right', va='top', fontsize=10,
bbox=dict(boxstyle='round', facecolor='lightyellow'))
ax.set_xlabel('$\\theta$', fontsize=12)
ax.set_ylabel('Posterior density', fontsize=12)
ax.set_title(f'Bayesian Analysis: {k_demo}/{n_demo} heads',
fontsize=13)
ax.legend(fontsize=7, loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('bayesian_vs_frequentist_testing.png', dpi=150,
bbox_inches='tight')
plt.show()
このグラフから、仮説検定における2つのアプローチの特徴が読み取れます。
-
左図(p値と事後確率の関係): p値が小さいほど事後確率 $P(\theta > 0.5 | \text{data})$ が高い傾向がありますが、両者は単純な1対1の関係ではありません。赤い線(p = 0.05)と緑の線(事後確率 = 0.95)の付近でデータ点がばらついており、一方の基準では「有意」と判定され、他方では「有意でない」と判定されるケースが存在することがわかります。
-
中央図(検出力の比較): $\theta = 0.55$ というわずかな差を検出するための検出力をサンプルサイズごとに比較しています。両者とも $n$ が大きくなると検出力が上昇しますが、ベイズ的基準の方がやや保守的(検出力が低い)傾向があります。これは、ベイズ的基準が「$\theta > 0.5$ の確率が95%以上」という厳しい条件を求めているためです。
-
右図(事後分布の可視化): 30回中18回表が出た場合の事後分布を示しています。緑色の領域が $P(\theta > 0.5 | \text{data})$ を表し、ベイズ的には「$\theta$ が0.5より大きい確率がいくらか」が直接的にわかります。一方、二項検定のp値は「$\theta = 0.5$ のとき、18回以上表が出る確率」であり、質問の方向が異なることが視覚的に理解できます。
両アプローチの長所と使い分け
頻度主義が適切な場面
1. 客観性が重視されるとき: 臨床試験、品質管理、規制当局への報告など、結果の客観性と再現性が求められる場面では、事前分布の選択という主観的要素のない頻度主義が好まれます。FDA(米国食品医薬品局)をはじめとする規制機関の多くは、歴史的に頻度論的な手法を標準としてきました。
2. 事前情報が全くないとき: 未知の現象の初期探索では、事前分布を設定する根拠がありません。このような場合、データのみに依拠する頻度主義的アプローチの方が透明性が高くなります。
3. 大標本が利用可能なとき: データが十分に多い場合、MLEは漸近的に不偏で効率的になり、信頼区間も正確なカバレッジを保証します。ベイズ的手法との差はほとんどなくなるため、計算が簡単な頻度主義で十分です。
4. 手続きの長期的性質が重要なとき: 「この手続きを長期的に使い続けたとき、誤った結論を出す割合は5%以下に抑えられる」という保証が重要な場面(例えば製造ラインの品質管理)では、頻度主義的な枠組みが適しています。
ベイズ統計が適切な場面
1. 信頼できる事前情報があるとき: 過去の研究結果や専門家の知見がある場合、それを事前分布として活用することで、より効率的な推定が可能になります。特に臨床試験のPhase II/IIIの移行のように、前段階のデータを次の段階に引き継ぐ場面ではベイズの強みが発揮されます。
2. 不確実性の完全な記述が必要なとき: 意思決定には「推定値の信頼性」が不可欠です。ベイズの事後分布は、パラメータのあらゆる可能性に対する確率を与えるため、最適な意思決定(ベイズ決定理論)と自然に結びつきます。
3. 小標本のとき: データが少ないと、MLEは不安定で極端な値を取ることがあります(例: 3回中3回表なら $\hat{\theta} = 1.0$)。ベイズ推定では事前分布が正則化の役割を果たし、極端な推定値を緩和します。
4. 逐次更新が必要なとき: データが逐次的に入ってくる場面(例: センサーデータ、オンライン学習)では、ベイズの「事後分布を新しい事前分布として使う」という仕組みが自然かつ効率的です。カルマンフィルタはこの原理の典型例です。
5. 階層モデルが適切なとき: 複数のグループや複数のパラメータを同時に扱う階層モデルは、ベイズの枠組みで特に強力です。個々のグループのデータが少なくても、全体からの「借用」(shrinkage)によって安定した推定が得られます。
実用上のガイドライン
最後に、実用上の判断基準を整理します。
| 状況 | 推奨アプローチ | 理由 |
|---|---|---|
| 大標本($n > 100$) | どちらでも可 | 両者はほぼ同じ結果を与える |
| 小標本($n < 30$) | ベイズ | 事前分布が安定化に寄与。ただし事前分布の影響を確認すること |
| 事前情報が豊富 | ベイズ | 情報を有効活用できる |
| 事前情報がゼロ | 頻度主義 or 無情報事前分布のベイズ | 頻度主義が透明。ベイズなら無情報事前分布を使用 |
| 規制・報告 | 頻度主義(慣習的に) | 規制機関が求める形式に合わせる |
| 意思決定 | ベイズ | 事後分布が意思決定理論と直接結びつく |
| 逐次データ | ベイズ | 逐次更新が自然に行える |
| 多パラメータ | ベイズ(階層モデル) | 情報の共有(shrinkage)が有効 |
重要なのは、両アプローチは「どちらが正しいか」という問題ではなく、「どちらがこの問題に適切か」という問題だということです。多くの実践者は、問題の性質に応じて両方を使い分けています。
数学的に見た両アプローチの接続
大標本での一致
ベイズ統計と頻度主義が大標本で一致するのは偶然ではなく、深い数学的理由があります。
$n$ 個の独立同分布データ $x_1, \ldots, x_n$ からパラメータ $\theta$ を推定する場合、ベルンシュタイン・フォンミーゼスの定理(Bernstein-von Mises theorem)により、事後分布は大標本で次のように近似されます。
$$ p(\theta | x_1, \ldots, x_n) \approx N\!\left(\hat{\theta}_{\text{MLE}}, \frac{1}{n I(\hat{\theta}_{\text{MLE}})}\right) $$
ここで $I(\theta)$ はフィッシャー情報量です。
この定理は、データが十分に多ければ、事前分布に関係なく事後分布はMLEを中心とする正規分布に収束することを示しています。つまり
- 事後平均 → MLE に収束
- ベイズ信用区間 → 頻度論的信頼区間に収束
- 事前分布の影響 → 消失
これは「データが語る声が、事前の信念を圧倒する」と直感的に理解できます。
正則化としての事前分布
先ほど触れたMAPと正則化の対応を、もう少し詳しく見てみましょう。
対数事後確率を最大化する問題は
$$ \hat{\theta}_{\text{MAP}} = \arg\max_{\theta} \left[ \log p(\text{data} | \theta) + \log p(\theta) \right] $$
と書けます。第1項は対数尤度(データへの適合度)、第2項は対数事前分布(正則化項)です。
- $p(\theta) = N(0, \sigma^2 I)$ のとき: $\log p(\theta) = -\frac{1}{2\sigma^2}\|\theta\|^2 + \text{const}$ → L2正則化
- $p(\theta) = \text{Laplace}(0, b)$ のとき: $\log p(\theta) = -\frac{1}{b}\|\theta\|_1 + \text{const}$ → L1正則化
このように、頻度主義で「テクニック」として導入される正則化が、ベイズの枠組みでは「事前分布」として自然に解釈されるのです。正則化パラメータの大きさは、事前分布の分散(つまり「事前情報への確信度」)に対応しています。
この接続は、両アプローチが本質的に敵対するものではなく、同じ問題の異なる側面を照らしていることを示唆しています。
まとめ
本記事では、ベイズ統計と頻度主義の違いを、確率の解釈・推定・区間推定・検定の4つの観点から比較しました。
- 確率の解釈: 頻度主義は確率を長期的な頻度として定義し、パラメータは固定定数として扱う。ベイズは確率を主観的な確信度として定義し、パラメータを確率変数として扱う
- 推定: MLEはデータのみから推定し客観的だが小標本で不安定。ベイズ推定は事前分布を活用し小標本でも安定するが事前分布の選択に主観が入る。一様事前分布ではMLEとMAP推定は一致する
- 区間推定: 信頼区間は「手続きの信頼性」、信用区間は「パラメータがそこにいる確率」を表す。多くの人が信頼区間に期待する解釈は実際にはベイズ信用区間の解釈である
- 検定: p値は「$H_0$ のもとでのデータの稀さ」を測定し、ベイズファクターは「$H_0$ と $H_1$ のどちらがデータを説明するか」を比較する。前者は帰無仮説の棄却しかできないが、後者は帰無仮説の支持も定量化できる
- 大標本での一致: ベルンシュタイン・フォンミーゼスの定理により、データが十分に多ければ両アプローチは同じ結論を導く。違いが現れるのは主に小標本の場面
- 正則化と事前分布の対応: L2正則化は正規事前分布、L1正則化はラプラス事前分布に対応し、両アプローチの深い接続を示している
次のステップとして、以下の記事も参考にしてください。