🔍

Shapiro-Wilk(シャピロ・ウィルク)検定|正規性検定

に公開

概要

データが正規分布に従っているかどうかを検定する方法

主な用途

パターン 説明 実務ユースケース
正規性の事前確認 t検定などパラメトリック手法の前提を確認 施策前後の効果検証における差分の正規性チェック
単変量の分布検定 1変量の数値データの正規性を評価 CV率、売上などの分布チェック

データ要件

  • 従属変数:数値型(例:差分、CV率、売上)
  • 独立変数:存在しない ※比較対象があるわけではなく、1つのデータ分布に使用されるため
  • 前提条件:特になし(データが連続値であれば使用可)
    ※標本サイズは小〜中規模が推奨(目安:3 ≤ n ≤ 5000)

理論

データが正規分布に従うかを検定
 - 帰無仮説:データは正規分布に従う
 - 対立仮説:正規分布に従わない(両側検定) ※片側検定は存在しない

【検定の手順】

  1. データを昇順に並べる

  2. 正規分布の理論値(重みa_i)を計算
    正規分布の特徴をもとに事前に計算される(scipyなどが自動計算)

  3. 統計量Wの算出

W = \frac{ \left( \sum_{i=1}^{n} a_i x_{(i)} \right)^2 }{ \sum_{i=1}^{n} (x_i - \bar{x})^2 }
  • 分子:理論的な正規分布との整合度
  • 分母:実データのばらつき(不偏分散 × 標本数)

Wは「正規分布にどれだけ近いか」を示し、1に近いほど正規分布に近いと判断される

  1. p値を算出
    「統計量Wが帰無仮説(=正規分布に従う)のもとでどの程度の確率で得られるか(p値)
    → p値が有意水準(例:0.05)未満なら、正規分布に従わないと判断(帰無仮説を棄却)

p値の計算は実際にはscipy.stats.shapiroなどのライブラリで内部的に計算される

標本サイズなどの影響で、W値が高くてもp値が小さければ正規分布とは言えず、
逆にW値が低くてもp値が大きければ正規分布とみなせる場合がある

実装コード例

Python

from scipy.stats import shapiro

# 差分データ
diff = df['before'] - df['after']

# Shapiro-Wilk検定
stat, p_val = shapiro(diff)
print(f"W値 = {stat:.3f}, p値 = {p_val:.3f}")

# 評価(有意水準=0.05)
if p_val < 0.05:
    print("→ 差分データは正規分布に従うとみなせません。")
else:
    print("→ 差分データは正規分布に従うとみなせます。")

注意点・Tips

  • 検定の前提確認として重要:対応のあるt検定など、差分が正規分布に従う前提の確認に使う
  • サンプル数が少ないと検出力が低下:特にn<10程度では慎重に解釈
    → ノンパラメトリック検定など別の手法を使う選択肢もあり
  • サンプル数が多いとわずかな歪みも検出されやすい
    目安としてn > 50〜100では小さな歪みや外れ値でp値が低くなりやすく、
    実務上は正規に近くても「統計的には違う」と判断されることがある
    → この場合、Kolmogorov-Smirnov検定やAnderson-Darling検定も選択肢がある
  • 外れ値に弱い傾向がある:事前に外れ値の影響を確認しておくことを推奨
    → ヒストグラムやQ-Qプロット、箱ひげ図等を併用すると良い

ケーススタディ

🔗学習効果の評価

関連手法

参考リンク・文献

Discussion