統計的検定とは?仮説検定の手順と考え方をわかりやすく解説

統計的検定(statistical testing)とは、母集団に対する仮説を標本データに基づいて検証し、統計的に有意な結論を得るための手法です。「効果があるかないか」「差があるか」といった問いに対して、確率論に基づく客観的な判断を下す枠組みを提供します。

本記事では、統計的検定の基本的な考え方から具体的な手順、そしてPythonでの実装までを解説します。

本記事の内容

  • 統計的検定の目的と基本概念
  • 帰無仮説と対立仮説
  • 検定の手順
  • 第1種の過誤と第2種の過誤
  • 具体例とPythonでの実装

統計的検定とは

母集団と標本

統計学では、知りたい対象の全体を母集団、そこから取り出した一部のデータを標本と呼びます。

例えば、「ある新薬は既存薬より効果があるか?」という問いに答えるために、全患者に試すことはできないので、一部の患者(標本)に投与して結果を観察し、母集団全体について結論を導きます。

検定の考え方

統計的検定は、「仮説を立て、データがその仮説と矛盾するかを確率的に判断する」手法です。

直感的には、「偶然では説明しにくいほどの差や効果が観測されたなら、それは本当に意味のある差である」と結論づけます。

帰無仮説と対立仮説

帰無仮説 $H_0$

帰無仮説(null hypothesis)は、「差がない」「効果がない」という消極的な仮説です。検定では、この仮説が正しいと仮定してデータを評価します。

対立仮説 $H_1$

対立仮説(alternative hypothesis)は、帰無仮説に対立する仮説であり、「差がある」「効果がある」という主張です。

具体例

新薬Aの効果を検証する場合:

  • $H_0$: 新薬Aの効果は既存薬と同じ($\mu_A = \mu_0$)
  • $H_1$: 新薬Aの効果は既存薬と異なる($\mu_A \neq \mu_0$)

検定の手順

ステップ1: 仮説の設定

帰無仮説 $H_0$ と対立仮説 $H_1$ を明確に設定します。

ステップ2: 有意水準の決定

有意水準 $\alpha$ を決めます。通常 $\alpha = 0.05$(5%)が使われます。これは「帰無仮説が正しいのに誤って棄却してしまう確率」の上限です。

ステップ3: 検定統計量の計算

標本データから検定統計量を計算します。例えば、母平均の検定(分散既知)では、

$$ Z = \frac{\bar{X} – \mu_0}{\sigma / \sqrt{n}} $$

帰無仮説 $H_0: \mu = \mu_0$ のもとで、$Z \sim \mathcal{N}(0, 1)$ に従います。

ステップ4: p値の計算

p値(p-value)は、帰無仮説が正しいと仮定したとき、観測されたデータ以上に極端な値が得られる確率です。

両側検定の場合:

$$ p = 2 \cdot P(Z > |z_{\text{obs}}|) $$

ステップ5: 判定

  • $p \leq \alpha$ ならば $H_0$ を棄却(統計的に有意)
  • $p > \alpha$ ならば $H_0$ を棄却しない(有意でない)

第1種の過誤と第2種の過誤

検定には2種類の誤りが存在します。

$H_0$ が真 $H_0$ が偽
$H_0$ を棄却 第1種の過誤($\alpha$) 正しい判断(検出力)
$H_0$ を棄却しない 正しい判断 第2種の過誤($\beta$)
  • 第1種の過誤(偽陽性): 実際には差がないのに「差がある」と判断する。確率は $\alpha$
  • 第2種の過誤(偽陰性): 実際には差があるのに「差がない」と判断する。確率は $\beta$
  • 検出力(power): $1 – \beta$。本当に差があるときにそれを検出できる確率

$\alpha$ と $\beta$ のトレードオフ

$\alpha$ を小さくすると第1種の過誤は減りますが、第2種の過誤が増えます。標本サイズ $n$ を大きくすることで、両方の過誤を同時に減らすことができます。

片側検定と両側検定

両側検定

