Bootstrap простыми словами

Проверь себя · 1/3разбор после ответа
Что вернёт запрос SELECT COUNT(DISTINCT user_id) FROM orders, если у некоторых пользователей несколько заказов?

Короткое объяснение

Bootstrap — метод статистики, когда вы многократно «берёте случайную подвыборку с возвращением» из ваших данных и считаете статистику на каждой.

Звучит странно — но позволяет получать доверительные интервалы и p-value для ЛЮБОЙ метрики, даже когда классические формулы не работают.

Зачем нужен

Классическая статистика (t-test) работает только для нормальных распределений и для среднего / пропорции.

Но часто нужны:

  • Медиана (классической формулы нет)
  • Перцентиль (P95 времени отклика)
  • Соотношения метрик (конверсия, retention)
  • Тяжёлый хвост (чек, время сессии)

Bootstrap — универсальный инструмент. Работает с любой статистикой.

Как работает

  1. У вас выборка из N наблюдений
  2. Случайно выбираете N значений с возвращением (повторы разрешены)
  3. Считаете нужную статистику (медиану, среднее и т.д.)
  4. Повторяете шаг 2-3 много раз (1000-10000)
  5. Получаете распределение статистики → из него доверительный интервал или p-value

Пример на пальцах

У вас 5 чеков: 100, 200, 300, 400, 500.

Медиана = 300.

Bootstrap-итерация 1: случайная выборка с возвращением [100, 500, 300, 300, 200] → медиана 300.

Итерация 2: [200, 400, 400, 100, 500] → медиана 400.

Итерация 3: [500, 300, 500, 100, 200] → медиана 300.

...

После 10000 итераций: у вас 10000 значений медианы.

  • P2.5 = 200
  • P97.5 = 400

95% ДИ для медианы: [200, 400].

Python пример

import numpy as np

data = np.array([100, 200, 300, 400, 500])

boot_medians = []
for _ in range(10000):
    sample = np.random.choice(data, size=len(data), replace=True)
    boot_medians.append(np.median(sample))

ci_low, ci_high = np.percentile(boot_medians, [2.5, 97.5])
print(f"95% CI for median: [{ci_low:.0f}, {ci_high:.0f}]")

Преимущества

1. Работает для любой метрики

Среднее, медиана, P95, соотношения, любая пользовательская — всё через bootstrap.

2. Не требует нормальности

Классический t-test предполагает нормальность. Bootstrap работает на любых распределениях.

3. Интуитивный

Проще объяснить команде, чем статистические формулы.

4. Легко реализовать

Цикл + случайная выборка. Работает на чём угодно.

Недостатки

1. Медленно

10000 итераций × N пересемплов × вычисление метрики. На больших данных тяжело.

2. Не «магия»

Если данные плохие, bootstrap не спасёт. Он даёт валидный ДИ при выполнении предположений.

3. Для очень маленьких выборок не работает

N = 3 не хватит для bootstrap.

4. Цена вычислений

В A/B-тестах с миллионами пользователей bootstrap медленный. Обычно используют сабсемплинг или аналитические аппроксимации.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Bootstrap в A/B-тестах

Классический вариант:

  1. Есть контроль и тест
  2. Для каждой группы bootstrap-итерация: пересемпл и подсчёт метрики
  3. Считаем разницу между группами
  4. После 10000 итераций → распределение разницы
  5. Доверительный интервал включает 0 → не значимо. Не включает → значимо.

Виды bootstrap

Стандартный bootstrap

Обычный пересемпл с возвращением. Самое простое.

Байесовский bootstrap

Веса вместо пересемпла. Медленнее, но теоретически строже.

Блочный bootstrap

Для временных рядов — пересемплируем блоками (чанками), чтобы сохранить автокорреляцию.

Стратифицированный bootstrap

Пересемпл внутри страт (например, отдельно для iOS и Android).

Частые ошибки

1. Мало итераций

1000 — минимум. 10000 — стандарт. 100 — недостаточно.

2. Без возвращения вместо с возвращением

replace=True обязательно. Без возвращения — вы просто перемешиваете данные.

3. Для маленьких выборок

N < 20 — bootstrap ненадёжен.

4. Для временных рядов без блочного bootstrap

Классический bootstrap ломает автокорреляцию во времени.

5. Не фиксировать seed для воспроизводимости

Коллеги перезапустили код — получили другой ДИ. Всегда np.random.seed(...) или random_state.

Альтернативы

  • Перестановочный тест (permutation test) — похожий подход, но для p-value
  • Delta-метод — аналитическая аппроксимация
  • Асимптотические аппроксимации — если выборка большая и вычисление дорогое

На собесе

Типичные вопросы:

«Что такое bootstrap?» Пересемпл с возвращением для оценки распределения статистики.

«Когда использовать?» Медианы, перцентили, тяжёлые хвосты, когда классика не работает.

«Сколько итераций?» 10000 обычно. 1000 — минимум.

«Bootstrap или t-test?» Если выполняются предположения t-test (нормальность, среднее), используйте его — быстрее. Иначе — bootstrap.

Связанные темы

FAQ

Сколько итераций bootstrap?

10000 стандарт. Больше — точнее ДИ, но медленнее.

Bootstrap для A/B с чеками — это ок?

Да. Для метрик с тяжёлым хвостом — bootstrap лучший выбор.

replace=True обязательно?

Да. Без возвращения — это не bootstrap, а просто перемешивание.

Блочный bootstrap для чего?

Для временных рядов. Классический bootstrap ломает автокорреляцию.