Почему A/B тест может сломаться еще до того, как начался
Когда говорят про эксперименты, почти все сразу думают про A/B тест: есть контроль, есть новая версия, сравнили метрику, приняли решение. Но до того как вмешательство вообще появилось, нужно убедиться, что сама экспериментальная инфраструктура умеет честно делить трафик и считать метрики. Именно здесь появляется A/A тест. Его смысл не в том, чтобы сравнить две одинаковые версии ради формальности, а в том, чтобы проверить саму систему измерения.
Если две одинаковые группы вдруг регулярно показывают значимые различия, проблема не в продукте и не в гипотезе. Проблема в разбиении, логировании, атрибуции событий или расчете метрики. И это очень полезное знание, потому что оно спасает от ложных запусков и дорогих неверных выводов.
Что именно проверяет A/A тест
$$ H_0: \mu_A = \mu_{A'} $$В A/A тесте нулевая гипотеза утверждает, что между двумя одинаковыми группами нет реального эффекта. Если система экспериментов здорова, различия должны объясняться случайным шумом, а не устойчивым смещением.
H_0— нулевая гипотеза об отсутствии эффекта\mu_A— среднее значение метрики в первой группе\mu_{A'}— среднее значение метрики во второй, тоже контрольной группе
Важное ощущение здесь такое: мы тестируем не продукт, а доверие к процессу измерения. A/A тест отвечает на вопрос, можно ли вообще верить следующему A/B.
Какие проблемы он умеет вскрывать
Во-первых, неслучайное разбиение пользователей. Если алгоритм распределения групп систематически отправляет разные сегменты в разные корзины, эксперимент уже не честный. Во-вторых, ошибки в логировании: часть событий может не долетать только в одну ветку. В-третьих, перекосы в расчете метрики, когда, например, события учитываются по-разному в зависимости от версии клиента. В-четвертых, неожиданные лаги данных и проблемы таймзон, которые делают метрику нестабильной.
A/A тест особенно полезен перед крупными сериями запусков или после изменений в инфраструктуре трекинга. Он не гарантирует, что все идеально, но сильно снижает риск слепо доверять цифрам.
Как показать это на Python
import numpy as np # генерируем две случайные контрольные группы без реального эффекта
from scipy.stats import ttest_ind # сравниваем средние метрики как в простом эксперименте
rng = np.random.default_rng(42) # фиксируем генератор случайных чисел для воспроизводимости
group_a = rng.normal(loc=10.0, scale=2.0, size=500) # первая контрольная группа с одинаковым распределением
group_a2 = rng.normal(loc=10.0, scale=2.0, size=500) # вторая контрольная группа без вмешательства
stat, pvalue = ttest_ind(group_a, group_a2, equal_var=False) # проверяем, видит ли тест ложное различие
print(round(group_a.mean(), 3)) # смотрим среднее первой группы
print(round(group_a2.mean(), 3)) # смотрим среднее второй группы
print(round(pvalue, 4)) # высокий p-value обычно означает, что значимого эффекта нетЕсли такой тест неожиданно начинает часто давать «значимость», это тревожный сигнал. Значит, еще до настоящего A/B у вас уже есть систематическая проблема в экспериментальном контуре.