SRM (Sample Ratio Mismatch) — что это и почему важно
Коротко
SRM (Sample Ratio Mismatch) — ситуация, когда фактическое распределение пользователей по группам A/B-теста отличается от запланированного. Ожидали сплит 50/50, а получили 51.3/48.7? При больших выборках даже такое отклонение не случайно — это сигнал о системной проблеме. SRM означает, что механика эксперимента сломана, и доверять его результатам нельзя.
На собеседованиях аналитиков SRM спрашивают всё чаще — это показывает, что кандидат не просто умеет считать p-value, а понимает, что может пойти не так на уровне инфраструктуры эксперимента.
Почему SRM — серьёзная проблема
Если распределение по группам не соответствует плану, значит рандомизация нарушена. А если нарушена рандомизация, группы перестают быть сопоставимыми — между ними появляется систематическое различие, не связанное с тестируемым изменением. Любая разница в метриках может быть следствием не фичи, а перекоса в составе групп.
Пример: тест показал рост конверсии на 3% в тестовой группе. Но в тестовой группе оказалось на 2% больше пользователей, чем в контроле. Возможно, часть ботов или невалидных сессий отсеялась из одной группы, но не из другой. Рост конверсии — артефакт, а не реальный эффект.
Правило простое: обнаружили SRM — не интерпретируйте результаты теста, пока не найдёте и не устраните причину.
Как обнаружить SRM
Проверка SRM — это хи-квадрат тест согласия (goodness of fit). Сравниваем наблюдаемые размеры групп с ожидаемыми.
Допустим, в тесте 50/50 мы набрали 105 200 пользователей: 53 400 в контроле и 51 800 в тесте.
Ожидаемые значения при равном сплите: 52 600 и 52 600. Считаем хи-квадрат:
X2 = (53400 - 52600)^2 / 52600 + (51800 - 52600)^2 / 52600
= 640000 / 52600 + 640000 / 52600
= 12.17 + 12.17 = 24.33При df = 1 и alpha = 0.05 критическое значение — 3.84. Наше X2 = 24.33 значительно превышает порог. SRM подтверждён.
Python: проверка SRM за 3 строки
from scipy.stats import chisquare
observed = [53400, 51800] # фактические размеры групп
expected = [52600, 52600] # ожидаемые при 50/50
stat, p_value = chisquare(observed, f_exp=expected)
print(f"X2 = {stat:.2f}, p = {p_value:.6f}")
# X2 = 24.33, p = 0.000001p-value близок к нулю — расхождение не объясняется случайностью. Если p < 0.001, SRM почти наверняка есть.
Для сплитов, отличных от 50/50 (например, 80/20), просто пересчитайте expected пропорционально:
import numpy as np
observed = [82100, 19300]
total = sum(observed)
ratio = [0.8, 0.2]
expected = [total * r for r in ratio]
stat, p_value = chisquare(observed, f_exp=expected)Частые причины SRM
Редиректы. Тестовый вариант загружается через редирект, контрольный — напрямую. Часть пользователей отваливается во время редиректа, тестовая группа уменьшается.
Фильтрация ботов. Бот-фильтр применяется после сплита и срабатывает неравномерно. Например, тестовый вариант генерирует другой паттерн запросов, и бот-детектор отсеивает больше «пользователей» из одной группы.
Triggered experiment. Пользователь попадает в тест только при определённом действии (например, клик по кнопке). Если тестовый вариант меняет вероятность этого действия, размеры групп смещаются.
Ошибка в рандомизации. Хэш-функция, распределяющая пользователей, работает неравномерно. Или рандомизация привязана к сессии, а не к пользователю, и при перезаходе пользователь может сменить группу.
Разная скорость загрузки. Тестовый вариант тяжелее, загружается дольше. Пользователи закрывают страницу до инициализации трекера — и не попадают в логи тестовой группы.
Что делать, если обнаружили SRM
- Не интерпретируйте метрики. Результаты теста с SRM невалидны — любые выводы ненадёжны.
- Ищите причину. Проверьте логи рандомизации, фильтры, редиректы, скорость загрузки вариантов.
- Проверьте подгруппы. SRM может проявляться только в определённых сегментах (платформа, браузер, регион) — это поможет локализовать проблему.
- Перезапустите тест после устранения причины. Исправить данные задним числом невозможно.
Подробнее о типичных ошибках в A/B-тестах.
Вопросы с собеседований
Что такое SRM и почему это проблема? SRM — расхождение между фактическим и ожидаемым распределением пользователей по группам теста. Это означает нарушение рандомизации: группы несопоставимы, результаты невалидны.
Как проверить наличие SRM? Хи-квадрат тест согласия: сравниваем наблюдаемые размеры групп с ожидаемыми. Если p-value < 0.001, SRM есть.
Тест показал значимый положительный эффект, но обнаружен SRM. Что делаете? Не доверяю результатам. SRM означает, что разница в метриках может быть артефактом перекоса в составе групп. Ищу причину SRM, устраняю её и перезапускаю тест.
Назовите три причины SRM. Редиректы (потеря пользователей при перенаправлении), неравномерная фильтрация ботов, ошибки в хэш-функции рандомизации. Ещё — triggered experiments, где само попадание в тест зависит от тестируемого варианта.
SRM обнаружен только на iOS, на Android всё ок. Как интерпретировать? На Android можно интерпретировать результаты, но с осторожностью — если причина SRM на iOS связана с общей инфраструктурой, эффект может быть неявно перекошен и на Android. Лучше найти причину, прежде чем доверять любым результатам.
FAQ
Какой порог p-value для SRM? Обычно используют p < 0.001 — жёстче, чем для самого теста. Причина: SRM — проблема инфраструктуры, а не статистическая гипотеза. Ложноположительное срабатывание здесь менее опасно, чем пропуск реальной проблемы.
SRM бывает в тестах с неравным сплитом (например, 90/10)? Да. SRM — это расхождение между фактическим и запланированным сплитом, каким бы он ни был. Проверка хи-квадратом работает для любого соотношения.
Можно ли «поправить» данные теста с SRM, вместо того чтобы перезапускать? Теоретически можно перевзвесить группы, но на практике это не рекомендуется. Причина SRM обычно вносит систематическое смещение, которое невозможно скорректировать статистически. Перезапуск — единственный надёжный вариант.
Как автоматизировать проверку SRM? Добавьте проверку в пайплайн отчётов по экспериментам: после набора минимальной выборки считайте хи-квадрат и показывайте предупреждение, если p < 0.001. Многие платформы экспериментов (Statsig, Eppo, GrowthBook) делают это из коробки.
Хотите отработать SRM и другие темы A/B-тестов на практике? Больше вопросов — в примерах или откройте тренажёр.