Я искал вокруг и, к моему удивлению, кажется, что на этот вопрос не ответил.
У меня есть массив Numpy, содержащий 10000 значений из измерений. Я построил гистограмму с Matplotlib, и визуальным контролем значения обычно распределяются:
Однако я хотел бы подтвердить это. Я нашел тест нормальности, реализованный в scipy.stats.mstats.normaltest, но результат говорит иначе. Я получаю этот вывод:
(masked_array(data = [1472.8855375088663],
mask = [False],
fill_value = 1e+20)
, masked_array(data = [ 0.],
mask = False,
fill_value = 1e+20)
)
что означает, что вероятность того, что набор данных обычно распределяется, равна 0. Я снова запустил эксперименты и снова проверил их, получив тот же результат, а в "лучшем" случае значение p было 3.0e-290.
Я тестировал функцию со следующим кодом и, похоже, делаю то, что хочу:
import numpy
import scipy.stats as stats
mu, sigma = 0, 0.1
s = numpy.random.normal(mu, sigma, 10000)
print stats.normaltest(s)
(1.0491016699730547, 0.59182113002186942)
Если я правильно понял и правильно использовал функцию, это означает, что значения обычно не распределяются. (И, честно говоря, я понятия не имею, почему разница в выходе, т.е. Меньше деталей.)
Я был уверен, что это нормальное распространение (хотя мои знания статистики являются основными), и я не знаю, что может быть альтернативой. Как я могу проверить, что такое функция распределения вероятности?
EDIT:
Мой массив Numpy, содержащий 10000 значений, генерируется следующим образом (я знаю, что это не лучший способ заполнения массива Numpy), а затем запускается нормальный тест:
values = numpy.empty(shape=10000, 1))
for i in range(0, 10000):
values[i] = measurement(...) # The function returns a float
print normaltest(values)
ИЗМЕНИТЬ 2:
Я только что понял, что несоответствие между выходами состоит в том, что я случайно использовал две разные функции (scipy.stats.normaltest() и scipy.stats.mstats.normaltest()), но это не имеет значения, поскольку соответствующая часть вывода одинакова независимо от используемой функции.
ИЗМЕНИТЬ 3:
Установка гистограммы с предложением от askewchan:
plt.plot(bin_edges, scipy.stats.norm.pdf(bin_edges, loc=values.mean(), scale=values.std()))
приводит к следующему:
РЕДАКТИРОВАТЬ 4:
Установка гистограммы с предложением пользователя user333700:
scipy.stats.t.fit(data)
приводит к следующему: