人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

2つの分布が異なるか調べるKolmogorov–Smirnov検定

Kolmogorov–Smirnov検定って簡単にいうと?

コルモゴロフ-スミルノフ検定(Kolmogorov–Smirnov test)以下KS検定 は任意の2つの分布が異なるか評価する検定です。 例えば用途として、金融では与信スコアリングモデルがデフォルトと非デフォルトを分離できているのか評価するために使うことがあります。

KS検定は順序尺度を用いた検定なのでどんな分布でも検定できる、ノンパラメトリック検定になります。 なのでノンパラメトリックな経験的分布同士の検定も行うことができます。 ちなみに正規分布かどうか調べるならばシャピロ-ウィルク検定[Shapiro-Wilk test]など別の検定を使ったほうが精度が良いとされています。

Kolmogorov–Smirnov検定を使ってみる

Pythonで使うならばscipyにライブラリがあるのでこれを使うのが簡便で良いです。 scipy.stats.ks_2samp — SciPy v0.14.0 Reference Guide

使い方も簡単で2つの分布をnumpy形式で入れてやるだけです。 結果はタプルになっているので必要な方を取得してください。

from scipy import stats
result = stats.ks_2samp(distribution1, distribution1)
result[0]  # 統計検定量
result[1]  # p-value

Kolmogorov–Smirnov検定って何を見てるの?

KS検定が何を評価しているかというと、2つの分布の出現頻度の差を見ています。
横軸にスコアxを0~1、縦軸にyに累積出現割合をおきます。
2つの分布が異なれば片方は0に近い領域で出現数が増え、もう片方は1に近い領域で出現数が増えます。

f:id:Grahamian:20180526011937p:plain

このとき、あるxでのyの差(上図矢印)のうち最大値を統計検定量として検定します。
つまり一番出現割合の差が大きいときを評価します。
この特性のため、KSテストは分布の中央値に影響を受けやすく分布の裾の評価が弱いです。
裾が重要であるような分布(例えばリスク評価)を検定するならばAnderson-Derling検定を使うのが良いとされています。
ただし、2分布間の分布を評価するAnderson-Derling検定はscipyにもありません(1sampleならある)。
Rならばadkというパッケージに入ってるようですがCRANから削除されているのでアーカイブから入れる必要があります。

stats.stackexchange.com