Что такое бутстрап (Bootstrap) в статистике?

Ответ

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

Основные шаги метода:

  1. Имеется исходная выборка размера n.
  2. Генерируется B бутстрап-выборок (обычно B = 1000-10000). Каждая бутстрап-выборка формируется путём случайного отбора n наблюдений из исходной выборки с возвращением (т.е. одно наблюдение может попасть в выборку несколько раз).
  3. Для каждой бутстрап-выборки вычисляется интересующая статистика ( theta^* ) (например, выборочное среднее).
  4. Распределение этих B значений ( theta^* ) используется как аппроксимация выборочного распределения исходной статистики.

Пример на Python: построение 95% доверительного интервала для медианы.

import numpy as np

# Исходные данные (например, время отклика сервиса в мс)
data = np.array([120, 135, 98, 155, 210, 103, 178, 145])
n = len(data)
B = 10000

bootstrap_medians = []
for _ in range(B):
    # Генерация бутстрап-выборки с возвращением
    bootstrap_sample = np.random.choice(data, size=n, replace=True)
    # Вычисление статистики для этой выборки
    bootstrap_medians.append(np.median(bootstrap_sample))

# Построение перцентильного доверительного интервала
ci_lower = np.percentile(bootstrap_medians, 2.5)
ci_upper = np.percentile(bootstrap_medians, 97.5)
print(f"Бутстрап 95% ДИ для медианы: ({ci_lower:.2f}, {ci_upper:.2f})")

Преимущества бутстрапа:

  • Не требует строгих предположений о форме исходного распределения (например, нормальности).
  • Применим к сложным статистикам, для которых нет аналитической формулы.
  • Хорошо работает даже с небольшими выборками.

Ограничения: Может давать смещённые оценки для статистик, сильно зависящих от "хвостов" распределения, или данных со сложной структурой (например, временные ряды).

Ответ 18+ 🔞

А, бутстрап! Ну это ж классика, ебать мои старательские костыли. По сути, это такой хитрый способ, когда у тебя данных — кот наплакал, а доверительный интервал построить охота. И ты начинаешь выкручиваться, как мартышка с гранатой.

Смотри, в чём прикол. Берёшь свою жалкую выборку, смотришь на неё и понимаешь — нихуя не ясно, какое там распределение. Нормальное? Хуй там! А статистику (допустим, медиану) оценить надо. Вот тут-то бутстрап и выручает, этот полупидор элегантный.

Работает всё до безобразия просто, ёпта:

  1. У тебя есть n чисел. Всё, что есть.
  2. Ты начинаешь ебашить симуляции. Берёшь эти n чисел и с возвращением тащишь из них новые выборки, тоже по n штук. Одно и то же число может вылезти несколько раз — это нормально, так и задумано.
  3. Для каждой такой сгенерированной выборки считаешь нужную тебе статистику (среднее, медиану, дисперсию — что угодно). Делаешь так B раз, где B — это овердохуища, типа 10 000.
  4. Смотришь на получившуюся кучу значений — вот тебе и аппроксимация того, как твоя статистика могла бы размазаться, будь у тебя больше данных.

Вот, смотри на коде, сейчас всё станет ясно, как божий день. Главное, блок кода не трогай — он святой.

import numpy as np

# Допустим, это время отклика какого-нибудь кривого микросервиса
data = np.array([120, 135, 98, 155, 210, 103, 178, 145])
n = len(data)
B = 10000  # Делаем много, чтобы не бздеть

bootstrap_medians = []
for _ in range(B):
    # Вот он, ключевой момент: тычась в исходные данные, создаём новую выборку
    bootstrap_sample = np.random.choice(data, size=n, replace=True)
    # И считаем для неё медиану
    bootstrap_medians.append(np.median(bootstrap_sample))

# А теперь смотрим, в какие границы попадают 95% наших симулированных медиан
ci_lower = np.percentile(bootstrap_medians, 2.5)
ci_upper = np.percentile(bootstrap_medians, 97.5)
print(f"Бутстрап 95% ДИ для медианы: ({ci_lower:.2f}, {ci_upper:.2f})")

Чем хорош метод? Да тем, что доверия ебать ноль к предположениям. Не нужно гадать, нормальное ли распределение. Работает почти всегда, когда данные — это просто независимые наблюдения, типа кусочков. Для сложных статистик, на которые нет готовой формулы, — вообще спасение.

Но и подводные камни есть, ядрёна вошь. Если твоя статистика дико зависит от редких выбросов в хвостах, бутстрап может лажать. Или если данные — временной ряд, где есть зависимость между наблюдениями. Тут уже надо голову думать, а не тупо семплировать. Но в большинстве бытовых случаев — инструмент хуй в пальто, то есть просто отличный.