Разберём ещё один метод расчёта АБ и потихоньку будем завершать вводную часть по этой теме.
Классический метод, который на практике я встречал не часто — оценка через доверительные интервалы (CI, confidence intervals). Он простой, хоть и не самый надёжный такой реализации.
Да, технически, интервалы в расчётах АБ заложены везде. Мы же поговорим о классике, когда построение CI это самоцель.
🧐 CI — это диапазон значений, в котором, с определённой вероятностью, находится истинное значение параметра.
Если CI выборок не пересекаются, то это означает стат. значимость в различиях (технически, среднее одной выборки не должно лежать в интервале второй, но на цифрах интервалов мы среднего не видим)
Ограничение: CI предполагают нормальные распределения выборок и теряют в точности на малых выборках.
Пример реализации метода:
# Заводим функцию для расчёта CI
calc_ci <- function(df, cl = 0.95) {
mean_metric <- mean(df$metric) # считаем среднее
std_error <- sd(df$metric) / sqrt(nrow(df)) # считаем стандартную ошибку
error_limit <- qt(cl / 2 + .5, df = nrow(df) - 1) * std_error # считаем предел погрешности
lower <- mean_metric - error_limit # считаем нижнюю границу интервала
upper <- mean_metric + error_limit # считаем верхнюю границу интервала
return(c(lower, upper))
}
# Считаем CI для групп
ci_A <- calc_ci(df %>% filter(var == "A"))
ci_B <- calc_ci(df %>% filter(var == "B"))
# Заводим функцию для расчёта CI
def calc_ci(df, cl = 0.95):
mean_metric = np.mean(df['metric']) # считаем среднее
std_error = np.std(df['metric']) / np.sqrt(len(df)) # считаем стандартную ошибку
error_limit = stats.t.ppf(cl / 2 + 0.5, df = len(df) - 1) * std_error # считаем предел погрешности
lower = mean_metric - error_limit # считаем нижнюю границу интервала
upper = mean_metric + error_limit # считаем верхнюю границу интервала
return lower, upper
# Считаем CI для групп
ci_A = calc_ci(df[df['var'] == 'A'])
ci_B = calc_ci(df[df['var'] == 'B'])
#ABtest
