A/B-тест это эксперимент: часть пользователей случайно получает новую версию (B), остальные старую (A), и мы сравниваем метрики. Случайность распределения делает группы похожими во всём, кроме изменения, поэтому разницу в метриках можно приписать изменению. На собесе спрашивают не формулы, а дизайн: что тестируем, на ком, по какой метрике и сколько ждём.
С чего начинается тест
- Гипотеза. «Если показать цену со скидкой на карточке, конверсия в покупку вырастет, потому что пользователь раньше видит выгоду». В гипотезе есть изменение, метрика и механизм.
- Метрики. Заранее, до запуска.
- Единица рандомизации и анализа.
- Размер выборки и длительность из MDE, альфы и мощности.
- Критерий решения: что делаем при каждом исходе.
Всё это фиксируют в документе до старта. Решения, принятые после взгляда на данные, превращают тест в подгонку.
Метрики
- Целевая (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-тест?