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

«Какие статистические критерии вы используете для анализа A/B-тестов?» — вопрос из категории Аналитика и метрики, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор критерия зависит от типа метрики и свойств данных. Вот мой практический подход:

Для бинарных метрик (конверсия, кликабельность):

  • Z-тест для пропорций: Основной инструмент при больших размерах выборок (n > 30, а лучше > 100 на группу), когда можно аппроксимировать биномиальное распределение нормальным.
    from statsmodels.stats.proportion import proportions_ztest
    # count - количество успехов, nobs - размер группы
    count = np.array([150, 180])  # Конверсии в группах A и B
    nobs = np.array([1000, 1000]) # Размеры групп
    z_stat, p_value = proportions_ztest(count, nobs, alternative='two-sided')
    print(f"Z-статистика: {z_stat:.3f}, p-value: {p_value:.4f}")

Для непрерывных метрик (средний чек, время в приложении):

  • T-тест Стьюдента: Использую, когда данные приблизительно нормально распределены и дисперсии в группах схожи (проверяю тестом Левена).
    from scipy.stats import ttest_ind
    # revenue_a, revenue_b - массивы с данными по чекам
    t_stat, p_value = ttest_ind(revenue_a, revenue_b, equal_var=True)
  • U-тест Манна-Уитни: Непараметрическая альтернатива, когда данные не нормальны или есть выбросы. Он сравнивает не средние, а распределения в целом.
    from scipy.stats import mannwhitneyu
    u_stat, p_value = mannwhitneyu(time_on_site_a, time_on_site_b, alternative='two-sided')

Ключевые принципы, которые я соблюдаю:

  1. Проверка предпосылок: Перед t-тестом смотрю на гистограммы и проверяю нормальность (Shapiro-Wilk) и гомогенность дисперсий (Levene's test).
  2. Коррекция множественных сравнений: Если тестируется несколько гипотез одновременно, применяю поправку Бонферрони или Бенджамини-Хохберга (FDR).
  3. Расчёт мощности теста: До запуска оцениваю необходимый размер выборки, чтобы с заданной вероятностью (обычно 80%) обнаружить эффект ожидаемого размера (MDE). Использую для этого statsmodels.stats.power.
  4. Анализ не только p-value: Всегда смотрю на доверительные интервалы разницы метрик, чтобы оценить не только статистическую значимость, но и практическую значимость эффекта.