tgoop.com/zasql_python/344
Create:
Last Update:
Last Update:
Кажется, что A/B тест уже идёт — метрики собираются, жизнь прекрасна. Но если доли пользователей в группах не соответствуют ожидаемым — это SRM. И это уже проблема.
Sample Ratio Mismatch (SRM) — несоответствие фактических долей заданным.
Ожидание:
control — 50%
test — 50%
Реальность:
control — 62%
test — 38%
1. Что-то не то со сплитованием в A/B-шнице (последнее на что можно подумать, если платформа не только что разработана). Могут быть проблемы со сплитовалкой на уровне разработки, но также маловероятный сценарий.
2. Логи определения групп пользователей настроены некорректно. Вероятный сценарий. Могли определить неправильно веса групп, выкатить только на определенные девайсы, неправильно настроено определение групп (в тест / контроль попадают пользователи с разным распределением метрики при верной H0).
Предположим, что у нас есть таблица, куда складываются логи пользователей с группами, можно посмотреть на количество пользователей в каждой группе. Тут можно просто глазами просмотреть (что ожидали на дизайне vs то, что получили по факту, какое соотношение).
SQL
SELECT
variant,
COUNT(DISTINCT user_id) AS users
FROM
experiment_assignments
WHERE
experiment_name = 'new_checkout_flow'
AND assignment_time BETWEEN '2025-04-01' AND '2025-04-10'
GROUP BY
variant;
Возьмем пример из начала на 10 000 наблюдений с фактическим разбросом.
from scipy.stats import chisquare
observed = [6200, 3800]
total = sum(observed)
expected = [total / 2, total / 2]
_, p_value = chisquare(f_obs=observed, f_exp=expected)
if p_value < 0.05:
print("SRM")
else:
print("NO SRM")
Вообще на каждом эксперименте можно поставить автоматическую проверку (на предмет валидности расчетов). Ожидаемое vs Фактическое.
Немного про проверку гипотез при Chi-Square
H0: Распределение пользователей между вариантами эксперимента соответствует ожидаемым долям (например, 50 / 50).
H1: Распределение пользователей отличается от ожидаемого.
Если p-value < 0.05, мы отвергаем H0 => SRM есть.
Если p-value >= 0.05, оснований отвергать H0 нет => распределилось все как и ожидалось.
Ставьте реакции если: