Перейти к содержимому

Бутстрап: единственный стат. тест, который вам нужен

10 минут чтения
Содержание

Всем привет! 👋 Сегодня мы разберем бутсрап. Его преимущества и недостатки. Очень часто вокруг себя, на конференциях или в частных тг-каналах вижу обсуждение различных статистических инструментов и почти никогда не слышу про бутстрап, хотя гарантирую, что после прочтения этой статьи при вопросе “как построить доверительный интервал для этой метрики?” вы сразу будете думать о нём, а не о каком-то хитром способе, как привести выборку к какому-то распределению и исследовать его. Итак, начнем.

Когда параметрических методов не хватает

Параметрические методы (например, t-тест) хорошо работают в определённых условиях: большая выборка, распределение, близкое к нормальному, и статистика, для которой есть аналитическая формула стандартной ошибки.

Проблема в том, что на практике эти условия выполняются реже, чем хотелось бы.

Ситуация 1: статистика, для которой нет формулы. t-тест даёт интервал для среднего. А если нужен интервал для медианы revenue per user? Для 95-го перцентиля времени загрузки? Для отношения revenue / sessions? Аналитических формул стандартных ошибок для этих статистик либо нет, либо они требуют допущений, которые не выполняются.

Ситуация 2: скошенные данные на реальных выборках. Формула xˉ±tSE\bar{x} \pm t \cdot SE предполагает, что выборочное среднее распределено симметрично. Центральная предельная теорема это гарантирует, но при достаточно большом nn. Для скошенных распределений (revenue, длительность сессий, суммы покупок) ЦПТ сходится медленно. При n=50-100n = 50\text{-}100 симметричный интервал систематически ошибается.

Ситуация 3: сложные метрики в A/B-тестах. Например, отношение двух величин, или разница медиан, или что-то составное. Дельта-метод даёт приближение, но формулы быстро становятся громоздкими. А для каждой новой метрики приходится выводить формулу заново.

Бутстрап решает все три ситуации одним и тем же алгоритмом. Ниже я покажу это на данных.

Идея в одном абзаце

У вас есть выборка X={x1,x2,,xn}X = \{x_1, x_2, \ldots, x_n\}. Вы хотите узнать распределение некоторой статистики θ^=s(X)\hat{\theta} = s(X) — среднего, медианы, перцентиля, чего угодно.

Алгоритм:

  1. Из выборки XX берёте случайную подвыборку размера nn с возвращением — это бутстрап-выборка XX^*.
  2. Считаете статистику θ^=s(X)\hat{\theta}^* = s(X^*).
  3. Повторяете BB раз (обычно B=10000B = 10\,000).
  4. Получаете BB значений θ^1,θ^2,,θ^B\hat{\theta}^*_1, \hat{\theta}^*_2, \ldots, \hat{\theta}^*_B — это эмпирическое распределение вашей статистики.

Из этого распределения можно извлечь стандартную ошибку, доверительный интервал, p-value.

Визуально: что происходит

Вот конкретный пример. Выборка из 50 наблюдений, распределение скошено вправо (типичная картина для revenue). Мы хотим оценить неопределённость медианы.

Скошенная вправо выборка из 50 наблюдений сверху и гистограмма 10 000 бутстрап-медиан снизу — асимметричное распределение статистики

Верхний график визуализирует исходную выборку и её медиану. Нижний представляет собой гистограмму 10 000 бутстрап-медиан. Обратите внимание: распределение бутстрап-статистики не обязано быть нормальным. В данном случае оно скошено — и это важно. Бутстрап честно отражает эту скошенность, а симметричная формула xˉ±tSE\bar{x} \pm t \cdot SE нет.

Почему это работает: plug-in principle и Гливенко-Кантелли

Интуиция бутстрапа кажется подозрительной: мы семплируем из собственной выборки и делаем вид, что это новые данные. Почему это легитимно?

Ключ хранится plug-in principle. Идея простая: если мы не знаем истинное распределение FF, мы заменяем его эмпирическим распределением F^n\hat{F}_n, которое присваивает каждому наблюдению вес 1/n1/n.

F^n(x)=1ni=1n1[Xix]\hat{F}_n(x) = \frac{1}{n} \sum_{i=1}^{n} \mathbb{1}[X_i \leq x]

Почему это работает? Потому что теорема Гливенко-Кантелли это нам гарантирует:

supxRF^n(x)F(x)a.s.0при n\sup_{x \in \mathbb{R}} |\hat{F}_n(x) - F(x)| \xrightarrow{a.s.} 0 \quad \text{при } n \to \infty

Эмпирическое распределение сходится к истинному равномерно и почти наверное. Не в одной точке, не в среднем, а по всей прямой одновременно. Это сильный результат.

Из этого следует: если F^nF\hat{F}_n \approx F, то и распределение статистики θ^\hat{\theta} при семплировании из F^n\hat{F}_n будет близко к её истинному распределению при семплировании из FF.

Формально: пусть θ=T(F)\theta = T(F) — функционал от распределения (например, медиана). Бутстрап-оценка — это θ^=T(F^n)\hat{\theta}^* = T(\hat{F}_n). Если функционал TT непрерывен (в подходящем смысле), то:

