Урок курса
Bootstrap в A/B-тестах: доверительный интервал
A/B тесты и анализ данных на PythonBootstrap приближает выборочное распределение статистики повторным ресемплированием наблюдений с возвращением. Из исходной выборки размера n много раз собирают новую выборку того же размера, каждый раз считают метрику и получают распределение оценок.
Для A/B-теста обычно ресемплируют группы отдельно, вычисляют метрику A, метрику B и их разницу. Квантили распределения разниц дают percentile-интервал.
for _ in range(iterations):
a_star = rng.choice(a, size=len(a), replace=True)
b_star = rng.choice(b, size=len(b), replace=True)
effects.append(metric(b_star) - metric(a_star))
Метод особенно удобен для медианы, квантиля и сложной метрики, у которой неудобна аналитическая формула стандартной ошибки.
Единица ресемплирования
Bootstrap должен сохранять структуру данных. Если вариант назначается пользователю, а таблица содержит события, ресемплируют пользователей вместе со всеми их событиями, а не отдельные строки. Иначе зависимые события искусственно увеличат эффективный размер выборки.
Для временных рядов простой независимый bootstrap часто разрушает автокорреляцию; используют block bootstrap или временную модель. Для кластерного эксперимента ресемплируют кластеры. Метод не исправляет плохую рандомизацию, утечку между группами и систематическое смещение.
Число итераций влияет на стабильность хвостовых квантилей. Фиксируйте seed для воспроизводимости и проверяйте, что увеличение итераций заметно не меняет вывод.
Ограничения и интерпретация
Percentile bootstrap прост, но может работать плохо при сильном смещении, малой выборке или статистике на границе допустимых значений. Существуют basic и BCa-интервалы; выбор метода нужно зафиксировать до просмотра желаемого результата.
Bootstrap не означает «метод без предположений». Он предполагает, что наблюдаемая выборка достаточно представляет генеральную совокупность и что схема ресемплирования отражает механизм получения данных.
В отчёте укажите метрику, единицу ресемплирования, число итераций, seed и тип интервала. Сравните результат с простым аналитическим методом на тестовой задаче: резкое расхождение часто обнаруживает ошибку реализации или неверную единицу анализа.
Bootstrap разницы средних: код без дополнительных библиотек
Одна строка ниже — итоговая выручка одного независимо рандомизированного пользователя. Повторно выберем пользователей внутри каждой группы с возвращением и посчитаем разницу средних. Фиксированный seed помогает воспроизвести учебный результат, но не повышает статистическую надёжность.
import random
from statistics import mean
rng = random.Random(42)
a = [0, 0, 100, 0, 200, 0, 50, 0]
b = [0, 100, 150, 0, 250, 50, 0, 100]
deltas = sorted(mean(rng.choices(b, k=len(b))) - mean(rng.choices(a, k=len(a))) for _ in range(5000))
low, high = deltas[124], deltas[4874]
print(low, high)
assert low < high
Это простой percentile-интервал для учебной разницы средних. Восемь пользователей в группе — слишком мало для уверенного бизнес-решения: увеличение числа ресемплов не создаёт новых исходных данных. Попробуйте добавить пользователям повторные события. Если ресемплировать события вместо пользователей, зависимость внутри одного человека потеряется. Для отношений вроде среднего чека на покупку нужно определить, как в каждом ресемпле считаются числитель и знаменатель.
Задача 1
Что нужно ресемплировать, если вариант A/B назначается пользователю, а у пользователя много событий?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
