Бутстрап 95% доверительного интервала для медианы суммы заказа
values — список сумм заказов. Верните 95% доверительный интервал (low, high) для медианы методом перцентильного бутстрапа — у медианы нет простой замкнутой формулы стандартной ошибки, поэтому ресемплинг здесь естественен.
Используйте n_boot ресемплов и фиксированный seed, чтобы результат воспроизводился.
def bootstrap_median_ci(values: list[float], n_boot: int = 10000,
seed: int = 0) -> tuple[float, float]:
# ваш код здесь
Напишите реализацию.
Ресемплируйте значения с возвращением до размера n, берите медиану каждого ресемпла и повторяйте несколько тысяч раз. 2.5-й и 97.5-й перцентили этих бутстрап-медиан — это 95% интервал, без замкнутой формулы стандартной ошибки.
- ✗Ресемплировать без возвращения или не того размера
- ✗Применять формулу нормального приближения к медиане
- ✗Брать перцентили сырых значений вместо бутстрап-медиан
- →Почему ресемплировать ровно до n, а не до меньшего размера?
- →Как изменится интервал, если удвоить n_boot?
Draw n_boot resamples of size n with replacement, record each median, then read off the 2.5% and 97.5% percentiles of the sorted bootstrap medians.
import random
from statistics import median
def bootstrap_median_ci(values, n_boot=10000, seed=0):
rng = random.Random(seed)
n = len(values)
boot = []
for _ in range(n_boot):
sample = [values[rng.randrange(n)] for _ in range(n)]
boot.append(median(sample))
boot.sort()
lo = boot[int(0.025 * n_boot)]
hi = boot[int(0.975 * n_boot)]
return (lo, hi)
The two ideas that make it correct: resample with replacement to the same size n (so each resample mimics a fresh draw from the population), and take percentiles of the statistic — the medians — not of the raw order values.