1. ホーム
  2. python

[解決済み] Python Scipyによる2標本Kolmogorov-Smirnov検定

2022-11-26 12:55:53

質問

Scipyで2標本のKS検定を行う方法がわかりません。

ドキュメントを読んだ後 scipy kstest

分布が標準正規分布と同じかどうかをテストする方法がわかる

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
#>>> test_stat
#(0.021080234718821145, 0.76584491300591395)

これは、p値が0.76のとき、2つの分布が同一であるという帰無仮説を棄却できないことを意味します。

しかし、私は2つの分布を比較し、それらが同一であるという帰無仮説を棄却できるかどうかを確認したいのですが、そのようなことは可能でしょうか?

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
z = np.random.normal(1.1,0.9, 1000)

で、xとzが同じかどうかを調べる

ナイーブを試してみました。

test_stat = kstest(x, z)

と入力すると、以下のようなエラーが発生しました。

TypeError: 'numpy.ndarray' object is not callable

Pythonで2標本のKS検定を行う方法はありますか?もしあれば、どのようにすればよいですか?

よろしくお願いします。

どのように解決するのですか?

1標本のKS検定を使っていますね。 おそらく2標本検定を使いたいのでしょう ks_2samp :

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 
>>> np.random.seed(12345678)
>>> x = np.random.normal(0, 1, 1000)
>>> y = np.random.normal(0, 1, 1000)
>>> z = np.random.normal(1.1, 0.9, 1000)
>>> 
>>> ks_2samp(x, y)
Ks_2sampResult(statistic=0.022999999999999909, pvalue=0.95189016804849647)
>>> ks_2samp(x, z)
Ks_2sampResult(statistic=0.41800000000000004, pvalue=3.7081494119242173e-77)

結果は以下のように解釈できる。

  1. を比較することができます。 statistic の値と KS-test臨界値表 をサンプルサイズにしたがって計算します。このとき statistic の値が臨界値より大きければ、2つの分布は異なっていることになります。

  2. を比較することもできます。 p-value を有意水準で比較することもできます。 a 通常 a=0.05 または 0.01 (あなたが決める、a が低ければ低いほど、より有意である)。もしp-valueが a よりも小さい場合,2つの分布が異なる可能性が非常に高くなります。