Проверка гипотез: какой тест когда применять

Нулевая и альтернативная гипотезы

Любая проверка гипотез начинается с двух утверждений:

H0 (нулевая гипотеза) — утверждение, что эффекта нет. Конверсия не изменилась, средний чек одинаковый, распределение соответствует ожидаемому. H0 считается верной, пока данные не убедят в обратном.

H1 (альтернативная гипотеза) — утверждение, что эффект есть. Конверсия выросла, средний чек в тесте выше, распределение отличается от ожидаемого.

Логика проверки — не доказательство H1, а попытка опровергнуть H0. Вы рассчитываете p-value — вероятность получить наблюдаемые данные или более экстремальные, если H0 верна. Маленькое p-value означает: данные плохо совместимы с H0, есть основания её отклонить.

Односторонний и двусторонний тесты

Двусторонний тест (two-tailed) — H1 утверждает, что параметр отличается от нулевого в любую сторону. Пример: «конверсия в тесте не равна конверсии в контроле». Используется по умолчанию в большинстве A/B тестов.

Односторонний тест (one-tailed) — H1 утверждает направление эффекта. Пример: «конверсия в тесте выше, чем в контроле». P-value одностороннего теста вдвое меньше, чем двустороннего, при том же значении статистики.

Когда использовать односторонний тест? Только если вас категорически не интересует противоположное направление. Если вы тестируете новую кнопку «Купить» и готовы раскатить её только при росте конверсии, формально можно использовать односторонний тест. Но на практике двусторонний безопаснее — вы увидите, если изменение ухудшило метрику.

На собеседованиях рекомендуют отвечать: по умолчанию используйте двусторонний тест, односторонний — только при чётком обосновании.

Таблица выбора теста

Выбор теста зависит от двух вещей: типа данных и количества групп.

Что сравниваете 2 группы (независимые) 2 группы (парные) 3+ групп
Средние, данные ~нормальные t-тест (Student) Парный t-тест ANOVA
Средние, данные ненормальные Mann-Whitney U Wilcoxon signed-rank Kruskal-Wallis
Доли (конверсии) z-тест для долей McNemar Хи-квадрат
Категориальные данные Хи-квадрат / Фишер Хи-квадрат

На собеседовании аналитика чаще всего спрашивают четыре теста: z-тест для долей, t-тест, хи-квадрат и Mann-Whitney. Их и разберём.

Z-тест для долей: сравнение конверсий

Самый частый тест в продуктовой аналитике. Применяется в A/B тестах, когда вы сравниваете конверсии двух групп.

Когда использовать: две независимые группы, метрика — доля (конверсия, CTR, retention). Условие: np >= 5 и n(1-p) >= 5 в каждой группе.

Пример. Контроль: 10 000 пользователей, 1200 конверсий (12.0%). Тест: 10 000 пользователей, 1350 конверсий (13.5%). Разница — 1.5 п.п. Случайность?

Нулевая гипотеза H0: p_test = p_control. Объединённая доля:

p_pool = (1200 + 1350) / 20000 = 0.1275

Стандартная ошибка разности:

SE = sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
SE = sqrt(0.1275 * 0.8725 * 0.0002) = 0.00472

Z-статистика:

z = (0.135 - 0.120) / 0.00472 = 3.18

P-value (двустороннее) = 2 * P(Z > 3.18) = 0.0015.

Результат значим при alpha = 0.05. Есть основания утверждать, что тестовый вариант повысил конверсию.

Python

import numpy as np
from scipy import stats

n1, x1 = 10_000, 1200   # контроль
n2, x2 = 10_000, 1350   # тест

p1, p2 = x1 / n1, x2 / n2
p_pool = (x1 + x2) / (n1 + n2)
se = np.sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))

z_stat = (p2 - p1) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z_stat)))

print(f"z = {z_stat:.3f}, p-value = {p_value:.4f}")
# z = 3.178, p-value = 0.0015

T-тест: сравнение средних

Применяется, когда метрика — непрерывная величина: средний чек, время на сайте, количество действий за сессию.

Независимый t-тест (две группы)

Когда использовать: две независимые группы, метрика — среднее. Данные примерно нормальны или выборка достаточно большая (n >= 30, работает ЦПТ).

Пример. Вы тестируете новый алгоритм рекомендаций. Контрольная группа: средний чек 1 450 руб. Тестовая: 1 520 руб. Значимо ли?

T-статистика вычисляется как:

t = (x̄_test - x̄_control) / sqrt(s1²/n1 + s2²/n2)

Чем больше t по модулю, тем меньше p-value. При больших выборках t-тест и z-тест дают практически одинаковый результат; разница заметна при n < 30.

Парный t-тест

Когда использовать: измерения до и после на тех же объектах. Пример: среднее время загрузки страницы до и после оптимизации, замеренное на тех же 50 страницах.

Парный тест работает с разностями d_i = after_i - before_i и проверяет, отличается ли среднее разностей от нуля. Мощнее независимого, потому что убирает межобъектную вариативность.

Python

from scipy import stats

# Независимый t-тест
control = [1450, 1380, 1520, 1490, 1410, 1470, 1500, 1430, 1460, 1510,
           1390, 1440, 1480, 1420, 1460, 1400, 1530, 1470, 1450, 1490]
test = [1520, 1480, 1590, 1550, 1510, 1530, 1570, 1500, 1540, 1560,
        1470, 1520, 1550, 1490, 1530, 1480, 1600, 1540, 1510, 1570]

stat, p_value = stats.ttest_ind(test, control)
print(f"t = {stat:.3f}, p-value = {p_value:.4f}")
# t = 3.674, p-value = 0.0008

# Парный t-тест (до и после на тех же объектах)
before = [3.2, 2.8, 3.5, 3.1, 2.9, 3.3, 3.0, 3.4, 2.7, 3.1]
after  = [2.8, 2.5, 3.0, 2.7, 2.6, 2.9, 2.6, 3.0, 2.4, 2.8]

stat, p_value = stats.ttest_rel(after, before)
print(f"t = {stat:.3f}, p-value = {p_value:.4f}")
# t = -5.715, p-value = 0.0003

Хи-квадрат: категориальные данные

Тест хи-квадрат (chi-square, χ²) проверяет, есть ли связь между двумя категориальными переменными. Работает с таблицами сопряжённости (contingency tables).

Когда использовать: обе переменные категориальные. Пример: зависит ли выбор тарифа (бесплатный / базовый / премиум) от источника трафика (поиск / реклама / соцсети)?

Пример. Вы хотите проверить, зависит ли конверсия от устройства.

Конверсия Нет конверсии Всего
Десктоп 120 880 1000
Мобайл 80 920 1000

H0: устройство и конверсия независимы (конверсия одинакова на обоих устройствах).

Тест вычисляет ожидаемые частоты при H0 и сравнивает их с наблюдаемыми:

χ² = Σ (O_i - E_i)² / E_i

Где O_i — наблюдаемая частота, E_i — ожидаемая при H0. Ожидаемая частота для ячейки = (сумма строки * сумма столбца) / общая сумма.

Для нашего примера ожидаемая частота конверсий на десктопе: 1000 * 200 / 2000 = 100. На мобайле — тоже 100.

χ² = (120-100)²/100 + (880-900)²/900 + (80-100)²/100 + (920-900)²/900
χ² = 4.0 + 0.444 + 4.0 + 0.444 = 8.89

При 1 степени свободы (df = (строки - 1) * (столбцы - 1)) p-value = 0.0029. Связь значима — конверсия на десктопе выше.

Ограничение: ожидаемые частоты во всех ячейках должны быть >= 5. При малых частотах используйте точный тест Фишера.

