Bootstrap в статистике — что это и когда применять
Что такое 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 — точно.
Алгоритм: пошагово
- Есть исходная выборка размером n.
- Случайно выбираете n элементов из неё с возвращением — это одна bootstrap-выборка.
- Вычисляете интересующую статистику (среднее, медиану, разность конверсий — что угодно).
- Повторяете шаги 2–3 B раз (обычно B = 10 000).
- Получаете B значений статистики — это bootstrap-распределение.
- Берёте 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-тест:
- Объединяете данные контроля и теста.
- Для каждой bootstrap-итерации: сэмплируете с возвращением из контроля и теста отдельно, считаете разность средних.
- Получаете распределение разности. Если 95% CI не содержит 0 — эффект значим.
Этот подход часто применяют в Яндексе, Авито и других компаниях с большими продуктовыми командами.
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, эффект значим.
Потренируйтесь решать задачи по статистике и A/B-тестированию — откройте тренажёр. 1500+ примеров вопросов по всем темам, включая статистику.
Читайте также
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 воспроизведёт это смещение. При совсем малых выборках стоит рассмотреть байесовские методы.