🔍
Shapiro-Wilk(シャピロ・ウィルク)検定|正規性検定
概要
データが正規分布に従っているかどうかを検定する方法
主な用途
パターン | 説明 | 実務ユースケース |
---|---|---|
正規性の事前確認 | t検定などパラメトリック手法の前提を確認 | 施策前後の効果検証における差分の正規性チェック |
単変量の分布検定 | 1変量の数値データの正規性を評価 | CV率、売上などの分布チェック |
データ要件
- 従属変数:数値型(例:差分、CV率、売上)
- 独立変数:存在しない ※比較対象があるわけではなく、1つのデータ分布に使用されるため
- 前提条件:特になし(データが連続値であれば使用可)
※標本サイズは小〜中規模が推奨(目安:3 ≤ n ≤ 5000)
理論
データが正規分布に従うかを検定
- 帰無仮説:データは正規分布に従う
- 対立仮説:正規分布に従わない(両側検定) ※片側検定は存在しない
【検定の手順】
-
データを昇順に並べる
-
正規分布の理論値(重み
)を計算a_i
正規分布の特徴をもとに事前に計算される(scipyなどが自動計算) -
統計量
の算出W
- 分子:理論的な正規分布との整合度
- 分母:実データのばらつき(不偏分散 × 標本数)
は「正規分布にどれだけ近いか」を示し、1に近いほど正規分布に近いと判断される W
-
p値を算出
「統計量 が帰無仮説(=正規分布に従う)のもとでどの程度の確率で得られるか(p値)W
→ 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プロット、箱ひげ図等を併用すると良い
ケーススタディ
関連手法
- 前提条件に関連する手法
- Q-Qプロット(視覚的な正規性チェック)
- 類似手法
- Kolmogorov-Smirnov検定(最大のズレを評価)
- Anderson-Darling検定(裾の差にも強力)
- 関連手法
Discussion