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