Python中分布的正态性检验

15 投票
2 回答
28540 浏览
提问于 2025-04-17 20:49

我有一些从雷达卫星图像中采样的数据,想对这些数据进行一些统计测试。在这之前,我想先做一个正态性测试,以确保我的数据是符合正态分布的。看起来我的数据是正态分布的,但当我进行测试时,得到的P值是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()

这个输出是这样的:(41099.095955202931, 0.0)。第一个数字是卡方值,第二个是P值。

我还做了一个数据图,已经附上。我想也许是因为我处理的是负值,所以导致了问题,于是我对这些值进行了归一化处理,但问题依然存在。

数组中值的直方图

2 个回答

6

一般来说,当样本数量少于50个时,使用正态性检验要小心。因为这些检验需要足够的证据来拒绝原假设,而原假设是“数据的分布是正态的”。样本数量少的时候,检验可能找不到这些证据。

要记住,当你没有拒绝原假设,并不意味着替代假设就是对的。

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

15

这个问题解释了为什么你会得到这么小的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,这样就可以和正态分布这样的密度进行比较)。

撰写回答