분포

확률 통계
공개

2025년 6월 19일

Pmf를 이용한 확률

쿠키 문제

from empiricaldist import Pmf
import pandas as pd

prior = Pmf.from_seq(['Bowl 1', 'Bowl 2'])
likelihood_vanilla = [0.75, 0.5]
posterior = prior * likelihood_vanilla
posterior.normalize()
posterior
probs
Bowl 1 0.6
Bowl 2 0.4
  • 만약 같은 그릇에서 한 번 더 쿠키를 꺼냈을 때 바닐라일 경우
posterior *= likelihood_vanilla
posterior.normalize()
posterior
probs
Bowl 1 0.692308
Bowl 2 0.307692
  • 만약 같은 그릇에서 한 번 더 쿠키를 꺼냈을 때 초코쿠키일 경우
likelihood_chocolate = [0.25, 0.5]
posterior *= likelihood_chocolate
posterior.normalize()
posterior
probs
Bowl 1 0.529412
Bowl 2 0.470588

101개의 쿠키 그릇

  • 그릇 i에는 바닐라 쿠키가 i% 있다.
  • 임의의 그릇을 골라 쿠키를 임의로 꺼냈을 때, 바닐라 쿠키라면 그릇 x에서 쿠키가 나왔을 확률은 얼마일까?
import numpy as np

hypos = np.arange(101)
prior = Pmf(1, hypos)
prior.normalize()
prior
probs
0 0.009901
1 0.009901
2 0.009901
3 0.009901
4 0.009901
... ...
96 0.009901
97 0.009901
98 0.009901
99 0.009901
100 0.009901

101 rows × 1 columns

likelihood_vanilla = hypos / 100
posterior1 = prior * likelihood_vanilla
posterior1.normalize()
0.5000000000000001
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Noto Sans KR'
prior.plot(label='prior', color='C5')
posterior1.plot(label='posterior', color='C4')
plt.legend()
plt.xlabel('그릇 번호')
plt.ylabel('PMF')
plt.title('바닐라 쿠키 하나 뽑은 후')
Text(0.5, 1.0, '바닐라 쿠키 하나 뽑은 후')

  • 한 번 더 뽑았을 때 바닐라 쿠키인 경우
posterior2 = posterior1 * likelihood_vanilla
posterior2.normalize()
0.6699999999999999
posterior2.plot(label='posterior', color='C4')
plt.xlabel('그릇 번호')
plt.ylabel('PMF')
plt.title('바닐라 쿠키 두 번 뽑은 후')
Text(0.5, 1.0, '바닐라 쿠키 두 번 뽑은 후')

  • 한 번 더 뽑았는데 초코 쿠키인 경우
likelihood_chocolate = 1 - hypos / 100
posterior3 = posterior2 * likelihood_chocolate
posterior3.normalize()
0.2462686567164179
posterior3.plot(label='posterior', color='C4')
plt.xlabel('그릇 번호')
plt.ylabel('PMF')
plt.title('바닐라 쿠키 두 번 뽑고 초코 쿠키 하나 뽑은 후')
Text(0.5, 1.0, '바닐라 쿠키 두 번 뽑고 초코 쿠키 하나 뽑은 후')

posterior3.max_prob()
67
  • MAP: 사후확률 분포에서 가장 큰 확률값

주사위 문제

def update_dice(pmf, data):
  hypos = pmf.qs
  likelihood = 1 / hypos
  likelihood[data > hypos] = 0
  pmf *= likelihood
  pmf.normalize()
  • 주사위를 굴려서 1이 나왔다.
hypos = [6, 8, 12]
pmf = Pmf(1/3, hypos)
update_dice(pmf, 1)
pmf
probs
6 0.444444
8 0.333333
12 0.222222
  • 주사위를 한번 더 굴렸는데 7이 나왔다.
update_dice(pmf, 7)
pmf
probs
6 0.000000
8 0.692308
12 0.307692

연습문제

3-1

hypos = [6, 8, 12]
pmf = Pmf(1/3, hypos)
update_dice(pmf, 1)
update_dice(pmf, 3)
update_dice(pmf, 5)
update_dice(pmf, 7)
pmf
probs
6 0.000000
8 0.835052
12 0.164948

3-2

hypos = [4, 6, 8, 12, 20]
pmf = Pmf([1/15, 2/15, 3/15, 4/15, 5/15], hypos)
update_dice(pmf, 7)
pmf
probs
4 0.000000
6 0.000000
8 0.391304
12 0.347826
20 0.260870

3-3

pmf = Pmf.from_seq(['서랍 1', '서랍 2'])
likelihood = [1/2, 1/9]
posterior = pmf * likelihood
posterior.normalize()
posterior
probs
서랍 1 0.818182
서랍 2 0.181818
맨 위로