🔍
Kolmogorov-Smirnov(コルモゴロフ・スミルノフ)検定|正規性検定
概要
データが正規分布に従っているかどうかを検定する方法
主な用途
パターン | 説明 | 実務ユースケース |
---|---|---|
正規性の事前確認 | t検定などパラメトリック手法の前提を確認 | 施策前後の効果検証における差分の正規性チェック |
単変量の分布検定 | 1変量の数値データの正規性を評価 | CV率、売上などの分布チェック |
データ要件
- 従属変数:数値型(例:差分、CV率、売上)
- 独立変数:存在しない ※比較対象があるわけではなく、1つのデータ分布に使用されるため
- 前提条件:
特になし(データが連続値であれば使用可)
※標本サイズは小〜中規模が推奨(目安:3 ≤ n ≤ 5000)
理論
データが正規分布に従うかを検定
- 帰無仮説:データは正規分布に従う
- 対立仮説:正規分布に従わない(両側検定) ※片側検定は存在しない
【検定の手順】
-
データを昇順に並べる
-
経験分布関数(EDF)と理論分布(CDF)を比較
各データ点に対して、EDF(実際の累積確率)とCDF(理論分布の累積確率)との差を算出 -
統計量
の算出D
-
:経験分布関数(EDF)F_n(x) -
:理論分布関数(CDF)(例:正規分布のCDF)F(x) -
:各D におけるx の最大値\left| F_n(x) - F(x) \right|
が大きいほど、理論分布と実データの乖離が大きいと判断される D
-
p値を算出
統計量 が帰無仮説(=正規分布に従う)のもとで得られる確率(p値)を算出D
→ 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'
の指定やパラメータ推定が不適切だと誤判定の可能性あり
関連手法
- 前提条件に関連する手法
- Q-Qプロット(視覚的な正規性チェック)
- 類似手法
- Shapiro-Wilk検定(小規模向けで強力)
- Anderson-Darling検定(裾の差にも強力)
- 関連手法
参考リンク・文献
-
データが特定の分布(例:正規分布)に従っているという仮定を必要としない統計的検定 ↩︎
Discussion