{
 "cells": [
  {"cell_type":"markdown","metadata":{},"source":["# Distributions and moments\n","Move among probability mass, simulation, expectation, and approximation."]},
  {"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["import numpy as np\n","import matplotlib.pyplot as plt\n","rng = np.random.default_rng(2026)\n","x = rng.binomial(20, .3, size=10000)\n","values, counts = np.unique(x, return_counts=True)\n","plt.bar(values, counts/counts.sum(), color='#6750a4')\n","plt.xlabel('successes'); plt.ylabel('empirical probability'); plt.show()\n","print('empirical mean/variance:', x.mean(), x.var())\n","print('theoretical mean/variance:', 20*.3, 20*.3*.7)"]},
  {"cell_type":"markdown","metadata":{},"source":["## Rare-event approximation\n","Compare Binomial$(n,p)$ with Poisson$(np)$ while changing $n$ and $p$ but holding $np$ fixed."]},
  {"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["from math import comb, exp, factorial\n","n, p = 1000, .002\n","lam = n*p\n","for k in range(7):\n","    b = comb(n,k)*p**k*(1-p)**(n-k)\n","    q = exp(-lam)*lam**k/factorial(k)\n","    print(k, f'{b:.6f}', f'{q:.6f}', f'error={abs(b-q):.2e}')"]},
  {"cell_type":"markdown","metadata":{},"source":["**Challenge.** Construct two visibly different distributions with the same mean and variance. What information do the first two moments discard?"]}
 ],
 "metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3"}},
 "nbformat":4,"nbformat_minor":5
}
