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 — точно.

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

  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 — эффект значим.

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

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 воспроизведёт это смещение. При совсем малых выборках стоит рассмотреть байесовские методы.