Numpy.random에서 볼 수 있는 확률분포 (이산 확률 분포)

류재환·2023년 3월 16일
0

1. 베르누이 분포

결과가 0이나 1 둘 중 하나인 경우, p의 확률로 1이 나오고 1-p의 확률로 0이 나온다. 이항분포의 특수한 경우로 볼 수 있다. 파라미터로는 확률 p가 있다.

예: 코인을 던져 앞면이 나오면 1 뒷면이 나오면 0인 경우는
p=0.5인 베르누이 분포

import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

X=np.random.binomial(n=1,p=0.5,size=200)
fig ,axes = plt.subplots(1,1,figsize=(12,7),dpi=150)
sns.countplot(X,color='royalblue',ax=axes)
plt.show()

이항분포의 특수한 케이스이기 때문에 코드에서도 이항분포를 의미하는 binomial 함수를 쓰는 것을 알 수 있다.

2. 이항 분포

n번의 독립적인 시행에서 각각이 p의 확률을 가지는 분포, n=1일 경우가 베르누이 분포이다. 파라미터로는 시행횟수 n, 확률 p가 있다.
예: 주사위를 10번 굴려 1번 눈이 나오는 횟수를 세는 경우는 n=10, p=1/6인 이항 분포이다.

X=np.random.binomial(n=10,p=1/6,size=1000)
fig ,axes = plt.subplots(1,1,figsize=(12,7),dpi=150)
sns.countplot(X,color='royalblue',ax=axes)
plt.show()

3. 카테고리 분포

베르누이 분포의 확장으로, 각각의 카테고리는 베르누이 분포를 따르며 각각의 확률이 존재한다. 파라미터로는 카테고리 개수 a, 각각 카테고리의 확률 p_1,...,p_a가 있다.
예: 1부터 6까지의 눈이 있는 주사위를 굴리는 경우 1부터 6까지의 6개 카테고리를 가지고 각각의 확률은 1/6가 된다.

X=np.random.choice(a=6,size=600,p=[1/6 for _ in range(6)])
fig ,axes = plt.subplots(1,1,figsize=(12,7),dpi=150)
sns.countplot(X+1,color='royalblue',ax=axes)
plt.show()

4. 다항 분포

이항분포의 일반화된 분포로 k개의 카테고리에 대해 n번의 독립적인 시행을 거쳐서 나온 횟수를 센다. 파라미터로는 시행횟수 n, 카테고리 개수 k, 각각 카테고리의 확률 p_1,...,p_k가 있다.
k=2 n=1인 다항 분포의 경우, 베르누이 분포와 동일하다.
k=2 n>1인 다항 분포의 경우, 이항 분포와 동일하다.
k>2 n=1인 다항 분포의 경우, 카테고리 분포와 동일하다.

베르누이 분포와 이항 분포 사이의 관계는 카테고리 분포와 다항 분포 사이의 관계와 동일하며 이는 아래 그래프를 통해서도 알 수 있다.
예: 주사위를 10번 굴려 각각의 눈이 나오는 횟수를 세는 경우는 n=10, k=6, p_1,...,p_6=1/6인 다항분포이다.

X=np.random.multinomial(n=10,size=1000,pvals=[1/6 for _ in range(6)])

num=X.transpose()

fig ,axes = plt.subplots(2,3,figsize=(12,7),dpi=150)
axes=axes.flatten()
colors = ["#3a57b8","#4169e1","#6e80e7","#8f98ec","#aeb1f1","#cacaf6"]
for i in range(6):
    axes[i].set_title(f"the number of {i+1}",fontweight="semibold")
    sns.countplot(num[i],color=colors[i],ax=axes[i])
plt.show()


다항 분포에서 각각의 주사위 눈금별 분포는, 2에서 확인한 이항 분포와 모습이 같다.

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

0개의 댓글