코딩과 업무스킬

파이썬 Random 모듈 라이브러리 난수 생성으로 데이터 시뮬레이션 해보기

궁금한물고기 2021. 7. 22. 16:48
반응형

통계 지식을 이용해서 확률분포의 파라미터(parameter)를 추정했으면 시뮬레이션을 통해 그 결과가 우리가 추정한 분포를 따르는지 확인해봐야 하는 상황이 발생한다. 이럴때 파이썬의 Random모듈 라이브러리를 사용하면 쉽게 시뮬레이션에 필요한 난수 생성이 가능하다.

 

랜덤으로 요소를 선택해주는 파이썬 모듈

랜덤으로 리스트의 요소를 선택할 수 있는 대표적인 모듈로는 random.choice(), random.sample(), random.shuffle 등이 있다. 각각이 어떻게 다른지는 아래 설명으로 정리한다.

random.choice()

무작위로 리스트의 요소를 반환한다. 중복선택이 가능하기 때문에 sampling with replacement 상황에서 사용한다. 아래 코드는 파란공 2개, 빨간공 3개가 들어있는 리스트에서 무작위로 10000만번 공을 뽑았을 때 파란공이 뽑힐 확율을 확인하는 코드이다. 당연히 무작위로 공을 뽑는 횟수가 증가할수록 확률은 0.4에 가까워질것이다.

bead = ['blue'] * 2 + ['red']*3

from random import choices
import numpy as np
    
B = 10000
events =[]
for i in range(B):
    events.extend(choices(bead,k=1))

print(dict((x,events.count(x)) for x in set(events)))

np.mean([y == 'blue' for y in events])

random.sample()

무작위로 리스트의 요소를 반환한다. 하지만 중복선택이 아니기 때문에 sampling without replacement 상황에서 사용한다. 5개의 구슬이 든 리스트에서 5개의 요소를 선택할 때 sample의 경우 choice와 다르게 중복선택이 허용되지 않기 때문에 결과에 파란구슬과 빨간구슬은 항상 각 2,3개씩 선택되는 것을 확인할 수 있다. 

bead = ['blue'] * 2 + ['red']*3

from random import sample
from random import choices

print('choice, with replacement')
for i in range(10):
    print(choices(bead,k=5))
print('sample, without replacement')
for i in range(10):
    print(sample(bead,k=5))

랜덤변수를 생성하는 파이썬 numpy 모듈

파이썬 모듈을 이용해서 특정 확률분포의 랜덤변수를 매우 손쉽게 생성해낼수도 있다. 이때는 numpy라이브러리의 random 모듈을 사용해준다. numpy.random.normal(), numpy.random.binomial(), numpy.random.uniform() 등 우리가 아는 확률분포의 랜덤변수를 모두 생성할 수 있다.

 

numpy.random.normal()

아래 예제에서는 numpy random 모듈로 정규분포의 랜덤변수 10000개를 만들어내고 이를 히스토그램으로 표현하여 데이터가 실제로 정규분포에 가까운지 확인해보았다. 실제로 정규분포와 거의 유사한 것을 확인할 수 있다.

import numpy as np
import matplotlib.pyplot as plt

S = np.random.normal(0,0.1,10000)
plt.hist(S, bins= 100)
plt.show()

 

numpy.random.binomial()

아래 예제에서는 이항분포의 랜덤변수 50개를 만들어내고 이를 히스토그램으로 표현했다. 정규분포의 그래프와는 확연하게 다른 그래프를 확인할 수 있다.

import numpy as np
import matplotlib.pyplot as plt

S = np.random.binomial(20, 0.5 , 50)
plt.hist(S, bins =10)
plt.show()

 

 

반응형