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

統計的仮説検定は、データに基づいて科学的な意思決定を行うための強力な枠組みです。しかし、どんな検定にも「間違い」を犯す可能性が伴います。その間違いには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$ を大きくするには以下の方法があります。

  1. 標本サイズ $n$ を増やす: $\delta \propto \sqrt{n}$ なので、$n$ を大きくすれば $\delta$ が増加します
  2. 効果量 $(\mu_1 – \mu_0)/\sigma$ を大きくする: 検出したい差が大きければ $\delta$ も大きくなります(ただし自然に決まる量なので制御しにくい)
  3. ばらつき $\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$ の関係を支配する重要なパラメータ

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