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.000001

p-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

  1. Не интерпретируйте метрики. Результаты теста с SRM невалидны — любые выводы ненадёжны.
  2. Ищите причину. Проверьте логи рандомизации, фильтры, редиректы, скорость загрузки вариантов.
  3. Проверьте подгруппы. SRM может проявляться только в определённых сегментах (платформа, браузер, регион) — это поможет локализовать проблему.
  4. Перезапустите тест после устранения причины. Исправить данные задним числом невозможно.

Подробнее о типичных ошибках в 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-тестов на практике? Больше вопросов — в примерах или откройте тренажёр.