Системы A/B-тестирования: из чего состоят и как выбрать платформу
Как устроена платформа A/B-тестов: назначение групп, флаги, экспозиции, метрики, SRM и реестр. Чек-лист выбора и разбор учебного сбоя 54/46.
Содержание статьи
Команда купила сервис A/B-тестирования, настроила флаг и получила красивый отчёт. Но в одной группе 54% игроков, в другой 46%, хотя план был 50/50. Теперь вопрос не в том, какой p-value у метрики, а в том, где путь от назначения до отчёта потерял людей. Система A/B-тестирования — это весь этот путь: от устойчивого выбора варианта до правила, кто вправе назвать тест завершённым. Покажем его на учебной игре DragonKeep и разберём, что действительно проверять при выборе платформы.
Коротко: какие части обязаны работать вместе
Полноценная система отвечает на семь вопросов. Кому и как назначили вариант? Что он увидел? Записалась ли экспозиция? Как исход попал к назначенному пользователю? В каком окне посчитали метрику? Какие проверки прошёл отчёт? Где сохранили решение? Если хотя бы один ответ нельзя восстановить, интерфейс с графиком не превращает запуск в надёжный эксперимент.
Небольшой команде не обязательно сразу строить отдельный статистический сервис. Достаточно фиксированной схемы назначения, одного события экспозиции, версии определения метрики и запрета объявлять результат до проверки качества данных. Платформа полезна, когда она делает эти правила обычным путём работы, а не требует каждый раз ручного героизма аналитика.
У каждого слоя есть владелец: разработка отвечает за стабильность назначения и флага, аналитика — за определение метрики и проверки, продакт — за гипотезу и действие по результату. Когда ответственность заканчивается на границе отделов, сбой экспозиции выглядит как «странный p-value» и может неделями оставаться без хозяина. Запишите владельцев рядом с контрактом данных.
| Слой | Что сохраняет | Проверка |
|---|---|---|
| Назначение и флаг | ID эксперимента, единицу и вариант | Один человек стабильно видит один вариант |
| Экспозиция | Момент фактического показа и версию флага | Нет подмены назначения просмотром страницы |
| Метрика | Числитель, знаменатель, окно и версию SQL | Результат воспроизводим из сырых данных |
| Решение | План, проверки, вывод и ответственного | Повторный читатель видит, почему раскатили |
Назначение групп: выберите единицу, а затем хэш
Первый вопрос — что именно рандомизируется. Для пользовательского интерфейса обычно нужен устойчивый пользователь или аккаунт; если один аккаунт делят люди, единицей может стать аккаунт. Для сетевого продукта иногда нужны магазины, команды или географические кластеры. Рандомизировать сессии, а затем считать результат по пользователям опасно: один человек успеет увидеть оба варианта, и сравнение перестанет соответствовать дизайну.
Типовая реализация получает стабильный идентификатор, ID эксперимента и его соль, вычисляет хэш и по заранее заданным диапазонам ведёт пользователя в control либо test. Соль отделяет тесты друг от друга, а сохранённая версия алгоритма защищает от внезапного перераспределения после релиза SDK. Удалённые гости, смена устройства и объединение анонимного ID с аккаунтом требуют отдельного правила. Нельзя молча смешивать их с «один пользователь — одна строка».
Сплит 50/50 — свойство проекта, а не обещание ровно равного числа людей в каждом дне. Независимое назначение даёт шум. Но если расхождение намного больше ожидаемого для размера выборки, нужен сигнал SRM. Смена веса с 50/50 на 90/10 в середине теста тоже должна записываться как событие изменения дизайна: иначе один итоговый отчёт смешает разные правила назначения.
Проверьте и экспериментальные слои. Когда одна команда ведёт тест по платежам, а другая — по интерфейсу покупки, независимые соли не гарантируют отсутствие взаимодействия. Для критичных пересечений заранее резервируют непересекающиеся аудитории или задают явное правило совместимости. Иначе статистический движок честно оценит смесь двух изменений, а руководитель ошибочно припишет весь эффект одному.
Флаг и экспозиция — разные события
Feature flag решает, какой код или вариант может увидеть пользователь. Экспозиция фиксирует, что вариант действительно дошёл до выбранного места продукта. Опрос флага в фоновом сервисе ещё не означает просмотр экрана. Если считать таких людей экспонированными, эффект разбавится. Если записывать только кликавших, вы отберёте людей уже по результату воздействия и сможете получить «выигрыш» из ошибки отбора.
Нужен явный контракт: в каком месте приложения пишется экспозиция, с каким experiment_id, variant, стабильным ID и временем, что происходит при повторном открытии экрана и при отказе сети. Для анализа обычно хранится первая релевантная экспозиция на единицу назначения; исходы ищутся после неё в объявленном окне. Ошибки записи не должны превращаться в тишину: полезны счётчики назначений, показов и отправленных событий по варианту и версии приложения.
Не смешивайте статистическую «популяцию всех назначенных» с популяцией «увидевших изменение». Первая отвечает на вопрос об эффекте политики назначения, вторая может быть полезна при корректном определении входа в эксперимент, но её фильтр не должен зависеть от поведения, которое само изменение вызвало. Сформулируйте estimand до запуска.
Метрики: один и тот же SQL для обеих групп
Платформа должна знать зерно метрики: пользователь, сессия, заказ или событие. У конверсии сессий знаменатель — сессии; у доли купивших — назначенные пользователи. Если флаг назначается пользователю, а доверительный интервал считается так, будто каждая его сессия независима, оценка неопределённости окажется слишком смелой. Единица рандомизации должна учитываться и в статистическом расчёте.
Каталог метрик хранит определение, источник, окно, задержку данных и владельца. Поправка в SQL после просмотра результата создаёт уже другую метрику, поэтому нужна версия: можно пересчитать обе группы одинаково и показать, чем старый и новый отчёты различаются, но нельзя незаметно заменить исходную основную метрику. Проверьте также полные окна: D7 игрока, назначенного вчера, ещё не наступил.
Маленькая ручная сверка спасает больше времени, чем новый дашборд: взять десять ID, восстановить вариант и экспозицию, затем руками пройти JOIN до исхода. Если строка платежа размножилась из-за нескольких экспозиций, агрегат может выглядеть правдоподобно и при этом не принадлежать реальным людям. Для пользовательских и событийных ratio-метрик отдельно полезен разбор единицы анализа.
Статистический движок хранит договорённость, а не только p-value
До запуска в карточке теста записывают основную метрику, защитные метрики, MDE, аудиторию, ожидаемый размер выборки и окно исхода. В отчёте нужны размер эффекта и интервал, число единиц по группам, версия метрик и статус проверок. p-value отвечает на узкий вопрос о совместимости наблюдений с выбранной нулевой гипотезой при предпосылках модели; он не выражает вероятность того, что гипотеза продукта верна.
Движок должен понимать тип метрики. Для бинарного исхода и денежной суммы оценки неопределённости строятся по-разному; для нескольких наблюдений на одного пользователя требуется кластеризация по единице назначения. Если сервис предлагает один универсальный тест «на любую таблицу», попросите документацию по оценке дисперсии и проверьте её на заранее рассчитанном примере. Статистическая значимость сама по себе не отвечает, окупится ли изменение.
Подглядывание в отчёт с правом остановиться при первом p < 0,05 нарушает фиксированный дизайн проверки. Зафиксируйте дату анализа и зрелость когорт либо заранее выберите корректную последовательную процедуру. Платформа может скрывать преждевременные выводы и напоминать о сроке, но право остановки всё равно остаётся организационным решением. Команда должна письменно различать статус «данные ещё собираются», «проверка качества не пройдена» и «можно читать эффект».
Реестр и ограничения одновременных тестов
В реестре каждому опыту нужна гипотеза, владелец, аудитория, несовместимые флаги, дата начала, план анализа, версии кода и метрик, итоговое решение. Без реестра одна команда поднимет конверсию экрана, пока другая одновременно поменяет тот же экран. Даже если назначения технически независимы, взаимодействие изменений может испортить интерпретацию одного эффекта.
Блокировки нужны не для любых двух тестов на одном пользователе, а там, где они мешают друг другу: один меняет навигацию к экрану второго, оба правят цену, или оба делят один ограниченный инвентарь. Для независимых изменений параллельный запуск может быть допустим. Полезная функция реестра — сохранить нулевой или отрицательный результат: следующий продакт не займёт ещё один месяц трафика той же гипотезой.
О том, как инженерные правила меняются при большой пропускной способности команды, читайте кейс Booking.com и кейс платформы Spotify. Их масштаб нельзя копировать целиком в команду с тремя тестами в квартал; переносимы конкретные контракты назначения, метрик и решений.
Учебный сбой: отчёт обязан остановиться на SRM
В вымышленной игре DragonKeep опыт menu_color задуман как A/A: цвет продукта фактически не меняется. В exposures.csv находится 10 929 записей control и 9 350 test, всего 20 279 уникальных игроков. При плане 50/50 это 53,89% и 46,11%. Статистика Пирсона для двух корзин около 122,95; при одной степени свободы p около 1,4 × 10⁻²⁸. Такое расхождение не стоит объяснять обычным шумом назначения.
Запрос ниже берёт variant из фактической экспозиции, а не поле ab_group в таблице игроков: последнее не является назначением этого опыта. Он проверяет вход в систему, а не эффект на игровую метрику. После результата аналитик должен остановить причинный отчёт и найти, где возникло расхождение: хэш, доставка флага, запись экспозиции, фильтр аудитории или JOIN. Перевзвешивание строк не исправит неизвестный механизм потери.
Столбцы — число игроков, не показатель продукта. Контроль SRM проводится до сравнения исходов; 10 929/9 350 при n=20 279 даёт χ²≈122,95.
SELECT variant, COUNT(*) AS players
FROM exposures
WHERE exp_id = 'menu_color'
GROUP BY variant
ORDER BY variant;Строить самим или брать готовое: критерии решения
Сравнивать системы по числу графиков рано, пока не перечислены реальные ограничения продукта. Нужны ли серверные флаги? Можно ли отправлять события вовне? Есть ли несколько приложений и единый ID? Кто будет разбирать инцидент с неверным назначением? Сколько экспериментов запускается за квартал? Ответы отделяют «нам нужен SDK и реестр» от «нам нужен самостоятельный статистический контур».
Собственная сборка удобна, если команда уже контролирует идентификаторы и хранилище, имеет людей на поддержку SDK, метрик и мониторинга, а требования к данным или нестандартной единице назначения не укладываются в продуктовые настройки. Цена такого выбора — не только разработка хэша. Нужно годами сохранять обратную совместимость назначения, фиксировать версии, переживать сбои записи и проверять каждую новую метрику.
Готовая система ускоряет запуск типовых флагов, интерфейса и реестра, но интеграция не заканчивается подключением SDK. Надо проверить, где считаются метрики, что считается экспозицией, как реализован экспорт сырых данных и можно ли независимо повторить результат. Если продуктовая команда не может воспроизвести назначение конкретного человека, красивая карточка эксперимента не решает проблему.
| Критерий | Собственная сборка | Готовая система |
|---|---|---|
| Команда и поддержка | Нужны постоянные владельцы SDK, данных и статистики | Нужны владельцы интеграции и качества данных |
| Идентичность и данные | Можно встроить особые правила и хранение | Нужно сверить поддержку своей схемы ID и экспорта |
| Время до первого теста | Зависит от уже существующей инфраструктуры | Интерфейс быстрее, согласование событий остаётся |
| Проверяемость результата | Весь расчёт под контролем команды | Требуется доступ к сырым назначениям и определениям |
Что подтверждают официальные документы Varioqub и GrowthBook
На 28 сентября 2026 года справка Varioqub описывает интеграцию с Яндекс Метрикой для распределения и отчётов. Создание эксперимента включает варианты, тип изменения, метрики и настройку распределения. Отчёт показывает показатели по вариантам. Это факты документации, а не обещание, что сервис автоматически проверит вашу конкретную схему событий и статистическую процедуру.
В репозитории GrowthBook продукт описан как открытое ядро с флагами и экспериментами; часть функций относится к коммерческому расширению, поэтому слово «open source» не означает одинаковую доступность всего интерфейса. Официальное руководство описывает детерминированное назначение и работу с метриками, а README Python SDK — подключение флагов и учёт экспозиций. Реальный набор функций нужно подтвердить для своей конфигурации и версии.
Сравнение ниже умышленно короткое: документация показывает направления интеграции, но не заменяет пилот на вашем трафике. Она не даёт права объявить один продукт «лучшим» или сопоставить стоимость внедрения без вашей архитектуры.
| Вопрос | Varioqub | GrowthBook |
|---|---|---|
| Откуда данные | Сверить счётчик и цели Метрики со своими заказами | Сверить свои источники и определения метрик |
| Как назначают | Повторить сплит в нужной аудитории и устройстве | Проверить стабильный ID и конфигурацию SDK |
| Как воспроизвести | Сопоставить отчёт с выгрузкой сырых событий | Сопоставить отчёт с запросом к своему хранилищу |
| Что согласовать | Доступность нужных функций в вашем варианте сервиса | Границы открытого ядра и коммерческих функций |
Пилот платформы: три небольших теста вместо демонстрации интерфейса
Сначала проведите A/A без продуктового изменения. На заранее выбранной аудитории проверьте стабильность назначения после перезапуска приложения, счёт назначенных и реально экспонированных, пропуск событий, SRM и одинаковое определение метрики в двух группах. Если базовый путь не работает, A/B на важной фиче лишь добавит шум к расследованию.
Затем проведите тест с известным техническим исходом: безопасный флаг меняет видимый элемент, а контрольная проверка на нескольких тестовых ID подтверждает каждый вариант. Убедитесь, что экспозиция пишется в момент просмотра, а не при фоновой загрузке. Наконец, воспроизведите один отчёт из сырых строк. Здесь выясняется, совпадает ли зерно единицы назначения с зерном статистического анализа.
После пилота запишите ограничения как рабочий список, а не как обещание поставщика: какие источники данных подключены, что делать при offline, как менять соль, как исключать пересечение тестов, как выкатывать или откатывать вариант, кто получает тревогу по SRM. Решение о платформе зависит от этих ответов и вашей поддержки, а не от яркости визуального редактора.
Согласуйте и неприятный сценарий: тест уже идёт, версия приложения с новым SDK обрезала часть экспозиций. Кто ставит отчёт на паузу? Как узнают об этом менеджеры? Сохраняется ли сырая выгрузка предыдущей версии? Если никто не владеет ответом, система не готова к ответственному запуску. Регламент инцидента полезнее ещё одной визуализации uplift.
Пилот считается завершённым, когда другая команда может повторить назначение и итоговую метрику без доступа к устным объяснениям автора. Запишите обнаруженные расхождения до обсуждения закупки.
Пять ошибок внедрения, которые меняют решение о продукте
Первая: назначить группу по сессии, а интервал считать по пользователям. Один человек получает два варианта, и причинное сравнение теряет смысл. Вторая: записывать экспозицию при чтении флага в фоне. В анализ попадают те, кто не видел изменение; истинный эффект размывается. Третья: после теста поменять SQL основной метрики без версии. Команда читает другой вопрос как первоначально обещанный.
Четвёртая: пропустить SRM, потому что «разница всего несколько процентов». При большой выборке этот сдвиг почти исключён обычным шумом; возможен систематический пропуск test. Пятая: остановиться при первом значимом результате. При повторных проверках заявленный уровень ошибки уже не тот, по которому планировали выборку. Шестая: сохранить только положительные тесты. Реестр перестаёт защищать от повторной проверки уже отвергнутых гипотез.
Отдельная ошибка — назвать сервис статистическим двигателем, не уточнив, какой именно метод он применяет к бинарной, денежной и повторной метрике. Попросите документацию и воспроизведите один расчёт до миграции. Хорошая платформа не освобождает от определения estimand и цены продуктовой ошибки.
Решение: какой минимальный набор внедрить сейчас
Если в команде пока редкие тесты, начните с назначения по стабильному ID, журнала экспозиций, версии метрик, A/A и одного шаблона решения. Запретите интерпретацию эффекта при необъяснённом SRM. Это даёт проверяемый путь без большого проекта по статистическому интерфейсу. Когда запусков станет больше, измерьте, что тормозит именно вашу команду: ручное управление флагами, сбор метрик, пересечения или согласование выводов.
Если выбираете внешний сервис, пилотируйте его на этих же проверках и заранее назначьте владельца интеграции. Если строите сами, запланируйте поддержку и повторную проверку после релизов SDK. Для menu_color решение однозначно: результат отменяем, ищем источник сплита 54/46, исправляем и заново запускаем A/A. Продуктовое изменение по этому отчёту не выкатываем.
Частые вопросы
Что такое система A/B-тестирования? Это назначение групп, доставка вариантов, запись экспозиций, расчёт метрик и проверок, а также реестр решений. Один статистический калькулятор покрывает только последнюю часть пути.
Достаточно ли feature flag для A/B? Нет. Флаг управляет вариантом, но без корректной экспозиции, исходов и правила анализа вы получите раскатку по группам, а не проверенный эксперимент.
Всегда ли нужен собственный статистический движок? Нет. При редких тестах достаточно воспроизводимого расчёта и дисциплины анализа; при масштабе имеет смысл автоматизировать повторяющиеся проверки и версии метрик.
Может ли платформа сама исправить SRM? Она может заметить расхождение. Причину — ошибку назначения, доставки, логирования или фильтра — нужно найти в пути данных; автоматическая корректировка веса не заменяет расследования.
Как начать без новой платформы? Зафиксируйте единицу назначения, событие экспозиции, основной показатель, срок и владельца решения; затем проведите A/A и проверьте сплит калькулятором.
Материалы по теме

A/A-тест: как проверить систему экспериментов до первого A/B
A/A-тест проверяет назначение, экспозиции и метрики до анализа эффекта. Учебный menu_color показывает SRM 54/46 при плане 50/50 и путь расследования.

A/B-тестирование: как провести тест от гипотезы до решения
Пошаговый A/B-тест на учебной игре: гипотеза, метрика, MDE, сплит, D7 retention, интервал и решение. Где ломается сравнение и что проверить до раскатки.

Почему A/B-тесту нельзя доверять: SRM, подглядывание и другие ошибки
Практический чеклист качества A/B-теста: как заметить перекос трафика, подглядывание в результаты, множественные проверки и поломку трекинга.