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)

其中只有一个的 p 值 < 0.05。这似乎真的坏了。我错过了什么吗?

4

1 回答 1

5

normaltest返回一个 2 元组。第一个值是卡方统计量,第二个值是 p 值。

所以在你上面的例子中,实际上没有 p 值 < 0.05。

的文档字符串normaltest 可能不正确;查看源代码(/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)

(编辑:注意文档字符串在最新版本中是正确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 回答