suptP(θ^t)P(θ^t)P0\sup_t \left| P^*(\hat{\theta}^* \leq t) - P(\hat{\theta} \leq t) \right| \xrightarrow{P} 0

где PP^* — вероятность при семплировании из F^n\hat{F}_n.

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


Доверительные интервалы: три метода

Имея BB бутстрап-значений статистики, мы можем построить доверительный интервал. Но “как?” вопрос не тривиальный. Существуют три основных подхода, и они дают разные результаты.

1. Перцентильный метод (Percentile)

Простейший вариант. Берём квантили бутстрап-распределения напрямую:

CI1α=[θ^α/2,  θ^1α/2]CI_{1-\alpha} = \left[\hat{\theta}^*_{\alpha/2}, \; \hat{\theta}^*_{1-\alpha/2}\right]

где θ^α/2\hat{\theta}^*_{\alpha/2} — это α/2\alpha/2-квантиль из BB бутстрап-значений.

Плюс: простота. Минус: не учитывает смещение оценки и может давать неправильное покрытие, если бутстрап-распределение несимметрично.

2. Нормальный метод (Normal)

Предполагаем, что бутстрап-распределение приблизительно нормальное:

CI1α=[θ^z1α/2SE,  θ^+z1α/2SE]CI_{1-\alpha} = \left[\hat{\theta} - z_{1-\alpha/2} \cdot \text{SE}^*, \; \hat{\theta} + z_{1-\alpha/2} \cdot \text{SE}^*\right]

где SE=std(θ^1,,θ^B)\text{SE}^* = \text{std}(\hat{\theta}^*_1, \ldots, \hat{\theta}^*_B) — стандартное отклонение бутстрап-оценок.

Плюс: использует исходную оценку θ^\hat{\theta}, а не только бутстрап. Минус: предполагает симметрию, что для скошенных статистик (медиана, перцентили) не работает.

3. BCa — Bias-Corrected and Accelerated

Это метод, предложенный Эфроном, и на сегодня считающийся стандартом. Он корректирует два артефакта перцентильного метода:

  • Bias correction (z0z_0) — поправка на систематическое смещение. Оценивается как доля бутстрап-значений, меньших исходной оценки:
