Numpy.random에서 볼 수 있는 확률분포 (연속 확률 분포)

류재환·2023년 3월 22일
0
post-thumbnail

1. 정규 분포

정규 분포 또는 가우스 분포는 연속 확률 분포 중 하나로, 다음과 같은 확률 밀도 함수를 가진다.

1σ2πexp((xμ)22σ2)\frac{1}{\sigma\sqrt{2\pi}}exp(-\frac{(x-\mu)^2}{2\sigma^2})

매개변수로는 평균 μ\mu, 분산 σ2\sigma^2가 있다.
통계학과 여러 자연 과학 분야에서 중요한 역할을 하며, 잘 모르는 분포를 근사할 경우 많이 사용하는 분포이다.
중심 극한 정리로 인해 근사되는 분포이기도 하다.

mean, std = 3. , 1.
var = std*std
s = np.random.normal(mean, std, 2000)
fig, axe = plt.subplots(1,1,figsize=(12,7),dpi=150)

count, bins, ignored = axe.hist(s, 100, density=True)

biny = np.exp(-(np.power(bins-mean,2))/(2*var))/(np.sqrt(2*np.pi*var))

axe.plot(bins,biny,color='r')

plt.show()

+중심 극한 정리

동일한 확률 분포를 가진 n개의 샘플의 평균의 분포는 n이 충분히 클 경우 정규분포에 가까워진다.

import numpy as np
from matplotlib import pyplot as plt

X=[]
for i in range(2000):
    X.append(np.random.binomial(n=10,p=1/6,size=200).mean())
fig ,axe = plt.subplots(1,1,figsize=(12,7),dpi=150)

count, bins, ignored = axe.hist(X, 50, color='royalblue',density=True)
mean, var = 10*1/6, 10*1/6*5/6*1/200
biny = np.exp(-(np.power(bins-mean,2))/(2*var))/(np.sqrt(2*np.pi*var))

axe.plot(bins,biny,color='r')
plt.show()

코드를 통해 이항 분포의 샘플 200개의 평균을 2000번 추출하여 분포를 확인해 보면, 빨간선으로 표현한 정규 분포와 상당히 근사한 것을 확인 할 수 있다.

2. 로그 정규 분포

로그 정규 분포는 로그를 취한 값이 정규 분포를 따르는 분포이다.

mean, std = 3. , 1.
var = std*std
fig, axes = plt.subplots(1,2,figsize=(12,5),dpi=150)
s = np.random.lognormal(mean, std, 1000)
count, bins, ignored = axes[0].hist(s, 100, density=True, color='royalblue')
count, bins, ignored = axes[1].hist(np.log(s), 100, density=True, color='royalblue')
biny = np.exp(-(np.power(bins-mean,2))/(2*var))/(np.sqrt(2*np.pi*var))
axes[1].plot(bins,biny,color='r')
plt.show()

왼쪽은 로그 정규 분포를 그대로, 오른쪽은 로그 정규 분포에 log를 취한 값을 나타내였다.
사진에서 로그 정규 분포에 log를 취한 값이 정규 분포를 따른다는 것을 보여준다.

3. 지수 분포

일정 시간동안 일어나는 사건의 분포가 푸아송 분포를 따른다면, 사건 사이의 간격의 분포는 지수 분포를 따른다.
파리미터는 빈도 λ\lambda가 있으며 다음과 같은 확률 밀도 함수를 가진다.

λeλx(x>0)\lambda e^{-\lambda x} \quad (x>0)
rate = 1
fig, axe = plt.subplots(1,1,figsize=(12,5),dpi=150)
s = np.random.exponential(rate, 1000)
count, bins, ignored = axe.hist(s, 100, density=True, color='royalblue')

biny = rate * np.exp(-rate*bins)

axe.plot(bins,biny,color='r')

plt.show()

profile
비전공자의 개발자 도전기

0개의 댓글