
Всем привет! На связи Денис Зорин и Гриша Засько, мы работаем в ASL — лаборатории прикладной статистики Т-Банка. Помогаем командам проводить A/B-тесты на масштабе всей экосистемы: от дизайна эксперимента до анализа результатов. Еще мы развиваем A/B-платформу, инструменты для экспериментов и методы, которые помогают ускорять тесты без потери статистических гарантий.
Расскажем о задачке, с которой столкнулись в тестах с множественными сравнениями. Когда в эксперименте несколько целевых метрик, нужно контролировать вероятность ложноположительного результата. Часто для этого используют поправку Бонферрони: общий уровень значимости делят поровну между метриками, это простой и надежный метод.
Но мы обратили внимание, что, когда метрик несколько, есть потенциал для ускорения: мы предлагаем не делить уровень значимости поровну, а распределять его между метриками оптимально. В результате для некоторых тестов удается сократить необходимый размер выборки на десятки процентов, и эффект усиливается для тестов с большим количеством множественных сравнений.
А/В-эксперименты с несколькими целевыми метриками
Обычно в продуктовых A/B-экспериментах всего одна целевая метрика. Например, делаем изменение в UI-интерфейсе продукта и хотим понять, вырастет ли при этом конверсия в покупку. Матрица принятия решений по результатам эксперимента простая и понятная: если положительный эффект есть и он большой — раскатываем изменение, если нет — не раскатываем.
В более сложных A/B-экспериментах матрица принятия решений может быть многосоставной. Например, мы хотим увеличить выручку, но не готовы раскатывать изменение, если при этом просела конверсия в покупку. Тогда одной метрики уже недостаточно: нужно смотреть на несколько целевых или целевых и защитных метрик одновременно.
В таком случае полезно заранее описывать матрицу принятия решений.

А/В-тест с несколькими целевыми метриками сложнее, ведь матрицу принятия решений нужно продумать заранее. Статистический дизайн эксперимента тоже должен быть согласован с матрицей.
Статистически при работе с несколькими целевыми метриками возникает проблема множественного сравнения. Если проверять несколько гипотез одновременно, растет вероятность хотя бы один раз ошибочно отвергнуть верную нулевую гипотезу.
=
(отвергли хотя бы одну верную нулевую гипотезу)
Пусть для каждой метрики мы используем свой уровень значимости
. Обозначим через
событие, что мы ошибочно отвергли
-ю нулевую гипотезу. Тогда для корректного критерия имеем
А вероятность хотя бы одной ошибки можно ограничить сверху через неравенство Буля:
Поэтому, если хотим контролировать общий уровень ошибки на уровне , достаточно потребовать:
Классическое решение — поправка Бонферрони. Если у нас целевых метрик и общий уровень значимости
, то каждой метрики выделяем
Например, если и метрик две, то каждая проверяется на уровне
. Это работает: вероятность хотя бы одной ошибки первого рода не превышает общий уровень
. Но дальше начинается неприятная часть. Для каждой метрики мы считаем свой размер выборки, а для всего эксперимента необходимо взять максимум:
Если одна метрика требует намного больше пользователей, чем остальные, именно она определяет длительность всего теста.

Почему равная поправка может быть не лучшей
Рассмотрим пример с двумя метриками: выручкой и конверсией в покупку. Такая пара может появиться, если решение устроено так: хотим раскатывать изменение только при росте выручки, но при этом не хотим получить просадку в конверсии. То есть выручка отвечает за основной эффект, а CR покупки — за важное ограничение на качество изменения.
При обычной поправке Бонферрони каждой метрике достается по уровня значимости.
Для эксперимента нужно взять максимум, то есть 872k пользователей. Проблема не в том, что Бонферрони «неправильный». Он как раз делает то, что должен: контролирует FWER. Проблема в том, что он делит уровень значимости поровну, хотя сами метрики могут быть очень разными.
У одной метрики может быть большая дисперсия, у другой — маленькая. У одной MDE может быть относительно маленьким, у другой — крупным.
Из-за этого одинаковое превращается в очень разные размеры выборок. Здесь возникает идея: а что, если не делить
поровну?
Идея: размазать поправку
Мы хотим сохранить главное свойство Бонферрони: контроль FWER. Но вместо равного деления берем такие , что
То есть весь «бюджет» ошибки первого рода остается тем же. Просто между метриками он распределяется не поровну. Мы можем перераспределять между метриками, пока сумма не превышает общий уровень значимости (см. формулы выше с неравенством Буля).

