Bootstrap в статистике — что это и когда применять

Проверь себя · 1/3разбор после ответа
Пусть Xслучайная величина с дисперсией σ^2, а — среднее n независимых наблюдений X1..Xn. Чему равна Var(x̄)?

Что такое bootstrap

Bootstrap — это метод статистики, основанный на ресемплировании (resampling). Идея: вместо того чтобы строить доверительные интервалы по формулам, которые предполагают нормальное распределение, вы генерируете тысячи «виртуальных выборок» из имеющихся данных и смотрите, как ведёт себя интересующая вас статистика.

Допустим, у вас 500 пользователей, и вы хотите оценить медиану времени на сайте. Формулы для доверительного интервала медианы сложные и ненадёжные при малых выборках. Bootstrap решает эту задачу в лоб: берёте из тех же 500 наблюдений случайную выборку размером 500 с возвращением, считаете медиану. Повторяете 10 000 раз. Получаете распределение медианы — и из него берёте перцентили.

Ключевое слово — с возвращением (with replacement). Одно и то же наблюдение может попасть в выборку несколько раз, а некоторые не попадут вовсе. Именно за счёт этого каждая bootstrap-выборка чуть отличается от исходной.

Зачем нужен bootstrap

Классические формулы для CI работают при определённых допущениях: нормальность распределения, достаточный размер выборки, известная формула стандартной ошибки. Bootstrap не требует ничего из этого.

Когда bootstrap незаменим:

  • Нет формулы. Для медианы, 90-го перцентиля, отношения двух метрик (ratio metrics) аналитических формул CI либо нет, либо они сложные и ненадёжные.
  • Распределение ненормальное. Если данные сильно скошены (доходы, время на сайте, суммы чеков), z-формула для CI среднего будет давать заниженное покрытие.
  • Маленькая выборка. При n < 30 параметрические методы требуют сильных допущений. Bootstrap работает и тут — хотя при совсем маленьких n (< 15) результат будет шумным.
  • A/B-тесты с ratio-метриками. Средний чек, revenue per user, sessions per user — всё это отношения, для которых дельта-метод работает приближённо, а bootstrap — точно.

Алгоритм: пошагово

  1. Есть исходная выборка размером n.
  2. Случайно выбираете n элементов из неё с возвращением — это одна bootstrap-выборка.
  3. Вычисляете интересующую статистику (среднее, медиану, разность конверсий — что угодно).
  4. Повторяете шаги 2–3 B раз (обычно B = 10 000).
  5. Получаете B значений статистики — это bootstrap-распределение.
  6. Берёте 2,5-й и 97,5-й перцентили — это 95% доверительный интервал.

Этот вариант называется перцентильный bootstrap (percentile bootstrap). Есть и другие — BCa (bias-corrected and accelerated), studentized bootstrap — но на собеседовании чаще всего спрашивают именно перцентильный.

Python: bootstrap за 10 строк

import numpy as np

data = np.array([12, 15, 14, 10, 13, 18, 22, 11, 9, 16,
                 14, 20, 13, 17, 15, 19, 11, 25, 14, 12])

n_bootstrap = 10_000
boot_medians = np.array([
    np.median(np.random.choice(data, size=len(data), replace=True))
    for _ in range(n_bootstrap)
])

ci_lower, ci_upper = np.percentile(boot_medians, [2.5, 97.5])
print(f"Медиана: {np.median(data)}")
print(f"95% CI (bootstrap): [{ci_lower}, {ci_upper}]")
# Медиана: 14.0
# 95% CI (bootstrap): [12.5, 17.0]

replace=True — это и есть «с возвращением». Без него bootstrap не работает.

Можно ускорить через scipy (начиная с версии 1.9):

from scipy.stats import bootstrap

data_tuple = (data,)
result = bootstrap(data_tuple, np.median, n_resamples=10_000)
print(f"95% CI: [{result.confidence_interval.low:.1f}, "
      f"{result.confidence_interval.high:.1f}]")

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

В A/B-тестах bootstrap особенно полезен для метрик, которые плохо подчиняются ЦПТ (центральной предельной теореме) или не имеют простой формулы стандартной ошибки.

Пример: сравнение среднего чека. Распределение чеков обычно сильно скошено вправо — несколько крупных покупок вносят огромный вклад. z-тест для разности средних может давать некорректные p-value. Bootstrap-тест:

  1. Объединяете данные контроля и теста.
  2. Для каждой bootstrap-итерации: сэмплируете с возвращением из контроля и теста отдельно, считаете разность средних.
  3. Получаете распределение разности. Если 95% CI не содержит 0 — эффект значим.

