다운로드
작성자: admin 작성일시: 2016-05-22 20:19:31 조회수: 4157 다운로드: 341
카테고리: 기초 수학 태그목록:

이항 분포

성공확률이 $\mu$ 인 베르누이 시도를 $N$번 반복하는 경우를 생각해 보자. 가장 운이 좋을 때에는 $N$번 모두 성공할 것이고 가장 운이 나쁜 경우에는 한 번도 성공하지 못할 겻이다. $N$번 중 성공한 횟수를 확률변수 $X$ 라고 한다면 $X$의 값은 0 부터 $N$ 까지의 정수 중 하나가 될 것이다.

이러한 확률변수를 이항 분포(binomial distribution)를 따르는 확률변수라고 하며 다음과 같이 표시한다.

$$ X \sim \text{Bin}(x;N,\mu) $$

이항 분포 확률변수 $X$의 확률질량함수를 구해보자. 우선 베르누이 확률 분포를 따르는 확률변수 $Y$를 가정한다.

$$ Y \sim \text{Bern}(y;\mu) $$

이 확률변수의 $N$개의 표본을 $y_1, y_2, \cdots, y_N$라고 하자. 이 값은 모두 0(실패) 아니면 1(성공) 이라는 값을 가지기 때문에 $N$번 중 성공한 횟수는 $N$개의 표본 값의 합(sum)이다.

$$ x = \sum_{i=1}^N y_i $$

베르누이 분포를 따르는 확률변수 $Y$의 확률질량함수를 대입하여 정리하면 이항 분포 확률변수 $X$의 확률질량함수는 다음과 같아진다.

$$ \text{Bin}(x;N,\mu) = \binom N x \mu^x(1-\mu)^{N-x} $$

이 식에서 $\binom N x$ 기호는 조합(combination)이라는 기호로 $N$개의 원소 중에 $x$개의 원소를 순서와 상관없이 선택할 수 있는 경우의 수를 뜻한다. 조합은 다음 공식으로 계산할 수 있다.

$$ \binom N x =\dfrac{N!}{x!(N-x)!} $$

$!$ 기호는 팩토리얼(factorial)이라고 하며 다음처럼 정의한다.

$$ N! = N\cdot (N-1) \cdots 2 \cdot 1 $$

SciPy를 사용한 이항 분포의 시뮬레이션

이항 분포 확률변수는 Scipy의 stats 서브 패키지에 binom 클래스로 구현되어 있다. n 인수로 전체 시도 횟수 $N$를 넣고 p 인수로 베르누이 확률 분포의 기댓값 $\mu$를 넣는다.

In [1]:
N = 10
mu = 0.6
rv = sp.stats.binom(N, mu)

확률질량함수는 다음과 같다.

In [2]:
xx = np.arange(N + 1)
plt.bar(xx, rv.pmf(xx), align="center")
plt.xlabel("표본값")
plt.ylabel("$P(x)$")
plt.title("이항 분포의 pmf")
plt.show()

rvs 메서드로 시뮬레이션을 한 결과는 다음과 같다.

In [3]:
np.random.seed(0)
x = rv.rvs(100)
x
Out:
array([ 6,  5,  6,  6,  6,  5,  6,  4,  3,  6,  5,  6,  6,  4,  8,  8,  9,
        5,  5,  4,  3,  5,  6,  5,  8,  5,  8,  4,  6,  6,  7,  5,  6,  6,
        9,  6,  6,  6,  4,  5,  7,  6,  5,  8,  5,  5,  7,  8,  7,  7,  6,
        6,  2,  8,  7,  8,  5,  7,  6,  7,  8,  8,  5,  8,  7,  7,  5,  8,
        4,  8,  3,  6,  3,  6,  5,  9,  7,  8,  7,  8,  7,  6,  8,  5,  6,
        7,  6,  8,  6,  4,  7,  5,  8,  5,  7,  7,  6,  9,  5, 10])
In [4]:
sns.countplot(x)
plt.title("이항 분포의 시뮬레이션 결과")
plt.xlabel("표본값")
plt.show()

이론적인 확률분포와 표본의 확률분포를 같이 나타내려면 다음과 같은 코드를 사용한다.

In [5]:
y = np.bincount(x, minlength=N+1)/float(len(x))
df = pd.DataFrame({"이론": rv.pmf(xx), "시뮬레이션": y}).stack()
df = df.reset_index()
df.columns = ["표본값", "유형", "비율"]
df.pivot("표본값", "유형", "비율")
df
Out:
표본값 유형 비율
0 0 이론 0.000105
1 0 시뮬레이션 0.000000
2 1 이론 0.001573
3 1 시뮬레이션 0.000000
4 2 이론 0.010617
5 2 시뮬레이션 0.010000
6 3 이론 0.042467
7 3 시뮬레이션 0.040000
8 4 이론 0.111477
9 4 시뮬레이션 0.070000
10 5 이론 0.200658
11 5 시뮬레이션 0.210000
12 6 이론 0.250823
13 6 시뮬레이션 0.270000
14 7 이론 0.214991
15 7 시뮬레이션 0.170000
16 8 이론 0.120932
17 8 시뮬레이션 0.180000
18 9 이론 0.040311
19 9 시뮬레이션 0.040000
20 10 이론 0.006047
21 10 시뮬레이션 0.010000
In [6]:
sns.barplot(x="표본값", y="비율", hue="유형", data=df)
plt.title("이항 분포의 이론적 분포와 시뮬레이션 분포")
plt.show()

이항 분포의 모멘트

이항 분포의 기댓값과 분산은 각각 다음과 같다.

기댓값

$$ \text{E}[X] = N\mu $$

(증명)

$$ \text{E}[X] = \text{E} \left[ \sum_{i=1}^N Y_i \right] = \sum_{i=1}^N \text{E}[ Y_i ] = N\mu $$

여기에서 $Y_i$는 서로 독립인 베르누이 분포이다.

분산

$$ \text{Var}[X] = N\mu(1-\mu)$$

(증명)

$$ \text{Var}[X] = \text{Var} \left[ \sum_{i=1}^N Y_i \right] = \sum_{i=1}^N \text{Var}[ Y_i ] = N\mu(1-\mu)$$

연습 문제 8.2.4

이항 확률분포의 모수가 다음과 같을 경우에 각각 표본을 생성한 후 기댓값과 분산을 구하고 앞의 예제와 같이 확률밀도함수와 비교한 바 플롯을 그린다.

표본의 갯수가 10개인 경우와 1000개인 경우에 대해 각각 위의 계산을 한다.

  1. $\mu = 0.5$, $N=5$
  2. $\mu = 0.9$, $N=20$

질문/덧글

bincount할 때 moon*** 2016년 10월 14일 3:47 오후

y = np.bincount(x, minlength=N)/float(len(x))

에서 minlength=N+1 이 되어야 모든 표본(샘플 중 누락된 것을 포함한)에 대해

bincount를 할 수 있지 않나요?

답변: bincount할 때 관리자 2016년 10월 14일 6:35 오후

원래 코드(minlength=N)가 맞습니다.

답변: 답변: bincount할 때 관리자 2017년 2월 14일 12:35 오후

죄송합니다. 제가 잘못 알았습니다. 수정하였습니다.