{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Here's Allen Downey's article: http://allendowney.blogspot.fr/2011/08/jimmy-nut-company-problem.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> “Jimmy Nut Company advertises that their nut mix contains 40% cashews, 15% brazil nuts, 20% almonds, and only 25% peanuts. The truth in advertising investigators took a random sample (of size 20 lb) of the nut mix and found the distribution to be as follows:\n", "\n", ">Cashews Brazil Nuts Almonds Peanuts\n", "\n", ">6 lb 3 lb 5 lb 6 lb\n", "\n", ">At the 0.01 level of significance, is the claim made by Jimmy Nuts true?”" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "weights = {'Cashew': (16+18)/2, \n", " 'Brazil nut': (6+8)/2, \n", " 'Almonds': (20+24)/2, \n", " 'Peanuts': 28.}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Converting from weight in the sample to count per ounce." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def ConvertToCount(sample, count_per):\n", " \"\"\"Convert from weight to count.\n", "\n", " sample: Hist that maps from category to weight in pounds\n", " count_per: dict that maps from category to count per ounce\n", " \"\"\"\n", " for value, count in sample.Items():\n", " sample.Mult(value, 16 * count_per[value])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "sample = dict(cashew=6, brazil=3, almond=5, peanut=6)\n", "count_per = dict(cashew=17, brazil=7, \n", " almond=22, peanut=28)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'almond': 22, 'brazil': 7, 'cashew': 17, 'peanut': 28}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_per" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from thinkstats2 import MakeHistFromDict, MakePmfFromDict\n", "\n", "observed = MakeHistFromDict(sample)\n", "ConvertToCount(observed, count_per)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hist({'cashew': 1632, 'brazil': 336, 'almond': 1760, 'peanut': 2688})" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "observed" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "advertised = dict(cashew=40, brazil=15, \n", " almond=20, peanut=25)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "expected = MakePmfFromDict(advertised)\n", "ConvertToCount(expected, count_per)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pmf({'cashew': 108.80000000000001, 'brazil': 16.8, 'almond': 70.4, 'peanut': 112.0})" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expected" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "308.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expected.Normalize(observed.Total())" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pmf({'cashew': 2266.431168831169, 'brazil': 349.9636363636364, 'almond': 1466.514285714286, 'peanut': 2333.090909090909})" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expected" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 13, "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", "
expectedobservederror
almond1466.5142861760.020.012469
brazil349.963636336.0-3.990025
cashew2266.4311691632.0-27.992519
peanut2333.0909092688.015.211970
\n", "
" ], "text/plain": [ " expected observed error\n", "almond 1466.514286 1760.0 20.012469\n", "brazil 349.963636 336.0 -3.990025\n", "cashew 2266.431169 1632.0 -27.992519\n", "peanut 2333.090909 2688.0 15.211970" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame([expected.GetDict(), observed.GetDict()]).transpose()\n", "df.columns = ['expected', 'observed']\n", "df['error'] = (df.observed - df.expected) / df.expected * 100\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute the chi-square of this:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "def chi_square(expected_dict, observed_dict):\n", " \"\"\"Computes the chi squared statistic.\"\"\"\n", " chi = 0\n", " for key in expected_dict:\n", " a, b = observed_dict[key], expected_dict[key]\n", " chi += (a-b)**2/b\n", " return chi" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "290.8728179551123" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_stat = chi_square(expected.GetDict(), observed.GetDict())\n", "test_stat" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "from thinkstats2 import MakeCdfFromHist, MakeHistFromList" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.657641282822343" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_nuts = observed.Total()\n", "cdf = MakeCdfFromHist(expected)\n", "t = cdf.Sample(num_nuts)\n", "simulated = MakeHistFromList(t)\n", "chi2 = chi_square(expected.GetDict(), simulated.GetDict())\n", "chi2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's do that many times now!" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "import tqdm" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 5000/5000 [00:18<00:00, 273.41it/s]\n" ] } ], "source": [ "chi2s = []\n", "for _ in tqdm.tqdm(range(5000)):\n", " t = cdf.Sample(num_nuts)\n", " simulated = MakeHistFromList(t)\n", " chi2 = chi_square(expected.GetDict(), simulated.GetDict())\n", " chi2s.append(chi2)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(chi2s, bins=50, normed=True, label='simulated distribution');\n", "plt.vlines(test_stat, 0, 0.3, label='test statistic')\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So indeed, it seems unlikely that the observed distribution has been drawn from our generative model. Great post by Allen!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.1" }, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "13px", "width": "253px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }