A/B-тестирование: p.value < 0.05 или как быть когда сплит не 50/50?

Итак, недавно у меня возникла следующая ситуация. Планировался запуск A/B-теста. Так как тест высокорисковый, то появилась мысль минимизировать риск за счет того, что в группу B направить не 50% трафика, а лишь 5%.

Действую по протоколу проведения A/B-тестов нам следует до запуска теста выполнить два предварительных действия:
  1. оценить лифт целевого показателя
  2. оценить размер минимально необходимой выборки
С первой задачей справиться несложно.

Моя базовая конверсия (с1) = 2%. Лифт, который я хочу обнаружить (lift) = 5%.
Итого, моя новая конверсия (с2) = c1 * (1 + lift) = 2.1%.

А вот со второй задачей справиться уже несколько сложнее.

Обычно для решения таких задач я использую статистический калькулятор:

Sample Size Calculator; www.evanmiller.org

Как мы видим, под числом 309,928 четко написано - per variation - что означает, что такой объем должен набраться для каждой группы.

Дело в том, что большинство онлайн-калькуляторов делают расчет минимально необходимой выборки при конфигурации сплита 50%/50%.

Но я-то хочу сделать принципиально другой сплит: 95%/5%.

Является ли настолько асимметричный A/B-тест особым случаем с точки зрения математики?

Итак, начнем с того, что разберем как нам самим оценивать размер минимально необходимой выборки. Для этого в R существует целых две функции:
  • stats::power.prop.test()
  • pwr::pwr.2p.test()
Давайте попробуем каждую из них:

stats::power.prop.test().

Здесь размер минимально необходимой выборки = 315206 визитов (см. чарт выше).

pwr::pwr.2p.test().

А здесь размер минимально необходимой выборки уже = 315161 визитов.

Как мы видим, все 3 результата разные. 

Во-первых, Evan's калькулятор занижает размер минимальной выборки (в этом случае на ~1.7% трафика). 
Во-вторых, даже R функции несколько расходятся в оценке (315206 vs 315161).

Немного по`google`ив мы находим этому объяснение:
оба теста делают некую аппроксимацию биноминального распределения, а потому на разных % конверсии каждый из вариантов чуть более или менее точен. 

Для себя я принял решение использовать цифры из пакета pwr.

Идем дальше.

В A/B-тестах есть два важных параметра:
  • significance level (Type I error probability), обычно sig.level = 0.05
  • statistical power (1 - Type II error), обычно power = 0.8
На чарте сравнивающим две группы эти понятия транслируются в следующие закрашенные области (см. легенды под графиком):

Source: https://rpsychologist.com/d3/NHST/

И оба этих параметра нужно задать, чтобы определить размер минимально необходимой выборки.

Если у вас в какой-то момент проведения теста достигается p.value < 0.05, то это еще не означает, что тест надо закончить. 

Только по достижению размера минимальной необходимой выборки мы можем быть уверены, что тест обладает следующими характеристиками:
  • sig.level = 0.05 и
  • power = 0.8
Насколько это важно я сейчас вам продемонстрирую. 

Давайте сделаем симуляцию. 

Итак, чуть ранее, мы определили, что для того, чтобы поймать lift = 5% при базовой конверсии в 2% нам нужно 315161 визитов. 

Я создаю две группы с одинаковыми размерами (n1 = 315161, n2 = 315161).
У группы A фиксирую конверсию на уровне с1 = 6303 / 315161 = 2%.
У группы B небольшими шагами наращиваю дельту конверсии (lift_delta) и смотрю на p.value и power.

p.value vs power: equal size groups.

Мы видим, при lift в 3.7% я уже получил p.value = 0.039, т.е. ниже, чем 0.05. НО power теста все еще низкий и = 54%. 

Это означает, что всего с вероятностью в 54% мы найдем эффект, когда он действительно есть.

И лишь когда мы дойдем до lift в 5% на выборке в 315161 наш power выйдет на уровень 80%.

Теперь мы готовы к тому, чтобы вернуться и ответить на мой начальный вопрос:

меняются ли стат. характеристики A/B-теста, если группа A получает 95% трафика, а группа B всего 5% трафика?

Давайте снова сделаем симуляцию. 

Беру объем трафика, который мы могли бы израсходовать на симметричный тест, но распределяю его в пропорции 95%/5% (n1 = 567289, n2 = 63032).
У группы A фиксирую конверсию на начальном уровне с1 = 2%.
У группы B небольшими шагами наращиваю дельту конверсии (lift_delta) и смотрю на p.value и power.

p.value vs power: non-equal size groups.

Как видим, чтобы выйти на классические параметры стат. значимости мне нужно достичь lift уже в размере 8.5%, а не 5%, которые рассчитывались для симметричного типа теста. А это увеличивает требование к конверсии на целых 70%!

Получается, что:
  1. несимметричные сплиты требуют другой математики
  2. у них тяжелее требования к lift для достижения стат. значимости
Если же вы не видите возможности достичь такого lift, то вам на помощь может прийти функция pwr::pwr.2p2n.test().

Она позволяет узнать неизвестный параметр для несимметричных A/B-тестов. 

Например, давайте узнаем, сколько нужно трафика в группе B, если:
  • в группе A объем трафика = 567289
  • мы хотим поймать lift = 5% 
  • соблюдая sig.level = 0.05 и power = 0.8
pwr::pwr.2p2n.test().

Оказывается, для несимметричного теста для достижения стат. характеристик трафика нужно намного больше (218188!), чем мы полагали ранее (63032). А значит и пропорция нужна другая: теперь это 72%/28%.

Comments

  1. Спасибо за статью ��

    Интересно было бы ещё понять как изменятся цифры при такой логике:
    1. Размер выборки минимальный определили 309к
    2. Как повысится значимость и достоверность если в А группу мы дадим больше чем 309к, при этом В так и останется равной 309к

    Может уже исследовали? ��

    ReplyDelete
    Replies
    1. Если честно - то такой сценарий я не просчитывал.

      Delete

Post a Comment

Popular posts from this blog

DAU / MAU отличный способ мерять не то, что вам нужно

Aha-момент или как понять, что клиент готов быть регулярным пользователем вашего продукта

Quick Ratio: или как понять растет ли ваш продукт?