python中分布的正态性检验

Nat*_*mas 12 python statistics normal-distribution scipy

我有一些数据,我从雷达卫星图像中采样,想要进行一些统计测试.在此之前,我想进行常态测试,以确保我的数据是正常分布的.我的数据似乎是正常分布的,但是当我执行测试时,得到Pvalue为0,表明我的数据不是正常分布的.

我已经附加了我的代码以及分布的输出和直方图(我对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()
Run Code Online (Sandbox Code Playgroud)

这打印出:(41099.095955202931,0.0).第一个元素是卡方值,第二个元素是p值.

我已经附上了我所附数据的图表.我认为可能因为我正在处理负值而导致问题因此我将值标准化但问题仍然存在.

数组中值的直方图

Dav*_*son 13

这个问题解释了为什么你得到这么小的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))
Run Code Online (Sandbox Code Playgroud)

(注意normed=1参数:这可以确保将直方图标准化为总面积为1,这使其与正态分布的密度相当).


Far*_*eki 5

通常,当样本数小于50时,您应该小心使用正常性测试.由于这些测试需要足够的证据来拒绝零假设,即"数据的分布是正常的",并且当样本数量很少时,他们无法找到那些证据.

请记住,当您未能拒绝原假设时,并不意味着替代假设是正确的.

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