통계학 기초 _ 조건부 확률, 베이즈 정리
DataScience/통계-선형대수

통계학 기초 _ 조건부 확률, 베이즈 정리

728x90

◎ 조건부 확률(The Law of Conditional Probability)

  • 한 사건이 일어났다는 전제 하에서 다른 사건이 일어날 확률

전체 사각형이 모든 가능한 확률 공간이고,

A는 왼쪽 원, B는 오른쪽 원이며 그 교집합이 가운데 부분이다.

위의 식에 P(B)를 양변에 곱하면, P(A|B)P(B)=P(AB) 와 같은 식을 얻을 수 있으며,

이는 곧 P(A|B)=nP(ABn)를 의미한다.

이는, 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))


 

728x90