본문 바로가기

Codestates AI 부트캠프/1. Introduction to Data Sceince

[통계학] 2-2 Central Limit Theorem

참고 https://hello5555.tistory.com/19

1. 기술 통계와 추리 통계

  • 기술 통계 : 우리가 수집한 데이터를 요약, 묘샤 그리고 설명하는 통계 기법
  • 추리 통계: 수집한 데이터를 바탕으로 모집단에 대해 추론하는 통계 기법

2. numpy.random을 통해 모집단 만들어보기

 

import numpy as np
import random
import matplotlib.pyplot as plt 

np.random.seed(10) 
#여기서 seed는 '코드' 같은 것이다. 랜덤으로 값을 불러오지만, seed값을 똑같이 입력하면 같은 값이 출력된다

zero_or_one = np.random.choice([0, 1], size=5000, p=[.22, .78])
#0과 1 둘 중에 하나를 랜덤으로 뽑는다. 데이터 갯수는 5000개. 0이 나올 확률은 22%, 1이 나올 확률은 78%.
#zero_or_one은 array로 반환된다

zero_or_one.mean()   #평균
zero_or_one.var()   #분산
zero_or_one.std()   #표준편차

 

3. Bootstrapping

우리가 가진 데이터를 모집단이라고 가정한 뒤, for loop을 사용하여 표본을 무수히 많이 채취하는 것(10000번쯤..?). 이 표본들의 평균의 분포를 확인하여 모집단의 평균을 추정한다.

 

sample_of_10 = []

for _ in range(10000):
  sample = np.random.choice(zero_or_one, 10, replace=True) 
  sample_of_10.append(sample.mean())
# zero_or_one 데이터 내에서, 한 표본당 10개씩의 데이터를, 10000번 추출 
# replace=True : 데이터 내 중복 추출 가능

sample_of_10 = np.array(sample_of_10)
#bootstrapping이 끝난 후에는 데이터를 넘파이 어레이로 바꿔야 통계적 가공하기에 용이하다



4. 큰 수의 법칙

샘플의 사이즈가 커질수록 평균이 모집단의 평균에 가까워진다.

 

#이번에는 샘플 사이즈를 100으로 두어보자.

sample_of_100 = []

for _ in range(10000):
  sample = np.random.choice(zero_or_one, 100, replace=True) 
  sample_of_100.append(sample.mean())

sample_of_100 = np.array(sample_of_100)

print(zero_or_one.mean(), sample_of_10[0], sample_of_100[0])
# 0.7674 0.7 0.75

 

데이터가 100개인 샘플의 평균이 모집단 평균에 더 가깝다

 

print(zero_or_one.var(), sample_of_10.var(), sample_of_100.var())
#0.17849724 0.0179063559 0.0017827859160000007

 

표본 분포의 분산은 모집단의 분포에 샘플 사이즈로 나눈 것과 같다. 샘플이 많아질수록 분산이 작아진다.

5. 중심 극한 정리

모집단의 분포에 상관없이, 표본 평균의 분포는 정규 분포를 이룬다. 이때 유의할 점은, 샘플 사이즈 또는 샘플을 뽑는 횟수가 충분해야한다는 것이다.

 


6. 신뢰 구간 (Confidence Interval)

아무리 충분하게 표본을 뽑아 표본 분포를 만들었다해도, 우리는 모집단의 평균을 정확하게 알 수는 없다. 그렇기에 표본 분포에서 모집단의 평균이 위치할만한 구간을 짚어준다. 

"자, 모집단의 평균이 여기서부터 저기 안에 있을 확률이 95%야!" 

이 구간을 신뢰구간이라고 하며, 이 때 제공하는 확률은 90, 99% 등으로 경우에 따라 달라질 수 있다.

 

#표본 분포의 평균
sample_of_100_mean = sample_of_100.mean()
sample_of_100_mean

#왼쪽과 오른쪽 꼬리 2.5% 지점 
lower, upper = np.percentile(sample_of_100, 2.5), np.percentile(sample_of_100, 97.5) 

#그래프 그리기
plt.figure(figsize=(8,5)) 
plt.hist(sample_of_100, alpha=0.5)
plt.axvline(lower, c='red', label='95% Confidence Interval')
plt.axvline(upper, c='red')
plt.axvline(sample_of_100_mean, c='green', label='Mean')
plt.legend();

 

아래와 같이 구현된 그래프 안에서 빨간선 두개 사이에 모집단의 평균이 위치할 확률이 95%다