← Назад к вопросам

Какие знаешь критерии соответствия данных T-тесту?

2.2 Middle🔥 121 комментариев
#Метрики и аналитика

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Критерии соответствия данных для 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
  • Или собираю больше данных

На практике: когда я прерываю анализ

  1. Outliers: Если вижу экстремальные значения, проверяю их. Иногда это ошибка в данных. Иногда это реальный паттерн.
  2. Многократное тестирование: Если тестирую 10 метрик одновременно, вероятность false positive растёт. Корректирую p-value (Bonferroni correction).
  3. Временные эффекты: Если видим, что эффект меняется со временем (день 1 vs день 7), это признак, что нарушена независимость или есть скрытые факторы.

Мой чеклист перед T-тестом

  • Данные независимы (разные пользователи, разные сеансы)
  • Нет явных outliers (или они объяснены)
  • Размер выборки достаточен (n > 30, желательно > 100)
  • Распределение похоже на нормальное (особенно если n < 30)
  • Дисперсии примерно равны (или используем Welch's test)
  • Нет multiple testing issues (если несколько метрик, корректирую alpha)
  • Результат имеет практический смысл (не только статистический)

Итог: T-тест — мощный инструмент, но требует уважения к его предположениям. На практике в A/B-тестировании с большими выборками он довольно robust, но я всегда проверяю основные условия перед выводами.

Какие знаешь критерии соответствия данных T-тесту? | PrepBro