$H_1: \mu \neq \mu_0$ のように、差の方向を指定しない場合。

棄却域: $|Z| > z_{\alpha/2}$

片側検定

$H_1: \mu > \mu_0$ のように、差の方向を指定する場合。

棄却域: $Z > z_\alpha$(右片側)

Pythonでの実装

統計的検定をPythonで実装し、p値と検出力の関係を可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(42)

# 例: 母平均の検定(1標本z検定)
# H0: mu = 50, H1: mu != 50
mu_0 = 50
sigma = 10
n = 30
alpha = 0.05

# 標本データの生成(真の母平均 = 53)
true_mu = 53
sample = np.random.normal(true_mu, sigma, n)
x_bar = np.mean(sample)

# 検定統計量の計算
z_stat = (x_bar - mu_0) / (sigma / np.sqrt(n))
p_value = 2 * (1 - stats.norm.cdf(abs(z_stat)))

print("=== 1標本z検定 ===")
print(f"標本平均: {x_bar:.2f}")
print(f"帰無仮説: mu = {mu_0}")
print(f"検定統計量 Z: {z_stat:.4f}")
print(f"p値: {p_value:.4f}")
print(f"有意水準 alpha: {alpha}")
print(f"判定: {'H0を棄却(有意)' if p_value <= alpha else 'H0を棄却しない'}")

# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: 検定統計量と棄却域
x = np.linspace(-4, 4, 500)
y = stats.norm.pdf(x)
z_crit = stats.norm.ppf(1 - alpha/2)

axes[0].plot(x, y, 'b-', linewidth=2, label='$N(0, 1)$')
axes[0].fill_between(x[x <= -z_crit], y[x <= -z_crit], alpha=0.3, color='red',
                      label=f'Rejection region ($\\alpha$={alpha})')
axes[0].fill_between(x[x >= z_crit], y[x >= z_crit], alpha=0.3, color='red')
axes[0].axvline(z_stat, color='green', linewidth=2, linestyle='--',
                label=f'Z statistic = {z_stat:.2f}')
axes[0].set_xlabel('Z')
axes[0].set_ylabel('Density')
axes[0].set_title('Two-sided Z-test')
axes[0].legend(fontsize=9)
axes[0].grid(True, alpha=0.3)

# 右: 検出力と標本サイズの関係
n_values = np.arange(5, 201)
effect_sizes = [1, 2, 3, 5]  # mu - mu_0

for delta in effect_sizes:
    powers = []
    for n_val in n_values:
        # 非心パラメータ
        noncentrality = delta / (sigma / np.sqrt(n_val))
        # 検出力 = P(|Z| > z_crit | H1が真)
        power = 1 - (stats.norm.cdf(z_crit - noncentrality) -
                      stats.norm.cdf(-z_crit - noncentrality))
        powers.append(power)
    axes[1].plot(n_values, powers, linewidth=2, label=f'$\\delta$ = {delta}')

axes[1].axhline(0.8, color='k', linestyle='--', alpha=0.5, label='Power = 0.8')
axes[1].set_xlabel('Sample size n')
axes[1].set_ylabel('Power ($1 - \\beta$)')
axes[1].set_title('Power vs Sample Size')
axes[1].legend(fontsize=9)
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

左のグラフでは、帰無仮説のもとでの標準正規分布と棄却域、検定統計量の位置を示しています。右のグラフでは、効果量と標本サイズに応じた検出力の変化を可視化しています。効果量が大きいほど、また標本サイズが大きいほど、検出力が高くなることがわかります。

まとめ

本記事では、統計的検定の基本概念と手順について解説しました。

  • 統計的検定は、帰無仮説を標本データに基づいて棄却するか判断する手法である
  • p値は帰無仮説のもとで観測データ以上に極端な結果が得られる確率であり、有意水準と比較して判定する
  • 第1種の過誤(偽陽性)と第2種の過誤(偽陰性)のトレードオフを理解することが重要
  • 検出力は標本サイズと効果量に依存し、適切な標本サイズ設計が検定の信頼性を左右する