◎ 조건부 확률(The Law of Conditional Probability)
- 한 사건이 일어났다는 전제 하에서 다른 사건이 일어날 확률
전체 사각형이 모든 가능한 확률 공간이고,
A는 왼쪽 원, B는 오른쪽 원이며 그 교집합이 가운데 부분이다.
위의 식에 P(B)를 양변에 곱하면, P(A|B)P(B)=P(A∩B) 와 같은 식을 얻을 수 있으며,
이는 곧 P(A|B)=∑nP(A∩Bn)를 의미한다.
이는, B라는 정보가 주어진 상황에서 A의 확률은 B와 교집합들의 합으로 구성 되어 있다는 것을 이해 할 수 있다.
◎ 베이즈 정리
우선 베이즈 정리의 공식부터 확인해보도록 하자. 베이즈 정리의 공식은 아래 식과 같다.
- 사전확률은 내가 알고있는 지식으로부터 얻어진 특정 사건의 확률
- 사후확률은 특정 사건이 일어났을 때, 어떤 원인때문이다 라고 생각되는 확률
베이즈 정리의 대표적인 수식은 다음과 같다.
위 수식은 두 가지 사건이 존재할때 성립하고, 그보다 더 많은 사건이 존재할 때는 다음과 같이 표현할 수 있다.
식 에는 총 네 개의 확률값이 적혀져 있으며, 생김새도 거의 비슷비슷해 그냥 보기에는 의미를 파악하기가 어렵다.
네 개의 확률 값 중 P(H)와 P(H|E)는 각각 사전 확률, 사후 확률이라고 부르고, 베이즈 정리는 근본적으로 사전확률과 사후확률 사이의 관계를 나타내는 정리이다.
- 예시
- 약물 양성반응 예시 계산
다시 한번 정리하자면, 베이지안에서의 P(A|B)는 B라는 추가 정보를 바탕으로 한 A의 확률입니다.
- TPR : True Positive Rate (= 민감도, true accept rate) 1인 케이스에 대해 1로 잘 예측한 비율.(암환자를 암이라고 진단 함)
- FPR : False Positive Rate (= 1-특이도, false accept rate) 0인 케이스에 대해 1로 잘못 예측한 비율.(암환자가 아닌데 암이라고 진단 함)
이전 계산의 사후확률을 새로운 계산의 사전확률로 사용한다
[1차검증]
# 베이지안 계산을 위해서는 4개의 변수가 필요합니다.
p_pos_used = 0.99 # True positive rate (TPR, Sensitivity)
p_used = 0.005 # prior probability
p_pos_not_used = 0.01 # False positive rate (FPR)
p_not_used = 1 - p_used # 1 - p_used
numerator = p_pos_used * p_used
denominator = (p_pos_used * p_used) + (p_pos_not_used * p_not_used)
posterior_probability = numerator / denominator
posterior_probability
<출력>
0.33221476510067116
[2차검증]
p_pos_used = 0.99 # TPR
# 1차검증 결과를 2차검증에 사용
p_used = 0.332 # prior probability
p_pos_not_used = 0.01 # FPR
p_not_used = 1 - p_used # 1 - p_used
numerator = p_pos_used * p_used
denominator = (p_pos_used * p_used) + (p_pos_not_used * p_not_used)
posterior_probability = numerator / denominator
posterior_probability
<출력>
0.980081106870229
- 동전 던지기 예시 with 베이지안
처음 가정 = 동전을 던졌을때 앞면이 나올 확률은 0부터 1까지 고르게 분포해있다. (사전 정보 없음)
동전을 여러번 던지면서 해당 정보를 반영하고,
이를 통해 동전을 던졌을때 앞면이 나올 확률을 점점 추정하는 과정
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from IPython.core.pylabtools import figsize
figsize(15, 9)
dist = stats.beta
n_trials = [0, 1, 2, 3, 4, 5, 8, 15, 50, 300, 500, 1000]
data = stats.bernoulli.rvs(0.5, size = n_trials[-1]) # binomial with p(h) = 0.5
x = np.linspace(0, 1, 100)
for k, N in enumerate(n_trials):
sx = plt.subplot(len(n_trials) / 2, 2, k+1)
plt.xlabel("P(H)", fontsize = 13) if k in [0, len(n_trials) - 1] else None
plt.setp(sx.get_yticklabels(), visible = False)
heads = data[:N].sum()
y = dist.pdf(x, 1 + heads, 1 + N - heads)
plt.plot(x, y, label = 'Trial %d \n Head %d Times' % (N, heads))
plt.fill_between(x, 0, y, color = '#348abd', alpha = .4)
plt.vlines(0.5, 0, 4, color = 'k', linestyles = '--', lw = 1)
leg = plt.legend()
leg.get_frame().set_alpha(0.4)
plt.autoscale(tight = True)
plt.suptitle('Bayesian Update (Probability of Head)', y = 1.02, fontsize = 14)
plt.tight_layout()
- Bayesian 기반 신뢰구간 추정 (SciPy 사용)
# https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bayes_mvs.html#scipy.stats.bayes_mvs
mean_CI, _, _ = stats.bayes_mvs(coinflips, alpha = .95) # mean , variance, std
# mean_cntr, var_cntr, std_cntr
mean_CI
# 윗 결과와 유사함
<출력>
Mean(statistic=0.35, minmax=(0.12097224312031751, 0.5790277568796824))