scipy.stats.normaltest()来测试numpy.random.normal()的正常性

时间:2017-02-04 05:39:28

标签: python numpy scipy

我使用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。这有什么不对?

2 个答案:

答案 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()

enter image description here

答案 1 :(得分:2)

  

如果我的理解是正确的,它表示输入数据在正态分布中的可能性。我原以为上面代码生成的所有pval都非常接近1。

你的理解是不正确的,我很害怕。 p-value是获得至少与零假设下的观察一样极端的结果的概率(即,假设数据实际上是正态分布的)。它不需要接近1.通常, p - 值大于0.05被认为是不重要的,这意味着正常性没有被测试反驳。

正如Victor Chubukov指出的那样,即使数据是真正正常分布的,你也可以简单地获得低p值。

统计假设检验相当复杂,可能看起来有点反直觉。如果您需要了解更多详细信息,Cross Validated可以获得更详细的答案。