Почему рандомизация — основа достоверного теста

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 — рандомизация нарушена или трафик фильтруется неравномерно.