pbj0812의 코딩 일기

[통계학] spicy 패키지를 이용한 동전 던지기(베이지안) 본문

Science/통계학

[통계학] spicy 패키지를 이용한 동전 던지기(베이지안)

pbj0812 2020. 8. 31. 01:58

0. 목표

 - scipy 패키지를 이용한 동전 던지기

1. 실습

 1) library 호출

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from IPython.core.pylabtools import figsize
from matplotlib import rc
import scipy.stats as stats

 2) 함수 제작

  - stats.beta : 베타분포 객체 생성(링크)

  - stats.bernoulli.rvs(0.5, size = inp[-1]) : 베르누이 시뮬레이션(확률 0.5로 계산, inp[-1]로 지정한 것은 리스트(숫자가 커지는 형태)로 받아서 돌릴때 가장 마지막 값(가장 긴 값)을 근거해서 그림을 그릴 것이기 때문)

  - dist.pdf(x, 1 + heads, 1+ N - heads) : 각 x에 대한 확률밀도를 계산

  - plt.fill_between : 차트 내부 채우기

def coin(inp):
    dist = stats.beta
    len_inp = len(inp)
    data = stats.bernoulli.rvs(0.5, size = inp[-1])
    x = np.linspace(0, 1, 100)
    
    size_y = 5 * len_inp
    fig = plt.figure()
    fig.set_size_inches(15, size_y)
    rc('font', family='AppleGothic')
    
    for k, N in enumerate(inp):
        sx = fig.add_subplot(len_inp, 1, k+1)
        plt.xlabel("$p$, 앞면의 확률", fontsize = 13)
        plt.setp(sx.get_yticklabels(), visible=False) # ylabel 생략
        heads = data[:N].sum()
        y = dist.pdf(x, 1 + heads, 1 + N - heads)
        plt.plot(x, y, label = "%d 번의 동전 던지기, \n앞면 %d 번 관측" % (N, heads))
        plt.fill_between(x, 0, y, color = "#348ABD", alpha = 0.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("사후확률의 베이지안 업데이트", y=1.02, fontsize = 14)
    plt.tight_layout()

 2. 결과

n_trials = [0, 1, 2, 3, 4, 5,8, 15, 50, 500]
coin(n_trials)

3. 참고

 - matplotlib 차트 내부 채우기

 - scipy.stats.beta

 - rv.rvs

 - 베타분포

 - pdf

 - 코드원본

 - 프로그래머를 위한 베이지안 with 파이썬(캐머런 데이비슨 필론)

 

Comments