{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d6994968",
   "metadata": {},
   "source": [
    "# 贝叶斯风险评估\n",
    "\n",
    "对应案例: [贝叶斯风险](/docs/case-studies/risk/bayesian-risk-case/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9caba7dd",
   "metadata": {},
   "source": [
    "## 1. 贝叶斯更新"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e50cf324",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np, matplotlib.pyplot as plt\n",
    "from scipy import stats\n",
    "np.random.seed(42)\n",
    "# Prior: Beta(2,10) - 认为风险概率约为 2/12 ≈ 17%\n",
    "prior_a,prior_b=2,10\n",
    "# Observe data: 3 failures in 100 trials\n",
    "failures,trials=3,100\n",
    "# Posterior: Beta(prior_a+failures, prior_b+trials-failures)\n",
    "post_a,post_b=prior_a+failures,prior_b+trials-failures\n",
    "x=np.linspace(0,0.5,500)\n",
    "prior=stats.beta.pdf(x,prior_a,prior_b)\n",
    "post=stats.beta.pdf(x,post_a,post_b)\n",
    "likelihood=stats.binom.pmf(failures,trials,x)\n",
    "plt.figure(figsize=(10,6))\n",
    "plt.plot(x,prior,label=f'Prior Beta({prior_a},{prior_b})',color='gray',ls='--')\n",
    "plt.plot(x,likelihood/likelihood.max(),label=f'Likelihood ({failures}/{trials})',color='#FF9800')\n",
    "plt.plot(x,post,label=f'Posterior Beta({post_a},{post_b})',color='#2196F3',lw=2)\n",
    "plt.axvline(prior_a/(prior_a+prior_b),color='gray',ls=':')\n",
    "plt.axvline((post_a)/(post_a+post_b),color='#2196F3',ls=':')\n",
    "plt.legend(); plt.xlabel('Failure probability'); plt.title('Bayesian Risk Update')\n",
    "plt.show()\n",
    "print(f'Prior mean: {prior_a/(prior_a+prior_b):.3f}')\n",
    "print(f'Posterior mean: {post_a/(post_a+post_b):.3f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d346a54e",
   "metadata": {},
   "source": [
    "## 2. 风险区间估计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bc21897c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 95% credible interval\n",
    "lower=stats.beta.ppf(0.025,post_a,post_b)\n",
    "upper=stats.beta.ppf(0.975,post_a,post_b)\n",
    "p_above_10pct=1-stats.beta.cdf(0.1,post_a,post_b)\n",
    "print(f'95% CI: [{lower:.3f}, {upper:.3f}]')\n",
    "print(f'P(failure > 10%): {p_above_10pct:.1%}')\n",
    "# Multiple observations\n",
    "observations=[(0,10),(1,20),(2,50),(3,100)]\n",
    "plt.figure(figsize=(10,6))\n",
    "for i,(f,n) in enumerate(observations):\n",
    "    a,b=prior_a+f,prior_b+n-f\n",
    "    plt.plot(x,stats.beta.pdf(x,a,b),label=f'{f}/{n}')\n",
    "plt.axvline(0.1,color='red',ls='--',label='10% threshold')\n",
    "plt.legend(); plt.xlabel('Failure probability')\n",
    "plt.title('Risk Belief Evolution'); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4d9f058",
   "metadata": {},
   "source": [
    "## 3. 决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8b918108",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Expected loss: if we act, cost=$100K; if we don't and it fails, cost=$1M\n",
    "act_cost=100000; fail_cost=1000000\n",
    "x=np.linspace(0,0.5,500)\n",
    "expected_loss_act=act_cost  # constant\n",
    "expected_loss_not_act=fail_cost*x\n",
    "# Posterior expected loss\n",
    "post_prob=stats.beta.pdf(x,post_a,post_b)\n",
    "post_prob/=post_prob.sum()\n",
    "exp_act=act_cost\n",
    "exp_not=sum(expected_loss_not_act*post_prob)/sum(post_prob)\n",
    "print(f'Expected loss (Act): ${exp_act:,.0f}')\n",
    "print(f'Expected loss (Not act): ${exp_not:,.0f}')\n",
    "print(f'Decision: {\"ACT\" if exp_act<exp_not else \"DON'T ACT\"}')\n",
    "threshold=act_cost/fail_cost\n",
    "print(f'Break-even probability: {threshold:.1%}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b7ba88a",
   "metadata": {},
   "source": [
    "---\n",
    "*更多分析见 [案例文档](/docs/case-studies/risk/bayesian-risk-case/)*"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
