언빌리버블티

[통계] Python 모수를 추정하는 방법(Bootstrap) 본문

Statistics/Python

[통계] Python 모수를 추정하는 방법(Bootstrap)

나는 정은 2022. 10. 11. 14:10

멋쟁이 사자처럼 17일차
Special Lecture : 통계학 특강 정리✨

부트스트랩이란? (모델링 bootstrap 아님!)

  • 모수의 분포를 신뢰구간으로 추정하는 아주 파워풀한 방법으로 정규분포를 따른다는 가정을 필요로 하지 않는다.
    • 모집단에 대해서 분포의 정보를 알 수 없을 경 사용한다.
      • 원래는 신뢰구간을 구하려면 웬만큼 큰 표본(n > 30) 이 필요
  • 현재의 표본에서 추가적으로 표본을 복원 추출한 뒤 각 표본에 대한 통계량을 다시 계산한다.
    • 수십만의 데이터로 구성된 모집단으로부터 1000개의 표본을 사용할 때, 1000개로만 통ㄱㅖ량을 계산하는 것이 아닌, 1000개 내에서 추가적으로 중복을 허용하는 표본을 새로 뽑아 새로운 표본을 만들어 사용하는 구조이다.

부트스트랩의 절차

1) n개의 표본에서 중복을 허용하는 m개의 표본을 뽑는다.
2) 추출된 표본 m들의 평균을 구한다.
3) 이 과정을 k번 반복하여 신뢰구간을 구한다

 

 

부트스트랩에 관한 이게 무슨 소리인가 하는 이야기

뜬금없지만, 이번엔 부트스트랩을 다뤄볼까 합니다. 아무래도 신뢰구간으로 추정을 하니까 지금이 아니면 얘기하기 어려울 것 같아서 말이죠. 부트스트랩은 이름이 참 거창하긴 

recipesds.tistory.com

" 부트스트랩은 일단 "적은" 데이터에 관련된 용어 "

표본을 가지고 그 표본 안에서 또 표본추출을 하는 방법

예를 들면, 추출한 표본이 150개 있다고 가정하고 그 안에서 복원 추출로 50개의 표본을 꺼내서 이것의 평균을 구하고, 이런 평균을 구하는 짓을 100번 반복해서 평균을 구하는 방법이라고 생각하면 된다.

 

위 포스트를 참고하여 부트스트랩의 과정을 Python 코드로 옮겨보았다.

 

파이썬으로 계산하는 부트스트랩 (연습)

  • 타이타닉 데이터 셋을 통해 생존자와 사망자의 평균 나이가 차이가 있는지를 추정
  • 먼저 모수를 모른다고 가정 후 , 30개의 Sample을 통해서만 부트스트래핑
    • 여기서 30개 크기 표본에 대한 평균을 100개를 만든다.
      • 각 표본의 차이를 구해 95% 신뢰구간을 만든다.
Pseudo-Code

나이 차이를 모을 리스트 선언

Bootstrap을 100번 반복:
  30개씩 복원 추출
  생존한 사람의 나이 평균 계산
  사망한 사람의 나이 평균 계산
  두개의 차이를 계산한 뒤 나이 차이 리스트에 추가. 
  
모평균 추정 95% 신뢰구간을 구하기 위해 
하위 2.5%, 상위 2.5%에 대한 값을 계산해서 신뢰구간을 구한다.
# 라이브러리 및 데이터셋 로드
import pandas as pd
import numpy as np
import seaborn as sns

df = sns.load_dataset("titanic")
df.head()
# 나이와 생존여부 칼럼
df_bstrp = df[['age','alive']]
# 30개 샘플 추출 
df_bstrp = df_bstrp.sample(30, random_state = 42)
 

 

# Bootstrap 계산 

iteration_loop = 100
lst_diffAge = []

for _ in range(iteration_loop):
    bootStrapSample = df_bstrp.sample(30, replace=True) # 하나씩 다시 뽑아 복원 추출
    NoSurvivedAgeMean = bootStrapSample[bootStrapSample['alive'] == 'no']['age'].mean() #생존자 평균 나이  
    SurvivedAgeMean = bootStrapSample[bootStrapSample['alive'] == 'yes']['age'].mean() # 사망자 평균 나이 
    lst_diffAge.append(NoSurvivedAgeMean - SurvivedAgeMean) # 사망자 평균나이 - 생존자 평균나이 모음 
 
# 신뢰수준 95% 신뢰구간
np.percentile(lst_diffAge, 2.5), np.percentile(lst_diffAge, 97.5)
(7.197916666666669, 24.25079166666666) # 사망자 나이 평균 - 생존자 나이 평균 
 
  • 두 평균 차이에 대한 신뢰구간 값이 양수이므로 사망자 나이 평균이 생존자보다 더 많았다 라고 생각해볼 수 있다.

++)

실제 평균의 차이를 구해 모수가 신뢰구간 안에 포함되는지를 알아보자.

df[df['alive'] == 'no'].age.mean() - df[df['alive'] == 'yes'].age.mean()
8.382281934683753

위에 구했던 신뢰구간에 모수가 포함된다는 것을 알 수 있었다 !

import pingouin as pg
from scipy import stats

pg.ttest(df[df['alive'] == 'no'].age , df[df['alive'] == 'yes'].age, confidence=0.95)
 
  • 원래 데이터 셋의 사망자 평균과 생존자 평균에 대한 차이가 있는지에 대한 t -test 수행
    • p-value 값이 두 평균은 차이가 있다고 볼 수 있다

 


Reference

 

부트스트랩에 관한 이게 무슨 소리인가 하는 이야기

뜬금없지만, 이번엔 부트스트랩을 다뤄볼까 합니다. 아무래도 신뢰구간으로 추정을 하니까 지금이 아니면 얘기하기 어려울 것 같아서 말이죠. 부트스트랩은 이름이 참 거창하긴 

recipesds.tistory.com

 

신뢰구간과 통계적 유의성과의 관계

1. 신뢰구간과 통계가설검정은 밀접한 관련을 갖는다. 신뢰구간과 통계가설검정은 같은 가정과 수학적 논리...

blog.naver.com

 

DATA - 12. 부트스트랩(Bootstrap)

부트스트랩(Bootstrap) 모수의 분포를 추정하는 파워풀한 방법은 현재 있는 표본에서 추가적으로 표본을 복원 추출하고 각 표본에 대한 통계량을 다시 계산하는 것입니다. 이러한 절차를 부트스트

bkshin.tistory.com

 

Comments