🔍

Kolmogorov-Smirnov(コルモゴロフ・スミルノフ)検定|正規性検定

に公開

概要

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

主な用途

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

データ要件

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

理論

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

【検定の手順】

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

  2. 経験分布関数(EDF)と理論分布(CDF)を比較
    各データ点に対して、EDF(実際の累積確率)とCDF(理論分布の累積確率)との差を算出

  3. 統計量Dの算出

D = \max_{x} \left| F_n(x) - F(x) \right|
  • F_n(x):経験分布関数(EDF)
  • F(x):理論分布関数(CDF)(例:正規分布のCDF)
  • D:各xにおける\left| F_n(x) - F(x) \right| の最大値

Dが大きいほど、理論分布と実データの乖離が大きいと判断される

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

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

標本サイズが大きくなるほど、わずかな差異でも帰無仮説が棄却されやすくなる傾向あり

実装コード例

Python

from scipy.stats import kstest, norm

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

# Kolmogorov-Smirnov検定(正規分布との比較)
stat, p_val = kstest(diff, cdf='norm', args=(diff.mean(), diff.std(ddof=1)))
print(f"D値 = {stat:.3f}, p値 = {p_val:.3f}")

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

補足:from scipy.stats import normは必要なのか
cdf='norm' のように文字列で指定する場合:インポートは不要
(SciPy が内部で自動的に scipy.stats.norm を参照して使用) ※上記コードも同様
自作の累積分布関数やカスタマイズした正規分布を使う場合:インポートが必要

注意点・Tips

  • 前提確認に使用:t検定などパラメトリック手法の前提(正規性)チェックに使う
  • サンプル数が少ないと検出力が低下:特にn<10程度では慎重に解釈
    → ノンパラメトリック検定[1]など別の手法を使う選択肢もあり
  • サンプル数が多いとわずかな歪みも検出されやすい
    目安としてn>50〜100では軽微な歪みでもp値が小さくなりがち
    → 実務では、Shapiro-Wilk検定やAnderson-Darling検定も併用するとよい
  • CDFの指定ミスに注意cdf='norm'の指定やパラメータ推定が不適切だと誤判定の可能性あり

関連手法

参考リンク・文献

脚注
  1. データが特定の分布(例:正規分布)に従っているという仮定を必要としない統計的検定 ↩︎

Discussion