С теорией разобрались, едем дальше.
Для расчёта АБ существует много методов. Мы рассмотрим самые популярные, которые чаще других применяются на практике. И начнём, конечно, с T-теста Стьюдента / Уэлча.
‼️ Кстати, тоже частая тема на собесах.
Нулевая гипотеза Т-теста предполагает, что средние значения переменной в выборках равны. Отклонение гипотезы (p-value < 0.05) это наша желаемая цель.
Я часто подхожу к расчётам через T-тест. Он простой и довольно точный. Из минусов — имеет пару ограничений (но и инструменты для их обхода).
Первое ограничение подразумевает, что дисперсии в выборках должны быть гомогенны, т.е. равны.
Для проверки дисперсий обычно используют какой-то из критериев:
✅ Бартлетта. Он чувствителен к нормальности распределения;
✅ Левена. Менее чувствителен к нормальности, самый популярный тест;
✅ Флигнера-Килина. Не чувствителен к отклонениям от нормальности и выбросам, подходит для ненормального распределения;
Нулевые гипотезы всех критериев похожи, они предполагают, что дисперсии в выборках равны. Т.е. нам эту гипотезу отклонять не хочется (цель p-value > 0.05).
Но вне зависимости от результатов, мы можем обойти это ограничение. Оно присутствует у Стьюдента, но его нет у Уэлча. Т.е. технически, нам всё равно какая там дисперсия получится 🙂
В коде далее df — датасет, metric — метрика, столбец который проверяем, var — категория варианта.
Проверка дисперсий в R и Python:
library(car) # библиотека с тестом Левена
bartlett.test(metric ~ var, df) # тест Бартлетта
leveneTest(metric ~ var, df) # тест Левена
fligner.test(metric ~ var, df) # тест Флигнера-Килина
from scipy.stats import bartlett, fligner, levene
# тест Бартлетта
bartlett_result = bartlett(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
# тест Левена
levene_result = levene(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
# тест Флигнера-Килина
fligner_result = fligner(df[df['var'] == 'A']['metric'], df[df['var'] == 'B']['metric']).pvalue
#ABtest
