Когда останавливать A/B-тест? Часть 2: Monte Carlo

Iskander Mirmakhmadov
expf
Published in
6 min readFeb 14, 2022

Дисклеймер

Это вторая часть руководства по расчету необходимого времени на эксперимент с использованием альтернативы аналитическим функциям. Если вы еще не знаете что такое MDE и как оно работает, то прочитайте 1-ю часть статьи: Когда останавливать A/B-тест? Часть 1: MDE

Записывайтесь на следующий поток интенсивного курса по A/B-тестированиям и математической статистике от EXPF

Перейти на сайт

Что мы узнали из 1-й части статьи о MDE

Чтобы спрогнозировать время на эксперимент, нам требуется предварительно рассчитать MDE для метрики. Имея знания по ожидаемому эффекту, можно получить грубую оценку прогноза момента прокраса метрики: рассчитали количество наблюдений, разделили на трафик по дню с учетом удержания и готово. Даже без конкретных ожиданий по эффекту, который хотелось бы получить, можно посчитать сразу несколько отсечек (1%, 5% и т.п.) и уже во время проведения эксперимента принимать решения об остановке эксперимента.

Методы по расчету MDE на параметрических критериях нам доступны из библиотек stats для Python и pwr для R. Но что делать, если, скажем, хотелось бы применять критерий Манна-Уитни, а не t-тест?Помимо этого, иногда важно учитывать реальное поведение пользователей и как закрывается окно метрики. Тут могут помочь симуляции методом Monte Carlo.

Что такое Monte Carlo

Симуляции методом Монте-Карло, также известный как многократное симулированное моделирование исходов каких-либо событий, является методом, с помощью которого можно оценить возможные результаты чего угодно.

Метод Монте-Карло имеет достаточно широкое применение в бизнесе и промышленности:

  • Котировки акций на фондовом рынке
  • Прогнозирование выручки и ценообразование
  • Проверка боингов перед их производством

Название методу было дано благодаря городу Монако, расположенному в одноименном княжестве. Все потому, что в городе много казино и популярна игра в рулетку. А рулетка, как известно, — есть самый рандомный рандом, что является ядром методики.

Вычисление значения pi методом Монте-Карло

Принцип метода Монте-Карло заключается в воссоздании событий, близких к событиям реальным на основе известных входных данных. Если обобщить суть методики, то все базируется на усреднении результатов многократных повторов некого события. На их основе можно провести множество синтетических “псевдо-экспериментов”. Например, у вас есть данные по продажам в интернет-магазине за месяц. Что будет, если запустить A/B-тест и выручка бы выросла или упала на 1%? Можно ли на таком периоде достичь необходимой мощности? Если многократно случайно разделить покупателей на контрольную и тестовую группы, а также добавить эффект, можно рассчитать чувствительность. Кстати, генерация подвыборок в бутстрапе основана на методе Монте-Карло.

Помимо прочего, метод Монте-Карло привносит ряд других бенефитов в отличие от аналитического метода. Далее опишем каждый из них.

Преимущества Monte Carlo

Точные знания о распределении метрики

Чаще всего данные по целевой метрике распределены не стандартным способом (например, не относится к нормальной форме распределения или Бернулли). К тому же, где-то критично не обрезать хвост и не избавляться от выбросов. К примеру, самый распространенный нестандартный кейс в SaaS — наличие константных price-сетов подписки: 0.99$, 4.99$, 9.99$ и т.п.. Тут было бы правильнее накинуть несколько покупок в синтетическую Б-ветку с ценовой константой согласно ожидаемому эффекту и ожидаемому поведению пользователей, а затем померить мощность: равномерно по всем ценам, больше покупок с низкой ценой, больше покупок с высокой ценой и т.п.

Расчет мощности с применением непараметрических критериев

Второе преимущество— расчет мощности с применением непараметрических критериев, по которым нет возможности использовать аналитический подход. В целом, у метода Монте-Карло нет каких-либо требований по тому, что отдавать на вход и что проверять. Можно оценивать мощность любого критерия, а затем сравнивать их между собой по уровню мощности.

Использование неравномерно распределенного эффекта

Вместо константного сдвига (например, lift = 1%) можно использовать нормально распределенный или скошено-распределенный эффект. Скошенность примечательна тем, что мы как будто бы представляем ситуацию, в которой легкие пользователи сильнее отреагировали на изменение в эксперименте, чем тяжелые. Например, если взять выручку по пользователям, то мы можем сделать так, чтобы изменение по выручке имело больший вес в правой части распределения. Здесь легкими пользователями являются те, у кого небольшая выручка. Правда, в таком подходе достаточно очевидно среднее у эффекта (такое же, как и lift), а дисперсия — нет.

Наверняка, выше перечислен не весь перечень преимуществ, которые можно выделить. Тем не менее, их уже достаточно, чтобы опробовать данную методику на своих данных.

Применение Monte Carlo

Prerequisites

