проверка нормальности дистрибутива в 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.

Я сделал график данных, которые я приложил. Я подумал, что, возможно, поскольку я имею дело с отрицательными значениями, это вызывает проблему, поэтому я нормализовал значения, но проблема не устранена.

гистограмма значений в массиве


person Nathan Thomas    schedule 04.03.2014    source источник
comment
Этот вопрос объясняет, почему вы получаете такое маленькое p-значение. По сути, тесты на нормальность почти всегда отклоняют нулевое значение при очень больших размерах выборки (например, в вашей вы можете увидеть лишь небольшую асимметрию в левой части, чего при вашем огромном размере выборки более чем достаточно).   -  person David Robinson    schedule 04.03.2014
comment
@unutbu: это неправда: чтобы продемонстрировать, normaltest(np.random.normal(loc=100, scale=10, size=1000)) по-прежнему возвращает однородные p-значения, даже если среднее значение равно 100, а стандартное отклонение равно 10.   -  person David Robinson    schedule 04.03.2014
comment
@DavidRobinson: О! Спасибо за исправление.   -  person unutbu    schedule 04.03.2014
comment
Это немного поздно, но для будущих читателей: min и max являются ключевыми словами в python, поэтому я бы посоветовал не использовать их в качестве переменных.   -  person Eulenfuchswiesel    schedule 08.05.2018


Ответы (2)


Этот вопрос объясняет, почему вы получаете такое маленькое 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, что делает ее сопоставимой с плотностью, подобной нормальному распределению).

person David Robinson    schedule 04.03.2014

В общем, когда число выборок меньше 50, вы должны быть осторожны при использовании тестов нормальности. Поскольку этим тестам требуется достаточно доказательств, чтобы отвергнуть нулевую гипотезу, то есть «распределение данных нормальное», и когда количество выборок невелико, они не могут найти эти доказательства.

Имейте в виду, что если вы не можете отвергнуть нулевую гипотезу, это не означает, что альтернативная гипотеза верна.

Существует еще одна возможность: Некоторые реализации статистических тестов на нормальность сравнивают распределение ваших данных со стандартным нормальным распределением. Чтобы этого избежать, я предлагаю вам стандартизировать данные, а затем применить тест на нормальность.

person Community    schedule 07.08.2015