Урок по треку Статистика и A/B-тесты 7 мин

Дизайн A/B-теста за 7 минут

Гипотеза, единица рандомизации, метрики (целевые, прокси, guardrail), ratio-метрики, A/A и SRM.

A/B-тест это эксперимент: часть пользователей случайно получает новую версию (B), остальные старую (A), и мы сравниваем метрики. Случайность распределения делает группы похожими во всём, кроме изменения, поэтому разницу в метриках можно приписать изменению. На собесе спрашивают не формулы, а дизайн: что тестируем, на ком, по какой метрике и сколько ждём.

С чего начинается тест

  1. Гипотеза. «Если показать цену со скидкой на карточке, конверсия в покупку вырастет, потому что пользователь раньше видит выгоду». В гипотезе есть изменение, метрика и механизм.
  2. Метрики. Заранее, до запуска.
  3. Единица рандомизации и анализа.
  4. Размер выборки и длительность из MDE, альфы и мощности.
  5. Критерий решения: что делаем при каждом исходе.

Всё это фиксируют в документе до старта. Решения, принятые после взгляда на данные, превращают тест в подгонку.

Метрики

  • Целевая (primary) одна: по ней принимается решение. Например, выручка на пользователя или конверсия в оплату.
  • Прокси-метрики чувствительнее и быстрее, но должны быть связаны с целевой: клик по кнопке «Купить» как ранний сигнал покупки.
  • Guardrail (барьерные) не должны ухудшиться: время загрузки, доля ошибок, отписки, жалобы, отмены. Тест, поднявший конверсию ценой роста возвратов, не успешен.

Хорошая метрика чувствительна (двигается от изменений), устойчива к шуму, понятна бизнесу и считается одинаково в обеих группах.

Единица рандомизации

Обычно это пользователь: один человек всё время видит одну версию. Если рандомизировать по сессиям или просмотрам, один человек увидит обе версии, эффекты смешаются, а наблюдения внутри пользователя станут зависимыми.

Правило: единица анализа должна совпадать с единицей рандомизации или анализ должен учитывать зависимость. Если делили по пользователям, а считаете конверсию по сессиям, обычная формула дисперсии занижает её, и ложных «значимых» результатов становится больше.

Ratio-метрики

CTR = клики / показы, средний чек = выручка / заказы. Это отношение двух сумм по пользователям, и наблюдения в знаменателе (показы, заказы) не независимы: у активного пользователя их много. Для дисперсии таких метрик используют дельта-метод, линеаризацию или бутстреп по пользователям (подробно в модуле про снижение дисперсии).

Размер выборки и длительность

Нужное число пользователей на группу зависит от:

  • базового уровня и дисперсии метрики;
  • MDE, минимального эффекта, который хотим заметить;
  • уровня значимости (обычно 5%) и мощности (обычно 80%).

Длительность = нужная выборка / поток пользователей в тест. Плюс правило: тест идёт целыми неделями, минимум одну-две, чтобы покрыть недельную сезонность (в выходные люди ведут себя иначе). Если по расчёту хватает трёх дней, всё равно ждут неделю.

A/A-тест

Обе группы получают одно и то же. Зачем:

  • проверить сплит-систему: группы должны быть равного размера и похожи;
  • проверить, что метрика и критерий дают около 5% «значимых» результатов при альфе 5%. Если A/A-тесты красятся в 20% случаев, ошибка в расчёте дисперсии или в рандомизации.

Часто прогоняют не один A/A, а тысячи симуляций на исторических данных.

SRM: проверка соотношения групп

Sample Ratio Mismatch: делили 50/50, а получили 50 900 против 49 100. Проверка критерием хи-квадрат согласия:

import math

def srm_p_value(n_a, n_b, share_a=0.5):
    n = n_a + n_b
    exp_a, exp_b = n * share_a, n * (1 - share_a)
    chi2 = (n_a - exp_a) ** 2 / exp_a + (n_b - exp_b) ** 2 / exp_b
    return math.erfc(math.sqrt(chi2 / 2))  # хи-квадрат с 1 степенью свободы

Порог обычно строгий, p < 0.001: проверка идёт на каждом тесте, и ложные тревоги не нужны. При SRM результаты теста нельзя интерпретировать: значит, что-то по-разному отбирает или теряет пользователей в группах (ошибка редиректа, падение версии B у части браузеров, боты, фильтр в логировании). Сначала ищут причину.

Частые ошибки дизайна

  • Метрику выбрали после теста, «какая покрасилась».
  • Рандомизация по сессиям при анализе по пользователям.
  • Тест на три дня в будни.
  • Нет guardrail-метрик.
  • В тест попадают пользователи, которые изменения не увидели (например, не дошли до страницы оплаты). Это размывает эффект: лучше анализировать тех, кто дошёл до точки изменения, но помечать их одинаково в обеих группах (triggered-анализ).

Что спросят на собесе

  • Как спроектировать A/B-тест новой кнопки оплаты: шаги и метрики?
  • Что такое guardrail-метрики и зачем они?
  • Почему важна единица рандомизации?
  • Что такое SRM и что делать, если он обнаружен?
  • Зачем нужен A/A-тест?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.