Этот подход часто применяют в Яндексе, Авито и других компаниях с большими продуктовыми командами.

Подготовься к собесу по A/B и статистике
300+ вопросов с разбором: дизайн, размер выборки, p-value, ловушки
Тренировать A/B в Telegram

Bootstrap vs параметрические тесты

Параметрические тесты Bootstrap
Допущения Нормальность или большая выборка Минимальные
Скорость Мгновенно Секунды (10K итераций)
Любые статистики Нет (нужна формула SE) Да
Точность при малых n Зависит от допущений Зависит от данных
Интерпретация Привычная Привычная

Если данные нормальные и есть аналитическая формула — параметрические тесты дадут тот же результат быстрее. Bootstrap не «лучше» — он универсальнее.

Типичные ошибки

1. Слишком мало итераций. 100–500 повторений — мало. Доверительный интервал будет нестабильным: запустите код дважды — получите разные ответы. Минимум 5 000, стандарт — 10 000.

2. Забыли replace=True. Без возвращения каждая «выборка» — это просто перемешивание исходных данных. Все статистики будут одинаковыми. Это не bootstrap, а пермутационный тест — совсем другой метод.

3. Данные не репрезентативны. Bootstrap создаёт новые выборки из имеющихся данных. Если исходная выборка смещена (selection bias), bootstrap добросовестно воспроизведёт это смещение. Мусор на входе — мусор на выходе.

4. Применение к зависимым данным. Стандартный bootstrap предполагает, что наблюдения независимы. Для временных рядов нужен блочный bootstrap (block bootstrap), где сэмплируются блоки последовательных наблюдений.

Вопросы с собеседований

Что такое bootstrap простыми словами? — Это способ оценить неопределённость статистики (среднего, медианы, разности) без формул. Из имеющейся выборки многократно берём случайные подвыборки с возвращением, считаем нужную метрику и смотрим, как она варьируется. Разброс даёт доверительный интервал.

Почему сэмплирование с возвращением? — Без возвращения каждая выборка — перестановка одних и тех же значений. Все статистики совпадут с исходной. С возвращением каждая выборка отличается: какие-то наблюдения дублируются, какие-то отсутствуют — это создаёт вариативность, из которой мы оцениваем неопределённость.

Когда bootstrap лучше аналитических формул? — Когда нет формулы для стандартной ошибки (медиана, перцентили, ratio-метрики), когда распределение далеко от нормального, или когда выборка мала и вы не уверены в параметрических допущениях.

Сколько bootstrap-итераций нужно? — Для оценки CI — минимум 5 000, стандарт 10 000. Для оценки p-value — может понадобиться больше (50 000–100 000), потому что хвосты распределения оцениваются менее точно.

Как применить bootstrap в A/B тесте? — Для каждой итерации сэмплируете с возвращением из контроля и теста отдельно, считаете разность метрик. Получаете распределение разности. 95% CI из перцентилей — если не содержит 0, эффект значим.

Читайте также

FAQ

Что такое bootstrap в статистике?

Bootstrap — это метод ресемплирования, который позволяет оценить доверительный интервал любой статистики без аналитических формул. Из исходной выборки многократно создаются случайные подвыборки с возвращением, для каждой вычисляется статистика, а затем из полученного распределения берутся перцентили.

Чем bootstrap отличается от пермутационного теста?

Bootstrap сэмплирует с возвращением из каждой группы отдельно — он оценивает распределение статистики. Пермутационный тест перемешивает метки групп без возвращения — он проверяет нулевую гипотезу «группы не отличаются». Методы решают разные задачи: bootstrap строит CI, пермутационный тест даёт p-value.

Сколько итераций нужно для bootstrap?

Для стабильного доверительного интервала — минимум 5 000, стандарт — 10 000. При меньшем числе итераций границы CI будут «плавать» от запуска к запуску. Для оценки p-value в хвостах распределения может понадобиться 50 000–100 000.

Можно ли применять bootstrap к маленьким выборкам?

Да, bootstrap работает при малых n, но результат зависит от качества выборки. При n < 15 bootstrap-распределение будет дискретным и шумным. Если исходная выборка не репрезентативна, bootstrap воспроизведёт это смещение. При совсем малых выборках стоит рассмотреть байесовские методы.