Почему рандомизация — основа достоверного теста
A/B-тест измеряет причинно-следственную связь: именно это изменение привело к росту конверсии. Но это возможно только если группы A и B сопоставимы — то есть различаются только тестируемым изменением, а не составом аудитории.
Рандомизация решает эту задачу: при правильном случайном распределении группы статистически одинаковы по всем характеристикам — новым и возвращающимся пользователям, устройствам, каналам трафика, времени суток.
Методы рандомизации
Хеш-функция (стандарт для web/mobile):
# Детерминированная рандомизация через хеш
import hashlib
def get_variant(user_id: str, test_salt: str, num_variants: int) -> int:
key = f"{user_id}:{test_salt}"
hash_value = int(hashlib.md5(key.encode()).hexdigest(), 16)
return hash_value % num_variants
# user_id="u12345", test_salt="test_homepage_hero", num_variants=2
# → 0 (контроль) или 1 (вариант)
Соль теста (test_salt) — уникальная для каждого эксперимента. Это обеспечивает независимость: один пользователь может быть в контроле в одном тесте и в варианте в другом.
Уровни рандомизации (unit of randomization)
| Уровень | Когда использовать | Риски |
|---|---|---|
| Пользователь (userId) | Стандарт для зарегистрированных | Нужна логика для анонимов |
| Cookie | Для анонимных пользователей | Нестабильность при смене браузера |
| Сессия | Тесты, не влияющие на поведение между сессиями | Один юзер видит оба варианта |
| Страница / запрос | Нагрузочные тесты backend | Не подходит для UX-метрик |
Важно: уровень рандомизации должен совпадать с уровнем измерения. Если метрика — «конверсия пользователя», рандомизировать нужно по пользователю, иначе возникнет statistical bias.
Типичные нарушения рандомизации
- Временное разделение — неделя A vs неделя B. Вносит сезонность и события как конфаундеры.
- Географическое разделение — город A vs город B. Различия в аудитории, не в тесте.
- Рандомизация по сессии при метрике по пользователю — пользователь видит оба варианта, эффект размывается.
- Одинаковая соль для всех тестов — корреляция разделений между тестами, параллельные эксперименты влияют друг на друга.
Проверка рандомизации: A/A тест и SRM
Перед запуском первого A/B теста стоит провести A/A тест — он покажет, что рандомизация не производит значимых различий между идентичными группами.
В ходе тестов следите за Sample Ratio Mismatch (SRM): если ожидали split 50/50, а получили 53/47 — рандомизация нарушена или трафик фильтруется неравномерно.