Skip to content

qetzal/ab-test-simulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 

Repository files navigation

Это модель, которая симулирует множество A/B тестов, сравнивая две гипотезы с разной конверсией. Мы собираем статистику и оцениваем ситуации с досрочным завершением теста, если появилась статистическая значимость, завершение по с ограниченией по выборке и когда тест идет бесконечно долго, пока не появится статистическая значимость в одном из вариантов.

Для запуска достаточно открыть страницу в браузере локально. Результат покажется спустя какое-то время в консоли браузера.

Конверсия

Допустим у нас есть две посадочные страницы. На эту страницу приходят люди, далеко не все из которых сконвертятся, но одна из страниц повышает этот шанс — то есть у нее выше конверсия.

Конверсия для каждой страницы/гипотезы задается через две переменные:

var control_conversion = [1,5];
var test_conversion = [0.3,4];

Запись конверсии [1,5] означает, что вероятность конверсии для этой страницы для случайного посетителя находится между 1% и 5% и нормально распределена (классический "колокол"). То есть основная масса посетителей будет иметь шанс конверсии в 3%, а например очень малая часть 1% или 5%. Запись [0.3,4] — означает, что шанс конверсии у посетителей между 0.3% и 4% (у основной массы 2.15%)

Симуляция одного эксперимента

В рамках симуляции одного A/B эксперимента мы "посылаем" трафик и случайно выбираем один из двух вариантов.

Потом мы выбираем конверсию для этого посетителя. Она выбирается случайно с учетом нормального распределения (у основной массы ребят все в середке, чем ближе к началу и конца "колокола" — тем ребят меньше туда попадает).

После этого мы еще раз случайным образом проверяем — сконвертился ли этот посетитель или нет (с учетом выбранной конверсии).

Очевидно, что будут ситуации, когда у конкретного посетителя на странице с низкой конвесией [0.3,4] будет выбрана бОльшая конверсия (например 3%) чем для конкретного посетителя с бОльшей общей конверсией [1,5] (например 1.5%). Это так и это часть модели — так оно и бывает. На большом количестве посетителей всё все равно приводится к среднему.

Для каждого теста мы также передаем размер рекомендованной выборки.

Тест завершается, когда:

  • Посетителей стало больше чем размер рекомендованной выборки, то есть мы собрали данные для нее и данные статистически значимы. Послали 1000 посетителей, на 1000-ом данные значимы → завершаемся

или

  • Посетителей стало больше чем размер рекомендованной выборки и мы получили статистически значимые данные раньше чем кончилась выборка или позже. Послали 1000 посетителей, на 400-ом данные значимы, ждем 1000-ого, снимаем данные → завершаемся. Или послали 2500 посетителей, на 1000-ом данные не значимы, тест идет дальше на 2500 получили значимые данные → завершаемся.

или

  • В тесте больше 1,000,000 посетителей (чтобы браузер не подвисал долго в расчетах при очень одинаковых конверсиях двух версий)

P-значение выставлено в 0.05

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

Много симуляций

Прогоняем каждую симуляцию много раз и собираем данные.

  • result_limited_time_notsignificant: количество симуляций в которых после рекомендованного сегмента результат не статистическо значимый

  • result_limited_time_significant_noerror: количество симуляций в которых после рекомендованного сегмента результат был значимый и тест правильно показал отличие версий

  • result_limited_time_significant_error: количество симуляций в которых после рекомендованного сегмента результат был значимый и тест неправильно показал отличие версий (ошибся)

  • result_unlimited_time_significant_error: количество симуляций в которых тест завершился рано или поздно рекомендованного сегмента и ошибся

  • result_unlimited_time_significant_error_is_early: количество симуляций в которых наступил момент, что результат статистически значим, это случилось ДО рекомендованного сегменат и тест ошибся

  • result_unlimited_time_significant_error_is_late: количество симуляций в которых наступил момент, что результат статистически значим, это случилось ПОСЛЕ рекомендованного сегменат и тест ошибся

  • result_unlimited_time_significant_noerror: количество симуляций в которых тест завершился рано или поздно рекомендованного сегмента и показал правильный результат

  • result_unlimited_time_significant_noerror_is_early: количество симуляций в которых наступил момент, что результат статистически значим, это случилось ДО рекомендованного сегменат и тест не ошибся (мы получили правильные данные раньше)

  • result_unlimited_time_significant_noerror_is_late: количество симуляций в которых наступил момент, что результат статистически значим, это случилось ПОСЛЕ рекомендованного сегменат и тест не ошибся (мы получили правильные данные, но позже)

Попробовать самому

Вот тут менять конверсии:

var control_conversion = [1,5];	
var test_conversion = [0.3,4];	

Пока есть ограничение, что конверсия теста обязана быть меньше чем конверсия контрольной группы.

Тут меняем количество симуляций (10000) и размер рекомендованного сегмента (26000).

console.log(run_many_simulations(10000,26000));

Посчитать его можно тут: https://www.optimizely.com/sample-size-calculator/?conversion=3&effect=20&significance=95 Важно: размер рекомендованного сегмента должен быть СУММОЙ тестового и контрольного сегментов

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages