TL;DR

  • 부트스트랩(bootstrap) 은 하나의 표본에서 복원추출로 유사 표본을 다수 만들어, 추정량의 표집분포(표준오차·신뢰구간)를 분포 가정 없이 근사하는 비모수 재표집법이다.
  • 핵심 아이디어는 관측된 표본을 모집단의 대용(empirical distribution) 으로 보고, 거기서 다시 표집해 “통계량이 표본마다 얼마나 흔들리는가”를 측정하는 것이다.

부트스트랩

추정량의 불확실성을 알려면 원래는 모집단에서 표본을 여러 번 새로 뽑아 통계량이 얼마나 변하는지 봐야 한다. 하지만 현실에서는 표본이 하나뿐이다. 부트스트랩은 이 한 개의 표본을 모집단의 근사로 간주하고, 같은 크기 으로 복원추출을 반복해 가짜 표본(bootstrap sample)을 다수 생성한다. 각 가짜 표본에서 통계량을 계산하면, 그 값들의 분포가 추정량의 표집분포를 근사한다.

복원추출이므로 한 가짜 표본 안에서 같은 관측치가 여러 번 뽑히거나 아예 빠질 수 있다. 이 무작위성이 “표본을 다시 뽑았다면 통계량이 어떻게 달라졌을까”를 흉내 낸다.

이 노트가 다루는 것은 관측 표본(경험분포)에서 복원추출하는 non-parametric bootstrap이다. 데이터에 특정 분포족을 적합한 뒤 그 분포에서 표본을 생성하는 parametric bootstrap도 있다.


직관

표본 10개의 평균이 라고 하자. 이 평균은 표본을 새로 뽑을 때마다 조금씩 달라질 텐데, 표본이 하나뿐이라 그 변동 폭을 직접 볼 수 없다.

부트스트랩은 이 10개에서 복원추출로 10개를 다시 뽑는 일을 수천 번 반복한다. 어떤 가짜 표본은 큰 값이 여러 번 뽑혀 평균이 높고, 어떤 표본은 낮다. 이렇게 모인 수천 개의 평균이 흩어진 정도가 곧 원래 평균의 표준오차이고, 가운데 95%를 잘라내면 신뢰구간(percentile 방식)이 된다.


절차

  1. 크기 의 원본 표본에서 복원추출로 크기 의 가짜 표본을 만든다.
  2. 가짜 표본에서 관심 통계량(평균, 중앙값, 상관계수 등)을 계산한다.
  3. 1–2를 번(보통 수천~1만) 반복해 통계량 개를 모은다.
  4. 개의 분포로 추정한다.
    • 표준오차: 부트스트랩 통계량들의 표준편차.
    • 신뢰구간: 통계량들의 백분위수(percentile) 구간, 또는 치우침을 보정한 BCa.

무엇을 주는가

부트스트랩의 산출물은 추정이다. 점추정값 하나에 머물지 않고 그 값의 불확실성을 정량화한다.

  • 표준오차(SE): 추정량이 표본에 따라 얼마나 흔들리는지.
  • 신뢰구간(CI): 추정량의 불확실성을 구간으로 표현한 것. 반복 표본추출과 같은 절차를 가정했을 때 일정 비율로 참값을 포함하도록 구성한다. percentile 방식은 부트스트랩 분포의 2.5%·97.5% 분위수를 쓰고, 편향·왜도가 크면 BCa(bias-corrected and accelerated)가 더 적절할 수 있다.
  • 편향(bias): 부트스트랩 통계량 평균과 원래 추정값의 차이로 근사한다.

중앙값·분위수·상관계수처럼 표준오차를 공식으로 구하기 어려운 통계량의 신뢰구간도 같은 절차로 얻을 수 있다.


순열 검정과의 차이

순열 검정과 부트스트랩은 둘 다 재표집(resampling)이지만 목적과 방식이 갈린다.

