Почему A/B тесты — это не кнопка «проверить гипотезу»
A/B тесты часто подаются как волшебный ритуал: запускаем два варианта, ждем, смотрим p-value и принимаем решение. В реальной работе все сложнее. A/B тест нужен не ради статистической красоты, а ради управляемого решения в условиях неопределенности. Он помогает отделить устойчивый эффект от случайного шума, но только если эксперимент поставлен аккуратно: корректно выбраны метрики, единица рандомизации, длительность, размер выборки и правила остановки.
Именно поэтому хороший специалист смотрит на A/B тест не как на «финальную истину», а как на механизм принятия решения по данным. Это инструмент дисциплины, а не магическое доказательство.
Что именно сравнивают в A/B тесте
По сути мы проверяем, отличается ли среднее поведение двух групп сильнее, чем это можно объяснить случайными колебаниями. Если метрика бинарная — это может быть конверсия. Если непрерывная — средний чек, revenue per user, время сессии. Важно не только увидеть разницу, но и понять, насколько она практически важна и насколько надежно измерена.
$$ \Delta = \bar x_B - \bar x_A $$Самая базовая идея A/B теста — измерить разницу между средними двух групп и затем понять, насколько эта разница устойчива и практически полезна.
\Delta— наблюдаемая разница эффекта между группами\bar x_B— среднее значение метрики в группе B\bar x_A— среднее значение метрики в группе A
Эта формула кажется простой, но за ней скрывается весь смысл эксперимента: мы не ищем просто новое число, мы проверяем, заслуживает ли эта разница доверия и достаточно ли она значима для решения.
Где новички чаще всего портят эксперимент
Самые типичные ошибки — останавливать тест слишком рано, смотреть на десять метрик одновременно без явной главной, менять правила по ходу эксперимента и игнорировать продуктовый контекст. Можно получить «значимый» результат, который ничего не меняет в бизнесе, или, наоборот, упустить ценный эффект из-за плохой постановки теста.
import pandas as pd # собираем результаты по двум группам в таблицу
ab = pd.DataFrame({ # задаем упрощенный результат A/B теста
'group': ['A', 'A', 'A', 'B', 'B', 'B'], # принадлежность к контрольной или тестовой группе
'conversion': [0, 1, 0, 1, 1, 0] # бинарная метрика конверсии
})
summary = ab.groupby('group', as_index=False).agg(rate=('conversion', 'mean')) # считаем среднюю конверсию по каждой группе
delta = summary.loc[summary['group'] == 'B', 'rate'].iloc[0] - summary.loc[summary['group'] == 'A', 'rate'].iloc[0] # измеряем uplift тестовой группы
print(summary) # выводим таблицу средних значений
print({'delta': round(delta, 3)}) # отдельно показываем разницу между группамиВ реальной работе к этому добавятся доверительные интервалы, статистический критерий и правила принятия решения. Но даже базовая формула уже показывает главную идею: A/B тест — это не про впечатление, а про измеряемое отличие между вариантами.