{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8b4a2231",
   "metadata": {},
   "source": [
    "# Probability Models\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fe760cc2-6988-4403-b166-d3266457a732",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:56.403472Z",
     "iopub.status.busy": "2026-10-19T20:54:56.403249Z",
     "iopub.status.idle": "2026-10-19T20:54:57.613233Z",
     "shell.execute_reply": "2026-10-19T20:54:57.611895Z"
    },
    "tags": [
     "hide-input",
     "thebe-init",
     "runnable"
    ]
   },
   "outputs": [],
   "source": [
    "### headers\n",
    "import numpy as np\n",
    "from numpy import random\n",
    "\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93e28bd4",
   "metadata": {},
   "source": [
    "```{contents}\n",
    ":local:\n",
    ":depth: 2\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d233e8e",
   "metadata": {},
   "source": [
    "This section introduces probability language and the table structure used to describe data. We start with a **probability model** for a business process: the possible outcomes, their chances, and what we can compute from them. Then we turn to observed data and separate the population or process we care about from the sample we observe, and identify variables, observations, and distributions.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8fa4dee",
   "metadata": {},
   "source": [
    "## Probability Models\n",
    "\n",
    "A **probability model** (or *chance model*) describes a random process by listing every possible **outcome** and the **probability** of each. The list of all possible outcomes is the **sample space**.\n",
    "\n",
    "Consider an online store that ships orders. When a shipment goes out, the store does not know whether it will arrive on time. From past experience, the operations team uses this model for one shipment:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "de7f056b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.615340Z",
     "iopub.status.busy": "2026-10-19T20:54:57.615072Z",
     "iopub.status.idle": "2026-10-19T20:54:57.626576Z",
     "shell.execute_reply": "2026-10-19T20:54:57.625272Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>outcome</th>\n",
       "      <th>probability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>on time</td>\n",
       "      <td>0.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1 day late</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3+ days late</td>\n",
       "      <td>0.05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        outcome  probability\n",
       "0       on time         0.80\n",
       "1    1 day late         0.15\n",
       "2  3+ days late         0.05"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shipping = pd.DataFrame({\n",
    "    'outcome': ['on time', '1 day late', '3+ days late'],\n",
    "    'probability': [0.80, 0.15, 0.05],\n",
    "})\n",
    "shipping\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a56b1f2d",
   "metadata": {},
   "source": [
    "Every probability model follows two rules:\n",
    "\n",
    "1. Each probability is between 0 (impossible) and 1 (certain).\n",
    "2. The probabilities of all the outcomes in the sample space add up to 1, because exactly one of them must happen.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a3f30171",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.628349Z",
     "iopub.status.busy": "2026-10-19T20:54:57.628167Z",
     "iopub.status.idle": "2026-10-19T20:54:57.633246Z",
     "shell.execute_reply": "2026-10-19T20:54:57.632214Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.0)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shipping['probability'].sum()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6e445f2",
   "metadata": {},
   "source": [
    "### Events and Complements\n",
    "\n",
    "An **event** is a set of outcomes we care about. The event \"the shipment is late\" contains two outcomes, `1 day late` and `3+ days late`, so its probability is the sum of their probabilities.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7215e442",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.634925Z",
     "iopub.status.busy": "2026-10-19T20:54:57.634761Z",
     "iopub.status.idle": "2026-10-19T20:54:57.640871Z",
     "shell.execute_reply": "2026-10-19T20:54:57.639618Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.2)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "late = shipping['outcome'] != 'on time'\n",
    "p_late = shipping.loc[late, 'probability'].sum()\n",
    "p_late\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "961ddde3",
   "metadata": {},
   "source": [
    "The **complement** of an event is \"the event does not happen.\" Because the probabilities add up to 1, the probability of the complement is 1 minus the probability of the event:\n",
    "\n",
    "$$P(\\text{not late}) = 1 - P(\\text{late})$$\n",
    "\n",
    "The complement is often the easier way to compute a probability: \"at least one day late\" is everything except \"on time.\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "34bcf622",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.642583Z",
     "iopub.status.busy": "2026-10-19T20:54:57.642406Z",
     "iopub.status.idle": "2026-10-19T20:54:57.647605Z",
     "shell.execute_reply": "2026-10-19T20:54:57.646392Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.8)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p_not_late = 1 - p_late\n",
    "p_not_late\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c604beb",
   "metadata": {},
   "source": [
    "### Expected Value\n",
    "\n",
    "Managers usually care about a number attached to each outcome, such as a cost. Suppose the store gives a \\$5 credit when a shipment is 1 day late and a \\$20 credit when it is 3 or more days late. The credit is a **random variable**: a numeric quantity whose value depends on chance.\n",
    "\n",
    "The **expected value** of a random variable is the sum of each value times its probability:\n",
    "\n",
    "$$E(\\text{credit}) = 0 \\times 0.80 + 5 \\times 0.15 + 20 \\times 0.05$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b0f858be",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.649429Z",
     "iopub.status.busy": "2026-10-19T20:54:57.649257Z",
     "iopub.status.idle": "2026-10-19T20:54:57.655622Z",
     "shell.execute_reply": "2026-10-19T20:54:57.654434Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.75)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shipping['credit'] = [0, 5, 20]\n",
    "expected_credit = (shipping['credit'] * shipping['probability']).sum()\n",
    "expected_credit\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67d2b504",
   "metadata": {},
   "source": [
    "The expected credit is \\$1.75 per shipment. No single shipment costs \\$1.75: each costs \\$0, \\$5, or \\$20. The expected value is the **long-run average** over many shipments. If the store ships 10,000 orders a month, it should budget about \\$17,500 a month for late-delivery credits.\n",
    "\n",
    "Delivery credits like this are real. {numref}`temu-delivery-guarantee` shows Temu's delivery guarantee: a \\$5.00 credit for a delay, a refund if tracking does not update for 15 days, and a refund if the package does not arrive within 20 days. Each promise attaches a dollar amount to an outcome, so the retailer can budget for the whole guarantee with the same expected-value calculation.\n",
    "\n",
    "```{figure} ../../figures/temu-delivery-guarantee.png\n",
    ":width: 320px\n",
    ":name: temu-delivery-guarantee\n",
    ":alt: Temu order screen showing a $5 delay credit and a \"Package may be lost\" notice\n",
    ":align: center\n",
    "\n",
    "Temu's delivery guarantee for a package that may be lost\n",
    "```\n",
    "\n",
    "Customers have to think about the outcomes too. In this [Reddit thread](https://www.reddit.com/r/TemuThings/comments/1u2nct9/do_i_still_get_the_5_delay_credit_if_i_hit_refund/), a shopper asks whether they still get the \\$5 delay credit if they request a refund. That question is about which outcomes the credit is attached to, which is exactly what a probability model has to spell out.\n",
    "\n",
    "### From Model to Data\n",
    "\n",
    "A probability model describes the process; data are what we actually observe. We can connect the two with a **simulation**: use the model to generate many shipments and look at what happens. `rng.choice` draws outcomes at random with the model's probabilities.\n",
    "\n",
    "You met `choice()` in Chapter 3. Here we use the modern form, which takes three parts:\n",
    "\n",
    "- `rng = np.random.default_rng(8)` creates a random number generator. The seed `8` makes the results the same every time the cell runs.\n",
    "- `rng.choice(values, size=10000)` draws 10,000 values from `values`.\n",
    "- `p=shipping['probability']` gives each value its chance of being drawn. Without `p`, every outcome would be equally likely. With it, the draws follow the model.\n",
    "\n",
    "To compare the simulation with the model, we count the outcomes. `value_counts()` counts how many times each value appears, and `normalize=True` divides each count by the total, so the result is a proportion instead of a count.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6bfcb563",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.657492Z",
     "iopub.status.busy": "2026-10-19T20:54:57.657324Z",
     "iopub.status.idle": "2026-10-19T20:54:57.666234Z",
     "shell.execute_reply": "2026-10-19T20:54:57.664527Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "on time         0.8016\n",
       "1 day late      0.1525\n",
       "3+ days late    0.0459\n",
       "Name: proportion, dtype: float64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng = np.random.default_rng(8)\n",
    "simulated = pd.Series(rng.choice(shipping['outcome'], size=10000, p=shipping['probability']))\n",
    "\n",
    "simulated.value_counts(normalize=True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e7a1570",
   "metadata": {},
   "source": [
    "Putting the model and the simulation side by side makes the comparison easy to see. pandas lines up the two columns by index label, not by position. `value_counts()` labels its rows by outcome, so we use `set_index('outcome')` to label the model's probabilities by outcome too (see Chapter 4). Without it, the rows would not line up, and the table would be filled with `NaN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fcaaab44",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.668077Z",
     "iopub.status.busy": "2026-10-19T20:54:57.667891Z",
     "iopub.status.idle": "2026-10-19T20:54:57.813368Z",
     "shell.execute_reply": "2026-10-19T20:54:57.811976Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>model</th>\n",
       "      <th>simulated</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>on time</th>\n",
       "      <td>0.80</td>\n",
       "      <td>0.8016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1 day late</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.1525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3+ days late</th>\n",
       "      <td>0.05</td>\n",
       "      <td>0.0459</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              model  simulated\n",
       "on time        0.80     0.8016\n",
       "1 day late     0.15     0.1525\n",
       "3+ days late   0.05     0.0459"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "comparison = pd.DataFrame({\n",
    "    'model': shipping.set_index('outcome')['probability'],\n",
    "    'simulated': simulated.value_counts(normalize=True),\n",
    "})\n",
    "comparison.plot.bar(rot=0, figsize=(6, 3), ylabel='proportion', title='Model vs. 10,000 simulated shipments')\n",
    "plt.show()\n",
    "comparison"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37b7531c",
   "metadata": {},
   "source": [
    "The proportions in the simulated data, the **empirical distribution**, are close to the model's probabilities, but not exactly equal: each simulation gives slightly different results. The same is true of the average credit:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0090f810",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.815312Z",
     "iopub.status.busy": "2026-10-19T20:54:57.815129Z",
     "iopub.status.idle": "2026-10-19T20:54:57.822618Z",
     "shell.execute_reply": "2026-10-19T20:54:57.821581Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.6805)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_by_outcome = shipping.set_index('outcome')['credit']\n",
    "simulated.map(credit_by_outcome).mean()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f361076f",
   "metadata": {},
   "source": [
    "The simulated average credit is close to the expected value of \\$1.75. With more shipments, it tends to get closer. The next section returns to this idea as the law of large numbers.\n",
    "\n",
    "In practice, we usually work the other way around: we observe data and use them to learn about the process that produced them. The rest of this section introduces the language for describing observed data.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c6d365c-19e3-4b8b-a8bb-72e341b809b8",
   "metadata": {},
   "source": [
    "## Probability, Data, and Variables\n",
    "\n",
    "A probability model starts from known chances and tells us what data to expect. Statistics usually runs the other way: we start with data and try to learn about the process that produced it. Before we can describe data, we need a few terms: where the data came from (**population vs sample**), how the table is organized (**observations vs variables**), and how the values are spread out (**distribution**).\n",
    "\n",
    "We will use the `tips` dataset from seaborn, which records 244 restaurant bills. Each row is one party's bill, with the total, the tip, and details about the party and the meal. The `size` column is the number of people in the party."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "89dcbc89",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.824426Z",
     "iopub.status.busy": "2026-10-19T20:54:57.824249Z",
     "iopub.status.idle": "2026-10-19T20:54:57.840209Z",
     "shell.execute_reply": "2026-10-19T20:54:57.839077Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>total_bill</th>\n",
       "      <th>tip</th>\n",
       "      <th>sex</th>\n",
       "      <th>smoker</th>\n",
       "      <th>day</th>\n",
       "      <th>time</th>\n",
       "      <th>size</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>16.99</td>\n",
       "      <td>1.01</td>\n",
       "      <td>Female</td>\n",
       "      <td>No</td>\n",
       "      <td>Sun</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10.34</td>\n",
       "      <td>1.66</td>\n",
       "      <td>Male</td>\n",
       "      <td>No</td>\n",
       "      <td>Sun</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>21.01</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Male</td>\n",
       "      <td>No</td>\n",
       "      <td>Sun</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>23.68</td>\n",
       "      <td>3.31</td>\n",
       "      <td>Male</td>\n",
       "      <td>No</td>\n",
       "      <td>Sun</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>24.59</td>\n",
       "      <td>3.61</td>\n",
       "      <td>Female</td>\n",
       "      <td>No</td>\n",
       "      <td>Sun</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>239</th>\n",
       "      <td>29.03</td>\n",
       "      <td>5.92</td>\n",
       "      <td>Male</td>\n",
       "      <td>No</td>\n",
       "      <td>Sat</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>27.18</td>\n",
       "      <td>2.00</td>\n",
       "      <td>Female</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Sat</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>241</th>\n",
       "      <td>22.67</td>\n",
       "      <td>2.00</td>\n",
       "      <td>Male</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Sat</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>17.82</td>\n",
       "      <td>1.75</td>\n",
       "      <td>Male</td>\n",
       "      <td>No</td>\n",
       "      <td>Sat</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>243</th>\n",
       "      <td>18.78</td>\n",
       "      <td>3.00</td>\n",
       "      <td>Female</td>\n",
       "      <td>No</td>\n",
       "      <td>Thur</td>\n",
       "      <td>Dinner</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>244 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     total_bill   tip     sex smoker   day    time  size\n",
       "0         16.99  1.01  Female     No   Sun  Dinner     2\n",
       "1         10.34  1.66    Male     No   Sun  Dinner     3\n",
       "2         21.01  3.50    Male     No   Sun  Dinner     3\n",
       "3         23.68  3.31    Male     No   Sun  Dinner     2\n",
       "4         24.59  3.61  Female     No   Sun  Dinner     4\n",
       "..          ...   ...     ...    ...   ...     ...   ...\n",
       "239       29.03  5.92    Male     No   Sat  Dinner     3\n",
       "240       27.18  2.00  Female    Yes   Sat  Dinner     2\n",
       "241       22.67  2.00    Male    Yes   Sat  Dinner     2\n",
       "242       17.82  1.75    Male     No   Sat  Dinner     2\n",
       "243       18.78  3.00  Female     No  Thur  Dinner     2\n",
       "\n",
       "[244 rows x 7 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tips = sns.load_dataset('tips')\n",
    "tips                      ### size means number of ppl in the party"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "352b333c-1fe6-4051-8bc8-b840d1ec93e6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.842078Z",
     "iopub.status.busy": "2026-10-19T20:54:57.841886Z",
     "iopub.status.idle": "2026-10-19T20:54:57.846123Z",
     "shell.execute_reply": "2026-10-19T20:54:57.844815Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(244, 7)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tips.shape       ### a dataframe has shape, which is a tuple"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e036e043",
   "metadata": {},
   "source": [
    "`tips.shape` returns `(244, 7)`: 244 rows and 7 columns.\n",
    "\n",
    "### Population vs Sample\n",
    "\n",
    "The **population** is the full group we care about (e.g., \"all bills at the restaurant this year\"), whereas the **sample** is the subset we actually measured (e.g., the 244 rows in the tips dataset). We only ever see the sample, but the questions we ask are usually about the population. Using a sample to draw conclusions about a population is called **statistical inference**, and it is the main goal of the rest of this chapter.\n",
    "\n",
    "### Variable vs Observation\n",
    "\n",
    "Each **row** in the dataframe is an **observation** (e.g., one restaurant bill), whereas each **column** is a **variable** (e.g., `total_bill`, `tip`, `smoker`, `time`).\n",
    "\n",
    "- **Quantitative** variable: numeric values that are measured or counted, such as `total_bill`, `tip`, and `size`.\n",
    "- **Categorical** variable: values that place an observation in a group, such as `time` (Lunch/Dinner) and `smoker` (Yes/No).\n",
    "\n",
    "The data types give a quick first check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c333c16c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.847769Z",
     "iopub.status.busy": "2026-10-19T20:54:57.847542Z",
     "iopub.status.idle": "2026-10-19T20:54:57.853370Z",
     "shell.execute_reply": "2026-10-19T20:54:57.852242Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "total_bill     float64\n",
       "tip            float64\n",
       "sex           category\n",
       "smoker        category\n",
       "day           category\n",
       "time          category\n",
       "size             int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tips.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5f211ca",
   "metadata": {},
   "source": [
    "The `float64` and `int64` columns are quantitative, and the `category` columns are categorical. Data types are only a starting point, though: a column of ZIP codes or product IDs is stored as numbers but is categorical, because averaging ZIP codes means nothing.\n",
    "\n",
    "### Distribution\n",
    "\n",
    "A **distribution** shows which values a variable takes and how often each one occurs. For a categorical variable, the distribution is the proportion of observations in each category:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6ca3c555",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.855083Z",
     "iopub.status.busy": "2026-10-19T20:54:57.854915Z",
     "iopub.status.idle": "2026-10-19T20:54:57.861535Z",
     "shell.execute_reply": "2026-10-19T20:54:57.860364Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "time\n",
       "Dinner    0.721311\n",
       "Lunch     0.278689\n",
       "Name: proportion, dtype: float64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tips['time'].value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "671eb89f",
   "metadata": {},
   "source": [
    "About 72% of the bills are from dinner and 28% from lunch. These proportions are an **empirical distribution**, just like the simulated shipments earlier. If the sample represents the restaurant's bills well, 0.72 is our estimate of the probability that a randomly chosen bill is a dinner bill.\n",
    "\n",
    "For a quantitative variable, we group the values into ranges and count how many fall in each range. Are most bills around \\$10? \\$20? \\$50?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b52c1cef",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.863229Z",
     "iopub.status.busy": "2026-10-19T20:54:57.863068Z",
     "iopub.status.idle": "2026-10-19T20:54:57.871287Z",
     "shell.execute_reply": "2026-10-19T20:54:57.870166Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "total_bill\n",
       "(0, 10]      17\n",
       "(10, 20]    130\n",
       "(20, 30]     65\n",
       "(30, 40]     22\n",
       "(40, 60]     10\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.cut(tips['total_bill'], bins=[0, 10, 20, 30, 40, 60]).value_counts(sort=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76db4364",
   "metadata": {},
   "source": [
    "Most bills (130 of 244) are between \\$10 and \\$20, and the counts drop off as the bills get larger. Only 10 bills are above \\$40, with the largest just over \\$50. The values trail off to the right rather than evenly on both sides.\n",
    "\n",
    "These observations already touch the three features to cover whenever you describe a quantitative distribution:\n",
    "\n",
    "- **Center**: where a typical value is (most bills are in the teens).\n",
    "- **Spread**: how much the values vary (from under \\$10 to about \\$50).\n",
    "- **Shape**: whether the values are symmetric or skewed, and whether there are outliers (a long tail of large bills).\n",
    "\n",
    "The next section, {doc}`Descriptive Distributions <0802-descriptive-distributions>`, gives you the numeric summaries and plots to measure each of these precisely."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-761e07ac",
   "metadata": {},
   "source": [
    "\n",
    "## Section Practice\n",
    "\n",
    "Use this short exercise to check the main workflow from this section.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "cell-f052fce7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.872977Z",
     "iopub.status.busy": "2026-10-19T20:54:57.872814Z",
     "iopub.status.idle": "2026-10-19T20:54:57.876900Z",
     "shell.execute_reply": "2026-10-19T20:54:57.875857Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Exercise: Practice Probability Models\n",
    "# A bakery models how many custom cakes are ordered in a day.\n",
    "#   1. Check that the probabilities add up to 1.\n",
    "#   2. Compute the probability of at least one order, using the complement of 0 orders.\n",
    "#   3. Compute the expected number of orders per day.\n",
    "#   4. The bakery also recorded orders for 20 actual days (observed). These days are a\n",
    "#      sample from the process the model describes. Compute the observed proportion of\n",
    "#      days with at least one order and the observed average orders per day.\n",
    "# Print exactly:\n",
    "# Total probability: 1.0\n",
    "# P(at least one order): 0.9\n",
    "# Expected orders: 1.7\n",
    "# Observed P(at least one order): 0.85\n",
    "# Observed average orders: 1.6\n",
    "demand = [0, 1, 2, 3]                       # cakes ordered in a day\n",
    "probabilities = [0.10, 0.30, 0.40, 0.20]\n",
    "observed = [2, 1, 0, 3, 2, 2, 1, 0, 2, 3, 1, 2, 2, 1, 3, 2, 0, 2, 1, 2]\n",
    "### Your code starts here\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "cell-6c38b64c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-19T20:54:57.878462Z",
     "iopub.status.busy": "2026-10-19T20:54:57.878304Z",
     "iopub.status.idle": "2026-10-19T20:54:57.884297Z",
     "shell.execute_reply": "2026-10-19T20:54:57.883364Z"
    },
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total probability: 1.0\n",
      "P(at least one order): 0.9\n",
      "Expected orders: 1.7\n",
      "Observed P(at least one order): 0.85\n",
      "Observed average orders: 1.6\n"
     ]
    }
   ],
   "source": [
    "### Solution\n",
    "demand = [0, 1, 2, 3]                       # cakes ordered in a day\n",
    "probabilities = [0.10, 0.30, 0.40, 0.20]\n",
    "observed = [2, 1, 0, 3, 2, 2, 1, 0, 2, 3, 1, 2, 2, 1, 3, 2, 0, 2, 1, 2]\n",
    "\n",
    "total = round(sum(probabilities), 2)\n",
    "p_at_least_one = round(1 - probabilities[0], 2)\n",
    "expected = round(sum(d * p for d, p in zip(demand, probabilities)), 2)\n",
    "\n",
    "observed = pd.Series(observed)\n",
    "obs_at_least_one = (observed >= 1).mean()\n",
    "obs_average = observed.mean()\n",
    "\n",
    "print('Total probability:', total)\n",
    "print('P(at least one order):', p_at_least_one)\n",
    "print('Expected orders:', expected)\n",
    "print('Observed P(at least one order):', obs_at_least_one)\n",
    "print('Observed average orders:', obs_average)\n",
    "# The observed values (0.85 and 1.6) are close to the model (0.9 and 1.7) but not equal:\n",
    "# 20 days is a small sample, so the empirical distribution varies by chance."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
