Иногда выборочные средние могут распределиться не нормально, а нам прям очень надо. Эту проблему можно пофиксить
Чтобы попытаться выровнять распределение, мы можем использовать много методов — от простого логарифмирования и стандартизации, до рангового преобразования и трансформации Йео-Джонсона.
Сразу оговорюсь, что на практике в АБ с выравниванием заморачиваются не часто (можешь щегольнуть скиллом на работе), поэтому я не буду слишком углубляться в описание всех методов, а разберу мой любимый — степенную трансформацию Бокса-Кокса.
☝️ Главный нюанс, который стоит знать про BCT (Box-Cox transformation) — он не работает с отрицательными значениями. В коде последней строкой фикс для таких случаев.
🧐 Суть метода, под капотом, заключается в поиске идеального значения суперпараметра лямбда, который определяет как именно трансформировать данные. Лямбда подставляется в формулу к каждому значению в данных. Если лямбда нулевая, то формула логарифмирует значения, если не нулевая — возводит данные в степень лямбды.
Если по простому, то мы видоизменяем значения таким образом, чтобы они были больше похоже друг на друга и с ними было удобнее работать, но при этом не терялся их смысл.
Вот так это выглядит в R (версия для Python в комменте):
library(MASS)
library(car)
# Вычисляем лучшее значение лямбды
par(mfrow = c(1, 1))
boxcox_result <- boxcox(df$metric ~ 1, lambda = seq(-3,3,0.1))
# Сохраняем его
best_lambda <- boxcox_result$x[which.max(boxcox_result$y)]
# Применяем преобразование
df$metric_transformed <- car::bcPower(df$metric, best_lambda)
# При наличии отрицательных значений, смещаем нашу метрику на минимальную величину +1
df$metric <- df$metric+ abs(min(df$metric)) + 1
📎 У меня на гитхабе есть демка такого преобразования (R).
#ABtest
