중심 극한 정리(Central Limit Theorem, CLT)

중심 극한 정리가 뭐지?

확률론과 통계학에서, 중심 극한 정리(中心 極限 定理, 영어: central limit theorem, 약자 CLT)는 동일한 확률분포를 가진 독립 확률 변수 n개의 평균의 분포는 n이 적당히 크다면 정규분포에 가까워진다는 정리이다.
- 위키백과

중심 극한 정리란 어떤 모집단 하나로부터 표본 집단을 여러 개 가져온 후 이들의 평균을 구해놓고서 분포를 보니 가져온 갯수가 많으면 많을수록 정규 분포와 비슷해지더라, 하는 내용이다.

중심 극한 정리는 모집단이 어떻게 생겼는지에 상관 없이 적용된다.
즉, 표본의 분포가 원래 무엇이었는지에 상관 없이 표본 평균이 정규 분포를 따르므로 이를 통해 신뢰 구간을 만들거나 T-Test, ANOVA 등의 시행이 가능하다.

표본을 한 번 가져올 때는 보통 30개 이상을 가져온다.


중심 극한 정리는 어떻게 하는거지?

모집단으로부터 가져올 표본 집단의 갯수와 한 집단에 들어갈 표본의 갯수를 정한다. 그리고 각 표본 집단의 평균값을 구한 후 이들의 분포가 어떻게 생겼는지 본다.

<예시 - 중심 극한 정리 구현>

import pandas as pd  

def  clt(data, num):
    sample_means = []
    for x in  range(0, num):
        sample = np.random.choice(data, 30) # 표본 갯수 30개씩 가져오기
        sample_means.append(sample.mean()) # 표본 집단의 평균값 저장

    pd.DataFrame(sample_means).hist(color = '#4000c7');

<예시 - 이항분포>

import numpy as np
import matplotlib.pyplot as plt  

n, p = 1, 0.5
bino = np.random.binomial(n, p, 100)  

plt.hist(bino)
plt.show()

clt(bino, 100) # 표본 집단을 100개 가져온 경우
clt(bino, 1000) # 표본 집단을 1000개 가져온 경우


<예시 - 지수 분포>

expo = np.random.exponential(1, 1000)

plt.hist(expo)
plt.show()

clt(expo, 100)
clt(expo, 1000)


<예시 - 포아송 분포>

poi = np.random.poisson(5, 1000)  

plt.hist(poi)
plt.show()

clt(poi, 100)
clt(poi, 1000)


위 예시들을 통해 알 수 있듯이, 모집단이 어떻게 생겼든 표본 평균의 분포는 정규 분포와 비슷해진다.
또한 표본 평균의 갯수가 많을 수록 정규 분포에 보다 가까워진다.

<참고 자료>
중심 극한 정리 - 위키백과
[개념 통계 17] 중심극한 정리는 무엇이고 왜 중요한가?
중심극한정리에 대한 오해, 많으면 무조건 정규분포 OK???
[파이썬 데이터 사이언스] 중심극한정리(CLT, central limit theorem) 시뮬레이션

[확률과 통계] 파이썬으로 이항 분포 그리기
[확률과 통계] 파이썬으로 지수 분포 그리기
[Python NumPy] 무작위 표본 추출, 난수 만들기 (random sampling, random number generation)
numpy.random.choice
numpy.random.binomial
numpy.random.exponential
numpy.random.poisson

 

'Statistics > Confidence Interval' 카테고리의 다른 글

[Stats] 신뢰 구간(Confidence Interval)  (0) 2021.10.17

신뢰 구간(Confidence Intervals)

신뢰 구간이 뭐지?

통계학에서 신뢰 구간(信賴區間, 영어: confidence interval)은 모수가 어느 범위 안에 있는지를 확률적으로 보여주는 방법이다.
신뢰 구간은 보통 표본에서 산출된 통계와 함께 제공된다. 예를 들어, "신뢰수준 95%에서 투표자의 35% ~ 45%가 A후보를 지지하고 있다."라고 할 때 95%는 신뢰수준이고 35% ~ 45%는 신뢰구간이며 θ는 A후보의 지지율이다.
- 위키백과

