ノンパラメトリック検定の全体像 — いつ使うべきか?

ある心理学実験で、反応時間を測定しています。データを見ると、多くの被験者は0.5秒前後で反応しますが、少数の被験者は3秒以上かかっています。このデータは右に長い裾を持つ歪んだ分布であり、正規分布には従いません。

このようなデータに対してt検定を適用すると、外れ値の影響を受けて検定結果が歪む可能性があります。正規分布を仮定できないとき、どのような検定を使えばよいのでしょうか。

答えがノンパラメトリック検定(nonparametric test)です。データの分布形状を仮定せず、順位(rank)を使って検定を行います。

ノンパラメトリック検定を理解すると、以下の場面で適切な判断ができます。

  • 歪んだ分布のデータ: 反応時間、年収、生存時間などの右裾の重い分布
  • 順序データ: 5段階評価のようなデータ(平均の計算が不適切)
  • 外れ値の影響: 少数の外れ値に影響されない頑健な検定
  • 小標本: 分布の仮定が検証しにくいほどデータが少ない場合

本記事の内容

  • ノンパラメトリック検定の原理と順位変換
  • ウィルコクソンの符号順位検定(1標本・対応あり)
  • マン・ホイットニーのU検定(独立2標本)
  • クラスカル・ウォリス検定(3群以上)
  • パラメトリック検定との比較
  • Pythonでの実装と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

ノンパラメトリック検定の原理

パラメトリック vs ノンパラメトリック

パラメトリック検定(t検定, F検定など)は、データが特定の分布(通常は正規分布)に従うことを仮定し、その分布のパラメータ(平均、分散)を使って検定します。

ノンパラメトリック検定は分布の形状を仮定しません。代わりに、データの順位(rank)を使います。順位は元のデータの「大小関係」だけを保持し、値の大きさの情報を捨てます。

順位変換の直感

データ $\{3.2, 1.5, 8.7, 2.1, 100.3\}$ を考えます。

元のデータでは100.3が平均を大きく引き上げますが、順位に変換すると $\{3, 1, 4, 2, 5\}$ となり、100.3は「最大」という情報だけが残ります。外れ値の影響が劇的に軽減されるのです。

主要な対応関係

パラメトリック ノンパラメトリック 用途
1標本t検定 ウィルコクソンの符号順位検定 1群の中央値の検定
対応ありt検定 ウィルコクソンの符号順位検定 対応のある2群の比較
独立2標本t検定 マン・ホイットニーのU検定 独立な2群の比較
一元配置ANOVA クラスカル・ウォリス検定 3群以上の比較

順位の考え方を理解したところで、具体的な検定方法を見ていきましょう。

ウィルコクソンの符号順位検定

問題設定

$X_1, \ldots, X_n$ が中央値 $\theta$ の連続な対称分布に従うとき、$H_0: \theta = \theta_0$ を検定します。

手順

  1. 差 $D_i = X_i – \theta_0$ を計算
  2. $|D_i|$ の順位 $R_i$ をつける($D_i = 0$ は除外)
  3. 正の $D_i$ の順位和 $W^+ = \sum_{D_i > 0} R_i$ を計算
  4. $H_0$ のもとで $W^+$ の分布が既知なので、p値を計算

$H_0$ のもとでは正の差と負の差は同じ確率で生じるため、$E[W^+] = n(n+1)/4$ です。

大標本では $W^+$ は正規分布で近似できます。

$$ Z = \frac{W^+ – n(n+1)/4}{\sqrt{n(n+1)(2n+1)/24}} \approx N(0,1) $$

マン・ホイットニーのU検定

問題設定

独立な2群 $X_1, \ldots, X_{n_1}$ と $Y_1, \ldots, Y_{n_2}$ について、同じ分布に従うかを検定します。

手順

  1. 2群を合併して全体の順位をつける
  2. 第1群の順位和 $R_1 = \sum_{i=1}^{n_1} R(X_i)$ を計算
  3. U統計量を計算: $U = R_1 – n_1(n_1+1)/2$

$U$ は「第1群の各値が第2群の各値より大きいペアの数」を数えています。$H_0$(両群が同じ分布)のもとでは $E[U] = n_1 n_2 / 2$ です。

クラスカル・ウォリス検定

問題設定

$k$ 群の独立なサンプルが同じ分布に従うかを検定します(一元配置ANOVAのノンパラメトリック版)。

検定統計量

$$ \begin{equation} H = \frac{12}{N(N+1)}\sum_{i=1}^{k} \frac{R_{i}^2}{n_i} – 3(N+1) \end{equation} $$

ここで $R_i$ は第 $i$ 群の順位和、$N$ は全データ数です。

$H_0$ のもとで $H \approx \chi^2_{k-1}$ に従います。

パラメトリック vs ノンパラメトリックの比較

漸近相対効率(ARE)

正規分布のもとで、ウィルコクソン検定のt検定に対する漸近相対効率は

$$ \text{ARE}(\text{Wilcoxon}, t) = \frac{3}{\pi} \approx 0.955 $$

つまり、正規分布の場合でもウィルコクソン検定はt検定の約95%の効率を維持します。わずか5%の検出力の低下で、分布の仮定から解放されるのです。

非正規分布の場合は、ノンパラメトリック検定の効率がパラメトリック検定を大きく上回ることがあります。

Pythonで各検定を実装し比較しましょう。

Pythonでの実装と可視化

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

np.random.seed(42)

fig, axes = plt.subplots(1, 3, figsize=(16, 5.5))

