베르누이 시행과 이항 분포

2020. 7. 20. 23:52데이터 분석 기본

반응형

[베르누이 시행]

실험을 통해 얻을 수 있는 결과가 두 가지만 있다고 생각해보겠습니다. 예를 들어 동전을 던지는 실험을 했을 때 우리가 얻을 수 있는 결과는 앞면(H)와 뒷면(T) 두 가지 뿐입니다. 예와 같이 두 가지의 결과만 반복해서 나오며, 아래와 같은 조건을 만족하는 경우 이를 베르누이 시행이라고 부릅니다.

1) 각 시행은 성공(S), 실패(F)의 두 결과만을 갖는다(우리가 흔히 사용하는 성공의, 실패의 의미와는 무관, 결과가 두 개 뿐임을 강조)

2) 각 시행에서 성공할 확률 P(S)=p, 실패활 확률 P(F)=q(=1-p)로 그 값이 일정함

3) 각 시행은 서로 독립으로 각 시행의 결과가 다른 시행의 결과에 영향을 미치지 않음

[이항분포(Binomial distribution)]

위와 같은 조건을 만족하는 베르누이 시행을 반복할 때에 일어나는 성공의 횟수를 X라고 하면 X는 확률변수가 됩니다. 이 때 확률변수 X가 따라는 확률분포를 모수가 (n,p)인 이항분포라고 하며, X ~ B(n,p)로 표현하게 됩니다.

이항분포의 모수와 확률변수 X는 아래와 같이 정의 됩니다.

n: 베르누이 시행의 반복 횟수

p: 각 시행에서의 성공확률

X: n번의 시행 중에서 성공의 횟수

만약 확률변수 X가 B(n,p)를 따르면, 성공횟수가 x일 때 확률함수는 아래와 같이 정의 됩니다.

성공횟수가 x일 때 순서에 상관없이 성공횟수가 x이기만 하면 되기 때문에 성공횟수가 x회가 될 수 있는 조합의 경우의 수를 곱해주게 됩니다.

예를 들어 휘어진 동전이 있다고 가정해보겠습니다. 해당 동전은 앞면이 나올 확률이 0.7, 뒷면이 나올 확률이 0.3입니다. 그렇다면 동전을 10번 던져 앞면이 7번 나올 확률은 아래와 같습니다.

10번 던져 7번 앞면이 나올 확률은 약 26.7%정도입니다.

Python으로 간단히 베르누이 시행을 시뮬레이션 해보도록하겠습니다.

## 필요 Moule Import
from scipy.stats import bernoulli
import matplotlib.pyplot as plt

## scipy 모듈을 활용한 이항분포 시뮬레이션
data_bern = bernoulli.rvs(size=1000, p=0.7)(베르누이 1000번 시행, 성공할 확률 0.7)

## 시뮬레이션 결과 성공/실패 횟수 저장
s=len(data_bern[data_bern==1])
f=len(data_bern[data_bern==0])

## 시뮬레이션 결과 시각화

fail_or_sucess = [0, 1]
plt.bar(fail_or_sucess, height = [f/(s+f),s/(s+f)])
plt.xlim(-1, 2)
plt.xticks([0, 1], ["x=0", "x=1"])
plt.xlabel("Simulation Sample")
plt.ylabel("x")
plt.title("Simulation Result")
plt.show()

추가적으로, 이항분포를 시뮬레이션 해보겠습니다.

##  필요 Module 생성
from scipy.stats import binom
from collections import Counter
import pandas as pd
import matplotlib.pyplot as plt

data_binom = binom(n=1000, p=0.7) ## 시행횟수와 성공확률로 이항분포 생성
sample_binom=data_binom.rvs(1000) ## 생성된 분포 기반 1000개의 Sample 생성

## Counter 함수를 활용하여 성공횟수(x)별 횟수 도출 및 데이터 프레임 변환
count = Counter(sample_binom)
count_data = pd.DataFrame.from_dict(count, orient="index").reset_index()
count_data =count_data.rename(columns={"index":"number", 0:"count"})

## 시각화
plt.bar(count_data["number"], count_data["count"])
plt.xlabel("number of success")
plt.ylabel("x")
plt.title("Simulation Result")
plt.show()

Code 참조:

https://www.datacamp.com/community/tutorials/probability-distributions-python

https://datascienceschool.net/view-notebook/5e2ee247518f47a6ba2d0894b33c73a3/

반응형