1 도입 — Bootstrap 의 일반성
Buisson Ch.7 의 첫 메시지:
“부트스트랩은 극도로 강력하고 일반적인 시뮬레이션 도구이다. 어떤 자료에서도 견고한 결론을 도출할 수 있다 — 표본이 작거나 분포가 이상해도. 부트스트랩의 본질적 장점은 적용해서 잃을 게 없다 는 점이다.” (Buisson 2021, Ch.7)
이 글은 Buisson Ch.7 의 6 sub-section 흐름을 4 편으로 분할한 overview 이다.
2 Bootstrap 의 정의
표본에서 복원 추출 (sampling with replacement) 로 같은 크기의 새 가상 표본을 수천 회 생성하고, 각 가상 표본에서 통계량을 계산. 이 통계량의 분포 로 추론 (CI, 표준 오차 등) 을 수행.
핵심 절차:
- 원 표본 \(X = (x_1, x_2, \ldots, x_n)\) 에서 복원 추출 로 가상 표본 \(X^*\) 생성 (\(n\) 크기)
- \(X^*\) 에서 통계량 \(\hat{\theta}^*\) 계산
- 1, 2 단계를 \(B\) 회 반복 (보통 \(B = 1000 \sim 10000\))
- \(B\) 개 \(\hat{\theta}^*\) 의 분포로 추론
2.1 복원 추출의 의미
5 개 자료 \((A, B, C, D, E)\) 에서 복원 추출:
- 가능 결과: \((B, A, C, D, E)\), \((A, A, B, C, D)\), \((C, C, C, A, B)\), …
- 같은 자료 여러 번 등장 가능
- 각 추출이 독립
이 절차로 원 표본의 변동성 을 시뮬레이션.
3 Bootstrap 의 4 편 분할
A-BUI7-0 (이 글) Overview
A-BUI7-1 Intro + Bootstrap CI (Percentile/BCa)
A-BUI7-2 Sample Size Guidelines + Arbitrary Statistic
A-BUI7-3 Regression Bootstrap + Decision Tree
4 왜 Bootstrap 이 필요한가
4.1 전통적 CI 의 한계
A/B 테스트나 임상의 분포 가정 기반 CI:
\[ \text{CI}_{95\%} = \bar{X} \pm 1.96 \cdot \frac{s}{\sqrt{n}} \]
가정: 자료가 정규 또는 표본 평균이 정규에 근사 (CLT).
4.2 Buisson 의 사례 — 케이크 굽기 시간
C-Mart 산업 엔지니어가 베이커 10 명 의 케이크 준비 시간 측정. 자료에 이상치 1 개 (300 분, 다른 자료는 10~40 분).
전통적 95 % CI 계산:
\[ \text{CI} = (-23, 135) \text{ 분} \]
CI 가 음수 를 포함! 케이크 굽기 시간이 음수 일 수 없음. 이 결과는 분포 가정의 위반 때문.
전통 CI 가 음수를 포함하는 이유:
- 표본이 작음 (\(n = 10\))
- 이상치 1 개가 큰 표준편차 를 만들 → CI 가 매우 넓어짐
- 정규 가정이 깨짐 (자료가 우편향)
Bootstrap 은 이 문제를 회피:
- 시뮬레이션이 원 자료에 기반 → 음수가 나올 수 없음
- 이상치의 영향 을 자연스럽게 반영
- 분포 가정 X
4.3 Bootstrap CI
같은 자료에 부트스트랩 적용:
- 10 명 자료에서 복원 10 개 추출 → 가상 표본
- 가상 표본의 평균 계산
- 1, 2 를 1000 회 반복 → 1000 개 평균의 분포
- 분포의 2.5 % ~ 97.5 % 분위수 → 95 % CI
결과: \(\text{CI} = (28, 110)\) 같은 양수만 포함. 임상적으로 의미 있음.
5 Bootstrap 의 장점
5.1 장점 1 — 분포 가정 X
자료가 어떤 분포든 작동. 정규성·등분산성·독립성 모두 약화.
5.2 장점 2 — 임의의 통계량
평균뿐 아니라 어떤 통계량 에도 적용 가능:
- 중앙값, 분위수
- 회귀 계수
- 상관 계수
- ROC AUC
- 비표준 측정값 (Gini 계수, 마진 등)
전통 방법은 특정 분포 에서 특정 통계량 의 공식 필요. 부트스트랩은 일반화.
5.3 장점 3 — 작은 표본에서 강건
작은 표본 (\(n < 30\)) 에서 CLT 약함. 부트스트랩이 더 정확.
5.4 장점 4 — Robustness Check
전통 검정 + 부트스트랩 검정 일치 → 결과 robust. 불일치 → 추가 조사.
Buisson 이 강조한 잃을 게 없다 의 정확한 의미:
- 자료가 이상적 (큰 표본, 정규) → 부트스트랩이 전통 방법보다 약간 느리고 약간 덜 정확. 그러나 결과는 거의 같음.
- 자료가 비이상적 → 부트스트랩이 훨씬 더 정확.
따라서 부트스트랩이 자료에 강건. 이상치, 비대칭, 작은 표본 어디든 적용 가능.
A/B 테스트에서: 매출 자료의 우편향 이 큰데 t 검정 사용 시 부정확 가능. 부트스트랩이 robust.
6 Bootstrap 의 단점
6.1 단점 1 — 계산 비용
\(B = 10000\) 회 시뮬레이션. 큰 자료에서 수 시간 소요 가능. 단, 현대 컴퓨팅에서는 대부분 1 분 미만.
6.2 단점 2 — 작은 표본의 한계
매우 작은 표본 (\(n = 5\)) 에서는 부트스트랩도 한계. 원 자료에 없는 정보 는 시뮬레이션 불가.
6.3 단점 3 — 의존성 자료
시계열 또는 클러스터 자료에서 단순 부트스트랩 부적절. Block bootstrap 또는 Cluster bootstrap 변형 필요.
6.4 단점 4 — 직관적 이해 어려움
전통 CI 의 닫힌 공식 에 비해 부트스트랩은 시뮬레이션 이라 비통계학자에게 설명 어려움.
7 Bootstrap 의 변형
7.1 Percentile Bootstrap
가장 단순. \(B\) 개 통계량 분포의 2.5 %, 97.5 % 분위수 를 CI 로 사용.
7.2 BCa Bootstrap (Bias-Corrected accelerated)
편향 보정 + 가속도 보정. 일반적으로 더 정확.
7.3 Bootstrap-t
전통 t 통계량의 부트스트랩 분포 사용.
7.4 Block Bootstrap
시계열 자료를 블록 단위 로 추출. 의존성 보존.
(자세한 내용은 A-BUI7-1 과 A-WOO14-2 에서 다룸)
8 비즈니스에서의 활용
Buisson 의 시각:
“학술 연구에서는 결정적 자료가 없으면 판단 보류 가능. 그러나 적용 연구 에서는 대안 행동 선택 이 필수.”
비즈니스의 의사결정 압박 이 부트스트랩의 가치를 부각:
- 임원이 결과 해석 을 요구
- 음수 매출 CI 같은 비현실적 결과 회피 필요
- 작은 표본 segment 분석에서 robust CI
9 A/B 테스트에서의 활용
9.1 시나리오 1 — 매출 자료의 우편향
매출이 lognormal 같은 강한 우편향. CLT 가 약하면 t 검정 부정확.
부트스트랩으로 매출 평균의 CI 계산. 비음수 CI 로 비즈니스 의미 확보.
9.2 시나리오 2 — Median 비교
A/B 테스트에서 중앙값 비교 (이상치에 robust). 전통 분포 공식 없음. 부트스트랩으로 직접 계산.
9.3 시나리오 3 — 작은 Segment
특정 사용자 그룹 (예: 신규 + 모바일) 의 자료 작음. 부트스트랩으로 신뢰성 있는 추론.
9.4 시나리오 4 — 비표준 메트릭
ROC AUC, Gini 계수 같은 비표준 측정. 부트스트랩이 표준 도구.
10 코드 예시 — Bootstrap CI
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
# Buisson 사례 — 베이커 10 명, 이상치 1 개
times = np.array([300, 12, 18, 25, 30, 35, 22, 28, 31, 19])
print(f"표본 평균: {times.mean():.2f}")
print(f"표본 SD: {times.std(ddof=1):.2f}")
# 전통 CI
mean = times.mean()
sd = times.std(ddof=1)
n = len(times)
ci_traditional = (mean - 1.96 * sd / np.sqrt(n),
mean + 1.96 * sd / np.sqrt(n))
print(f"\n전통 95 % CI: ({ci_traditional[0]:.2f}, {ci_traditional[1]:.2f})")
print("→ 음수 포함, 비현실적")
# Bootstrap CI (Percentile)
B = 10000
boot_means = np.array([
np.random.choice(times, size=n, replace=True).mean()
for _ in range(B)
])
ci_bootstrap = np.percentile(boot_means, [2.5, 97.5])
print(f"\nBootstrap 95 % CI (Percentile): ({ci_bootstrap[0]:.2f}, {ci_bootstrap[1]:.2f})")
print("→ 양수만, 임상적으로 의미 있음")
# Bootstrap 분포 시각화 (출력은 생략)
# fig, ax = plt.subplots(figsize=(8, 4))
# ax.hist(boot_means, bins=50, density=True, alpha=0.7)
# ax.axvline(ci_bootstrap[0], color='red', linestyle='--', label='2.5 %')
# ax.axvline(ci_bootstrap[1], color='red', linestyle='--', label='97.5 %')
# ax.set_xlabel('Bootstrap 평균')
# ax.legend()11 Bootstrap 의 역사적 발전
11.1 1979 Efron — 부트스트랩 도입
Bradley Efron 의 Bootstrap Methods: Another Look at the Jackknife (Annals of Statistics) 가 부트스트랩의 시작. 당시 Jackknife (Quenouille 1949, Tukey 1958) 의 일반화로 제안.
처음에는 수학적 호기심 으로 받아들여짐. 이론적 정당성이 Bickel & Freedman 1981, Singh 1981 의 연구로 확립.
11.2 1980 년대 — 컴퓨팅의 발전
PC 와 워크스테이션의 등장이 부트스트랩을 실용 도구 로 만듦. Efron & Tibshirani (1986) Bootstrap Methods for Standard Errors, Confidence Intervals, and Other Measures of Statistical Accuracy 가 초기 표준 참고.
11.3 1993 — Efron & Tibshirani 책
An Introduction to the Bootstrap (Chapman & Hall) 출판. 부트스트랩의 교과서 표준 정착.
11.4 2000 년대 이후 — 머신러닝과 융합
Bootstrap aggregating (bagging, Breiman 1996) → Random Forest. 부트스트랩이 예측 모형 의 핵심 도구로 확장.
11.5 2020 년대 — Big Data 시대
큰 자료의 부트스트랩 효율화: - Bag of Little Bootstraps (BLB) - Subagging - 분산 컴퓨팅 (Spark, Dask)
Bootstrap 이전 통계학은 수학적 우아함 에 집중. 닫힌 공식, 점근 이론, 정규 가정.
Bootstrap 이 패러다임을 바꿈: 시뮬레이션이 수학을 대체 가능. 컴퓨팅으로 어떤 통계량의 분포도 추정.
이 변화가 현대 통계학의 핵심. 베이즈 분석 (MCMC), 머신러닝 (cross-validation), Bootstrap 모두 시뮬레이션 기반. 21 세기 통계는 컴퓨팅이 핵심.
12 부트스트랩 vs 다른 비모수 방법
12.1 Permutation Test
A-WOO14-5 에서 자세히. 부트스트랩과 비교:
| 측면 | Bootstrap | Permutation |
|---|---|---|
| 추출 | 복원 | 비복원 (셔플) |
| 목적 | 추정 + 검정 | 검정 |
| 가정 | 표본의 모집단 대표성 | 교환 가능성 |
| 출력 | CI, SE | p 값 |
12.2 Jackknife
각 자료점을 제외 한 통계량 계산. 부트스트랩의 선구자.
def jackknife(data, statistic):
n = len(data)
return [statistic(np.delete(data, i)) for i in range(n)]부트스트랩이 더 일반적이고 정확. 그러나 BCa 의 가속도 모수 계산에 jackknife 사용.
12.3 Cross-Validation
머신러닝의 모형 평가 도구. 부트스트랩 변형:
- 0.632 bootstrap (Efron 1983)
- Out-of-bag (OOB) error (Random Forest)
부트스트랩이 training/test split 의 대안.
13 부트스트랩의 적용 사례
13.1 사례 1 — 임상 메타 분석
여러 시험의 효과 통합. 각 시험의 효과 크기 + 가중치 → 메타 분석 추정값.
부트스트랩으로 통합 효과의 CI:
import numpy as np
# 각 시험의 효과와 분산
effects = np.array([0.30, 0.25, 0.40, 0.20, 0.35])
variances = np.array([0.05, 0.04, 0.06, 0.03, 0.05])
# Random-effects 메타 분석 (간단화)
def meta_analysis(effects, variances):
weights = 1 / variances
pooled = np.sum(weights * effects) / np.sum(weights)
return pooled
# Bootstrap
B = 5000
boot_pooled = []
for _ in range(B):
idx = np.random.choice(len(effects), len(effects), replace=True)
boot_pooled.append(meta_analysis(effects[idx], variances[idx]))
ci = np.percentile(boot_pooled, [2.5, 97.5])
print(f"Pooled effect 95 % CI: ({ci[0]:.4f}, {ci[1]:.4f})")13.2 사례 2 — 머신러닝 모형 성능
from sklearn.metrics import accuracy_score
# 부트스트랩 정확도 CI
B = 1000
accuracies = []
for _ in range(B):
idx = np.random.choice(len(y_test), len(y_test), replace=True)
acc = accuracy_score(y_test[idx], y_pred[idx])
accuracies.append(acc)
ci = np.percentile(accuracies, [2.5, 97.5])
print(f"정확도 95 % CI: ({ci[0]:.4f}, {ci[1]:.4f})")13.3 사례 3 — 경제학의 임금 격차
성별 임금 격차 + 회귀 + 부트스트랩으로 격차 CI. Heckman selection model 같은 복잡 모형도 부트스트랩으로 SE 계산.
13.4 사례 4 — 유전학의 PRS (Polygenic Risk Score)
유전 위험 점수의 정확도 + 부트스트랩 CI. 매우 큰 자료 + 복잡 모형.
14 A/B 테스트의 Bootstrap 통합 분석
import numpy as np
np.random.seed(42)
n_per = 5000
# 매출 자료 (lognormal)
control_revenue = np.random.lognormal(4, 1.0, n_per)
treatment_revenue = np.random.lognormal(4.05, 1.0, n_per)
# 다양한 통계량 동시 부트스트랩
B = 5000
results = {
'mean_diff': [],
'median_diff': [],
'q90_diff': [],
'percent_above_threshold': []
}
threshold = 100 # $100 이상 매출 사용자
for _ in range(B):
c_b = np.random.choice(control_revenue, n_per, replace=True)
t_b = np.random.choice(treatment_revenue, n_per, replace=True)
results['mean_diff'].append(t_b.mean() - c_b.mean())
results['median_diff'].append(np.median(t_b) - np.median(c_b))
results['q90_diff'].append(np.quantile(t_b, 0.9) - np.quantile(c_b, 0.9))
results['percent_above_threshold'].append(
np.mean(t_b > threshold) - np.mean(c_b > threshold)
)
# 모든 통계량의 95 % CI
print("A/B 테스트 다중 통계량 95 % CI:")
for stat_name, vals in results.items():
ci = np.percentile(vals, [2.5, 97.5])
print(f" {stat_name}: ({ci[0]:.4f}, {ci[1]:.4f})")이 한 분석이 5 개 통계량의 CI 동시 계산. 부트스트랩의 일반성.
15 후속 — Bootstrap CI 자세히
다음 글들:
- A-BUI7-1 — Intro + Percentile/BCa Bootstrap CI 자세히
- A-BUI7-2 — Sample Size 권고 + 임의 통계량
- A-BUI7-3 — Regression Bootstrap + 사용 결정 트리
16 관련 주제
선행 지식
후속 주제 (Phase A)
- A-BUI7-1, 2, 3 (자세히)
- A-WOO14-1, 2 (Computer-intensive 의 부트스트랩)
다른 카테고리 연결