Проверка гипотез на python

С каждым днем количество данных становится больше и больше. И как говорится, чем больше ты знаешь, тем больше ты задаешь вопросов, и тем больше ты хочешь получить ответов. Получить ответы на основе данных можно с помощью статистики. А именно, если требуется что-то сравнить, поможет проверка статистических гипотез.

Что же такое статистическая гипотеза. Приведём определение из Википедии.

Статистическая гипотеза — предположение о виде распределения и свойствах случайной величины, которое можно подтвердить или опровергнуть применением статистических методов к данным выборки.

Случайная величина, например, среднее, берется из выборки, которая тоже должна быть взята случайно и в ней должно быть от 30 элементов. Если выборка берется не случайно, то и данные будут не достоверные. Значение в 30 элементов это научно доказанный факт, так как начиная от 30 выборочные среднее и дисперсия близки к реальному среднему и дисперсии генеральной совокупности.

В общем виде алгоритм проверки выглядит следующим образом:

1. Формулировка основной гипотезы Н₀ и альтернативной гипотезы Н₁;

2. Задание уровня значимости α;

Определение уровня значимости довольно большая тема, поэтому обозначим кратко основные моменты.

Есть стандартные уровни значимости 0,1; 0,05; 0,01; 0,001.

И условно их можно выбирать так. Если объем выборки небольшой до 100 единиц, то можно вполне отвергнуть нулевую гипотезу при уровне значимости 0,05 или даже 0,1. При объеме выборки, измеряемой сотнями – от 100 до 1000, следует понизить уровень значимости хотя бы до 0,01. А при больших выборках, измеряемых тысячами наблюдений, уверенно отвергать нулевую гипотезу можно только при значимости меньшей 0,001.

В целом же для каждой конкретной задачи нужно смотреть на данные и подбирать уровень значимости, который в лучшей мере подойдет для этих данных.

Визуализация уровня значимости α для двусторонней гипотезы.
Визуализация уровня значимости α для двусторонней гипотезы.

3. Выбор статистического критерия;

4. Определения правила принятия решения;

5. Принятие решения на основе данных.

Теперь проведем тест на Python используя библиотеку scipy.stats.

Гипотеза: средние показатели переменных различаются.

- Сформулируем нулевую гипотезу (Н₀). Среднее значение тарифов тариф_1 и тариф_2 одинаковое.

- Сформулируем альтернативную гипотезу (Н₁). Среднее значение тарифов тариф_1 и тариф_2 разное.

Для примера возьмем распределение для тарифа_1 в виде data_1, а для тарифа_2 в виде data_2

Будем использовать следующие данные для проверки гипотез.

data_1 = np.random.uniform(-1, 0, 1000) # равномерное распределение тариф1 data_2 = np.random.normal(-1, 2, 1000) # нормальное распределение тариф2

В нашем примере будем использовать α = 0.05

Первым тестом для проверки будет тест Шапиро-Уилка.

Тест оценивает набор данных и дает количественную оценку вероятности того, что данные были получены из Гауссовского (нормального) распределения.

Для теста используется формула:

Проверка гипотез на python

Здесь S2 - сумма квадратов отклонений значений выборки от среднего арифметического:

Проверка гипотез на python

Значение B2 находят по формуле:

где i – номер элемента в вариационном ряду. В формуле учитывается только целая часть от n/2. Значения a_i находят из таблиц.
где i – номер элемента в вариационном ряду. В формуле учитывается только целая часть от n/2. Значения a_i находят из таблиц.
data = pd.concat([data_1, data_2]).reset_index(drop=True) # сделаем генеральное распределение для проведение теста stat, p = stats.shapiro(data) print('Statistics=%.3f, p-value=%.3f' % (stat, p)) if p < alpha: print('Отклонить гипотезу о нормальности') else: print('Принять гипотезу о нормальности') Statistics=0.919, p-value=0.000 Отклонить гипотезу о нормальности

Тест показал, что нормальность не соблюдается.

Следующий тест, тест Левена.

Логическая статистика, используемая для оценки равенства дисперсий для переменной, рассчитанной для двух или более групп. Некоторые распространенные статистические процедуры предполагают, что дисперсии популяций, из которых взяты различные выборки, равны. Тест Левена оценивает это предположение. Он проверяет нулевую гипотезу о том, что дисперсии популяции равны. Если результирующее p-значение теста Левена меньше некоторого уровня значимости (обычно 0.05), полученные различия в выборочных дисперсиях вряд ли имели место на основе случайной выборки из популяции с равными дисперсиями. Таким образом, нулевая гипотеза равных дисперсий отвергается и делается вывод о наличии разницы между дисперсиями в популяции.

Для теста используется формула:

Проверка гипотез на python

Где:

k - это число различных групп, к которым принадлежат отобранные случаи,

N_i - это количество случаев в i группе,

N - это общее количество случаев во всех группах,

