簡體   English   中英

python中分布的正態性檢驗

[英]normality test of a distribution in python

我有一些數據,我從雷達衛星圖像中采樣,並希望對其進行一些統計測試。 在此之前,我想進行常態測試,以確保我的數據是正常分布的。 我的數據似乎是正常分布的,但是當我執行測試時,得到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()

這打印出:(41099.095955202931,0.0)。 第一個元素是卡方值,第二個元素是p值。

我已經附上了我所附數據的圖表。 我認為可能因為我正在處理負值而導致問題因此我將值標准化但問題仍然存在。

數組中值的直方圖

這個問題解釋了為什么你得到這么小的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,這使其與正態分布的密度相當)。

通常,當樣本數小於50時,您應該小心使用常態測試。 由於這些測試需要足夠的證據來拒絕零假設,即“數據的分布是正常的”,並且當樣本數量很少時,他們無法找到那些證據。

請記住,當您未能拒絕原假設時,並不意味着替代假設是正確的。

還有一種可能性:正常性統計檢驗的某些實現將數據分布與標准正態分布進行比較。 為了避免這種情況,我建議您對數據進行標准化,然后應用常態測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM