Проверка гипотез: какой тест когда применять
Нулевая и альтернативная гипотезы
Любая проверка гипотез начинается с двух утверждений:
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.00472Z-статистика:
z = (0.135 - 0.120) / 0.00472 = 3.18P-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.0015T-тест: сравнение средних
Применяется, когда метрика — непрерывная величина: средний чек, время на сайте, количество действий за сессию.
Независимый 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.0029Mann-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), который сильно влияет на среднее, но слабо — на ранги.
Как выбрать тест: алгоритм
Определите тип метрики. Доля (конверсия, CTR) — z-тест или хи-квадрат. Среднее (чек, время) — t-тест или Mann-Whitney. Категории (тариф, сегмент) — хи-квадрат.
Определите количество групп. Две — t-тест, z-тест, Mann-Whitney. Три и больше — ANOVA, Kruskal-Wallis, хи-квадрат.
Проверьте предпосылки. Данные нормальны или n >= 30? t-тест. Скошенные данные, выбросы, маленький n? Mann-Whitney. Ожидаемые частоты >= 5? Хи-квадрат. Меньше 5? Тест Фишера.
Парные или независимые? Одни и те же объекты до/после — парный 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» — эффекта точно нет?
Нет. Отсутствие статистической значимости — не доказательство отсутствия эффекта. Возможно, мощности теста не хватило для обнаружения реального эффекта. Посмотрите на доверительный интервал — если его верхняя граница захватывает практически значимый эффект, нужна большая выборка.