Как выполнить тест Шапиро-Уилка в Python


Тест Шапиро-Уилка является тестом на нормальность. Он используется для определения того, соответствует ли выборка нормальному распределению .

Чтобы выполнить тест Шапиро-Уилка в Python, мы можем использовать функцию scipy.stats.shapiro() , которая имеет следующий синтаксис:

scipy.stats.shapiro(x)

куда:

  • x: массив демонстрационных данных.

Эта функция возвращает тестовую статистику и соответствующее p-значение.

Если p-значение ниже определенного уровня значимости, то у нас есть достаточно доказательств, чтобы сказать, что данные выборки не получены из нормального распределения.

В этом руководстве показано несколько примеров использования этой функции на практике.

Пример 1. Тест Шапиро-Уилка для нормально распределенных данных

Предположим, у нас есть следующие образцы данных:

from numpy.random import seed
from numpy.random import randn

#set seed (e.g. make this example reproducible)
seed(0)

#generate dataset of 100 random values that follow a standard normal distribution
data = randn(100)

В следующем коде показано, как выполнить тест Шапиро-Уилка для этой выборки из 100 значений данных, чтобы определить, является ли она результатом нормального распределения:

from scipy.stats import shapiro

#perform Shapiro-Wilk test
shapiro(data)

ShapiroResult(statistic=0.9926937818527222, pvalue=0.8689165711402893)

Из вывода мы видим, что статистика теста равна 0,9927 , а соответствующее значение p равно 0,8689 .

Поскольку p-значение не меньше 0,05, мы не можем отвергнуть нулевую гипотезу. У нас нет достаточных доказательств, чтобы сказать, что данные выборки не получены из нормального распределения.

Этот результат не должен вызывать удивления, поскольку мы сгенерировали выборочные данные с помощью функции randn() , которая генерирует случайные значения, соответствующие стандартному нормальному распределению.

Пример 2. Тест Шапиро-Уилка для данных с ненормальным распределением

Теперь предположим, что у нас есть следующие образцы данных:

from numpy.random import seed
from numpy.random import poisson

#set seed (e.g. make this example reproducible)
seed(0)

#generate dataset of 100 values that follow a Poisson distribution with mean=5
data = poisson(5, 100)

В следующем коде показано, как выполнить тест Шапиро-Уилка для этой выборки из 100 значений данных, чтобы определить, является ли она результатом нормального распределения:

from scipy.stats import shapiro

#perform Shapiro-Wilk test
shapiro(data)

ShapiroResult(statistic=0.9581913948059082, pvalue=0.002994443289935589)

Из вывода мы видим, что статистика теста равна 0,9582 , а соответствующее значение p равно 0,00299 .

Поскольку p-значение меньше 0,05, мы отвергаем нулевую гипотезу. У нас есть достаточно доказательств, чтобы сказать, что данные выборки не имеют нормального распределения.

Этот результат также не должен удивлять, поскольку мы сгенерировали выборочные данные с помощью функции poisson() , которая генерирует случайные значения, соответствующиераспределению Пуассона .

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие тесты на нормальность в различных статистических программах:

Как выполнить тест Шапиро-Уилка в R
Как выполнить тест Андерсона-Дарлинга в Python
Как выполнить тест Колмогорова-Смирнова в Python