我使用scipy.stats.normaltest()来测试numpy.random.normal()生成的数据的正常性。这是代码:
from numpy import random
from scipy import stats
for i in range(0, 10):
d = numpy.random.normal(size=50000)
n = scipy.stats.normaltest(d)
print n
结果如下:
(1.554124262066523, 0.45975472830684272)
(2.4982341884494002, 0.28675786530134384)
(2.0918010143075256, 0.35137526093176125)
(0.90623072927961634, 0.63564479846313271)
(2.3015160217986934, 0.31639684620041014)
(3.4005006481463624, 0.18263779969208352)
(2.5241123233368978, 0.28307138716898311)
(12.705060069198185, 0.001742333391388526)
(0.83646951793409796, 0.65820769012847313)
(0.12008522338293379, 0.94172440425950443)
根据文档here,normaltest()返回的值的第二个元素是
pvalue : float or array
A 2-sided chi squared probability for the hypothesis test.
如果我的理解是正确的,它表示输入数据在正态分布中的可能性。我曾预料到上面代码生成的所有pvalue都非常接近1.然而,其中一些可能小到0.001742333391388526。这有什么不对?
答案 0 :(得分:3)
有人可以来对我大喊大叫这是不是p值的正确定义,但作为一个背后估计,你可以期望得到一个低至x的p值概率为x。因此,每575次尝试,您将得到一个低至0.00174的p值。
import numpy as np
from scipy.stats import normaltest
import matplotlib.pyplot as plt
%matplotlib inline
L=[]
for i in range(0, 10000):
d = np.random.normal(size=50000)
n = normaltest(d)
L.append(n.pvalue)
plt.hist(L,bins=20)
plt.show()
答案 1 :(得分:2)
如果我的理解是正确的,它表示输入数据在正态分布中的可能性。我原以为上面代码生成的所有pval都非常接近1。
你的理解是不正确的,我很害怕。 p-value是获得至少与零假设下的观察一样极端的结果的概率(即,假设数据实际上是正态分布的)。它不需要接近1.通常, p - 值大于0.05被认为是不重要的,这意味着正常性没有被测试反驳。
正如Victor Chubukov指出的那样,即使数据是真正正常分布的,你也可以简单地获得低p值。
统计假设检验相当复杂,可能看起来有点反直觉。如果您需要了解更多详细信息,Cross Validated可以获得更详细的答案。