Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기
수학의 재미/확률분포

중심극한정리: 평범한 것들은 정규분포이다.

by hustler78 2022. 6. 11.
728x90
반응형

 

 

이번글에서는 중심극한 정리를 소개합니다. 

저번글에서는 [0,1] 구간에서 uniform random 변수를 생성하는 여러 가지 방법을 알아봤는데, 사실  정규분포를 따르는 난수를 발생하는 데에 궁극적인 목적이 있습니다. 그 과정에서 알아두는 좋을 것이 바로 중심극한정리입니다.

 

어떤 n개의 확률변수(또는 샘플) X1,X2,,Xn 있고, 이것들이 다 동일한 분포를 따르고 서로 독립이라 합시다(이것을 iid, independent and identically distributed, 독립 항등 분포라고 다양하게 부릅니다.)

Xi 각각의 평균은 μ, 분산을 σ2이라 합시다.  이들의 표본 평균 ˉX

ˉX=X1+X2++Xnn=1nni=1Xi

라 하면

중심극한정리(CLT, Central Limit Theorem)
n이 무한정 커질 때,
ˉXN(μ,σ2n)

라는 것입니다. N은 정규분포를 뜻합니다.

 

이 정리의 key point는 바로 정규분포를 따른다는 데 있습니다. 왜냐면 무작정 ˉX의 평균과 분산을 구해보면

E(ˉX)=1nni=1E(Xi)=1nni=1μ=μ

이고

V(ˉX)=1n2ni=1V(Xi)=1n2ni=1σ2=σ2n

입니다. 

 

이렇게 평균, 분산은 구하기가 쉽습니다. 그런데 이게 정규분포를 따른다는 것이 획기적인 거죠.  예제를 보겠습니다.


1. 동전 던기지

동전 아니져 코인 맞습니다

1. 동전의 앞면을 0, 뒷면을 1이라 하고 몇 번 던져봅니다. 그래서 나온 sample(표본)들을 평균합니다. 이것이 표본 평균이죠.

2. 이 표본 평균들을 아주 많이 구합니다. 이 구한 것들을 히스토그램을 그려서 분포를 살펴봅니다.

3. 중심 극한 정리에 따르면, 1번에서 표본의 개수가 많을수록(수식(1)의 n) 정규분포로 가겠죠, 이게 맞는지 2번 그래프에서 살펴보는 겁니다.

 

먼저 python code를 보시죠.

 

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

def clt_coinTest():
    coin_face = [0, 1]
    nAct = 20
    nSimulation = 5000
    data =[]
    for i in range(nSimulation):
        res = np.random.choice(coin_face, size=nAct)
        res_avr = np.average(res)
        data.append(res_avr)
    plt.hist(data, bins=20)
    plt.show()

if __name__ == '__main__':
    clt_coinTest()

 

    nAct = 20

이 부분은 표본 평균을 만들 샘플의 갯수입니다. 일단 n=20이라 하죠.

    nSimulation = 5000

표본평균을 5000개 만드는 변수입니다

        res = np.random.choice(coin_face, size=nAct)
        res_avr = np.average(res)
        data.append(res_avr)

- 개수(size)가 nAct 개인 난수 배열을 만듭니다. coin_face 가 [0,1] 두 원소로 이루어진 list형 data이고 이 중에서 radom choice 해서 res라는 변수에 쌓는 것입니다.

- res에 쌓인 데이터들을 average 합니다. 그럼 결과적으로 res_avr이 표본 평균이 됩니다.

- 이 표본 평균을 data라는 변수에 쌓습니다.

 

    plt.hist(data, bins=20)

계급의 개수가 20개인 histogram을 만듭니다.

 

n=20일 때, 히스토그램

뭔가 정규분포스럽지만.. 처참한 결과이지요. 아예 데이터가 없는 이빨 빠진 구간도 보입니다. 정규분포라고 하기엔 무리가 있습니다. n을 크게 키워볼까요?

 

n=1000일 때 히스토그램

알이 속속들이 차있는 약간의 대칭형 모양이 나옵니다. n을 더 키워보겠습니다.

n=10만일 때 히스토그램

비로소 대칭형 모양이 나오는 듯합니다. 여기서 중요한 사실은 히스토그램이 그려지는 x축의 range를 보시죠.

n=20일 때는 0.1~0.8,  n=1000일 때는 0.44~0.56 , n=100,000일 때는 0.495~0.595 사이로 좁아지게 되죠? 중심 극한 원리 때문입니다.

동전 던졌을 때 나오는 면이 0,1 인  확률변수 X의 확률은 각각 12입니다. 즉,

X 0 1
p 12 12

입니다. X의 평균과 분산을 각각 구해보면

E(X)=12,V(X)=E(X2)(E(X))2=114=34

입니다.

따라서 표본평균 ˉX의 평균과 분산은 각각

E(ˉX)=12,V(ˉX)=34n

이 됩니다. 따라서 n이 커질수록, 분산이 0으로 가게 되어  히스토그램처럼 range가 줄어들게 되는 것이죠.

주사위도 던져볼까요?

 

2. 주사위 던지기

임성훈 화백의 카툰 [주사위는 던져졌다], 카이사르의 운명은?

동전과 달리 주사위는 6개의 면이 있습니다. 

python code는 다음과 같습니다. 동전 던지기 code와 거의 비슷합니다.

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

def clt_diceTest():
    dice_face = [1, 2, 3, 4, 5, 6]
    nAct = 100000
    nSimulation = 5000
    data =[]
    for i in range(nSimulation):
        res = np.random.choice(dice_face, size=nAct)
        res_avr = np.average(res)
        data.append(res_avr)
    plt.hist(data, bins=20)
    plt.show()

if __name__ == '__main__':
    clt_diceTest()

결과를 볼까요? 표본 평균이 10만 인 상황입니다.

n=100,000인 히스토그램

물론 이것도 n이 작으면 처참한 그림이 나오죠

n=5일 때, 벌서는 사람 같네요.

 

위의 예제에서 보았듯이 표본 평균의 분포는 표본이 많아질수록 정규분포 모양을 띄게 됩니다. 위의 동전, 주사위 예제는 아주 간단한 관찰이었고, 다음 글에서는 정말 제대로 된 정규분포 모양을 얻기 위해 uniform random변수들을 이용해 볼 생각입니다.

임성훈 화백의 카툰 [주사위는 던져졌다]

 

728x90
반응형

댓글