Python/Numpy

[Numpy] 파이썬 이항분포 표본 추출, 정규분포 근사 시각화 예제

jimmy_AI 2022. 3. 2. 20:49
반응형

np.random.binomial 함수 사용법과 중심 극한 정리 예시

파이썬 넘파이 라이브러리에서 이항분포를 따르는 표본을 추출하고,

반복 시행 표본의 결과가 정규분포와 가까워지는 것을 시각화해보는 예시를 살펴보겠습니다.

 

 

넘파이 이항분포 표본 추출 방법

이항분포의 특징은 동전 던지기 혹은 강화 성공/실패 등의 상황을 생각하시면 이해가 쉽습니다.

 

20번 동전 던지기에서 앞면이 나오는 횟수를 샘플링한다고 가정해보겠습니다.

이 경우 횟수 n = 20, 성공률 p = 0.5 입니다.

 

파이썬 이항분포는 np.random.binomial 함수로 표본 추출이 가능합니다.

추출을 원하는 n, p 조건 값과 시행할 횟수인 size를 순서대로 input으로 넣어주시면 됩니다.

import numpy as np

n = 20
p = 0.5

np.random.binomial(n, p, size = 10)
# array([10, 12,  7, 10, 14, 10, 12, 11, 12, 10])

동전 20회를 던지는 1세트의 시행을 총 10세트 수행한 결과의 예시입니다.

(output = 각 세트에서 나온 앞면의 횟수)

 

 

참고로, size는 2차원 이상의 array 형태로도 지정이 가능합니다.

이번에는 n과 p 조건을 다르게 해보겠습니다.

n = 100
p = 0.6

np.random.binomial(n, p, size = (3, 3))
'''
array([[60, 66, 63],
       [56, 64, 68],
       [53, 50, 60]])'''

각 세트 당 성공률 60%의 시행을 100번 수행한 결과,

성공 횟수가 60회 근처에서 머무르고 있음을 확인할 수 있었습니다.

반응형

이항분포 추출 결과 정규분포 근사 시각화

중심 극한 정리에 의하여, 시행 횟수가 충분한 경우(np와 np(1-p)가 모두 5이상 정도)에는

이항분포의 결과가 평균은 np, 분산은 np(1-p)를 따르는 정규분포와 비슷해집니다.

 

이에 대한 결과를 파이썬 히스토그램 시각화를 통해서 살펴보는 예제를 다루어보겠습니다.

 

동전 200회를 던져 앞면이 나온 횟수를 세는 과정을 1세트로 가정한 예시입니다.

import matplotlib.pyplot as plt

n = 200 # 동전 던지기 횟수
p = 0.5 # 앞면 확률
size = 500 # 세트 반복 횟수

binom_sample = np.random.binomial(n, p, size)
normal_sample = n * p + np.sqrt(n * p * (1-p)) * np.random.randn(size) # 정규분포 샘플

# 히스토그램 시각화
plt.hist(binom_sample, color = 'blue', alpha = 0.3, bins = 25, label = 'binomial')
plt.hist(normal_sample, color = 'orange', alpha = 0.4, bins = 25, label = 'normal')
plt.legend()
plt.show()

먼저, 500세트를 반복한 결과를 히스토그램을 나열한 예시입니다.

평균이 100회 근처에 있는 것으로 보이기는 하나,

아직은 분산이 커서 정규분포의 샘플 결과와는 다소 차이가 있어보입니다.

 

 

이번에는 윗 코드에서 size = 10000으로 바꾸어 10000세트를 시행한 결과를 보겠습니다.

이항분포와 정규분포 샘플링의 결과가 거의 일치한 모습을 확인할 수 있었습니다.