web-dev-qa-db-ja.com

python)の分布の正規性検定

レーダー衛星画像からサンプリングしたデータがいくつかあり、統計的検定を実行したいと考えています。この前に、データが正規分布していることを確認できるように、正規性検定を実行したいと思いました。私のデータは正規分布しているように見えますが、テストを実行すると、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)。最初の要素はカイ2乗値で、2番目の要素はp値です。

添付したデータのグラフを作成しました。負の値を扱っているので問題が発生しているのではないかと思ったので、値を正規化しても問題は解決しません。

histogram of values in array

13
Nathan Thomas

この質問 なぜこのような小さな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になり、正規分布のような密度に匹敵するようになります)。

13
David Robinson

一般に、サンプル数が50未満の場合は、正規性の検定の使用に注意する必要があります。これらの検定には、「データの分布は正常である」という帰無仮説を棄却するのに十分な証拠が必要であり、サンプル数が少ない場合、それらの証拠を見つけることができません。

帰無仮説を棄却しなかった場合、対立仮説が正しいことを意味するわけではないことに注意してください。

別の可能性があります。正規性の統計的検定の一部の実装では、データの分布を標準の正規分布と比較します。これを回避するために、データを標準化してから、正規性の検定を適用することをお勧めします。

5
Farhad Maleki