from scipy.stats import gammaimport numpy as npfrom empiricaldist import Pmfimport matplotlib.pyplot as pltplt.rcParams['font.family'] ='Noto Sans KR'alpha =1.4qs = np.linspace(0, 10, 101)ps = gamma.pdf(qs, alpha)prior = Pmf(ps, qs)prior.normalize()
9.889360237140306
def expo_pdf(t, lam):return lam * np.exp(-lam * t)t1 =11/90likelihood1 = expo_pdf(t1, prior.qs)post1 = prior * likelihood1post1.normalize()# 지수분포에서 모든 시행은 독립적t2 =12/90likelihood2 = expo_pdf(t2, post1.qs)post2 = post1 * likelihood2post2.normalize()prior.plot(label="사전분포", alpha=0.7)post1.plot(label="1골 득점 후 사후분포", alpha=0.7)post2.plot(label="2골 득점 후 사후분포", alpha=0.7)plt.xlabel("λ (게임당 골 수)")plt.ylabel("확률밀도")plt.title("독일의 골 득점률 분포")plt.legend()plt.show()
from scipy.stats import poissonimport pandas as pdimport numpy as npdef make_poisson_pmf(lam, qs): ps = poisson.pmf(qs, lam) pmf = Pmf(ps, qs) pmf.normalize()return pmfdef make_mixture(pmf, pmf_seq): df = pd.DataFrame(pmf_seq).fillna(0).transpose() df *= np.array(pmf) total = df.sum(axis=1)return Pmf(total)remaining_time = (90-23) /90goals = np.arange(15)pmf_seq = [make_poisson_pmf(lam * remaining_time, goals) for lam in post2.qs]pred = make_mixture(post2, pmf_seq)print(f"예상 골 수: {sum(pred.qs[i] * pred.ps[i] for i inrange(len(pred.qs))):.2f}골")# 표준편차 수동 계산mean_val =sum(pred.qs[i] * pred.ps[i] for i inrange(len(pred.qs)))variance =sum((pred.qs[i] - mean_val)**2* pred.ps[i] for i inrange(len(pred.qs)))std_val = variance**0.5print(f"표준편차: {std_val:.2f}골")# 5골 이상 득점할 확률 계산prob_5_or_more =1-sum(pred.ps[i] for i inrange(min(5, len(pred.ps))))print(f"\n5골 이상 득점할 확률: {prob_5_or_more:.4f} ({prob_5_or_more*100:.2f}%)")pred.plot(color='red', alpha=0.7)plt.axvline(5, color='orange', linestyle='--', alpha=0.8, label='5골')try:# 수동으로 평균 계산 mean_goals =sum(pred.qs[i] * pred.ps[i] for i inrange(len(pred.qs))) plt.axvline(mean_goals, color='blue', linestyle='--', alpha=0.8, label=f'평균 ({mean_goals:.2f}골)')except:print("평균 계산 중 오류 발생")plt.xlabel("골 수")plt.ylabel("확률")plt.title("남은 시간 동안의 예상 골 수 분포")plt.legend()plt.show()
예상 골 수: 2.01골
표준편차: 1.78골
5골 이상 득점할 확률: 0.0939 (9.39%)
8-2
def update_goal(prior, data): posterior = prior.copy()for goals in data: likelihood = [poisson.pmf(goals, lam) for lam in posterior.qs] posterior = posterior * likelihood posterior.normalize()return posterior