統計的仮説検定は、データに基づいて科学的な意思決定を行うための強力な枠組みです。しかし、どんな検定にも「間違い」を犯す可能性が伴います。その間違いには2種類あり、それぞれ 第1種の過誤(Type I Error) と 第2種の過誤(Type II Error) と呼ばれます。
この2つの過誤を正しく理解することは、検定の設計・解釈の土台となります。医療診断、工業品質管理、科学研究など、あらゆる分野で誤った判断のリスクを定量的に制御するために、これらの概念は不可欠です。
本記事の内容
- 第1種の過誤と第2種の過誤の定義と直感的理解
- 有意水準 $\alpha$ と検出力 $1 – \beta$ の数学的関係
- 両者のトレードオフの導出と具体例
- 混同行列との対応
- Pythonによる $\alpha$ 領域と $\beta$ 領域の可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
仮説検定における2つの過誤
仮説検定の枠組み
仮説検定では、次の2つの仮説を設定します。
- 帰無仮説 $H_0$: 「差がない」「効果がない」という現状維持の仮説
- 対立仮説 $H_1$: 「差がある」「効果がある」という研究者が示したい仮説
検定統計量を計算し、それがある基準(棄却域)に入れば $H_0$ を棄却し、入らなければ $H_0$ を棄却しない(保留する)という判断を行います。
判断の4パターン
真実の状態と検定結果の組み合わせは、以下の4パターンに分類されます。
| $H_0$ を棄却しない | $H_0$ を棄却する | |
|---|---|---|
| $H_0$ が真(差がない) | 正しい判断($1 – \alpha$) | 第1種の過誤($\alpha$) |
| $H_1$ が真(差がある) | 第2種の過誤($\beta$) | 正しい判断($1 – \beta$) |
この表は、検定における判断の全体像を示しています。
第1種の過誤(Type I Error)
定義
第1種の過誤とは、帰無仮説 $H_0$ が真であるにもかかわらず、$H_0$ を棄却してしまう誤りです。
$$ \text{第1種の過誤}: P(\text{$H_0$ を棄却} \mid H_0 \text{ が真}) = \alpha $$
この確率 $\alpha$ を 有意水準(significance level) と呼びます。
直感的な理解
第1種の過誤は 偽陽性(False Positive) とも呼ばれます。実際には効果がないのに「効果がある」と誤って結論づけてしまう状況です。
例えば、新薬の臨床試験を考えましょう。新薬が実際にはプラセボと同じ効果しかないのに、「新薬は有効である」と結論してしまうケースが第1種の過誤です。
有意水準 $\alpha$ の意味
有意水準 $\alpha$ は、研究者が事前に設定する値で、第1種の過誤を犯す確率の上限を定めます。一般に $\alpha = 0.05$(5%)や $\alpha = 0.01$(1%)が使われます。
$\alpha = 0.05$ とは、帰無仮説が真であるとき、100回検定を繰り返せばそのうち約5回は誤って棄却してしまうことを意味します。
第2種の過誤(Type II Error)
定義
第2種の過誤とは、対立仮説 $H_1$ が真であるにもかかわらず、$H_0$ を棄却できない誤りです。
$$ \text{第2種の過誤}: P(\text{$H_0$ を棄却しない} \mid H_1 \text{ が真}) = \beta $$
この確率を $\beta$ と表記します。
直感的な理解
第2種の過誤は 偽陰性(False Negative) とも呼ばれます。実際に効果があるのに、「効果がある」と検出できない状況です。
先ほどの臨床試験の例で言えば、新薬が本当に有効であるにもかかわらず、「有効とは言えない」と結論してしまうケースです。効果のある薬が見逃されてしまうのです。
検出力(Power)
検出力は、対立仮説が真のときに正しく帰無仮説を棄却できる確率です。
$$ \text{検出力(Power)} = 1 – \beta = P(\text{$H_0$ を棄却} \mid H_1 \text{ が真}) $$
検出力が高いほど、実際に存在する効果を検出する能力が高いことを意味します。一般に、$1 – \beta \geq 0.80$(80%以上)が望ましいとされています。
混同行列との対応
機械学習で使われる混同行列(Confusion Matrix)と検定の過誤は、本質的に同じ構造を持っています。
| 予測: 陰性 | 予測: 陽性 | |
|---|---|---|
| 真の値: 陰性 | 真陰性(TN) | 偽陽性(FP)= 第1種の過誤 |
| 真の値: 陽性 | 偽陰性(FN)= 第2種の過誤 | 真陽性(TP) |
ここで、検定の文脈では次のように対応します。
- 「陽性」= $H_0$ を棄却する(「効果がある」と判断する)
- 「陰性」= $H_0$ を棄却しない(「効果があるとは言えない」と判断する)
- 「真の値: 陰性」= $H_0$ が真(実際に効果がない)
- 「真の値: 陽性」= $H_1$ が真(実際に効果がある)
この対応を整理すると次のようになります。
$$ \alpha = \frac{\text{FP}}{\text{FP} + \text{TN}}, \quad \beta = \frac{\text{FN}}{\text{FN} + \text{TP}} $$
数学的な導出:正規分布に基づく $\alpha$ と $\beta$
設定
母平均の検定を例に、$\alpha$ と $\beta$ を具体的に導出します。母分散 $\sigma^2$ が既知の場合を考えます。
帰無仮説と対立仮説を次のように設定します(片側検定)。
$$ H_0: \mu = \mu_0, \quad H_1: \mu = \mu_1 \quad (\mu_1 > \mu_0) $$
標本平均 $\bar{X}$ に基づく検定統計量は次のようになります。
$$ Z = \frac{\bar{X} – \mu_0}{\sigma / \sqrt{n}} $$
$H_0$ のもとでは $Z \sim N(0, 1)$ に従います。
棄却域の設定
有意水準 $\alpha$ の片側検定では、$Z > z_\alpha$ のとき $H_0$ を棄却します。ここで $z_\alpha$ は標準正規分布の上側 $\alpha$ 点です。
$$ P(Z > z_\alpha \mid H_0) = \alpha $$
具体的に $\alpha = 0.05$ のとき、$z_\alpha = z_{0.05} \approx 1.645$ です。
$\alpha$ の導出
$\alpha$ は、$H_0$ が真のときに棄却域に入る確率です。
$$ \begin{align} \alpha &= P(Z > z_\alpha \mid H_0) \\ &= P\left(\frac{\bar{X} – \mu_0}{\sigma / \sqrt{n}} > z_\alpha \mid \mu = \mu_0\right) \\ &= 1 – \Phi(z_\alpha) \end{align} $$
ここで $\Phi(\cdot)$ は標準正規分布の累積分布関数です。
$\beta$ の導出
$\beta$ は、$H_1$ が真のときに棄却域に入らない確率です。$H_1: \mu = \mu_1$ のもとでの検定統計量の分布を考えます。
$\mu = \mu_1$ のとき、$\bar{X} \sim N(\mu_1, \sigma^2/n)$ ですから、$Z = (\bar{X} – \mu_0) / (\sigma / \sqrt{n})$ の分布は次のようになります。
$$ Z \mid H_1 \sim N\left(\frac{\mu_1 – \mu_0}{\sigma / \sqrt{n}}, 1\right) $$
非心度パラメータ(noncentrality parameter)を $\delta$ と定義します。
$$ \delta = \frac{\mu_1 – \mu_0}{\sigma / \sqrt{n}} = \frac{(\mu_1 – \mu_0)\sqrt{n}}{\sigma} $$
$H_1$ のもとでは $Z \sim N(\delta, 1)$ ですから、$\beta$ は次のように計算できます。
$$ \begin{align} \beta &= P(Z \leq z_\alpha \mid H_1) \\ &= P\left(\frac{\bar{X} – \mu_0}{\sigma / \sqrt{n}} \leq z_\alpha \mid \mu = \mu_1\right) \\ &= P\left(\frac{\bar{X} – \mu_1}{\sigma / \sqrt{n}} \leq z_\alpha – \delta \mid \mu = \mu_1\right) \\ &= \Phi(z_\alpha – \delta) \end{align} $$
3行目では、$Z$ を $H_1$ のもとでの標準正規変量に変換するため、両辺から $\delta = (\mu_1 – \mu_0)/(\sigma/\sqrt{n})$ を引いています。
検出力の導出
検出力 $1 – \beta$ は次のようになります。
$$ \begin{align} 1 – \beta &= 1 – \Phi(z_\alpha – \delta) \\ &= \Phi(\delta – z_\alpha) \end{align} $$
ここで $\Phi(-x) = 1 – \Phi(x)$ という標準正規分布の対称性を利用しました。
$\alpha$ と $\beta$ のトレードオフ
トレードオフの数学的構造
$\beta = \Phi(z_\alpha – \delta)$ という関係式から、$\alpha$ と $\beta$ のトレードオフを理解できます。
$\alpha$ を小さくする(有意水準を厳しくする)ということは、$z_\alpha$ を大きくすることを意味します。$z_\alpha$ が大きくなると、$z_\alpha – \delta$ も大きくなるため、$\Phi(z_\alpha – \delta)$ が増加します。つまり $\beta$ が大きくなります。
逆に、$\alpha$ を大きくすれば $z_\alpha$ が小さくなり、$\beta$ は小さくなります。
この関係を数式で確認しましょう。$\alpha$ を微小に変化させたとき、$\beta$ がどう変わるかを調べます。
$$ z_\alpha = \Phi^{-1}(1 – \alpha) $$
ですから、$\alpha$ を増加させると $z_\alpha$ は減少します。$\alpha$ に関する $\beta$ の変化率を計算します。
$$ \frac{d\beta}{d\alpha} = \frac{d\beta}{dz_\alpha} \cdot \frac{dz_\alpha}{d\alpha} $$
各因子を求めます。
$$ \frac{d\beta}{dz_\alpha} = \frac{d}{dz_\alpha}\Phi(z_\alpha – \delta) = \phi(z_\alpha – \delta) $$
ここで $\phi(\cdot)$ は標準正規分布の確率密度関数です。
$$ \frac{dz_\alpha}{d\alpha} = \frac{d}{d\alpha}\Phi^{-1}(1 – \alpha) = -\frac{1}{\phi(z_\alpha)} $$
したがって、
$$ \frac{d\beta}{d\alpha} = -\frac{\phi(z_\alpha – \delta)}{\phi(z_\alpha)} $$
$\phi(x) > 0$ であるから $d\beta / d\alpha < 0$ であり、$\alpha$ を増加させると $\beta$ は減少することが数学的に証明されました。
トレードオフを緩和する方法
$\alpha$ と $\beta$ の両方を同時に小さくするには、非心度 $\delta$ を大きくする必要があります。
$$ \delta = \frac{(\mu_1 – \mu_0)\sqrt{n}}{\sigma} $$
$\delta$ を大きくするには以下の方法があります。
- 標本サイズ $n$ を増やす: $\delta \propto \sqrt{n}$ なので、$n$ を大きくすれば $\delta$ が増加します
- 効果量 $(\mu_1 – \mu_0)/\sigma$ を大きくする: 検出したい差が大きければ $\delta$ も大きくなります(ただし自然に決まる量なので制御しにくい)
- ばらつき $\sigma$ を小さくする: 測定精度を上げたり、実験デザインを工夫してばらつきを低減する
具体例
数値例
母平均の検定で、以下の設定を考えます。
- 帰無仮説: $\mu_0 = 100$
- 対立仮説: $\mu_1 = 105$(片側検定)
- 母標準偏差: $\sigma = 15$
- 標本サイズ: $n = 25$
- 有意水準: $\alpha = 0.05$
まず非心度を計算します。
$$ \delta = \frac{(105 – 100)\sqrt{25}}{15} = \frac{5 \times 5}{15} = \frac{25}{15} \approx 1.667 $$
棄却域の境界値は $z_{0.05} = 1.645$ です。
$\beta$ を計算します。
$$ \beta = \Phi(z_{0.05} – \delta) = \Phi(1.645 – 1.667) = \Phi(-0.022) \approx 0.491 $$
したがって検出力は次のようになります。
$$ 1 – \beta \approx 1 – 0.491 = 0.509 $$
この設定では、$\mu_1 = 105$ という真の効果があっても、それを検出できる確率は約50.9%にすぎません。検出力を80%以上にするには、標本サイズを増やす必要があります。
標本サイズと検出力の関係
検出力 $1 – \beta = 0.80$ を達成するために必要な標本サイズを逆算してみましょう。
$$ 1 – \beta = 0.80 \implies \beta = 0.20 \implies \Phi(z_\alpha – \delta) = 0.20 $$
$$ z_\alpha – \delta = \Phi^{-1}(0.20) \approx -0.842 $$
$$ \delta = z_\alpha – (-0.842) = 1.645 + 0.842 = 2.487 $$
$$ \delta = \frac{(\mu_1 – \mu_0)\sqrt{n}}{\sigma} = 2.487 $$
$$ \sqrt{n} = \frac{2.487 \times 15}{5} = 7.461 $$
$$ n = 7.461^2 \approx 55.7 $$
したがって、$n = 56$ 以上の標本が必要です。
Pythonでの実装
$\alpha$ と $\beta$ の領域を可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ設定
mu_0 = 100 # 帰無仮説の母平均
mu_1 = 105 # 対立仮説の母平均
sigma = 15 # 母標準偏差
n = 25 # 標本サイズ
alpha = 0.05 # 有意水準
# 標本平均の標準誤差
se = sigma / np.sqrt(n)
# 棄却域の境界値(標本平均のスケール)
x_crit = mu_0 + stats.norm.ppf(1 - alpha) * se
# x軸の範囲
x = np.linspace(mu_0 - 4 * se, mu_1 + 4 * se, 1000)
# H0とH1のもとでの標本平均の分布
pdf_h0 = stats.norm.pdf(x, loc=mu_0, scale=se)
pdf_h1 = stats.norm.pdf(x, loc=mu_1, scale=se)
# βの値を計算
beta = stats.norm.cdf(x_crit, loc=mu_1, scale=se)
power = 1 - beta
fig, ax = plt.subplots(figsize=(12, 6))
# H0の分布
ax.plot(x, pdf_h0, 'b-', linewidth=2, label=f'$H_0$: $\\mu = {mu_0}$')
# H1の分布
ax.plot(x, pdf_h1, 'r-', linewidth=2, label=f'$H_1$: $\\mu = {mu_1}$')
# α領域(第1種の過誤)を塗りつぶし
x_alpha = x[x >= x_crit]
ax.fill_between(x_alpha, stats.norm.pdf(x_alpha, loc=mu_0, scale=se),
color='blue', alpha=0.3, label=f'$\\alpha$ = {alpha:.2f} (Type I Error)')
# β領域(第2種の過誤)を塗りつぶし
x_beta = x[x <= x_crit]
ax.fill_between(x_beta, stats.norm.pdf(x_beta, loc=mu_1, scale=se),
color='red', alpha=0.3, label=f'$\\beta$ = {beta:.3f} (Type II Error)')
# 検出力の領域を塗りつぶし
x_power = x[x >= x_crit]
ax.fill_between(x_power, stats.norm.pdf(x_power, loc=mu_1, scale=se),
color='green', alpha=0.3, label=f'Power = {power:.3f}')
# 棄却域の境界線
ax.axvline(x=x_crit, color='black', linestyle='--', linewidth=1.5,
label=f'Critical value = {x_crit:.2f}')
ax.set_xlabel('Sample Mean $\\bar{X}$', fontsize=13)
ax.set_ylabel('Probability Density', fontsize=13)
ax.set_title('Type I Error ($\\alpha$) and Type II Error ($\\beta$)', fontsize=14)
ax.legend(loc='upper right', fontsize=10)
ax.set_ylim(bottom=0)
plt.tight_layout()
plt.show()
print(f"有意水準 α = {alpha}")
print(f"第2種の過誤 β = {beta:.4f}")
print(f"検出力 1 - β = {power:.4f}")
print(f"棄却域の境界(標本平均): {x_crit:.4f}")
$\alpha$ を変化させたときの $\beta$ のトレードオフ
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ設定
mu_0 = 100
mu_1 = 105
sigma = 15
n = 25
se = sigma / np.sqrt(n)
# αの範囲
alphas = np.linspace(0.001, 0.20, 200)
# 各αに対するβと検出力を計算
betas = []
powers = []
for a in alphas:
z_a = stats.norm.ppf(1 - a)
x_crit = mu_0 + z_a * se
b = stats.norm.cdf(x_crit, loc=mu_1, scale=se)
betas.append(b)
powers.append(1 - b)
betas = np.array(betas)
powers = np.array(powers)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左: αとβのトレードオフ
axes[0].plot(alphas, betas, 'b-', linewidth=2)
axes[0].set_xlabel('$\\alpha$ (Type I Error Rate)', fontsize=12)
axes[0].set_ylabel('$\\beta$ (Type II Error Rate)', fontsize=12)
axes[0].set_title('Trade-off between $\\alpha$ and $\\beta$', fontsize=13)
axes[0].axhline(y=0.2, color='gray', linestyle=':', label='$\\beta$ = 0.20')
axes[0].axvline(x=0.05, color='gray', linestyle='--', label='$\\alpha$ = 0.05')
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
# 右: αと検出力
axes[1].plot(alphas, powers, 'r-', linewidth=2)
axes[1].set_xlabel('$\\alpha$ (Type I Error Rate)', fontsize=12)
axes[1].set_ylabel('Power ($1 - \\beta$)', fontsize=12)
axes[1].set_title('$\\alpha$ vs Power', fontsize=13)
axes[1].axhline(y=0.8, color='gray', linestyle=':', label='Power = 0.80')
axes[1].axvline(x=0.05, color='gray', linestyle='--', label='$\\alpha$ = 0.05')
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
標本サイズを変えたときの $\alpha$ と $\beta$ の変化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ設定
mu_0 = 100
mu_1 = 105
sigma = 15
alpha = 0.05
# 標本サイズの範囲
ns = np.arange(5, 201)
# 各nに対するβと検出力を計算
betas = []
for n_val in ns:
se = sigma / np.sqrt(n_val)
z_alpha = stats.norm.ppf(1 - alpha)
delta = (mu_1 - mu_0) / se
b = stats.norm.cdf(z_alpha - delta)
betas.append(b)
betas = np.array(betas)
powers = 1 - betas
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(ns, powers, 'b-', linewidth=2, label='Power ($1 - \\beta$)')
ax.plot(ns, betas, 'r--', linewidth=2, label='$\\beta$ (Type II Error)')
# 検出力80%の水平線
ax.axhline(y=0.80, color='green', linestyle=':', linewidth=1.5, label='Power = 0.80')
# 検出力80%を達成するnを探す
n_target = ns[np.argmax(powers >= 0.80)]
ax.axvline(x=n_target, color='green', linestyle='--', alpha=0.7,
label=f'n = {n_target} for Power = 0.80')
ax.set_xlabel('Sample Size $n$', fontsize=13)
ax.set_ylabel('Probability', fontsize=13)
ax.set_title(f'Power and $\\beta$ vs Sample Size ($\\alpha$ = {alpha}, $\\mu_1 - \\mu_0$ = {mu_1-mu_0}, $\\sigma$ = {sigma})', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim(5, 200)
ax.set_ylim(0, 1)
plt.tight_layout()
plt.show()
print(f"検出力80%を達成するために必要な標本サイズ: n = {n_target}")
モンテカルロシミュレーションによる検証
理論値が正しいことを、シミュレーションで確認しましょう。
import numpy as np
from scipy import stats
np.random.seed(42)
# パラメータ設定
mu_0 = 100
mu_1 = 105
sigma = 15
n = 25
alpha = 0.05
n_simulations = 100000
se = sigma / np.sqrt(n)
z_crit = stats.norm.ppf(1 - alpha)
# --- 第1種の過誤のシミュレーション ---
# H0が真(μ = μ_0)のもとでデータを生成
type_i_count = 0
for _ in range(n_simulations):
sample = np.random.normal(mu_0, sigma, n)
z_stat = (np.mean(sample) - mu_0) / se
if z_stat > z_crit:
type_i_count += 1
type_i_rate = type_i_count / n_simulations
# --- 第2種の過誤のシミュレーション ---
# H1が真(μ = μ_1)のもとでデータを生成
type_ii_count = 0
for _ in range(n_simulations):
sample = np.random.normal(mu_1, sigma, n)
z_stat = (np.mean(sample) - mu_0) / se
if z_stat <= z_crit:
type_ii_count += 1
type_ii_rate = type_ii_count / n_simulations
# 理論値
delta = (mu_1 - mu_0) * np.sqrt(n) / sigma
beta_theory = stats.norm.cdf(z_crit - delta)
print("=== モンテカルロシミュレーション結果 ===")
print(f"シミュレーション回数: {n_simulations}")
print(f"")
print(f"第1種の過誤 (α):")
print(f" 理論値: {alpha:.4f}")
print(f" シミュレーション: {type_i_rate:.4f}")
print(f"")
print(f"第2種の過誤 (β):")
print(f" 理論値: {beta_theory:.4f}")
print(f" シミュレーション: {type_ii_rate:.4f}")
print(f"")
print(f"検出力 (1 - β):")
print(f" 理論値: {1 - beta_theory:.4f}")
print(f" シミュレーション: {1 - type_ii_rate:.4f}")
実行結果は次のようになります。
=== モンテカルロシミュレーション結果 ===
シミュレーション回数: 100000
第1種の過誤 (α):
理論値: 0.0500
シミュレーション: 0.0502
第2種の過誤 (β):
理論値: 0.4912
シミュレーション: 0.4895
検出力 (1 - β):
理論値: 0.5088
シミュレーション: 0.5105
理論値とシミュレーション結果がよく一致していることが確認できます。
まとめ
本記事では、統計的仮説検定における第1種の過誤と第2種の過誤について解説しました。
- 第1種の過誤($\alpha$): 帰無仮説が真なのに棄却してしまう誤り(偽陽性)。有意水準で制御する
- 第2種の過誤($\beta$): 対立仮説が真なのに棄却できない誤り(偽陰性)。検出力 $1 – \beta$ で評価する
- トレードオフ: $\alpha$ を小さくすると $\beta$ は大きくなる。両方を小さくするには標本サイズ $n$ を増やすことが有効
- 非心度 $\delta = (\mu_1 – \mu_0)\sqrt{n} / \sigma$ が $\alpha$ と $\beta$ の関係を支配する重要なパラメータ
次のステップとして、以下の記事も参考にしてください。