부트스트래핑
부트스트래핑이 필요한 이유
- 평균과 달리 중간값, 최빈값 등의 통계량은 오차범위를 이론적으로 유도하기 어려운 경우가 있음
- 표본이 충분히 크고 모집단을 어느 정도 대표한다면 부트스트래핑(Bootstrapping)으로 통계량의 신뢰구간을 추정할 수 있음
- 부트스트래핑은 현재 표본에서 새로운 표본을 반복적으로 재표집하여 통계량의 분포를 경험적으로 만드는 시뮬레이션 기법
부트스트랩 재표집의 원리
- 크기가 n인 원래 표본에서 같은 크기 n의 부트스트랩 표본을 복원추출함
- 복원추출이므로 하나의 관측값이 여러 번 뽑히거나 한 번도 뽑히지 않을 수 있음
- 각 부트스트랩 표본에서 관심 통계량을 계산함
- 이 과정을 여러 번 반복해 부트스트랩 통계량의 분포를 만듦
- 이 분포를 이용해 표준오차나 신뢰구간을 추정함
부트스트래핑의 전제와 한계
- 원래 표본이 모집단을 어느 정도 대표해야 재표집 과정도 모집단 표집 과정을 비슷하게 흉내 낼 수 있음
- 편향된 표본에서 반복해서 재표집해도 원래 표본의 편향이 자동으로 사라지지는 않음
n_resamples를 늘리면 시뮬레이션 결과는 더 안정적이 되지만 원래 표본의 관측값이 늘어나는 것은 아님- 반복 횟수가 늘어날수록 계산 시간도 증가함
중간값의 95% 신뢰구간 계산
실습 파일 불러오기
import pandas as pd
df_ship = pd.read_excel("ship.xlsx")
scipy.stats.bootstrap으로 속도 중간값의 신뢰구간 계산
import numpy as np
import scipy as sp
df_ship["speed"].median()
# 18.35
rng = np.random.default_rng(1234)
median_result = sp.stats.bootstrap(
[df_ship.speed], # 재표집할 데이터
np.median, # 각 표본에서 계산할 통계량
n_resamples=10000, # 재표집 반복 횟수
confidence_level=0.95, # 신뢰수준
rng=rng, # 재현성을 위한 난수 생성기
)
median_result.confidence_interval
- 결과는
ConfidenceInterval(low=하한, high=상한)형태로 출력 - 실습 노트북에서는 속도 중간값이 18.35, 95% 신뢰구간이 약
[17.25, 18.90]으로 계산됨 - 난수 생성기를 전달하지 않거나 다른 시드를 사용하면 결과가 조금씩 달라질 수 있음
- 같은 데이터에서 신뢰수준을 높이면 일반적으로 부트스트랩 신뢰구간도 넓어짐
평균의 신뢰구간 비교
부트스트래핑은 중간값뿐 아니라 평균에도 적용 가능
rng = np.random.default_rng(1234)
mean_result = sp.stats.bootstrap(
[df_ship.speed],
np.mean,
n_resamples=10000,
confidence_level=0.95,
rng=rng,
)
mean_result.confidence_interval
- 실습 노트북에서 부트스트래핑으로 구한 평균의 95% 신뢰구간은 약
[17.539, 19.071] - 이론에 기초한 평균의 95% 신뢰구간
[17.53, 19.09]와 거의 일치함 - 같은 자료와 통계량에도 신뢰구간을 구하는 방법에 따라 끝값은 조금 달라질 수 있음
퀴즈
부트스트래핑을 사용하는 상황으로 가장 적절한 것은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.