Scipy的normaltest函数似乎不准确

时间:2012-11-07 23:16:38

标签: python statistics scipy normal-distribution

使用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。这似乎真的破了。我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

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

所以在上面的例子中,实际上没有p值&lt; 0.05。

normaltest may be incorrect的文档字符串;通过查看源代码(/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最新版本的文档字符串is correct。)


完全没有异常!

p值&lt;大约5%的时间应该发生0.05。 尝试运行该命令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