Перед тем как запустить симуляции, требуется подготовить данные. Тут я бы отметил пару моментов:

  • Данные по метрике должны быть за достаточно продолжительный период, чтобы их можно было отфильтровать по дате в процессе симуляций. Ориентируйтесь на продолжительность ваших экспериментов
  • Включите в расчеты шаг, где нет эффекта (проще говоря, A/A тест). Если критерий, который потом будет использоваться на тех же данных, красится (fpr > alpha), то его использовать нельзя

Руководство и порядок действий

Далее в расчетах я буду использовать генератор данных, чтобы продемонстрировать возможности метода Монте-Карло. В ваших исследованиях используйте реальные данные, иначе смысла в инструменте нет (чаще всего, но не всегда).

  1. Выберите критерий
  2. Выберите шаг размера эффекта. Например, от 0% до 10% с шагом 1% или 5%
  3. Выберите количество симуляций. Чем их больше, тем дольше ждать, но зато получите более узкий ДИ мощности. Если не знаете какое число симуляций выбрать, то можно начать с 1000 итераций. В расчетах уместно использовать параллелизм, лишним не будет
  4. Подумайте как моделировать эффект. В зависимости от того, с каким типом случайной величины предстоит работа, методика может меняться. Для дискретных с несколькими значениями и бернулливских величин нет смысла в их простом умножении на константный эффект. Для 1% эффекта у Бернулли, например, 0 * 1.01 будет 0. Достаточно использовать генератор с входными значениями вероятности положительного исхода. Для остальных помним о том, что эффект можно представить в виде распределения. Для ratio-метрик мы хотели бы, чтобы менялся числитель, а знаменатель нет. Но если по какой-то причине вам это требуется, то не забудьте заложить это в логику расчетов
  5. Запустите расчеты и сохраняйте p-value на каждой итерации. Дождавшись, посчитайте FPR для lift=0% и TPR для lift≥1% по формуле ниже:
где I — индикаторная функция, P — полученные p-value на каждой итерации симуляции, alpha — уровень альфа (например, 0.05) и N — количество симуляций. Формула для FPR для эффекта 0% не отличима

Ниже мы рассмотрим простой пример, в котором замоделируем скорость увеличения мощности с применением Манна-Уитни:

Мощность по мере увеличения эффекта будет расти. В целом, могли бы остановится на шаге 5%, т.к. даже на размере 1000 наблюдений уже преодолен порог. Визуализируем и посмотрим что получилось:

Расчетная оценка чувствительности зависит от количества симуляций. При желании, на кривые можно наложить ДИ и оценить границы, в которых варьируется чувствительность. На анимации ниже показана как она меняется по мере их увеличения:

Применение метода Монте-Карло для симуляции эффекта 1%. Каждый фасет — количество наблюдений. Синей линией отмечена чувствительность

Мы продемонстрировали возможности метода Монте-Карло с константными эффектами, равномерно распределенными по всей случайной величине. В целях упрощения, мы один раз сгенерировали выборку с эффектом, а затем из нее брали рандомно рассплитованных пользователей. Для большей точности, желательно многократно генерировать новые выборки и заново добавлять эффект.

Если хочется как-то иначе представить эффект, то можно воспользоваться генераторами. Так, например, будет выглядеть нормально распределенный эффект:

test = control * norm.rvs(loc=lift, scale=lift_std, size=len(control))

Подобрать lift_std можно с помощью распределения дельт двух векторов на основе исторических экспериментов. Только не забудьте перевести абсолюты в доли. Кстати, в большинстве случаев, форма будет колокообразной.

Теперь попробуем сгенерировать данные по дискретной величине. В статье уже упоминалось неоднократно, что для нее нужно иначе подходить к задаче. Представим, что работаем с подписками по ценам 0.99$, 4.99$, 9.99$. Согласно историческому периоду, их доли равны 0.5, 0.4, 0.1. Можно попробовать симулировать эксперимент, в котором доля клиентов с самой высокой стоимостью подписки возрастет. В целом, здесь уместно использовать генератор, т.к. значениями параметра являются известные знания по переменной из исторического периода. Единственное что мы не учтем — это окно закрытия метрики. Без зарывания в детали, так выглядит код:

Обратите внимание, что здесь использовался t-тест, т.к. критерий Манна-Уитни не совсем в ладах с многократно повторяющимися значениями. В итоге, мы получили следующее:

Внимательно присмотревшись, можно заметить что кривая возрастает не монотонно (на отрезках 1000–2000 и 3000–4000). Это не ошибка, а особенность реального события, которую мы воспроизвели. Если проводить эксперимент, то на объеме 1000–6000 ситуация не будет выглядеть стабильной и потребуется больше наблюдений.

Заключение

Выше был рассмотрен метод Монте-Карло, позволяющий синтетическим образом симулировать эксперименты с произвольными эффектами. Методика позволяет спрогнозировать время прокраса метрики при разных обстоятельствах и проверить статистический критерий на частоту ложных прокрасов. Инструмент будет полезен в первую очередь для планирования экспериментов, но этим он не ограничен.

За обновлениями и выходом новых статей следите в телеграмм канале: t.me/exp_fest

--

--