1

を使用scipy.stats.normしてランダムなサンプルを生成し、それを実行すると、非常にscipy.stats.normaltestさまざまな出力が生成されます。

from scipy.stats import norm, normaltest

normaltest(norm.rvs(size=1000))
# (0.10435743048081543, 0.94915922246569517)
normaltest(norm.rvs(size=1000))
# (0.57583529133190114, 0.74982334089826597)
normaltest(norm.rvs(size=1000))
# (0.074086867327589984, 0.96363428027274967)
normaltest(norm.rvs(size=1000))
# (2.0817923824843461, 0.35313806086602029)
normaltest(norm.rvs(size=1000))
# (0.25177398640139054, 0.88171448088503002)
normaltest(norm.rvs(size=1000))
# (2.5213062252950227, 0.2834688289515595)
normaltest(norm.rvs(size=1000))
# (2.0550957310741165, 0.35788346385342579)
normaltest(norm.rvs(size=1000))
# (4.5722298301301869, 0.10166065590209576)
normaltest(norm.rvs(size=1000))
# (3.0060164141422421, 0.22245994699827343)
normaltest(norm.rvs(size=1000))
# (1.8870291791486471, 0.38925734860089078)
normaltest(norm.rvs(size=1000))
# (0.24931060262844901, 0.88280115054104014)

これらのうち 1 つだけが p 値 < 0.05 です。これは本当に壊れているようです。何か不足していますか?

4

1 に答える 1

5

normaltest2 タプルを返します。最初の値はカイ二乗統計量で、2 番目の値は p 値です。

したがって、上記の例では、実際には p 値 < 0.05 はありません。

の docstringnormaltest が正しくない可能性があります。ソース コード (/usr/share/pyshared/scipy/stats/stats.py) を見ると、私の主張が裏付けられます。

def normaltest(a, axis=0):
    a, axis = _chk_asarray(a, axis)
    s,p = skewtest(a,axis)
    k,p = kurtosistest(a,axis)
    k2 = s*s + k*k
    return k2, chisqprob(k2,2)

(編集: docstringはの最新バージョンの時点で正しいscipy.statsことに注意してください。)


全然異常じゃない!

p 値 < 0.05 は、約 5% の確率で発生します。そのコマンドを 1000 回実行してみて、それが正しいかどうかを確認してください。

In [67]: import scipy.stats as stats

In [69]: pvals = [stats.normaltest(stats.norm.rvs(size=1000))[1] for i in range(1000)]

In [71]: sum([1 for p in pvals if p < 0.05])/1000.0
Out[71]: 0.053
于 2012-11-07T23:21:33.640 に答える