# (a) 正規分布 vs 歪んだ分布でのt検定 vs ウィルコクソン検定
ax = axes[0]
n_sim = 5000
n = 20

# 歪んだ分布(対数正規分布)での第一種の過誤率
distributions = {
    'Normal': (lambda n: np.random.normal(0, 1, n), 0),
    'Lognormal': (lambda n: np.random.lognormal(0, 1, n) - np.exp(0.5), np.exp(0.5)),
    'Exponential': (lambda n: np.random.exponential(1, n) - 1, 1),
    't(3)': (lambda n: np.random.standard_t(3, n), 0),
}

t_errors = []
w_errors = []
dist_names = []

for name, (gen, med) in distributions.items():
    t_rej, w_rej = 0, 0
    for _ in range(n_sim):
        sample = gen(n)
        _, p_t = stats.ttest_1samp(sample, 0)
        _, p_w = stats.wilcoxon(sample - med, alternative='two-sided', zero_method='wilcox')
        if p_t < 0.05:
            t_rej += 1
        if p_w < 0.05:
            w_rej += 1
    t_errors.append(t_rej / n_sim)
    w_errors.append(w_rej / n_sim)
    dist_names.append(name)

x_pos = np.arange(len(dist_names))
width = 0.35
ax.bar(x_pos - width/2, t_errors, width, color='steelblue', alpha=0.7, label='t-test')
ax.bar(x_pos + width/2, w_errors, width, color='salmon', alpha=0.7, label='Wilcoxon')
ax.axhline(0.05, color='black', linewidth=1.5, linestyle='--', label='$\\alpha = 0.05$')
ax.set_xticks(x_pos)
ax.set_xticklabels(dist_names, fontsize=9)
ax.set_ylabel('Type I error rate', fontsize=12)
ax.set_title('Type I Error: t-test vs Wilcoxon', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3, axis='y')

# (b) 検出力の比較(歪んだ分布)
ax = axes[1]
shifts = np.linspace(0, 2, 10)
n_pow = 30

power_t = []
power_w = []
power_u = []

for shift in shifts:
    t_rej, w_rej = 0, 0
    for _ in range(n_sim):
        # 対数正規分布(右に歪んだ分布)
        sample = np.random.lognormal(shift * 0.3, 0.8, n_pow)
        _, p_t = stats.ttest_1samp(sample, np.exp(0.32))  # 中央値での検定
        try:
            _, p_w = stats.wilcoxon(sample - np.exp(0.32))
        except ValueError:
            p_w = 1.0
        if p_t < 0.05:
            t_rej += 1
        if p_w < 0.05:
            w_rej += 1
    power_t.append(t_rej / n_sim)
    power_w.append(w_rej / n_sim)

ax.plot(shifts, power_t, 'bo-', linewidth=2, markersize=6, label='t-test')
ax.plot(shifts, power_w, 'rs-', linewidth=2, markersize=6, label='Wilcoxon')
ax.set_xlabel('Effect size (shift)', fontsize=12)
ax.set_ylabel('Power', fontsize=12)
ax.set_title('Power: Lognormal Distribution', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (c) マン・ホイットニー U検定の例
ax = axes[2]
n1, n2 = 25, 25
group1 = np.random.exponential(2, n1)
group2 = np.random.exponential(3, n2) + 0.5

# t検定
t_stat, p_t = stats.ttest_ind(group1, group2, equal_var=False)
# U検定
u_stat, p_u = stats.mannwhitneyu(group1, group2, alternative='two-sided')

ax.hist(group1, bins=15, density=True, alpha=0.5, color='blue',
        edgecolor='gray', label=f'Group 1 (median={np.median(group1):.2f})')
ax.hist(group2, bins=15, density=True, alpha=0.5, color='red',
        edgecolor='gray', label=f'Group 2 (median={np.median(group2):.2f})')

ax.text(0.98, 0.95, f"Welch's t: p={p_t:.4f}\nMann-Whitney U: p={p_u:.4f}",
        transform=ax.transAxes, ha='right', va='top', fontsize=10,
        bbox=dict(facecolor='lightyellow', alpha=0.8))

ax.set_xlabel('Value', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Mann-Whitney U vs t-test\n(Skewed data)', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('nonparametric_tests.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフからノンパラメトリック検定の特徴がわかります。

  1. 左図: 正規分布ではt検定とウィルコクソン検定の過誤率はともに5%付近で良好です。しかし対数正規分布やt(3)分布のような非正規分布では、ウィルコクソン検定の方が過誤率が安定しています

  2. 中央図: 対数正規分布(歪んだ分布)での検出力比較です。ウィルコクソン検定はt検定と同等以上の検出力を示しています。非正規分布ではノンパラメトリック検定が有利になりえます

  3. 右図: 歪んだ分布のデータに対するマン・ホイットニーU検定とウェルチのt検定の比較です。両者のp値は異なることがあり、分布の形状によってどちらが適切かが変わります

まとめ

本記事では、ノンパラメトリック検定の全体像を解説しました。

  • ノンパラメトリック検定は分布の形状を仮定せず、データの順位を使って検定する
  • ウィルコクソンの符号順位検定は1標本t検定/対応ありt検定の代替
  • マン・ホイットニーのU検定は独立2標本t検定の代替
  • クラスカル・ウォリス検定は一元配置ANOVAの代替
  • 正規分布のもとでも約95%の効率を維持し、非正規分布では逆にパラメトリック検定を上回ることがある

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