Какие знаешь критерии соответствия данных T-тесту?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Критерии соответствия данных для T-теста
T-тест — один из самых популярных статистических инструментов в A/B-тестировании, но работает корректно только при соблюдении определённых условий. Расскажу, как я проверяю эти предположения перед анализом.
Основные условия применимости T-теста
1. Нормальность распределения (Normality)
Данные должны быть распределены по нормальному закону (Gaussian distribution, "bell curve").
Как проверяю:
- Визуально: Строю histogram данных и смотрю, похож ли на колокол
- Формально: Используя Shapiro-Wilk тест или Kolmogorov-Smirnov тест
- Если p-value > 0.05 — данные нормальны
- Если p-value < 0.05 — не нормальны
- На практике: В больших выборках (n > 30) небольшие отклонения от нормальности неё критичны из-за Central Limit Theorem
Пример проблемы: Если измеряем время ответа сервера, и у нас частые outliers (очень медленные запросы), распределение может быть skewed. В этом случае T-тест может дать неточные результаты.
2. Независимость наблюдений (Independence)
Даты одной группы не должны влиять на данные другой группы. Все наблюдения — независимы.
Как это нарушается:
- Временная зависимость: Если на понедельник трафик выше, чем на воскресенье, это может быть dependency
- Пользовательская связность: Если один пользователь заходит несколько раз в день, и я считаю каждый логин как отдельное наблюдение — это не независимо
- Групповые эффекты: Если тестирую в одном географическом регионе, и там была реклама, это влияет на обе группы
Как проверяю:
- Убеждаюсь, что каждый пользователь — в одной группе (A или B), не в обеих
- Проверяю, нет ли temporal patterns (дни недели, часы дня)
- Убеждаюсь, что тест работает на разных подмножествах данных (по географии, платформе, etc.)
3. Равенство дисперсий (Homogeneity of Variance)
Дисперсия (вариативность) в обеих группах должна быть примерно одинаковой.
Использую Levene's test или Bartlett's test:
- Если p-value > 0.05 — дисперсии равны, могу использовать обычный T-тест
- Если p-value < 0.05 — дисперсии разные, использую Welch's t-test (более устойчивый)
Пример нарушения: В контрольной группе конверсия стабильна 5%, а в варианте скачет от 1% до 15%. Высокая вариативность в варианте → нарушение равенства дисперсий.
4. Размер выборки (Sample Size)
Для T-теста нужна адекватная выборка. Правила:
- Малые выборки (n < 30): Требуется строгое выполнение условия нормальности
- Средние выборки (n = 30–100): Небольшие отклонения от нормальности приемлемы
- Большие выборки (n > 100): T-тест robust к нарушениям из-за Central Limit Theorem
На практике в A/B-тестировании я почти всегда работаю с n > 100–1000, поэтому нарушение нормальности не критично.
Типы T-тестов и их условия
Independent samples t-test (сравнение двух групп):
- Используется для A/B-тестирования
- Требует: независимость, нормальность (слабо для больших выборок), равенство дисперсий
- Вариант: Welch's t-test — если дисперсии не равны
Paired t-test (сравнение одних же пользователей до/после):
- Используется если тестируем на одних людях (before/after)
- Требует: попарная зависимость (по дизайну), нормальность разностей
- Пример: У каждого пользователя есть конверсия в день 1 и день 2 (до и после изменения)
One-sample t-test:
- Сравниваем выборку с известным значением
- Требует: независимость, нормальность
- Редко используется в A/B-тестировании
Как я проверяю предположения в Python
import scipy.stats as stats
import numpy as np
# Данные
control_group = [2, 3, 4, 5, 5, 6, 7, 8, 9, 10]
variant_group = [3, 4, 5, 6, 6, 7, 8, 9, 10, 11]
# 1. Нормальность (Shapiro-Wilk test)
stat_control, p_control = stats.shapiro(control_group)
stat_variant, p_variant = stats.shapiro(variant_group)
print(f"Control normal: {p_control > 0.05}")
print(f"Variant normal: {p_variant > 0.05}")
# 2. Равенство дисперсий (Levene's test)
stat_levene, p_levene = stats.levene(control_group, variant_group)
print(f"Equal variance: {p_levene > 0.05}")
# 3. T-тест
if p_levene > 0.05:
# Используем обычный t-test
t_stat, p_value = stats.ttest_ind(control_group, variant_group)
else:
# Используем Welch's t-test
t_stat, p_value = stats.ttest_ind(control_group, variant_group, equal_var=False)
print(f"T-test p-value: {p_value}")
print(f"Significant: {p_value < 0.05}")
Что делать, если условия нарушены?
Если нарушена нормальность (особенно для малых выборок):
- Mann-Whitney U test — непараметрическая альтернатива t-testu
- Permutation test — переиспользуем данные по-другому
Если нарушена независимость:
- Перестраиваю данные: считаю метрики на уровне пользователя (не сеанса)
- Использую mixed models, которые учитывают иерархию данных
Если нарушено равенство дисперсий:
- Использую Welch's t-test (уже встроен в большинство инструментов, по умолчанию)
Если малая выборка и нарушена нормальность:
- Использую Bayesian methods
- Или собираю больше данных
На практике: когда я прерываю анализ
- Outliers: Если вижу экстремальные значения, проверяю их. Иногда это ошибка в данных. Иногда это реальный паттерн.
- Многократное тестирование: Если тестирую 10 метрик одновременно, вероятность false positive растёт. Корректирую p-value (Bonferroni correction).
- Временные эффекты: Если видим, что эффект меняется со временем (день 1 vs день 7), это признак, что нарушена независимость или есть скрытые факторы.
Мой чеклист перед T-тестом
- Данные независимы (разные пользователи, разные сеансы)
- Нет явных outliers (или они объяснены)
- Размер выборки достаточен (n > 30, желательно > 100)
- Распределение похоже на нормальное (особенно если n < 30)
- Дисперсии примерно равны (или используем Welch's test)
- Нет multiple testing issues (если несколько метрик, корректирую alpha)
- Результат имеет практический смысл (не только статистический)
Итог: T-тест — мощный инструмент, но требует уважения к его предположениям. На практике в A/B-тестировании с большими выборками он довольно robust, но я всегда проверяю основные условия перед выводами.