Хи-квадрат vs z-тест для долей. Для таблицы 2x2 (два варианта, бинарный исход) хи-квадрат и z-тест дают эквивалентный результат: χ² = z². Хи-квадрат удобнее, когда групп или категорий больше двух.

Python

from scipy import stats
import numpy as np

# Таблица сопряжённости
observed = np.array([
    [120, 880],   # десктоп
    [80,  920],   # мобайл
])

chi2, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"χ² = {chi2:.3f}, df = {dof}, p-value = {p_value:.4f}")
print(f"Ожидаемые частоты:\n{expected}")
# χ² = 8.889, df = 1, p-value = 0.0029

Mann-Whitney U: непараметрическая альтернатива

Mann-Whitney U-тест (он же тест Уилкоксона для независимых выборок) — непараметрический тест для сравнения двух независимых групп. Не требует нормальности данных.

Когда использовать:

  • Данные сильно скошены (доходы, время сессии, суммы покупок)
  • Маленькая выборка, нельзя опираться на ЦПТ
  • Ранговые или порядковые данные
  • Много выбросов, которые искажают среднее

Как работает. Тест ранжирует все наблюдения обеих групп вместе, а затем проверяет, распределены ли ранги равномерно между группами. Если одна группа систематически получает более высокие ранги — различие значимо.

Важно: Mann-Whitney проверяет не равенство средних, а равенство распределений. Если распределения имеют одинаковую форму, тест сводится к проверке сдвига медиан. Но при разных формах распределений интерпретация сложнее.

Пример. Время первой покупки (в днях) для двух когорт пользователей:

from scipy import stats

cohort_a = [1, 2, 3, 3, 5, 7, 8, 12, 15, 45]
cohort_b = [1, 1, 2, 2, 3, 4, 4, 5, 6, 8]

stat, p_value = stats.mannwhitneyu(
    cohort_a, cohort_b, alternative='two-sided'
)
print(f"U = {stat:.1f}, p-value = {p_value:.4f}")
# U = 68.0, p-value = 0.1432

Результат незначим — нет оснований утверждать, что время до первой покупки различается между когортами. Обратите внимание: t-тест мог бы дать другой результат из-за выброса (45 дней в когорте A), который сильно влияет на среднее, но слабо — на ранги.

Как выбрать тест: алгоритм

  1. Определите тип метрики. Доля (конверсия, CTR) — z-тест или хи-квадрат. Среднее (чек, время) — t-тест или Mann-Whitney. Категории (тариф, сегмент) — хи-квадрат.

  2. Определите количество групп. Две — t-тест, z-тест, Mann-Whitney. Три и больше — ANOVA, Kruskal-Wallis, хи-квадрат.

  3. Проверьте предпосылки. Данные нормальны или n >= 30? t-тест. Скошенные данные, выбросы, маленький n? Mann-Whitney. Ожидаемые частоты >= 5? Хи-квадрат. Меньше 5? Тест Фишера.

  4. Парные или независимые? Одни и те же объекты до/после — парный t-тест или Wilcoxon signed-rank. Разные объекты — независимый t-тест или Mann-Whitney.

Типичные ошибки

1. Использование t-теста для долей. Конверсия — бинарная переменная (0 или 1). Технически t-тест для больших выборок даст близкий результат, но это некорректно методологически. Для долей используйте z-тест или хи-квадрат.

2. Использование t-теста при сильных выбросах. Среднее чувствительно к выбросам. Один пользователь с чеком 500 000 руб. при медиане 2 000 руб. исказит результат. Используйте Mann-Whitney или предварительно обработайте выбросы (тримминг, винсоризация).

3. Игнорирование множественных сравнений. Проверяете 10 метрик — примените поправку Бонферрони или FDR. Подробнее — в статье про p-value.

4. Парный тест на независимых данных (и наоборот). Если вы сравниваете конверсию до и после редизайна на разных пользователях — это независимые группы, парный тест неприменим. Если замеряете KPI тех же менеджеров до и после обучения — парный тест.