Оптимальное распределение уровня значимости
Для каждой метрики требуемый размер выборки зависит от выделенного ей уровня значимости . Чем меньше
, тем строже критерий и тем больше нужно выборки. Запишем размер выборки в виде:
где
- квантиль стандартного нормального распределения уровня
- вероятность ошибки второго рода для метрики
- индикатор двусторонней альтернативы:
, если альтернатива двусторонняя, и
, если односторонняя
- часть, которая зависит от параметров самой метрики: MDE, дисперсии, конверсии, соотношения групп.
Для небинарной метрики можно думать о таком виде:
Для бинарной метрики может использоваться другая формула, например через arcsin-преобразование:
Точная форма не так важна для идеи метода. Важно, что все особенности метрики складываются в коэффициент
, а дальше размер выборки зависит от
. Наша задача:
при условиях
То есть, мы ищем такое распределение уровня значимости, чтобы максимальный размер выборки среди всех метрик стал минимальным.
Что происходит в оптимуме
Решить задачу о распределении поправки помогает важное утверждение, которое мы доказали строго: в оптимуме размеры выборок по метрикам должны стать одинаковыми:
Интуиция такая: если какая-то метрика требует сильно больше пользователей, чем остальные, можно дать ей чуть больше . Тогда ее размер выборки уменьшится. Чтобы сумма
не изменилась, у другой метрики нужно забрать немного
. Ее размер выборки вырастет, но, если она была далеко от максимума, общий максимум все равно уменьшится. Так можно продолжать, пока размеры не сравняются:
.
Вместо того, чтобы искать сразу все , можно искать один общий размер
, к которому мы хотим привести все метрики.
Из формулы размера выборки:
Берем корень:
Отсюда выражаем квантиль:
Дальше, для каждого заданного можно восстановить
:
Теперь используем условие, что сумма всех равна общему уровню значимости:
Подставляем выражение для :
Остается решить уравнение относительно . Эффективный способ решить этого уравнения мы оставляем как упражнение читателю :)
После того как нашли , восстанавливаем все
по формуле выше. На выходе получаем:
общий размер выборки
;
индивидуальные уровни значимости
для каждой метрики;
гарантию, что суммарно FWER все еще контролируется на уровне
.
Что получилось на примере
Вернемся к примеру с двумя метриками. При обычной поправке Бонферрони общий размер теста был 872k. После перераспределения уровня значимости получилось:

Общий размер снизился с 872k до 720k. Метрика «выручка» была бутылочным горлышком: именно она требовала больше всего пользователей. Поэтому алгоритм отдал ей почти весь бюджет .
Метрика «CR покупки» и так требовала меньше пользователей, поэтому ей можно было оставить гораздо более строгий уровень значимости. В результате размеры сравнялись, а максимум уменьшился.
Результаты на тестах
В теории и на синтетических сценариях метод особенно хорошо работает, когда целевых метрик много. Максимальное теоретическое сокращение выборки было таким:

На реальных данных мы проверили метод на A/B-тестах с двумя целевыми метриками. В среднем размер выборки удалось сократить примерно в 1.2 раза. Это не значит, что каждый эксперимент всегда ускорится на 20—30%. Эффект зависит от параметров метрик: MDE, дисперсии, типа альтернативы.
Наш метод размазывания поправки дает наибольший выигрыш, когда метрики сильно отличаются друг от друга. Если все метрики примерно одинаковые по требуемому размеру выборки, обычная поправка Бонферрони уже близка к оптимальному распределению.
Как применить размазывание поправки
С практической стороны сценарий такой:
На этапе дизайна задаем список целевых метрик.
Для каждой метрики указываем MDE, дисперсию или базовую конверсию, тип альтернативы и мощность.
Выбираем общий уровень значимости, например
.
Оптимально перераспределяем
между метриками.
Получаем общий размер выборки и соответствующие уровни значимости
для каждой метрики
После эксперимента p-value по каждой метрике сравниваются с теми индивидуальными уровнями значимости, которые были получены на этапе дизайна:
Технически этот же подход можно расширить и на процедуру Бонферрони — Холма с весами. Расширение подхода полезно, если хочется проверять гипотезы последовательно, но при этом сохранить индивидуальные уровни значимости, которые получились после размазывания поправки. Мы не будем подробно разбирать это в статье, чтобы не уводить фокус от дизайна эксперимента, но математически такое расширение тоже контролирует FWER.
Важно: размазывание поправки не отвечает на вопрос, какие метрики нужно включать в эксперимент. Это должна определять матрица принятия решений. Если решение по тесту на самом деле зависит от одной метрики, не нужно искусственно добавлять еще несколько целевых метрик только потому, что метод умеет с ними работать.
То есть, метод не заменяет содержательный выбор целевых метрик. Если в эксперимент добавили слишком много метрик без понятной причины, оптимизация не решит продуктовую проблему. Она помогает тогда, когда несколько метрик действительно нужны, а дизайн хочется сделать менее дорогим.
Ключевые выводы
Размазывание поправки — бесплатное ускорение A/B-теста. Мы не меняем общий уровень значимости, не ломаем контроль FWER, а просто умнее распределяем тот же самый бюджет ошибки между метриками.
В тестах с несколькими целевыми метриками обычная поправка Бонферрони надежно контролирует FWER, но иногда делает дизайн слишком дорогим. Причина в том, что уровень значимости делится поровну, хотя метрики могут сильно различаться по дисперсии, MDE и базовым значениям.
Мы использовали более гибкий подход: распределяем общий уровень значимости между метриками так, чтобы минимизировать максимальный размер выборки. Математически задача сводится к одномерному поиску корня, а после этого для каждой метрики восстанавливается свой уровень значимости.
На реальных тестах с двумя целевыми метриками мы получили среднее сокращение размера выборки примерно в 1.2 раза. В синтетических сценариях с большим числом метрик выигрыш доходил до 1.6—1.9 раза.
Для нас это стало хорошим примером того, как небольшая оптимизация в статистическом дизайне может дать заметный практический эффект: эксперимент идет меньше, а контроль ошибки первого рода сохраняется.
Если вам интересно заниматься развитием культуры А/В-тестирования и создавать новые эффективные статистические методы — напишите Грише, к.ф.-м.н., руководителю Лаборатории Прикладной Статистики в Т-Банке.