z0=Φ1(#{θ^b<θ^}B)z_0 = \Phi^{-1}\left(\frac{\#\{\hat{\theta}^*_b < \hat{\theta}\}}{B}\right)
  • Acceleration (aa) — поправка на скошенность. Оценивается через джекнайф (jackknife — метод, при котором мы по очереди выкидываем одно наблюдение из выборки и пересчитываем статистику на оставшихся n1n-1, получая nn оценок; это показывает, насколько сильно каждое наблюдение влияет на результат):
a=i=1n(θˉ()θ^(i))36[i=1n(θˉ()θ^(i))2]3/2a = \frac{\sum_{i=1}^n (\bar{\theta}_{(\cdot)} - \hat{\theta}_{(i)})^3}{6\left[\sum_{i=1}^n (\bar{\theta}_{(\cdot)} - \hat{\theta}_{(i)})^2\right]^{3/2}}

где θ^(i)\hat{\theta}_{(i)} — статистика, вычисленная без ii-го наблюдения, а θˉ()\bar{\theta}_{(\cdot)} — среднее джекнайф-оценок.

Скорректированные квантили:

α1=Φ(z0+z0+zα/21a(z0+zα/2)),α2=Φ(z0+z0+z1α/21a(z0+z1α/2))\alpha_1 = \Phi\left(z_0 + \frac{z_0 + z_{\alpha/2}}{1 - a(z_0 + z_{\alpha/2})}\right), \quad \alpha_2 = \Phi\left(z_0 + \frac{z_0 + z_{1-\alpha/2}}{1 - a(z_0 + z_{1-\alpha/2})}\right)
CI1αBCa=[θ^α1,  θ^α2]CI_{1-\alpha}^{BCa} = \left[\hat{\theta}^*_{\alpha_1}, \; \hat{\theta}^*_{\alpha_2}\right]

Если z0=0z_0 = 0 и a=0a = 0, BCa вырождается в обычный перцентильный метод. Но на практике z0z_0 и aa почти никогда не равны нулю, и BCa даёт значительно лучшее покрытие.

Если вы используете бутстрап для чего-то серьёзнее учебного примера — используйте BCa. Вычислительная стоимость джекнайфа минимальна (nn дополнительных вычислений статистики), а выигрыш в покрытии реальный.

Теперь давайте посмотрим на реальных примерах.

Эксперименты

Кейс 1: покрытие на скошенных данных

Вот конкретный эксперимент. Берём lognormal-распределение (μ=4\mu = 4, σ=1.2\sigma = 1.2), типичное распределение доходов. Строим 95% доверительный интервал для среднего тремя способами: t-интервал, перцентильный бутстрап и BCa-бутстрап. Повторяем 2 000 раз с новыми выборками и считаем, как часто интервал накрывает истинное среднее.

Если метод работает правильно, покрытие должно быть ≈ 95%.

Покрытие 95% ДИ среднего на lognormal-данных по 2000 симуляций: t-интервал 85%, BCa-бутстрап 88% при n=30; оба сходятся к 95% с ростом n

При n=30n = 30 t-интервал даёт покрытие ~85% вместо заявленных 95%. Каждый шестой интервал промахивается мимо истинного значения, хотя не должен. BCa-бутстрап на тех же данных держит ~88% — тоже не идеально, но ближе к цели. Разрыв сокращается с ростом nn: при n=200n = 200 t-интервал даёт 93%, BCa — 94%.

Почему t-интервал ошибается? Потому что он симметричен: xˉ±tSE\bar{x} \pm t \cdot SE. А распределение среднего для lognormal-данных при малых nn скошено вправо. Симметричный интервал занижает верхнюю границу и завышает нижнюю. Бутстрап не предполагает симметрию — он строит интервал из фактического распределения статистики.

Кейс 2: интервал для статистики без формулы

Вторым кейсом рассмотрим ситуацию, где параметрические методы просто не применимы.

У вас есть данные A/B-теста: для каждого пользователя revenue и число сессий. Метрика revenue per session на уровне группы: θ=revenueisessionsi\theta = \frac{\sum \text{revenue}_i}{\sum \text{sessions}_i}. Это ratio-метрика, и её стандартная ошибка не вычисляется простой формулой (можно через дельта-метод, но это отдельная история с допущениями).

Бутстрап решает задачу в три строки: семплируем пользователей, считаем ratio, повторяем.

Бутстрап-распределение разницы revenue per session между группами A и B — асимметричный интервал против симметричного дельта-метода

На графике — бутстрап-распределение разницы revenue per session между группами A и B. Интервал асимметричен, и это правильно, потому что ratio-метрики не обязаны быть симметричными. Симметричный интервал через дельта-метод наложен для сравнения, он занижает верхнюю границу.

Этот интервал невозможно получить t-тестом. t-тест работает с поюзерными значениями, но ratio на уровне группы — это не среднее поюзерных ratio. Это другая статистика, и бутстрап — самый прямой способ получить для неё доверительный интервал.

Где бутстрап ломается

Бутстрап — мощный инструмент, но не всесильный. Вот три ситуации, где он не работает или работает плохо.

1. Тяжёлые хвосты

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

Бутстрап среднего при n=200: слева нормальное распределение даёт узкий стабильный колокол, справа Коши — интервал в 10 раз шире и нестабильный

Слева бутстрап среднего для нормального распределения (n=200n = 200). Стабильный колокол, узкий интервал. Справа то же для распределения Коши. Ширина интервала в 10 раз больше, и при каждом запуске результат будет другим.

На практике чистое Коши встречается редко, но тяжёлые хвосты постоянно: доходы пользователей, время сессий, суммы транзакций.

Решение: для тяжелохвостых данных используйте робастные статистики (медиану вместо среднего, trimmed mean) или проверяйте стабильность бутстрап-интервала при увеличении BB.

2. Очень малые выборки

При n<15-20n < 15\text{-}20 эмпирическое распределение является слишком грубой аппроксимацей истинного. Бутстрап-выборка из 10 наблюдений будет содержать в среднем 6.3\approx 6.3 уникальных значений (остальное дубликаты). Информации мало, и доверительные интервалы получаются ненадёжными.

Почему 6.3\approx 6.3? Вероятность, что конкретное наблюдение не попадёт в бутстрап-выборку: (11/n)n1/e0.368(1 - 1/n)^n \to 1/e \approx 0.368. Ожидаемое число уникальных: n(1(11/n)n)n(11/e)n(1 - (1 - 1/n)^n) \approx n(1 - 1/e).

nnОжидаемое число уникальныхДоля
106.363%
3019.063%
10063.263%
1000632.163%

Доля стабильна (63%\approx 63\%), но при n=10n = 10 абсолютное число уникальных значений слишком мало.

3. Зависимые данные

Стандартный бутстрап предполагает, что наблюдения независимы. Если у вас временной ряд, семплирование с возвращением разрушает временну́ю структуру.

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

Итого: козыри бутстрапа

Один алгоритм для любой статистики. Средние, медианы, перцентили, отношения, разности — бутстрап не требует выводить новую формулу для каждого случая. Это его главное практическое преимущество.

Честное покрытие на скошенных данных. Мы показали на симуляции: при n=30n = 30 на lognormal-данных t-интервал даёт покрытие 85% вместо заявленных 95%. BCa-бутстрап держит 88% — и разрыв с номиналом сокращается быстрее, чем у t-интервала.

Теоретический фундамент. Не эвристика, а следствие теоремы Гливенко-Кантелли — эмпирическое распределение сходится к истинному равномерно.

Используйте BCa. Если делаете бутстрап — используйте BCa-интервалы. Вычислительная стоимость минимальна (джекнайф — это nn дополнительных вычислений), а покрытие значительно лучше перцентильного метода.

Помните об ограничениях. Тяжёлые хвосты, малые выборки (n<15n < 15), зависимые данные — три случая, когда стандартный бутстрап может подвести.