부트스트랩 :: 통계 - mindscale
Skip to content

부트스트랩

소개

부트스트래핑(Bootstrapping)은 무작위 복원 추출을 사용하여 표집 분포를 추정하는 통계적 방법입니다.

Info

"부트스트래핑"이라는 이름은 "자기 신발끈으로 자신을 끌어 올리기(pull oneself up by one's own bootstraps)"이라는 속담에서 유래했습니다.이 말은 컴퓨터의 전원을 켜는 "부팅"의 어원이기도 합니다. 왜 이런 이름이 붙었냐하면, 부트스트래핑이 데이터의 분포에 대해 가정하지 않고 통계량을 추정하는 방법이기 때문입니다.

부트스트래핑은 전통적인 통계 방법을 적용할 수 없을 때, 통계량과 그 신뢰구간을 추정할 수 있는 방법입니다. 비교적 구현이 간단하고 광범위한 데이터 유형에 적용할 수 있습니다. 그러나 계산이 많고, 표본이 매우 작거나 특정 데이터에서는 정확하지 않을 수도 있습니다.

부트스트랩 방법

먼저, 평균의 신뢰구간을 구하는 논리에 대해 생각해봅시다. 모집단에서 어떤 표본을 추출하면 그 표본은 모집단과 약간 다른 표본평균을 가질 것입니다. 이것을 무한히 반복하면, 표본평균들이 대략 어떤 분포를 가지는지 알 수 있습니다. 이 분포를 표집 분포(sampling distribution)이라 합니다. 표집 분포를 보면, 표본평균이 모평균과 어느 정도까지 멀리 떨어져서 나올 수 있는지 그 범위를 알 수 있습니다. 이 범위가 오차범위입니다. 그러면 표본평균에서 ±오차범위를 하면, 역으로 모평균이 표본평균에서 얼마나 떨어져 있을지도 추정할 수 있는데, 이것이 평균의 신뢰구간입니다.

t 검정과 같은 전통적 통계 방법은 표집 분포의 형태를 이론적으로 유도합니다. 그렇게 유도된 분포가 t 분포이기 때문에, 우리는 이것을 t 검정이라고 하죠. 부트스트랩은 이론적으로 유도를 하는 대신, 실제로 표본을 매우 많이 추출해봅니다. 그러면 표집 분포에 매우 가까운 분포를 얻을 수 있을 것입니다. 그런데 우리는 모집단을 가지고 있지 않다는 문제가 있습니다. 부트스트랩은 이를 간단히 해결하는데, 모집단 대신 우리가 가진 표본을 사용합니다. 우리가 가진 표본이 모집단과 어느 정도 비슷할 것이기 때문입니다.

부트스트랩의 실제 방법은 간단합니다. 우리가 가진 데이터에서 무작위 복원 추출을 하여, 원래 데이터와 같은 크기의 표본을 만듭니다. 원래 데이터가 n개이면, 똑같이 n개를 뽑는 것이죠. 이 표본을 부트스트랩 표본(bootstrapped sample)이라고 합니다.

Info

복원 추출(sampling with replacement)은 무작위로 뽑고, 뽑은 데이터를 다시 넣고 섞는 방법입니다. 1, 2, 3 세 개의 사례가 있는 데이터에서 부트스트랩을 하면 1, 1, 1이 나올 수도 있고 3, 3, 3이 나올 수도 있습니다. 그래서 부트스트랩 표본은 원래의 표본과 다른 표본이 됩니다.

그러면 부트스트랩 표본을 아주 많이 만들어서, 그때의 통계량들이 어느 정도 다르게 나올 수 있는지 보면 신뢰구간을 구할 수 있습니다.

실습

중고차 데이터에서 중간값의 95% 신뢰구간을 부트스트랩으로 구해봅시다.

import numpy as np
import scipy as sp

sp.stats.bootstrap(
    [df.price],
    np.median,
    n_resamples=10000,
    confidence_level=0.95)
b = boot::boot(
    df$price,
    function(x, i){ median(x[i]) },
    R = 10000)
boot::boot.ci(b, conf = 0.95)

Question

평균의 신뢰구간을 t 분포를 이용해서 구한 경우와 부트스트랩으로 구한 경우를 비교해보세요.