Бутстрап: как оценить неопределенность, когда готовой формулы нет
Бутстрап: как оценить неопределенность, когда готовой формулы нет
Допустим, в тесте нужно сравнить медиану чека, 90-й перцентиль времени доставки или отношение кликов к показам. Для среднего с нормальным распределением формула доверительного интервала есть в любом учебнике. А для медианы или ratio-метрики с тяжелым хвостом она либо громоздкая, либо опирается на допущения, которые у вас не выполняются. Тут и выручает бутстрап.
В чем идея
Выборка у вас одна, повторить эксперимент тысячу раз нельзя. Зато можно тысячу раз переиграть саму выборку: считаем, что она неплохо похожа на всю популяцию, и тянем из нее новые выборки того же размера с возвращением. На каждой считаем метрику. Получаем тысячи значений, и их разброс показывает, насколько метрика шатается из-за случайности выборки.
Придумал метод Брэдли Эфрон в 1979 году, а название пошло от выражения pull yourself up by your bootstraps: вытащить себя за шнурки.
Как это делается
➖ Шаг 1.
Берем исходную выборку из n наблюдений.
➖ Шаг 2.
Тянем n наблюдений с возвращением. Одно и то же может попасть дважды, а какое-то не попасть вообще.
➖ Шаг 3.
Считаем нужную метрику на новой выборке: медиану, отношение, что угодно.
➖ Шаг 4.
Повторяем шаги 2 и 3 тысячи раз, обычно от 1000 до 10 000.
➖ Шаг 5.
Берем 2,5-й и 97,5-й перцентили полученных значений. Это 95% доверительный интервал.
Пример на Python import numpy as np rng = np.random.default_rng(42) def bootstrap_ci(a, b, stat=np.mean, n=10_000, alpha=0.05): diffs = [ stat(rng.choice(b, len(b))) - stat(rng.choice(a, len(a))) for _ in range(n)
] return np.percentile(diffs, [100 * alpha / 2, 100 * (1 - alpha / 2)]) ps для сравнения групп каждую выборку ресемплируем отдельно и смотрим на разницу метрик. Если интервал разницы не содержит ноль, эффект значим на выбранном уровне. Чтобы посчитать то же самое для медианы, передайте stat=np.median.
Для каких задач подходит
➖ Медиана и перцентили.
Формулы для их интервалов громоздкие и с допущениями, бутстрап считает все одинаково.
➖ Ratio-метрики.
CTR, заказы на сессию, выручка на пользователя: делим одну случайную величину на другую, и обычная дисперсия врет.
➖ Метрики с тяжелыми хвостами.
Выручка с редкими крупными покупками далека от нормальной, а бутстрапу нормальность не нужна.
➖ Ретро-A/A.
Много раз режем историю на псевдогруппы и проверяем, не врет ли критерий, разбирали тут . ➖ Любая нестандартная метрика.
Если ее можно посчитать на выборке, ее можно обернуть в бутстрап.
Когда бутстрап подведет
➖ Совсем маленькая выборка.
Если в данных 10-20 наблюдений, они плохо похожи на популяцию, и переигрывать нечего.
➖ Экстремумы.
Максимум и минимум бутстрап оценивает плохо: новый максимум не может оказаться больше старого.
➖ Зависимые наблюдения.
Если один человек встречается в данных несколько раз, ресемплировать нужно людей, а не строки, писал про это тут . ➖ Тяжелые вычисления.
Тысячи пересчетов на больших данных считаются долго, для разведки можно взять меньше итераций.
Практические советы
➖ Фиксируйте seed.
Чтобы результат можно было воспроизвести.
➖ Берите достаточно итераций.
Для интервала хватает 5-10 тысяч, для хвостов и p-value лучше больше.
➖ Ресемплируйте единицу рандомизации.
В A/B это обычно пользователь, а не строка в логе.
Бутстрап не лечит плохие данные, он честно показывает, насколько им можно верить.
❤️🔥 Подписывайтесь и поддержите канал бустом
↗️ Менторю и помогаю выйти на оффер
❓ Как вы считаете интервалы для медианы и ratio-метрик: бутстрапом или по формулам?
@data_driven_bogdan
Откликнуться в Telegram →
⚠️ Никогда не платите «за оформление» или «гарантию трудоустройства» — это признак мошенников. Работа ТРУ не несёт ответственности за содержание вакансии.