仮説検定は、データに基づいて統計的な判断を下すための手法ですが、その判断が常に正しいとは限りません。検定には2種類の誤りが存在し、それが 第1種の過誤(偽陽性)と 第2種の過誤(偽陰性)です。
たとえば、医療検査で「病気でないのに病気と判定する」のが第1種の過誤、「病気なのに見逃す」のが第2種の過誤です。どちらの誤りも深刻な結果をもたらしうるため、その確率を定量的に理解し、適切にコントロールすることが統計的検定において不可欠です。本記事では、仮説検定の基本的な枠組みから出発し、2つの過誤の定義・関係・コントロール方法を丁寧に解説します。
本記事の内容
- 仮説検定の基本的な枠組み
- 第1種の過誤(偽陽性)の定義とα
- 第2種の過誤(偽陰性)の定義とβ
- αとβのトレードオフ
- 検出力(Power)の概念
- Pythonでの可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
仮説検定の基本
帰無仮説と対立仮説
仮説検定では、2つの仮説を設定します。
| 仮説 | 記号 | 意味 |
|---|---|---|
| 帰無仮説 | $H_0$ | 「効果がない」「差がない」「変化がない」という保守的な仮説 |
| 対立仮説 | $H_1$ | 「効果がある」「差がある」という主張したい仮説 |
たとえば、新薬の効果を検証する場合、
- $H_0$: 新薬は既存薬と効果が同じ($\mu = \mu_0$)
- $H_1$: 新薬は既存薬より効果がある($\mu > \mu_0$)
検定の手順
- $H_0$ と $H_1$ を設定する
- 有意水準 $\alpha$ を決める(通常 $\alpha = 0.05$)
- 検定統計量を計算する
- 棄却域に入れば $H_0$ を棄却、入らなければ棄却しない
判断の4つのパターン
検定結果と真実の組み合わせにより、4つのパターンが存在します。
| $H_0$ が真 | $H_1$ が真 | |
|---|---|---|
| $H_0$ を棄却しない | 正しい判断 | 第2種の過誤(見逃し) |
| $H_0$ を棄却する | 第1種の過誤(誤検出) | 正しい判断(検出力) |
第1種の過誤(Type I Error)
定義
第1種の過誤とは、帰無仮説 $H_0$ が真であるにもかかわらず、$H_0$ を棄却してしまう誤り です。
$$ \begin{equation} \alpha = P(\text{$H_0$ を棄却} \mid \text{$H_0$ が真}) \end{equation} $$
$\alpha$ は 有意水準(significance level)とも呼ばれ、事前に設定する値です。
具体例
- 医療: 健康な人を「病気である」と誤って診断する(偽陽性)
- 司法: 無実の人を有罪とする(冤罪)
- 品質管理: 規格内の製品を「不良品」と判定する
直感的な理解
$\alpha = 0.05$ に設定するということは、「$H_0$ が正しいときに、100回検定を行ったら約5回は誤って $H_0$ を棄却してしまうリスクを許容する」ことを意味します。
第2種の過誤(Type II Error)
定義
第2種の過誤とは、対立仮説 $H_1$ が真であるにもかかわらず、$H_0$ を棄却できない誤り です。
$$ \begin{equation} \beta = P(\text{$H_0$ を棄却しない} \mid \text{$H_1$ が真}) \end{equation} $$
具体例
- 医療: 病気の人を「健康である」と誤って判定する(偽陰性、見逃し)
- 司法: 有罪の人を無罪とする
- 品質管理: 不良品を「規格内」と判定する
$\beta$ のコントロール
$\alpha$ は検定者が事前に設定しますが、$\beta$ は以下の要因に依存します。
| 要因 | $\beta$ への影響 |
|---|---|
| $\alpha$ を大きくする | $\beta$ は小さくなる |
| サンプルサイズ $n$ を増やす | $\beta$ は小さくなる |
| 真のパラメータと $H_0$ の差が大きい | $\beta$ は小さくなる |
| 母分散 $\sigma^2$ が小さい | $\beta$ は小さくなる |
数学的定義: 正規分布の検定における α と β
具体的な検定問題で $\alpha$ と $\beta$ を数式で表現しましょう。
設定
$X_1, \dots, X_n \sim N(\mu, \sigma^2)$($\sigma^2$ は既知)に対する片側検定を考えます。
- $H_0: \mu = \mu_0$
- $H_1: \mu = \mu_1 > \mu_0$
検定統計量は、
$$ Z = \frac{\bar{X}_n – \mu_0}{\sigma / \sqrt{n}} $$
$H_0$ のもとで $Z \sim N(0, 1)$ です。有意水準 $\alpha$ の棄却域は $Z \geq z_\alpha$ です。
α の表現
$$ \begin{align} \alpha &= P(Z \geq z_\alpha \mid H_0) \\ &= P\left(\frac{\bar{X}_n – \mu_0}{\sigma/\sqrt{n}} \geq z_\alpha \mid \mu = \mu_0\right) \\ &= 1 – \Phi(z_\alpha) \end{align} $$
β の表現
$H_1$($\mu = \mu_1$)のもとでは、$Z$ は非心正規分布に従います。
$$ Z = \frac{\bar{X}_n – \mu_0}{\sigma/\sqrt{n}} \sim N\left(\frac{\mu_1 – \mu_0}{\sigma/\sqrt{n}}, 1\right) $$
非心度パラメータを $\delta = \frac{\mu_1 – \mu_0}{\sigma/\sqrt{n}} = \frac{(\mu_1 – \mu_0)\sqrt{n}}{\sigma}$ とおくと、
$$ \begin{align} \beta &= P(Z < z_\alpha \mid H_1) \\ &= P\left(\frac{\bar{X}_n - \mu_0}{\sigma/\sqrt{n}} < z_\alpha \mid \mu = \mu_1\right) \\ &= \Phi(z_\alpha - \delta) \end{align} $$
検出力(Power)
定義
検出力とは、$H_1$ が真のときに正しく $H_0$ を棄却できる確率です。
$$ \begin{equation} \text{Power} = 1 – \beta = P(\text{$H_0$ を棄却} \mid \text{$H_1$ が真}) \end{equation} $$
検出力が高いほど、実際に効果があるときにそれを検出できる確率が高くなります。
検出力に影響する要因
先ほどの正規分布の例では、
$$ \text{Power} = 1 – \Phi(z_\alpha – \delta) = 1 – \Phi\left(z_\alpha – \frac{(\mu_1 – \mu_0)\sqrt{n}}{\sigma}\right) $$
この式から以下がわかります。
- 効果量 $(\mu_1 – \mu_0)$ が大きいほど、検出力は高くなる
- サンプルサイズ $n$ が大きいほど、検出力は高くなる
- 母標準偏差 $\sigma$ が小さいほど、検出力は高くなる
- 有意水準 $\alpha$ を大きくすると($z_\alpha$ が小さくなり)、検出力は高くなる
αとβのトレードオフ
$\alpha$ を小さくする(厳しい基準)と、棄却域が狭くなるため $\beta$ は大きくなり(検出力が下がり)ます。逆に $\alpha$ を大きくする(緩い基準)と、$\beta$ は小さくなりますが、偽陽性のリスクが増えます。
$$ \alpha \downarrow \implies \beta \uparrow \quad (\text{サンプルサイズ一定}) $$
このトレードオフを解消する唯一の方法は、サンプルサイズ $n$ を増やすこと です。$n$ を増やせば、$\alpha$ を小さく保ったまま $\beta$ も小さくできます。
具体例
例: 正規分布の片側検定
工場で生産される部品の直径の母平均が $\mu_0 = 10.0$ mm であることを確認したいとします。
- $H_0: \mu = 10.0$, $H_1: \mu = 10.5$(0.5mm大きい)
- $\sigma = 1.0$ mm(既知), $n = 25$, $\alpha = 0.05$
棄却域: $z_\alpha = z_{0.05} = 1.645$ より、$\bar{X} \geq 10.0 + 1.645 \times 1.0 / \sqrt{25} = 10.329$ mm のとき $H_0$ を棄却します。
$\beta$ の計算:
$$ \begin{align} \delta &= \frac{(10.5 – 10.0)\sqrt{25}}{1.0} = 2.5 \\ \beta &= \Phi(1.645 – 2.5) = \Phi(-0.855) \approx 0.196 \end{align} $$
したがって、検出力は $1 – 0.196 = 0.804$ です。つまり、実際に $\mu = 10.5$ のとき、約80%の確率でそれを検出できます。
Pythonでの実装
第1種の過誤と第2種の過誤の可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ
mu0 = 0 # H0の下での母平均
mu1 = 2 # H1の下での母平均
sigma = 1 # 標準偏差
n = 25
se = sigma / np.sqrt(n) # 標準誤差
alpha = 0.05
# 臨界値
z_crit = stats.norm.ppf(1 - alpha)
x_crit = mu0 + z_crit * se
# x軸の範囲
x = np.linspace(mu0 - 4 * se, mu1 + 4 * se, 1000)
# H0とH1の下での標本平均の分布
pdf_h0 = stats.norm.pdf(x, mu0, se)
pdf_h1 = stats.norm.pdf(x, mu1, se)
fig, ax = plt.subplots(figsize=(12, 6))
# H0の分布
ax.plot(x, pdf_h0, 'b-', linewidth=2, label='$H_0$: $\\mu = 0$')
# H1の分布
ax.plot(x, pdf_h1, 'r-', linewidth=2, label='$H_1$: $\\mu = 2$')
# 第1種の過誤(α): H0のもとで棄却域に入る部分
x_alpha = x[x >= x_crit]
ax.fill_between(x_alpha, stats.norm.pdf(x_alpha, mu0, se),
alpha=0.3, color='blue', label=f'Type I Error ($\\alpha$ = {alpha})')
# 第2種の過誤(β): H1のもとで棄却しない部分
x_beta = x[x <= x_crit]
ax.fill_between(x_beta, stats.norm.pdf(x_beta, mu1, se),
alpha=0.3, color='red', label=f'Type II Error ($\\beta$ = {stats.norm.cdf(x_crit, mu1, se):.3f})')
# 臨界値の線
ax.axvline(x=x_crit, color='green', linewidth=2, linestyle='--',
label=f'Critical value = {x_crit:.3f}')
ax.set_xlabel('Sample mean $\\bar{X}$', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Type I and Type II Errors in Hypothesis Testing', fontsize=14)
ax.legend(fontsize=10, loc='upper right')
ax.grid(True, alpha=0.3)
plt.savefig("type1_type2_errors.png", dpi=150, bbox_inches="tight")
plt.show()
# β と検出力の計算
beta = stats.norm.cdf(x_crit, mu1, se)
power = 1 - beta
print(f"Alpha (Type I Error): {alpha}")
print(f"Beta (Type II Error): {beta:.4f}")
print(f"Power: {power:.4f}")
青い塗りつぶし部分が第1種の過誤($\alpha$)、赤い塗りつぶし部分が第2種の過誤($\beta$)を表しています。臨界値(緑の破線)を左に動かすと $\alpha$ は増えますが $\beta$ は減り、右に動かすとその逆になります。
αとβのトレードオフの可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ
mu0 = 0
mu1 = 1.5
sigma = 1
n = 25
se = sigma / np.sqrt(n)
# 有意水準を変化させる
alphas = np.linspace(0.001, 0.30, 200)
betas = []
powers = []
for a in alphas:
z_crit = stats.norm.ppf(1 - a)
x_crit = mu0 + z_crit * se
b = stats.norm.cdf(x_crit, mu1, se)
betas.append(b)
powers.append(1 - b)
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)', fontsize=12)
axes[0].set_ylabel('$\\beta$ (Type II Error)', fontsize=12)
axes[0].set_title('Trade-off between $\\alpha$ and $\\beta$', fontsize=14)
axes[0].grid(True, alpha=0.3)
# αと検出力の関係
axes[1].plot(alphas, powers, 'r-', linewidth=2)
axes[1].set_xlabel('$\\alpha$ (Type I Error)', fontsize=12)
axes[1].set_ylabel('Power ($1 - \\beta$)', fontsize=12)
axes[1].set_title('Power as a Function of $\\alpha$', fontsize=14)
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("alpha_beta_tradeoff.png", dpi=150, bbox_inches="tight")
plt.show()
サンプルサイズと検出力の関係
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# パラメータ
mu0 = 0
sigma = 1
alpha = 0.05
z_alpha = stats.norm.ppf(1 - alpha)
# 異なる効果量での検出力
effect_sizes = [0.2, 0.5, 0.8, 1.0, 1.5]
n_values = np.arange(5, 201)
fig, ax = plt.subplots(figsize=(12, 6))
for delta in effect_sizes:
powers = []
for n in n_values:
se = sigma / np.sqrt(n)
mu1 = mu0 + delta
x_crit = mu0 + z_alpha * se
power = 1 - stats.norm.cdf(x_crit, mu1, se)
powers.append(power)
ax.plot(n_values, powers, linewidth=2, label=f'Effect size = {delta}')
ax.axhline(y=0.8, color='gray', linestyle='--', alpha=0.7, label='Power = 0.8 threshold')
ax.set_xlabel('Sample size (n)', fontsize=12)
ax.set_ylabel('Power ($1 - \\beta$)', fontsize=12)
ax.set_title(f'Power vs Sample Size ($\\alpha$ = {alpha})', fontsize=14)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 1.05)
plt.savefig("power_vs_sample_size.png", dpi=150, bbox_inches="tight")
plt.show()
効果量が大きいほど、少ないサンプルサイズで高い検出力が得られます。逆に、小さな効果を検出するには大きなサンプルサイズが必要です。一般に、検出力0.8(80%)以上を達成することが推奨されており、研究計画の段階で必要なサンプルサイズを計算すること(検出力分析)が重要です。
シミュレーションによる誤りの確認
import numpy as np
from scipy import stats
np.random.seed(42)
# パラメータ
mu0 = 0
mu1 = 1.0
sigma = 1
n = 30
alpha = 0.05
n_simulations = 10000
z_crit = stats.norm.ppf(1 - alpha)
# 第1種の過誤のシミュレーション(H0が真の場合)
type1_errors = 0
for _ in range(n_simulations):
sample = np.random.normal(mu0, sigma, n)
z = (sample.mean() - mu0) / (sigma / np.sqrt(n))
if z >= z_crit:
type1_errors += 1
# 第2種の過誤のシミュレーション(H1が真の場合)
type2_errors = 0
for _ in range(n_simulations):
sample = np.random.normal(mu1, sigma, n)
z = (sample.mean() - mu0) / (sigma / np.sqrt(n))
if z < z_crit:
type2_errors += 1
print("=== Simulation Results ===")
print(f"Number of simulations: {n_simulations}")
print(f"Sample size: n = {n}")
print(f"Significance level: alpha = {alpha}")
print()
print(f"Type I Error Rate: {type1_errors/n_simulations:.4f} (theoretical: {alpha})")
# 理論的なβ
delta = (mu1 - mu0) * np.sqrt(n) / sigma
beta_theory = stats.norm.cdf(z_crit - delta)
print(f"Type II Error Rate: {type2_errors/n_simulations:.4f} (theoretical: {beta_theory:.4f})")
print(f"Power (empirical): {1 - type2_errors/n_simulations:.4f} (theoretical: {1 - beta_theory:.4f})")
シミュレーションにより、第1種の過誤率が設定した有意水準 $\alpha = 0.05$ にほぼ等しいこと、第2種の過誤率も理論値とよく一致することが確認できます。
まとめ
本記事では、第1種の過誤と第2種の過誤について解説しました。
- 第1種の過誤($\alpha$): 帰無仮説が真なのに棄却してしまう誤り(偽陽性)
- 第2種の過誤($\beta$): 対立仮説が真なのに帰無仮説を棄却できない誤り(偽陰性)
- $\alpha$ と $\beta$ にはトレードオフがあり、一方を下げると他方が上がります
- このトレードオフはサンプルサイズを増やすことで改善できます
- 検出力 $1 – \beta$ は、効果量、サンプルサイズ、分散、有意水準に依存します
- 研究計画では事前に検出力分析を行い、必要なサンプルサイズを決定することが重要です
次のステップとして、以下の記事も参考にしてください。