2014-03-04 46 views
6

我有一些数据是从雷达卫星图像中抽取的,并希望对其进行一些统计测试。在此之前,我想进行正常性测试,以确保我的数据正常分布。我的数据似乎是正常分布的,但是当我执行测试Im得到Pvalue为0时,表明我的数据不是正态分布的。Python中分布的正态性测试

我附上我的代码以及分布的输出和直方图(我对python相对来说比较新,所以如果我的代码在任何方面都很笨拙的话,我很抱歉)。任何人都可以告诉我,如果我做错了什么 - 我发现很难从我的直方图相信我的数据不正常分布?

values = 'inputfile.h5' 
f = h5py.File(values,'r') 
dset = f['/DATA/DATA'] 
array = dset[...,0] 
print('normality =', scipy.stats.normaltest(array)) 
max = np.amax(array) 
min = np.amin(array) 

histo = np.histogram(array, bins=100, range=(min, max)) 
freqs = histo[0] 
rangebins = (max - min) 
numberbins = (len(histo[1])-1) 
interval = (rangebins/numberbins) 
newbins = np.arange((min), (max), interval) 
histogram = bar(newbins, freqs, width=0.2, color='gray') 
plt.show() 

这将打印此项:(41099.095955202931,0.0)。第一个元素是卡方值,第二个元素是一个p值。

我制作了附加的数据图表。我认为,也许是因为林处理负面价值是造成问题,所以我规范化的价值观,但问题仍然存在。

histogram of values in array

+1

[这个问题](http://stats.stackexchange.com/questions/2492/is-normality-testing-essentially-useless)解释了为什么你会得到如此小的p值。从本质上讲,正态性检验几乎总是在非常大的样本量上拒绝零点(例如,在您的情况下,您可以在左侧看到一点点歪斜,这对您庞大的样本规模来说已经足够了) –

+0

@unutbu :这不是真的:即使平均值为100,标准偏差为10,“normaltest(np.random.normal(loc = 100,scale = 10,size = 1000))仍然会返回一致的p值。” –

+0

@DavidRobinson:哦!感谢您的更正。 – unutbu

回答

2

一般来说,当样本数少于50时,应该注意使用正态性检验。由于这些测试需要足够的证据来拒绝零假设,即“数据的分布是正常的”,并且当样本数量很小时,他们无法找到这些证据。

请记住,当您拒绝零假设时,并不意味着备选假设是正确的。

还有另一种可能性: 正态性统计检验的一些实现将数据分布与标准正态分布进行比较。为了避免这种情况,我建议你将数据标准化,然后应用正态性检验。

7

This question解释了为什么你要这么小的p值。从本质上讲,正态性检验几乎总是在非常大的样本量上拒绝零值(例如,在你的左边,你可以看到只是一些歪斜,这在你庞大的样本量上已经足够了)。

在你的情况下,更符合实际的是绘制一条与你的数据相符的正态曲线。然后,您可以看到正常曲线实际上有何不同(例如,您可以看到左侧的尾部是否确实过长)。例如:

from matplotlib import pyplot as plt 
import matplotlib.mlab as mlab 

n, bins, patches = plt.hist(array, 50, normed=1) 
mu = np.mean(array) 
sigma = np.std(array) 
plt.plot(bins, mlab.normpdf(bins, mu, sigma)) 

(注意normed=1论点:这确保了直方图归一化为具有1的总面积,这使得它比得上像正常分布的密度)。