第1種の過誤と第2種の過誤をわかりやすく解説

仮説検定は、データに基づいて統計的な判断を下すための手法ですが、その判断が常に正しいとは限りません。検定には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$)

検定の手順

  1. $H_0$ と $H_1$ を設定する
  2. 有意水準 $\alpha$ を決める(通常 $\alpha = 0.05$)
  3. 検定統計量を計算する
  4. 棄却域に入れば $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) $$

この式から以下がわかります。

  1. 効果量 $(\mu_1 – \mu_0)$ が大きいほど、検出力は高くなる
  2. サンプルサイズ $n$ が大きいほど、検出力は高くなる
  3. 母標準偏差 $\sigma$ が小さいほど、検出力は高くなる
  4. 有意水準 $\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$ は、効果量、サンプルサイズ、分散、有意水準に依存します
  • 研究計画では事前に検出力分析を行い、必要なサンプルサイズを決定することが重要です

次のステップとして、以下の記事も参考にしてください。