Bootstrap Confidence Interval
Estimate a confidence interval for any statistic by resampling with replacement, using a seeded random generator for repeatable runs.
Code
import random
import statistics
from collections.abc import Callable, Sequence
def bootstrap_confidence_interval(
sample: Sequence[float],
*,
statistic: Callable[[Sequence[float]], float] = statistics.mean,
iterations: int = 2000,
confidence: float = 0.95,
seed: int | None = None,
) -> tuple[float, float, float]:
if not sample:
raise ValueError("sample must not be empty")
if not 0 < confidence < 1:
raise ValueError("confidence must be between 0 and 1")
if iterations < 100:
raise ValueError("use at least 100 iterations")
rng = random.Random(seed)
size = len(sample)
estimates: list[float] = []
for _ in range(iterations):
resample = [sample[rng.randrange(size)] for _ in range(size)]
estimates.append(statistic(resample))
estimates.sort()
alpha = (1 - confidence) / 2
lower = estimates[int(alpha * iterations)]
upper = estimates[min(iterations - 1, int((1 - alpha) * iterations))]
return lower, upper, statistic(sample)
def main() -> None:
latencies = [12.0, 15.5, 11.2, 40.0, 13.8, 14.1, 16.0, 12.9, 55.0, 13.0]
lower, upper, observed = bootstrap_confidence_interval(
latencies, iterations=4000, seed=42
)
print(f"mean={observed:.2f} 95% CI=({lower:.2f}, {upper:.2f})")
median_lower, median_upper, _ = bootstrap_confidence_interval(
latencies,
statistic=statistics.median,
iterations=4000,
seed=7,
)
print(f"median CI=({median_lower:.2f}, {median_upper:.2f})")
if __name__ == "__main__":
main()Report a problem with this exampleOpens a pre-filled issue on GitHub.