신뢰 구간을 쉽게 표현하자면 무언가에 대해서 말할 때 그 무언가의 일부를 보고서 "이 정도면 어지간해선 들어맞겠지" 할 만한 범위이다.

위 예에서는 A 후보의 지지율 신뢰 구간이 35% ~ 45%라고 하는데, 이는 투표 마친 사람들한테 설문조사한 결과를 토대로 실제 A 후보의 지지율 결과가 35% ~ 45% 사이에 있을 거라고 보는 것이다.
그리고 신뢰수준 95%의 의미는 이 말이 진짜로 맞을 확률이 95% 라는 것이다.


신뢰 구간은 어떻게 구하는거지?

아래는 표본 평균을 이용하여 모평균이 들어와 있을 만한 구간, 즉 '신뢰 구간'을 구하는 과정과 이를 Python으로 표현한 것이다.

신뢰 구간은 표본 평균을 기준으로 좌우로 2 × 표준 오차(Standard Error of Mean, SEM)$^1$ 만큼 더하고 뺀 범위이다(신뢰 수준 95% 기준$^2$).

import numpy as np
from scipy import stats  

def  confidence_interval(data, confidence = 0.95):
    """
    주어진 데이터의 표본 평균에 대한 신뢰구간을 계산.
    기본 값으로 t-분포와 양방향 (two-tailed), 95%의 신뢰도를 사용합니다.

    입력 값 :
    data - 여러 개로 이루어진 (list 혹은 numpy 배열) 표본 관측치
    confidence - 신뢰구간을 위한 신뢰도

    반환 되는 값:
    (평균, 하한, 상한구간)으로 이루어진 tuple
    """

    data = np.array(data)
    mean = np.mean(data)
    n = len(data)

    # Standard Error of Mean (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.sem.html)
    stderr = stats.sem(data)

    # length_of_one_interval
    interval = stderr * stats.t.ppf( (1 + confidence) / 2 , n-1) # ppf : inverse of cdf

    return (mean, mean - interval, mean + interval)

    # cdf -> t 를 넣으면 %
    # ppf -> % 를 넣으면 t

    # 1 + 0.95 / 2 -> 0.975
    # (1 - 0.95) / 2 -> 0.025
np.random.seed(123)  

data = np.random.normal(50, 10, 1000)  
sample = np.random.choice(data, 10)  

confidence_interval(sample)

(44.28501220284126, 37.93312500671013, 50.63689939897239)

# 다른 방법
from scipy.stats import t

# 표본의 크기
n = len(sample)
# 자유도
dof = n-1
# 평균의 평균
mean = np.mean(sample)
# 표본의 표준편차
sample_std = np.std(sample, ddof = 1)
# 표준 오차
std_err = sample_std / n ** 0.5 # sample_std / sqrt(n)

CI = t.interval(.95, dof, loc = mean, scale = std_err) # https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.t.html
print("95% 신뢰구간: ", CI)

95% 신뢰구간: (37.93312500671013, 50.63689939897239)


*1 : 표준 오차란 표본 평균의 표준 편차이며, 구하는 방법은 아래와 같다. $$SEM=\frac{σ}{√n}$$ 여기서 $σ$는 모집단의 표준편차이고 $n$은 표본의 크기이다.
*2 신뢰 수준에 따라 표준 오차에 몇을 곱해주는지가 달라진다. 참고 : Z-Score in Statistics

 

<참고 자료>
신뢰 구간 - 위키백과
신뢰 구간의 의미 - 공돌이의 수학정리노트
신뢰구간 (Confidence Interval) - BioinformaticsAndMe
표준 점수 - 위키백과
scipy.stats.sem - Standard Error of Mean, SEM
scipy.stats.t
Compute a confidence interval from sample data - Stack Overflow

+ Recent posts