이항 분포
이항 분포(二項分布)는 연속된 n번의 독립적 시행에서 각 시행이 확률 p를 가질 때의 이산 확률 분포이다.
(동전의 앞면, 주사위의 눈 5...와 같이 성공/실패로 나눌 수 있는 사건에 대해서 가능)
이름에서와 같이 이항계수가 사용된다.
일반적으로, 확률변수 X가 매개변수 n과 p를 가지는 이항분포를 따른다면,
X ~ B(n,p)라고 표기한다.
분포에는 확률질량함수와 누적분포함수가 있다.
(말이 어렵게 느껴지지만, 단순히 n번 시행해서 p를 만족할 횟수에 대한 확률함수와 누적확률함수가 있다고 생각하면 된다.)
n번 시행 중에 k번 성공할 확률은 확률 질량 함수로 주어진다:
$ \Pr(X = k) = f(k;n,p)={n\choose k}p^k(1-p)^{n-k}$
이 때, k = 0, 1, 2, ..., n 이고,
${n\choose k}=\frac{n!}{k!(n-k)!}$
는 이항 계수(C(n,k) 또는 nCk라고 쓰기도 함)이다.
이 식은 다음과 같이 이해할 수 있다:
우리는 k번의 성공($p^k$)과 n − k번의 실패($(1 − p)^{n − k}$)를 원한다.
그러나, k번의 성공은 n번의 시도 중 어디서든지 발생할 수 있고, 또한 k번의 성공을 가지는 분포는 C(n, k)개가 있다.
x축은 n번의 독립적 시행 중 p를 만족한 시행의 개수이고,
y축은 그 확률이다.
예를 들어서 주사위를 10번 던져서 세 번 6이 나오고 나머지 일곱 번 다른숫자가 나올 확률이 궁금하다면,
n=10, p=1/6인 이항분포 확률질량함수를 구해서 x에 3을 대입하면 된다.
from math import factorial
def calculate_combinations(n, k):
return factorial(n) // factorial(k) // factorial(n-k)
def binom_dist(k,n,p):
return calculate_combinations(n,k) * (p**k) * ((1-p)**(n-k))
n,p = 10, (1.0/6)
print binom_dist(3,n,p)
실제로 파이썬 코드로 짜서 확인해보면 0.155045359574가 나온다. 주사위 10번 던져서 6이 세 번 나올 확률은 15.5% 라는 것.
(생각보다 많이 발생하네?.. 순서까지 예측한게 아니라 어떤 조합이든 가능함에 주의...)
import numpy
import matplotlib.pyplot as plt
from math import factorial
def calculate_combinations(n, k):
return factorial(n) // factorial(k) // factorial(n-k)
def binom_dist(k,n,p):
return calculate_combinations(n,k) * (p**k) * ((1-p)**(n-k))
n,p = 10, (1.0/6)
z = numpy.arange(0, n, 1)
sigma_fn = numpy.vectorize(lambda z:binom_dist(z, n, p))
sigma = sigma_fn(z)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(z, sigma)
ax.set_ylim([-0.1, 1])
ax.set_xlim([0,n])
ax.grid(True)
plt.show()

plot까지 해보면 위와 같다.
해석해 보자면 6이 여섯번 나오는 확률부터는 거의 0에 가깝다.
위에서는 내가 직접 이항분포 확률질량함수를 구했는데 아래처럼 라이브러리를 써서 구할수도 있다.
(scipy.stats.binom.pmf)
import numpy
import matplotlib.pyplot as plt
from math import factorial
import scipy, scipy.stats
n,p = 10, (1.0/6)
z = numpy.arange(0, n, 1)
pmf = scipy.stats.binom.pmf(z,n,p)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(z, pmf)
ax.set_ylim([-0.1, 1])
ax.set_xlim([0,n])
ax.grid(True)
plt.show()
'tistory' 카테고리의 다른 글
| 베이지안 (0) | 2026.05.25 |
|---|---|
| Makefile (0) | 2026.05.25 |
| 티스토리에 소스코드 붙여넣기(syntax higlight, Color Scripter) (0) | 2019.03.18 |
| 티스토리에서 클립보드 이미지 붙여넣기(맥, 크롬환경) (1) | 2017.11.14 |
| tistory에서 latex 쓰기 (1) | 2017.11.08 |