Y_ij - это значение измеряемой переменной для j случая из i группы,

Проверка гипотез на python

Первое среднее по группе j

Второе медиана по группе i

test_leven, p = stats.levene(data_1, data_2) print('Statistics=%.3f, p-value=%.3f' % (test_leven, p)) alpha = 0.05 if p < alpha: print('Отклонить гипотезу о равенстве дисперсий') else: print('Принять гипотезу о равенстве дисперсий') Statistics=1272.766, p-value=0.000 Отклонить гипотезу о равенстве дисперсий

Проверим гипотезу с помощью scipy.stats.ttest_ind, так как с его помощью можно сравнить средние двух совокупностей.

results = stats.ttest_ind( data_1[0], data_2[0], equal_var=False) # Так как нормальность не соблюдается print('p-значение:', results.pvalue) if (results.pvalue < alpha): print("Отвергаем нулевую гипотезу") else: print("Не получилось отвергнуть нулевую гипотезу") p-значение: 2.19278763437e-16 Отвергаем нулевую гипотезу

Тест показывает, что гипотеза Н₀ не подтверждена, следовательно, отвергаем нулевую гипотезу. Поэтому принимаем альтернативную гипотезу Н₁, cреднее значение тарифа_1 и тарифа_2 разное.

В статистике есть и другие тесты для проверки гипотезы, главное понять какой конкретный тест подходит для Ваших данных. И не допускать ошибок первого и второго рода. Так как вероятность принять неправильную гипотезу, Н₀, или отвергнуть правильную всегда есть. Поэтому тестов много, как и данных, найдите правильный тест для своих гипотез.

1111
6 комментариев

Очень слабо написано. Тема не раскрыта даже поверхностно. Информация сильно разрознена. Есть грубые методические ошибки.

Определение уровня значимости довольно большая тема, поэтому обозначим кратко основные моменты.Опишите хотя бы, какой математический смысл имеет уровень значимости.

Гипотеза: средние показатели тарифов различаются.Стоп, откуда тарифы? до сих пор про них не было ни слова. Что за тарифы?
Тарифы на жкх, на сотовую связь, на энергоносители?

Первым тестом для проверки будет тест Шапиро-Уилка. Почему мы выбрали именно этот критерий, а, например, не критерий Колмогорова, Пирсона?
Чем обусловлен выбор?

data = pd.concat([data_1, data_2]).reset_index(drop=True)То есть склеили воедино выборку нормально распределенной СВ и равномерно распределенной СВ, ок, норм.
Отклонить гипотезу о нормальностиНичего удивительного, проверяли винегрет из тарифов

Тест показал, что нормальность не соблюдается.Следующий тест, тест Левена.Тут надо бы написать, что мы используем критерий Левена именно по той причине,
что нормальность ни одной из выборок не соблюдается, иначе бы использовали критерий Бартлетта, например.
Хотя, постойте, нам же надо было проверять на нормальность каждую из двух выборок data_1 и data_2 по отдельности.
А мы смешали их в кучу.
Ну да ладно, тест Левена справится.

Отклонить гипотезу о равенстве дисперсийОК, справился, действительно дисперсии различны

Проверим гипотезу с помощью scipy.stats.ttest_ind, так как с его помощью можно сравнить средние двух совокупностей.Подождите-ка, this test assumes that the populations have identical variances by default.
А мы только что с помощью теста Левена получили результат, что дисперсии различны.
То есть применять критерий Стьюдента мы не имеем возможности.
Ну применить конечно, можно, но смысла результат иметь не будет.
(scipy.stats.ttest_ind - это критерий Стьюдента, об этом тоже неплохо было бы упомянуть в статье)

И не допускать ошибок первого и второго рода. Так как вероятность принять неправильную гипотезу, Н₀, или отвергнуть правильную всегда есть.А что это за ошибки, в чем состоят?
Возможно, они как-то связаны с таинственным уровнем значимости из начала статьи? )
Об этом как раз и нужно было тут написать.

3
Автор

Большое спасибо за вашу развернутую обратную связь!
Разбираться в этой теме автор начал не так давно, видимо, поэтому возникли ваши комментарии.
Уровень значимости понимался, как допустимая вероятность отклонить нулевую гипотезу.
Упоминание тарифов было в первоначальном варианте исследований.
Согласны, было бы корректнее выбрать тест Колмогорова-Смирнова, т.к. количество записей для него достаточное.
Упустили момент, что не написали про ошибки первого и второго рода.
Следующие исследования будем проводить глубже и тщательнее )

1

меня тут скорее остановило то, что код явно откуда скопирован, но даже не проверен
множества подпихивать в пд.конкат - это конечно сильно

Автор

Это типичный код для проверки данного вопроса с использованием scipy.stats. Может быть, что-то и было взято из других статей при изучении материала, но это какая-то незначительная часть. Насчет множества и конкат, можете посоветовать правильный метод?

Автор

Проверю код еще раз, спасибо