{ "cells": [ { "cell_type": "markdown", "id": "bd13e811", "metadata": {}, "source": [ "# GG274 Homework 9: Bootstrap Confidence Intervals\n", "\n", "## Logistics\n", "\n", "**Due date**: The homework is due 23:59 on Monday, March 18.\n", "\n", "You will submit your work on [MarkUs](https://markus-ds.teach.cs.toronto.edu).\n", "To submit your work:\n", "\n", "1. Download this file (`Homework_9.ipynb`) from JupyterHub. (See [our JupyterHub Guide](../../../guides/jupyterhub_guide.ipynb) for detailed instructions.)\n", "2. Submit this file to MarkUs under the **hw9** assignment. (See [our MarkUs Guide](../../../guides/markus_guide.ipynb) for detailed instructions.)\n", "All homeworks will take place in a Jupyter notebook (like this one). When you are done, you will download this notebook and submit it to MarkUs.\n" ] }, { "cell_type": "markdown", "id": "8442f7a6", "metadata": {}, "source": [ "## Introduction\n", "\n", "In this homework you will construct a bootstrap confidence interval around a sample mean of time spent driving, for those people in the survey who reported ***more*** than 0 minutes of driving. " ] }, { "cell_type": "code", "execution_count": 1, "id": "498ebc38", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt \n", "import numpy as np\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "id": "ba9654ca", "metadata": {}, "source": [ "``` \n", "durl313 Duration - Travel - Car - Driver\n", "\n", " VALUE LABEL\n", " 0 No time spent doing this activity\n", " 9996 Valid skip\n", " 9997 Don't know\n", " 9998 Refusal\n", " 9999 Not stated\n", "\n", " Data type: numeric\n", " Missing-data codes: 9996-9999\n", " Record/columns: 1/362-364\n", "```" ] }, { "cell_type": "markdown", "id": "dd16cb9a", "metadata": {}, "source": [ "## Step 1 - Read the time use survey data into a `pandas` `DataFrame`\n", "\n", "a) The data is stored in `gss_tu2016_main_file.csv` .\n", "\n", "Use the `pandas` function `read_csv` to read the data into a `pandas` `DataFrame` named `time_use_df`. \n" ] }, { "cell_type": "code", "execution_count": 2, "id": "0e70a55c", "metadata": {}, "outputs": [], "source": [ "# Write your code below\n", "time_use_df = pd.read_csv('gss_tu2016_main_file.csv')" ] }, { "cell_type": "markdown", "id": "a9b80a4d", "metadata": {}, "source": [ "b) Use `time_use_df` to create a another `DataFrame` called `drive_time_df` that has two columns: `'CASEID', 'durl313'` (in that order)." ] }, { "cell_type": "code", "execution_count": 3, "id": "260275b5", "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", "
CASEIDdurl313
01000090
1100010
21000230
31000380
4100040
\n", "
" ], "text/plain": [ " CASEID durl313\n", "0 10000 90\n", "1 10001 0\n", "2 10002 30\n", "3 10003 80\n", "4 10004 0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Write your code below\n", "drive_time_df = time_use_df[[\"CASEID\", \"durl313\"]]\n", "\n", "drive_time_df.head()" ] }, { "cell_type": "markdown", "id": "ba21291a", "metadata": {}, "source": [ "b) Rename the column names of `drive_time_df` using the following table. The `DataFrame` with the new column names should be called `drive_time_df` (i.e., don't change the name of the `DataFrame`).\n", "\n", "Original column name | New column name\n", "----|----\n", "CASEID | ID\n", "durl313 | drv_time\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "911d50e5", "metadata": {}, "outputs": [], "source": [ "# Write your code below\n", "column_names = {'CASEID': 'ID',\n", " 'durl313': 'drv_time'}\n", "\n", "drive_time_df = drive_time_df.rename(columns=column_names)" ] }, { "cell_type": "markdown", "id": "cf32e981", "metadata": {}, "source": [ "## Step 2 - Select only those participants who drove and create new `pandas` `DataFrame`.\n", "\n", "a) In this step you will select only those survey participants who drove (i.e., their drv_time value is greater than 0 and not 9996, 9997, 9998, or 9999. \n", "\n", "First, create a `pandas` `Series` called `driver` where a value is `True` if the person drove and `False` if they did not." ] }, { "cell_type": "code", "execution_count": 5, "id": "0243bcf1", "metadata": {}, "outputs": [], "source": [ "# Write your code below\n", "\n", "driver = (drive_time_df[\"drv_time\"] > 0) & (drive_time_df[\"drv_time\"] < 9996)" ] }, { "cell_type": "markdown", "id": "637787f9", "metadata": {}, "source": [ "b) Create a new `DataFrame` `subset_drive_time_df` by selecting the rows in `drive_time_df` where the person drove." ] }, { "cell_type": "code", "execution_count": 6, "id": "449b31ab", "metadata": {}, "outputs": [], "source": [ "# Write your code below\n", "subset_drive_time_df = drive_time_df[driver]" ] }, { "cell_type": "markdown", "id": "6e4619af", "metadata": {}, "source": [ "## Step 3 - Calculate the mean of how much time drivers spent driving \n", "\n", "In this step you will compute the mean of how much time drivers spent driving and store it in a variable called `drive_time_avg`. " ] }, { "cell_type": "code", "execution_count": 7, "id": "5debecca", "metadata": {}, "outputs": [], "source": [ "# Write your code below\n", "\n", "drive_time_avg = subset_drive_time_df['drv_time'].mean()\n" ] }, { "cell_type": "markdown", "id": "ef247197", "metadata": {}, "source": [ "## Step 4 - Create a function that generates a bootstrap sample from `subset_drive_time_df`\n", "\n", "In the below cell, create a function called `one_bs_mean` that calculates a bootstrap sample mean called `dt_bsmean_sample` from `subset_drive_time_df`. " ] }, { "cell_type": "code", "execution_count": 9, "id": "3a8ca060", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "74.5740412979351" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Write your code below\n", "\n", "def one_bs_mean():\n", " dt_bsmean_sample = subset_drive_time_df['drv_time'].sample(frac = 1, replace=True).mean()\n", " return dt_bsmean_sample\n", "\n", "# test your function\n", "one_bs_mean()" ] }, { "cell_type": "markdown", "id": "b748c831", "metadata": {}, "source": [ "## Step 5 - Compute a distribution of bootstrap sample means\n", "\n", "a) Create an empty list called `bootstrap_means` and then a loop that populates this list with 10,000 bootstrap sample means (generated from calling your `one_bs_mean` function)." ] }, { "cell_type": "code", "execution_count": 10, "id": "bcf2d441", "metadata": {}, "outputs": [], "source": [ "# This code sets a random seed so the code below generates the same results\n", "# Don't change this!\n", "np.random.seed(901)\n", "\n", "# Write your code below\n", "bootstrap_means = []\n", "for _ in range(10000):\n", " bootstrap_means.append(one_bs_mean())" ] }, { "cell_type": "markdown", "id": "05edf48a", "metadata": {}, "source": [ "b) Plot `bootstrap_means` as a histogram using a `color` argument of `cyan` and `edgecolor` of `red`. Save the histogram to `bootstrap_means_histogram`." ] }, { "cell_type": "code", "execution_count": 13, "id": "12d2561d", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Write your code below\n", "bootstrap_means_histogram = plt.hist(bootstrap_means, color = 'cyan', edgecolor = 'red')" ] }, { "cell_type": "markdown", "id": "c240f8cb", "metadata": {}, "source": [ "## Step 6 - Report the 95% confidence interval of the sample mean of how much time drivers spend driving\n", "\n", "a) Compute the 2.5th percentile from the distribution `bootstrap_means` using the `np.percentile()`. Save the percentile to `bootstrap_means_2p5_percentile`." ] }, { "cell_type": "code", "execution_count": 36, "id": "26535b3d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "73.98493117010815" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Write your code below\n", "bootstrap_means_2p5_percentile = np.percentile(bootstrap_means, 2.5)\n", "\n", "bootstrap_means_2p5_percentile" ] }, { "cell_type": "markdown", "id": "2cd0db75", "metadata": {}, "source": [ "b) Compute the 97.5th percentile from the distribution `bootstrap_means` using the `np.percentile()`. Save the percentile to `bootstrap_means_97p5_percentile`." ] }, { "cell_type": "code", "execution_count": 20, "id": "978a9570", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "76.78839724680432" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Write your code below\n", "bootstrap_means_97p5_percentile = np.percentile(bootstrap_means, 97.5)\n", "\n", "bootstrap_means_97p5_percentile" ] }, { "cell_type": "markdown", "id": "5da0b797", "metadata": {}, "source": [ "c) Complete the following sentence reporting the 95% bootstrap confidence interval, rounded to two decimal points.\n" ] }, { "cell_type": "markdown", "id": "92901353", "metadata": {}, "source": [ "**write answer here**" ] }, { "cell_type": "markdown", "id": "c517e8d1", "metadata": {}, "source": [ "ANSWER: A 95% bootstrap confidence interval for the sample mean of driving time for drivers is 73.98 to 76.79 minutes. " ] }, { "cell_type": "markdown", "id": "6810b58b", "metadata": {}, "source": [ "**Give this to students:** \"A 95% bootstrap confidence interval for the sample mean of driving time for drivers is __ to __ minutes." ] }, { "cell_type": "code", "execution_count": null, "id": "a7b39833", "metadata": {}, "outputs": [], "source": [] } ], "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.8.8" }, "markus": { "assessment_id": 139, "course_id": 9, "url": "https://markus-ds.teach.cs.toronto.edu" }, "vscode": { "interpreter": { "hash": "440dd12f919b48e435ef15d7652bb5c9f2f802a3e9de582e9da805c841a6f459" } } }, "nbformat": 4, "nbformat_minor": 5 }