{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(lec7_live_complete)=\n", "# [complete] Lecture 7 live coding\n", "\n", "**2025-02-25**\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Law of Total Expectation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Set random seed for reproducibility\n", "rng = np.random.RandomState(42)\n", "n_samples = 10000" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose we're looking at average coffee prices globally over two types of coffee beans: Arabica and Robusta.\n", "\n", "$$\n", "X = \\begin{cases}\n", "1 & \\text{if coffee is Arabica} \\\\\n", "0 & \\text{if coffee is Robusta}\n", "\\end{cases}\n", "$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0, 1, 1, 1])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# # generate a random variable X with 80% arabica and 20% robusta\n", "X = rng.choice([0, 1], size=n_samples, p=[0.2, 0.8])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# # generate a random variable X with 80% arabica and 20% robusta\n", "# X = rng.choice([1, 0], size=n_samples, p=[0.8, 0.2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $Y$ be the price of coffee in dollars per pound.\n", "\n", "Arabica prices are higher, on average:\n", "$$\n", "Y \\sim \\begin{cases}\n", "\\mathcal{N}(4.5, \\;0.75^2) & \\text{if coffee is Arabica} \\\\\n", "\\mathcal{N}(2.0, \\;0.25^2) & \\text{if coffee is Robusta}\n", "\\end{cases}\n", "$$" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
is_arabicaprice $/lb
013.517227
102.048971
214.078259
314.295241
415.240613
\n", "
" ], "text/plain": [ " is_arabica price $/lb\n", "0 1 3.517227\n", "1 0 2.048971\n", "2 1 4.078259\n", "3 1 4.295241\n", "4 1 5.240613" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create Y from two normal distributions\n", "Y = np.where(X == 1,\n", " # select from this if X == 1\n", " rng.normal(loc=4.5, scale=0.75, size=n_samples),\n", " # select if X == 0\n", " rng.normal(loc=2, scale=0.25, size=n_samples))\n", "\n", "Y[:5]\n", "\n", "# Create dataframe\n", "coffee_df = pd.DataFrame({\n", " 'is_arabica': X,\n", " 'price $/lb': Y\n", "})\n", "\n", "coffee_df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# # Create Y from two normal distributions\n", "# Y = np.where(\n", "# X == 1,\n", "# rng.normal(loc=4.5, scale=0.75, size=n_samples),\n", "# rng.normal(loc=2, scale=0.25, size=n_samples)\n", "# )\n", "\n", "# # create dataframe\n", "# coffee_df = pd.DataFrame({\n", "# 'is_arabica': X,\n", "# 'price': Y\n", "# })" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "The Law of Total Expectation is generally stated as:\n", "\n", "$$\n", "E[Y] = E[E[Y|X]]\n", "$$\n", "\n", "\"The expected value of Y equals the expected value of the conditional expectation of Y given X\"\n", "\n", "**Idea**: we take the average of conditional means of Y given X over all possible values of X.\n", "\n", "For binary X, this expands to:\n", "\n", "$$\n", "E[Y] = E[Y|X=1]P(X=1) + E[Y|X=0]P(X=0)\n", "$$\n", "\n", "$E[E[Y|X]]$ means we:\n", "\n", "1. First compute the conditional means of $Y$ for each value of $X$\n", "2. Then take the weighted average of these conditional means, weighted by how often each $X$ occurs\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now verify the Law of Total Expectation with our coffee data:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Actual mean price: $4.02/lb\n", "Law of total expectation: $4.02/lb\n" ] } ], "source": [ "# compute the simple mean of Y\n", "actual_mean = np.mean(Y)\n", "\n", "# compute the conditional means\n", "Y_X1 = Y[X==1].mean()\n", "Y_X0 = Y[X==0].mean()\n", "\n", "# mean of a binary variable is equivalent to the probability it is equal to 1\n", "# P(X=1) = E[X], when X is binary\n", "prob_is_arabica = X.mean()\n", "\n", "\n", "# calculate the weighted average of conditional means\n", "# E[Y∣ X=1]P(X=1)+ E[Y∣ X=0]P(X=0)\n", "law_of_total_expectation = Y_X1 * prob_is_arabica + Y_X0 * (1 - prob_is_arabica)\n", "\n", "\n", "print(\"Actual mean price: ${:.2f}/lb\".format(actual_mean))\n", "print(\"Law of total expectation: ${:.2f}/lb\".format(law_of_total_expectation))\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# # compute the simple mean of Y\n", "# actual_mean = coffee_df['price'].mean()\n", "\n", "# # compute the conditional means\n", "# p_arabica = np.mean(coffee_df['is_arabica'])\n", "# mean_price_arabica = coffee_df[coffee_df['is_arabica'] == 1]['price'].mean()\n", "# mean_price_robusta = coffee_df[coffee_df['is_arabica'] == 0]['price'].mean()\n", "\n", "# # calculate the weighted average of conditional means\n", "# law_of_total_expectation = (mean_price_arabica * p_arabica + \n", "# mean_price_robusta * (1 - p_arabica))\n", "\n", "\n", "# print(\"Actual mean price: ${:.2f}/lb\".format(actual_mean))\n", "# print(\"Law of Total Expectation: ${:.2f}/lb\".format(law_of_total_expectation))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also visualize the distribution of the prices by species:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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6enMmzeP2NhYZX//UtwIm5o7dy6ff/45P/74Ix06dFAdx6F8fX1JSkoCYODAgWzbto3nn3+eV199VXEy+0tLS6OgoIABAwZY7zOZTPz444+89NJLVFVV4eXlpTChY4WHh9OtWzcOHDigOopDxMTEnFPE9+jRg48++khRIjWOHDnC2rVrWb16teooDvXXv/6V++67jxtvvBGAPn36cOTIERYvXizFjXBtmqZx11138fHHH7N+/XqPGkx4PmazmaqqKtUxHGLcuHHs2rWrwX1z5swhOTmZe++916MKG9AHVh88eJAZM2aojuIQI0aMOGfph/3799OxY0dFidRYvnw5UVFR1oG1nqK8vLzBBtcAXl5emM1mRYmkuLGp0tLSBr+pHT58mPT0dNq0aUNCQoLCZPZ355138s477/Dpp58SEhJCfn4+AGFhYQQEBChOZ3/3338/kyZNIiEhgTNnzvDOO++wfv16vv76a9XRHCIkJOSc8VVBQUFERkZ6xLirBQsWMGXKFDp27Ehubi4LFy7Ey8uL6dOnq47mEPfccw/Dhw/niSee4IYbbmDr1q289tprvPbaa6qjOYzZbGb58uXMmjXLo5YBAH226KJFi0hISKBXr17s2LGDJUuWcMstt6gLpQmb+f777zXgnMusWbNUR7O7xj43oC1fvlx1NIe45ZZbtI4dO2q+vr5au3bttHHjxmnffPON6lhKjR49Wrv77rtVx3CIadOmaTExMZqvr68WFxenTZs2TTtw4IDqWA71v//9T+vdu7fm5+enJScna6+99prqSA719ddfa4CWkZGhOorDlZSUaHfffbeWkJCg+fv7a507d9YeeOABraqqSlkmg6YpXEJQCCGEEMLGZJ0bIYQQQrgVKW6EEEII4VakuBFCCCGEW5HiRgghhBBuRYobIYQQQrgVKW6EEEII4VakuBFCCCGEW5HiRgghhBBuRYobIYTTyMrKwmAwkJ6e7pDzzZ49u0nPW79+PQaDgaKiIgBWrFhBeHi43XIJIVpHihshhNOIj48nLy/PafajGjt2LK+//rrqGEKIZpLiRgjhFKqrq/Hy8qJ9+/Z23Xjw5MmTzJo1i4SEBN59912SkpK4/vrrqa6ubvC8wsJCNm7cyJQpU+yWRQhhH1LcCCFsbsyYMcydO5e5c+cSFhZG27Zteeihhzh7K7vExEQee+wxZs6cSWhoKH/84x8b7Zbas2cPkydPJjQ0lJCQEEaNGsXBgwetj7/++uv06NEDf39/kpOT+fe//33BbPfccw8///wzb7/9NldccQXLli2jc+fOmM3mBs/74osvGDBgANHR0ed9r08++YSuXbvi7+/PxIkTycnJaeaflBDCHqS4EULYxcqVK/H29mbr1q08//zzLFmy5JwunmeeeYZ+/fqxY8cOHnrooXPe49ixY1x66aX4+fnx3XffkZaWxi233EJtbS0Aq1at4uGHH2bRokXs27ePJ554goceeoiVK1eeN9eOHTuYOXMmo0ePJiwsjLFjx/LUU0/h7+/f4HmfffYZU6dOPe/7lJeXs2jRIt566y02btxIUVERN954Y3P+iIQQdmK/tl8hhEeLj4/nX//6FwaDge7du7Nr1y7+9a9/cfvtt1ufc9lll/F///d/1ttZWVkN3uPll18mLCyM9957Dx8fHwC6detmfXzhwoU8++yzXHvttQB06tSJvXv38uqrrzJr1qxGc40YMYLly5fTr1+/82avqqpizZo1PPLII+d9Tk1NDS+99BJDhw4F9GKuR48ebN26lSFDhpz3dUII+5OWGyGEXVxyySUYDAbr7WHDhpGZmYnJZLLeN2jQoAu+R3p6OqNGjbIWNmcrKyvj4MGD3HrrrQQHB1svjz/+eINuq99asmQJ06ZN45577uGtt94iJSWFpUuXNnjOd999R1RUFL169Trv+3h7ezN48GDr7eTkZMLDw9m3b98FP5MQwv6k5UYIoUxQUNAFHw8ICDjvY6WlpQAsW7bM2npi4eXldcFzLlq0iEWLFnH11VczadIk7rnnHoxGI3/84x8BvUvqqquuaurHEEI4GWm5EULYxZYtWxrc/vnnn+natesFC4/f6tu3Lz/99BM1NTXnPBYdHU1sbCyHDh0iKSmpwaVTp05Nev/w8HD+9Kc/MWnSJH766ScANE3jf//73wXH2wDU1taSmppqvZ2RkUFRURE9evRo8ucTQtiHFDdCCLvIzs5m/vz5ZGRk8O677/Liiy9y9913N+s95s6dS0lJCTfeeCOpqalkZmby9ttvk5GRAcCjjz7K4sWLeeGFF9i/fz+7du1i+fLlLFmy5Lzvec899/DDDz9QXFyMyWTi+++/54cffmDgwIEApKWlUV5ezsiRIy+YzcfHh7vuuostW7aQlpbG7NmzueSSS2S8jRBOQLqlhBB2MXPmTCoqKhgyZAheXl7cfffd1m6fpoqMjOS7777jr3/9K6NHj8bLy4uUlBRGjBgBwG233UZgYCBPP/00f/3rXwkKCqJPnz7MmzfvvO+ZkJDA/PnzyczMpKysjPXr13PLLbdw1113AfDpp59yxRVXXHStncDAQO69915uuukmjh07xqhRo3jjjTea9fmEEPZh0M5eeEIIIWxgzJgxpKSk8Nxzz6mOckGzZ89mxYoVDe7r27cvDz74IDfccIOaUEKIVpNuKSGEqFNdXc11113HpEmTVEcRQrSCtNwIIWzOVVpuhBDuSYobIYQQQrgV6ZYSQgghhFuR4kYIIYQQbkWKGyGEEEK4FSluhBBCCOFWpLgRQgghhFuR4kYIIYQQbkWKGyGEEEK4FSluhBBCCOFW/j89rhp84jwaEQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.kdeplot(data=coffee_df, x='price $/lb', hue='is_arabica')\n", "plt.axvline(x=Y_X1, color=\"orange\", label=\"mean: arabica\")\n", "plt.axvline(x=Y_X0, color=\"blue\", label=\"mean: robusta\")\n", "plt.axvline(x=actual_mean, color=\"black\", label=\"overall mean\")\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# plt.figure(figsize=(10, 6))\n", "# sns.kdeplot(data=coffee_df, x='price', hue='is_arabica')\n", "# plt.axvline(actual_mean, color='black', linestyle='--', \n", "# label='Overall mean')\n", "# plt.axvline(mean_price_arabica, color='orange', linestyle='--', \n", "# label='Mean price: Arabica')\n", "# plt.axvline(mean_price_robusta, color='blue', linestyle='--', \n", "# label='Mean price: Robusta')\n", "# plt.xlabel('Price ($/lb)')\n", "# plt.ylabel('Density')\n", "# plt.title('Distribution of Coffee Prices by Species')\n", "# plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "Things to notice: \n", "\n", "- The overall mean (black dashed line) must fall between the two conditional means\n", "- It's pulled closer to the Arabica mean because there's more Arabica (80%)\n", "- The area under each curve represents the relative frequency of each type\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Keyword argument unpacking" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By prefixing a dictionary with `**`, you can unpack the dictionary into keyword arguments." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# def add(a, b):\n", "# return a + b\n", "\n", "# d = {'a': 1, 'b': 2}\n", "\n", "# add(**d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `**` operator can also be used in the function definition:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# COMPLETED CELL\n", "# def key_print(**kwargs):\n", "# # we see that the type of kwargs is dict\n", "# print(type(kwargs))\n", "# print(kwargs)\n", "\n", "# for k, v in kwargs.items():\n", "# print(\"key: \", k)\n", "# print(\"value: \", v)\n", "\n", "# card_ranks = {\"J\": 11, \"Q\": 12, \"K\": 13, \"A\": 1}\n", "# key_print(**card_ranks)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{note}\n", "See the [str.format()](https://docs.python.org/3/library/stdtypes.html#str.format) method as an example of keyword argument unpacking.\n", ":::" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "help(str.format)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# can give keyword args\n", "print(\"In this game, {card} is rank {value}\".format(value=14, card=\"A\"))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.6" } }, "nbformat": 4, "nbformat_minor": 4 }