5. Хи-квадрат при малых ожидаемых частотах. Если хотя бы одна ожидаемая частота < 5, результат хи-квадрата ненадёжен. Объедините категории или используйте точный тест Фишера.

6. «P > 0.05, значит различий нет». Отсутствие статистической значимости — не доказательство отсутствия эффекта. Возможно, мощности теста не хватило. Посмотрите на доверительный интервал — если верхняя граница захватывает практически значимый эффект, нужна большая выборка.

Вопросы с собеседований

1. Когда использовать z-тест, а когда t-тест?

Z-тест — для сравнения долей (конверсий) или когда дисперсия генеральной совокупности известна. T-тест — для сравнения средних, когда дисперсия оценивается по выборке. На практике при больших n (>30) результаты почти совпадают, потому что t-распределение сходится к нормальному.

2. Чем Mann-Whitney отличается от t-теста?

T-тест сравнивает средние и предполагает нормальность данных (или большие выборки). Mann-Whitney — непараметрический тест, работает с рангами и не требует нормальности. T-тест мощнее, если предпосылки выполнены. Mann-Whitney устойчивее к выбросам и скошенным распределениям.

3. Конверсия в группе A — 10% (n=5000), в группе B — 10.3% (n=5000). Какой тест и какой результат ожидаете?

Z-тест для долей. Разница 0.3 п.п. при таких выборках, скорее всего, незначима. Быстрая оценка: SE ~ sqrt(0.1 * 0.9 * 2/5000) ~ 0.006, z = 0.003/0.006 = 0.5, p-value ~ 0.6. Для обнаружения такой маленькой разницы нужна выборка на порядок больше.

4. В таблице 2x2 хи-квадрат и z-тест дают разные p-value. Почему?

Не должны — для таблицы 2x2 χ² = z², результаты эквивалентны. Если отличаются, возможно, один из тестов применён с поправкой Йейтса на непрерывность (continuity correction), а другой — без. В scipy chi2_contingency по умолчанию применяет поправку при df=1 — проверьте параметр correction.

5. У вас 15 наблюдений в каждой группе. Распределение сильно скошено. Какой тест?

Mann-Whitney U. При n=15 нельзя полагаться на ЦПТ для скошенных данных, t-тест даст ненадёжный результат. Mann-Whitney работает с рангами и устойчив к форме распределения и выбросам.

6. Вы проводите A/B тест с тремя вариантами (контроль + два теста). Какой тест?

Для долей — хи-квадрат на таблице 3x2. Для средних — ANOVA (или Kruskal-Wallis, если данные ненормальны). Если ANOVA покажет значимый результат, используйте post-hoc сравнения (Tukey HSD) с поправкой на множественные сравнения, чтобы определить, какие именно пары различаются.


Потренируйтесь решать задачи по статистике и A/B тестам в Карьернике — тренажёре для подготовки к собеседованиям аналитиков.

FAQ

Какой статистический тест использовать для сравнения конверсий в A/B-тесте?

Z-тест для долей — стандартный выбор для сравнения конверсий двух групп. Условие: np >= 5 и n(1-p) >= 5 в каждой группе. Для таблицы 2x2 эквивалентен хи-квадрату (chi-square), но z-тест удобнее, когда групп ровно две.

Когда использовать Mann-Whitney вместо t-теста?

Когда данные сильно скошены, содержат выбросы или выборка маленькая. Mann-Whitney — непараметрический тест, работающий с рангами. Он устойчивее к нарушениям нормальности, но менее мощный, чем t-тест, когда предпосылки t-теста выполнены.

Чем отличается односторонний тест от двустороннего?

Двусторонний тест проверяет, отличается ли параметр в любую сторону. Односторонний — только в одном направлении (например, «конверсия выросла»). По умолчанию используйте двусторонний — он безопаснее, потому что позволяет обнаружить и ухудшение метрики.

Что значит «p > 0.05» — эффекта точно нет?

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