부트스트랩순열 검정
목적추정 (표준오차·신뢰구간)가설검정 (p-value)
재표집복원 추출비복원 재배열
표본 크기원본과 같은 을 복원추출원본 그대로, 라벨·짝만 섞음
귀무가설불필요필요 (교환가능성)
산출추정량의 표집분포·SE·CI귀무분포·p-value

한계와 주의점

작은 표본에서 불안정하다

부트스트랩은 표본을 모집단의 대용으로 쓴다. 표본이 작으면 이 대용이 모집단을 제대로 대표하지 못해, 표준오차와 신뢰구간이 부정확해진다.

매끄럽지 않은 통계량에서 실패할 수 있다

최댓값·최솟값처럼 경계에 의존하는 통계량은 복원추출에 대해 불연속적으로 움직인다. 이런 통계량에서는 단순 부트스트랩이 일관성을 잃을 수 있다.

percentile 신뢰구간은 편향에 약하다

분포가 치우치거나 왜도가 크면 단순 백분위수 구간이 참값을 잘 포함하지 못한다. BCa나 basic 방식이 편향·왜도를 보정하지만, 작은 표본 문제 자체를 푸는 만능 해법은 아니다. 부트스트랩 분포가 퇴화(degenerate)하면 BCa는 NaN을 내기도 하므로, 표본이 작거나 통계량이 불안정할 때는 percentile·BCa·basic을 함께 비교하고 데이터 맥락에 비추어 판단한다.

관측치 독립을 가정한다

시계열·군집처럼 관측치가 서로 종속이면, 무작위 복원추출이 그 의존 구조를 깨뜨린다. block bootstrap처럼 구조를 보존하는 변형이 필요하다.


구현

import numpy as np
from scipy import stats
 
data = np.array([4.1, 5.2, 3.9, 6.0, 5.5, 4.8, 5.1, 6.3, 4.4, 5.9])
 
# 1) 직접 구현
rng = np.random.default_rng(0)
B = 10_000
boot = np.array([rng.choice(data, size=len(data), replace=True).mean()
                 for _ in range(B)])
se = boot.std(ddof=1)                       # 표준오차 ≈ 0.246
ci = np.percentile(boot, [2.5, 97.5])       # 95% percentile CI ≈ [4.63, 5.60]
 
# 2) SciPy
res = stats.bootstrap(
    (data,), np.mean,
    n_resamples=10_000,
    confidence_level=0.95,
    method="percentile",        # "percentile" | "basic" | "BCa"(기본값)
    rng=0,                       # SciPy ≥1.15 (구버전은 random_state)
)
print(res.standard_error, res.confidence_interval)

scipy.stats.bootstrap은 데이터 튜플과 통계량 함수를 받아 표준오차와 신뢰구간을 돌려준다. method는 percentile·basic·BCa를 지원하고 기본값은 BCa다. 단 BCa는 편향·왜도 보정에 유리할 뿐 작은 표본을 자동으로 구제하지는 않는다(→ 한계 참조).

시드를 고정해도 RNG 종류에 따라 구간이 미세하게 갈린다. np.random.default_rng(0)과 SciPy rng=0(SciPy ≥1.15 권장)은 ≈[4.63, 5.60]으로 일치하지만, 구형 random_state=0은 레거시 RNG라 ≈[4.65, 5.60]이 나온다.


Connections

  • 순열 검정 — 같은 재표집 계열. 부트스트랩은 복원·추정, 순열은 비복원·가설검정.
  • 표준편차 — 부트스트랩이 근사하는 표준오차는 추정량의 표준편차다.
  • Pearson 상관계수 — 상관계수의 신뢰구간처럼 공식으로 구하기 까다로운 추정량의 구간을 부트스트랩으로 구할 수 있다.
  • Spearman 순위상관계수 — 순위 상관계수의 불확실성도 부트스트랩으로 정량화한다.
  • Parametric vs Non-parametric — 분포 가정을 피하는 비모수 추정에 속한다.
  • [[몬테카를로 방법]] — 무작위 재표집으로 분포를 근사하는 상위 기법.