Калькулятор A/B тестов от Александры Никулиной

Этот калькулятор позволяет определить минимальный размер выборок для проведения A/B теста, учитывая различные соотношения групп, тип распределения и альтернативу проверки гипотезы. Подходит для T-test и Z-test.

*Целую часть десятичной дроби отделяйте точкой, а не запятой. Регистр не важен.









Результаты

Размер контрольной группы (A):

Размер тестовой группы (B):

Всего:

Интерпретация:

Примечание

Распределение: введите тип распределения ("бинарное" или "небинарное").

Альтернатива: введите альтернативу для А/В теста ("односторонняя" или "двусторонняя").

Ratio: соотношение контрольной группы к тестовой. Ratio=1 (Если группы разделены 50/50), Ratio=4 (80/20) и так далее. По умолчанию большая группа - контрольная, но если поменять их местами, перерасчет не требуется.

Lift — это отличие метрики теста от метрики контроля. Считаем их разницу и делим на контроль. Например, возьмем средний чек в контроле 1005 рублей, в тесте 1200. Тогда прирост = (1200–1005)/1005 = 0.194. Оцениваем по историческим данным.

Дисперсию оцениваем выборочной дисперсией по историческим данным. Участвует в рассчете только для небинарного распределения, если у вас бинарное - проигнорируйте это поле.

Базовое значение метрики оцениваем по выборочным историческим данным. Если распределение бинарное, то вводите p0: вероятность успеха на выборочных исторических данных (от 0 до 1).

Связаться со мной в telegram

packages = ["numpy", "scipy"] def get_data(): import numpy as np from scipy import stats as st # Меняем тип данных distribution = str(Element("distribution").element.value) alternative = str(Element("alternative").element.value) ratio = float(Element("ratio").element.value) power = float(Element("power").element.value) alpha = float(Element("alpha").element.value) lift = float(Element("lift").element.value) hist_value = float(Element("hist_value").element.value) dispersion = float(Element("dispersion").element.value) z_beta = st.norm.ppf(1 - power) # Считаем z_beta, она для всех одинаковая mde = lift * hist_value # считаем MDE # Считаем z_alpha, она меняется в зависимости от альтернативы if alternative.lower() == 'двусторонняя': z_alpha = st.norm.ppf(alpha / 2) elif alternative.lower() == 'односторонняя': z_alpha = st.norm.ppf(alpha) #print(distribution,alternative,ratio,power,alpha,lift,p0,dispersion,hist_value) # Считаем размер меньшей (тестовой) выборки, если распределение небинарное if distribution.lower() == 'небинарное': n_little = round(((ratio + 1) / ratio) * ((dispersion * (z_beta + z_alpha)**2) / mde**2)) interpretation = ' При таком размере выборок и дисперсии не больше заданной, в случае отклонения на MDE (lift * базовое значение метрики), вероятность отвергнуть гипотезу не меньше заданной мощности.' # Считаем размер меньшей (тестовой) выборки, если распределение бинарное elif distribution.lower() == 'бинарное': n_little = round(((ratio + 1) / ratio) * ((hist_value * (1 - hist_value) * (z_beta + z_alpha)**2) / mde**2)) interpretation = ' При таком размере выборок, в случае отклонения на MDE (lift * p0), вероятность отвергнуть гипотезу не меньше заданной мощности.' n_big = round(n_little * ratio) # Считаем размер большей выборки (контрольной) total = n_little + n_big # Считаем общий размер Element('control-group').write(n_big) Element('test-group').write(n_little) Element('total').write(total) Element('interpretation').write(interpretation)