{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear regression with the Associated Press\n", "\n", "In [this piece from the Associated Press](https://apnews.com/66ac44186b6249709501f07a7eab36da), Nicky Forster combines from the US Census Bureau and the CDC to see how life expectancy is related to actors like unemployment, income, and others. We'll be looking at how they can write sentences like this one: \n", "\n", "> \"An increase of 10 percentage points in the unemployment rate in a neighborhood translated to a loss of roughly a year and a half of life expectancy, the AP found.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<p class=\"reading-options\">\n <a class=\"btn\" href=\"/ap-regression-unemployment/simple-regression-with-census-data-statsmodels-with-formulas\">\n <i class=\"fa fa-sm fa-book\"></i>\n Read online\n </a>\n <a class=\"btn\" href=\"/ap-regression-unemployment/notebooks/Simple regression with census data (statsmodels with formulas).ipynb\">\n <i class=\"fa fa-sm fa-download\"></i>\n Download notebook\n </a>\n <a class=\"btn\" href=\"https://colab.research.google.com/github/littlecolumns/ds4j-notebooks/blob/master/ap-regression-unemployment/notebooks/Simple regression with census data (statsmodels with formulas).ipynb\" target=\"_new\">\n <i class=\"fa fa-sm fa-laptop\"></i>\n Interactive version\n </a>\n</p>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prep work: Downloading necessary files\n", "Before we get started, we need to download all of the data we'll be using.\n", "* **R12221544_SL140.csv:** Employment status by census tract - ACS 2015 5-year, tract level, table B23025\n", "* **R12221544.txt:** Data dictionary for R12221544_SL140.csv - Description of columns and tables\n", "* **R12221550_SL140.csv:** Demographic data by census tract - ACS 2015 5-year, tract level, tables B23025, B06009, B03002, B19013, C17002\n", "* **R12221550.txt:** Data dictionary for R12221550_SL140.csv - Description of columns and tables\n", "* **US_A.CSV:** USALEEP national data - estimates of life expectancy at birth for most of the census tracts in the USA\n", "* **Record_Layout_CensusTract_Life_Expectancy.pdf:** USALEEP data dictionary - None\n" ] }, { "cell_type": "code", "metadata": {}, "source": [ "# Make data directory if it doesn't exist\n", "!mkdir -p data\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/R12221544_SL140.csv.zip -P data\n", "!unzip -n -d data data/R12221544_SL140.csv.zip\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/R12221544.txt -P data\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/R12221550_SL140.csv.zip -P data\n", "!unzip -n -d data data/R12221550_SL140.csv.zip\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/R12221550.txt -P data\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/US_A.CSV -P data\n", "!wget -nc https://nyc3.digitaloceanspaces.com/ml-files-distro/v1/ap-regression-unemployment/data/Record_Layout_CensusTract_Life_Expectancy.pdf -P data" ], "outputs": [], "execution_count": null }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "# Keep decimal numbers to 4 decimal places\n", "pd.set_option(\"display.float_format\", '{:,.4f}'.format)\n", "pd.set_option(\"display.max_columns\", 100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reading in our data\n", "\n", "We'll start by reading in our datasets (as we must!).\n", "\n", "### Life expectancy data\n", "\n", "The first dataset is [USALEEP](https://www.cdc.gov/nchs/nvss/usaleep/usaleep.html), the U.S. Small-area Life Expectancy Estimates Project. It's from the National Center for Health Statistics at the CDC.\n", "\n", "We're going to rename a few columns so they make a little more sense. The columns themselves aren't too complicated, mostly pointing out the census tracts and the life expectancy." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "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>tract_id</th>\n", " <th>STATE2KX</th>\n", " <th>CNTY2KX</th>\n", " <th>TRACT2KX</th>\n", " <th>life_expectancy</th>\n", " <th>life_expectancy_std_err</th>\n", " <th>flag</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20100</td>\n", " <td>73.1000</td>\n", " <td>2.2348</td>\n", " <td>3</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20200</td>\n", " <td>76.9000</td>\n", " <td>3.3453</td>\n", " <td>3</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020400</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20400</td>\n", " <td>75.4000</td>\n", " <td>1.0216</td>\n", " <td>3</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020500</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20500</td>\n", " <td>79.4000</td>\n", " <td>1.1768</td>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020600</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20600</td>\n", " <td>73.1000</td>\n", " <td>1.5519</td>\n", " <td>3</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " tract_id STATE2KX CNTY2KX TRACT2KX life_expectancy \\\n", "0 1001020100 1 1 20100 73.1000 \n", "1 1001020200 1 1 20200 76.9000 \n", "2 1001020400 1 1 20400 75.4000 \n", "3 1001020500 1 1 20500 79.4000 \n", "4 1001020600 1 1 20600 73.1000 \n", "\n", " life_expectancy_std_err flag \n", "0 2.2348 3 \n", "1 3.3453 3 \n", "2 1.0216 3 \n", "3 1.1768 1 \n", "4 1.5519 3 " ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "life_expec = pd.read_csv(\"data/US_A.CSV\")\n", "life_expec.columns = ['tract_id', 'STATE2KX','CNTY2KX', 'TRACT2KX', 'life_expectancy', \n", " 'life_expectancy_std_err', 'flag']\n", "life_expec.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`flag` sounds a little mysterious and scary, but it's just whether the numbers were observed or predicted." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Unemployment Data\n", "\n", "For unemployment, we'll be using data from the Census. You can get unemployment measures from a lot of places in the US government, so the Census Bureau actually [publishes data on which ones you should use](https://www.census.gov/topics/employment/labor-force/guidance.html). In our case we're going to collect unemployment data from the American Community Survery, for the 5-year period nearest to our life expectancy dataset.\n", "\n", "We'll be using Table B23025005, Employment Status for the Population 16 Years and Over. Take a look at [the codebook](https://www.socialexplorer.com/data/ACS2015_5yr/metadata/?ds=ACS15_5yr&var=B23025005) for more details. We're only reading in a few columns to keep things looking clean." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "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>Geo_FIPS</th>\n", " <th>total_pop</th>\n", " <th>unemployed</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>1554</td>\n", " <td>54</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>1731</td>\n", " <td>116</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020300</td>\n", " <td>2462</td>\n", " <td>91</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020400</td>\n", " <td>3424</td>\n", " <td>216</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020500</td>\n", " <td>8198</td>\n", " <td>221</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Geo_FIPS total_pop unemployed\n", "0 1001020100 1554 54\n", "1 1001020200 1731 116\n", "2 1001020300 2462 91\n", "3 1001020400 3424 216\n", "4 1001020500 8198 221" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "columns = {\n", " 'Geo_FIPS': 'Geo_FIPS',\n", " 'ACS15_5yr_B23025001': 'total_pop',\n", " 'ACS15_5yr_B23025005': 'unemployed'\n", "}\n", "employment = pd.read_csv(\"data/R12221544_SL140.csv\", usecols=columns.keys(), encoding='latin-1')\n", "\n", "employment = employment.rename(columns=columns)\n", "employment.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the important thing is _percent_ unemployed, not just how many people are in an area, we'll need to do a little calculation.\n", "\n", "> **Note that I'm multiplying by 100 here** - if you have a litle extra time, try running this notebook on your own with a 0-1.0 percentage instead of the 0-100 version." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "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>Geo_FIPS</th>\n", " <th>total_pop</th>\n", " <th>unemployed</th>\n", " <th>pct_unemployment</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>1554</td>\n", " <td>54</td>\n", " <td>3.4749</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>1731</td>\n", " <td>116</td>\n", " <td>6.7013</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020300</td>\n", " <td>2462</td>\n", " <td>91</td>\n", " <td>3.6962</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020400</td>\n", " <td>3424</td>\n", " <td>216</td>\n", " <td>6.3084</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020500</td>\n", " <td>8198</td>\n", " <td>221</td>\n", " <td>2.6958</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Geo_FIPS total_pop unemployed pct_unemployment\n", "0 1001020100 1554 54 3.4749\n", "1 1001020200 1731 116 6.7013\n", "2 1001020300 2462 91 3.6962\n", "3 1001020400 3424 216 6.3084\n", "4 1001020500 8198 221 2.6958" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "employment['pct_unemployment'] = employment['unemployed'] / employment['total_pop'] * 100\n", "employment.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Demographic data\n", "\n", "The other dataset we're using is also from the Census Bureau's American Community Survey. It's a collection of many more columns with very, very long names and very, very mysterious codes. The tables include:\n", "\n", "* [B03002](https://censusreporter.org/tables/B03002/): Hispanic or Latino Origin by Race\n", "* [B06009](https://censusreporter.org/tables/B06009/): Place of Birth by Educational Attainment in the United States\n", "* [C17002](https://censusreporter.org/tables/C17002/): Ratio of Income to Poverty Level\n", "* [B19013](https://censusreporter.org/tables/B19013/): Median Household Income\n", "\n", "Again, we're only picking a few columns to read in. Generally they're the raw count of certain populations, as well as the total population counted of each table." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "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>Geo_FIPS</th>\n", " <th>race_table_total</th>\n", " <th>white</th>\n", " <th>black</th>\n", " <th>hispanic</th>\n", " <th>edu_table_total</th>\n", " <th>less_than_hs</th>\n", " <th>poverty_table_total</th>\n", " <th>poverty_100_124</th>\n", " <th>poverty_125_149</th>\n", " <th>income</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>1948</td>\n", " <td>1703</td>\n", " <td>150</td>\n", " <td>17</td>\n", " <td>1,243.0000</td>\n", " <td>184.0000</td>\n", " <td>1948</td>\n", " <td>81</td>\n", " <td>101</td>\n", " <td>61,838.0000</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>2156</td>\n", " <td>872</td>\n", " <td>1149</td>\n", " <td>17</td>\n", " <td>1,397.0000</td>\n", " <td>356.0000</td>\n", " <td>1983</td>\n", " <td>232</td>\n", " <td>58</td>\n", " <td>32,303.0000</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020300</td>\n", " <td>2968</td>\n", " <td>2212</td>\n", " <td>551</td>\n", " <td>0</td>\n", " <td>2,074.0000</td>\n", " <td>221.0000</td>\n", " <td>2968</td>\n", " <td>148</td>\n", " <td>207</td>\n", " <td>44,922.0000</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020400</td>\n", " <td>4423</td>\n", " <td>3662</td>\n", " <td>162</td>\n", " <td>464</td>\n", " <td>2,899.0000</td>\n", " <td>339.0000</td>\n", " <td>4423</td>\n", " <td>141</td>\n", " <td>182</td>\n", " <td>54,329.0000</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020500</td>\n", " <td>10763</td>\n", " <td>7368</td>\n", " <td>2674</td>\n", " <td>80</td>\n", " <td>6,974.0000</td>\n", " <td>310.0000</td>\n", " <td>10563</td>\n", " <td>256</td>\n", " <td>1064</td>\n", " <td>51,965.0000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Geo_FIPS race_table_total white black hispanic edu_table_total \\\n", "0 1001020100 1948 1703 150 17 1,243.0000 \n", "1 1001020200 2156 872 1149 17 1,397.0000 \n", "2 1001020300 2968 2212 551 0 2,074.0000 \n", "3 1001020400 4423 3662 162 464 2,899.0000 \n", "4 1001020500 10763 7368 2674 80 6,974.0000 \n", "\n", " less_than_hs poverty_table_total poverty_100_124 poverty_125_149 \\\n", "0 184.0000 1948 81 101 \n", "1 356.0000 1983 232 58 \n", "2 221.0000 2968 148 207 \n", "3 339.0000 4423 141 182 \n", "4 310.0000 10563 256 1064 \n", "\n", " income \n", "0 61,838.0000 \n", "1 32,303.0000 \n", "2 44,922.0000 \n", "3 54,329.0000 \n", "4 51,965.0000 " ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "columns = {\n", " 'Geo_FIPS': 'Geo_FIPS',\n", " 'ACS15_5yr_B03002001': 'race_table_total',\n", " 'ACS15_5yr_B03002004': 'black',\n", " 'ACS15_5yr_B03002003': 'white',\n", " 'ACS15_5yr_B03002012': 'hispanic',\n", " 'ACS15_5yr_B06009001': 'edu_table_total',\n", " 'ACS15_5yr_B06009002': 'less_than_hs',\n", " 'ACS15_5yr_C17002004': 'poverty_100_124',\n", " 'ACS15_5yr_C17002005': 'poverty_125_149',\n", " 'ACS15_5yr_C17002001': 'poverty_table_total',\n", " 'ACS15_5yr_B19013001': 'income'\n", "} \n", "census = pd.read_csv(\"data/R12221550_SL140.csv\", usecols=columns.keys(), encoding='latin-1')\n", "census = census.rename(columns=columns)\n", "census.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll again convert these **raw population numbers into percentages** - what percent of people are certain races? What percent of people have not finished high school?" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "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>Geo_FIPS</th>\n", " <th>pct_black</th>\n", " <th>pct_white</th>\n", " <th>pct_hispanic</th>\n", " <th>pct_less_than_hs</th>\n", " <th>pct_under_150_poverty</th>\n", " <th>income</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>7.7002</td>\n", " <td>87.4230</td>\n", " <td>0.8727</td>\n", " <td>14.8029</td>\n", " <td>9.3429</td>\n", " <td>61,838.0000</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>53.2931</td>\n", " <td>40.4453</td>\n", " <td>0.7885</td>\n", " <td>25.4832</td>\n", " <td>14.6243</td>\n", " <td>32,303.0000</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020300</td>\n", " <td>18.5647</td>\n", " <td>74.5283</td>\n", " <td>0.0000</td>\n", " <td>10.6557</td>\n", " <td>11.9609</td>\n", " <td>44,922.0000</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020400</td>\n", " <td>3.6627</td>\n", " <td>82.7945</td>\n", " <td>10.4906</td>\n", " <td>11.6937</td>\n", " <td>7.3027</td>\n", " <td>54,329.0000</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020500</td>\n", " <td>24.8444</td>\n", " <td>68.4567</td>\n", " <td>0.7433</td>\n", " <td>4.4451</td>\n", " <td>12.4964</td>\n", " <td>51,965.0000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Geo_FIPS pct_black pct_white pct_hispanic pct_less_than_hs \\\n", "0 1001020100 7.7002 87.4230 0.8727 14.8029 \n", "1 1001020200 53.2931 40.4453 0.7885 25.4832 \n", "2 1001020300 18.5647 74.5283 0.0000 10.6557 \n", "3 1001020400 3.6627 82.7945 10.4906 11.6937 \n", "4 1001020500 24.8444 68.4567 0.7433 4.4451 \n", "\n", " pct_under_150_poverty income \n", "0 9.3429 61,838.0000 \n", "1 14.6243 32,303.0000 \n", "2 11.9609 44,922.0000 \n", "3 7.3027 54,329.0000 \n", "4 12.4964 51,965.0000 " ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "census_features = pd.DataFrame({\n", " 'Geo_FIPS': census.Geo_FIPS,\n", " 'pct_black': census.black / census.race_table_total * 100,\n", " 'pct_white': census.white / census.race_table_total * 100,\n", " 'pct_hispanic': census.hispanic / census.race_table_total * 100,\n", " 'pct_less_than_hs': census.less_than_hs / census.edu_table_total * 100,\n", " 'pct_under_150_poverty': (census.poverty_100_124 + census.poverty_125_149) / census.poverty_table_total * 100,\n", " 'income': census.income,\n", "})\n", "census_features.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Merge the data\n", "\n", "To perform our regression, we need all of our data in **a single dataframe**. Fortunately these dataframes all keep track of census tracks with [FIPS codes](https://transition.fcc.gov/oet/info/maps/census/fips/fips.txt), unique geographic codes that we can rely on to merge our datasets." ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "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>tract_id</th>\n", " <th>STATE2KX</th>\n", " <th>CNTY2KX</th>\n", " <th>TRACT2KX</th>\n", " <th>life_expectancy</th>\n", " <th>life_expectancy_std_err</th>\n", " <th>flag</th>\n", " <th>Geo_FIPS</th>\n", " <th>total_pop</th>\n", " <th>unemployed</th>\n", " <th>pct_unemployment</th>\n", " <th>pct_black</th>\n", " <th>pct_white</th>\n", " <th>pct_hispanic</th>\n", " <th>pct_less_than_hs</th>\n", " <th>pct_under_150_poverty</th>\n", " <th>income</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1001020100</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20100</td>\n", " <td>73.1000</td>\n", " <td>2.2348</td>\n", " <td>3</td>\n", " <td>1001020100</td>\n", " <td>1554</td>\n", " <td>54</td>\n", " <td>3.4749</td>\n", " <td>7.7002</td>\n", " <td>87.4230</td>\n", " <td>0.8727</td>\n", " <td>14.8029</td>\n", " <td>9.3429</td>\n", " <td>61,838.0000</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>1001020200</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20200</td>\n", " <td>76.9000</td>\n", " <td>3.3453</td>\n", " <td>3</td>\n", " <td>1001020200</td>\n", " <td>1731</td>\n", " <td>116</td>\n", " <td>6.7013</td>\n", " <td>53.2931</td>\n", " <td>40.4453</td>\n", " <td>0.7885</td>\n", " <td>25.4832</td>\n", " <td>14.6243</td>\n", " <td>32,303.0000</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>1001020400</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20400</td>\n", " <td>75.4000</td>\n", " <td>1.0216</td>\n", " <td>3</td>\n", " <td>1001020400</td>\n", " <td>3424</td>\n", " <td>216</td>\n", " <td>6.3084</td>\n", " <td>3.6627</td>\n", " <td>82.7945</td>\n", " <td>10.4906</td>\n", " <td>11.6937</td>\n", " <td>7.3027</td>\n", " <td>54,329.0000</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>1001020500</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20500</td>\n", " <td>79.4000</td>\n", " <td>1.1768</td>\n", " <td>1</td>\n", " <td>1001020500</td>\n", " <td>8198</td>\n", " <td>221</td>\n", " <td>2.6958</td>\n", " <td>24.8444</td>\n", " <td>68.4567</td>\n", " <td>0.7433</td>\n", " <td>4.4451</td>\n", " <td>12.4964</td>\n", " <td>51,965.0000</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>1001020600</td>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>20600</td>\n", " <td>73.1000</td>\n", " <td>1.5519</td>\n", " <td>3</td>\n", " <td>1001020600</td>\n", " <td>2855</td>\n", " <td>190</td>\n", " <td>6.6550</td>\n", " <td>11.9190</td>\n", " <td>72.9161</td>\n", " <td>13.0615</td>\n", " <td>17.4873</td>\n", " <td>10.8543</td>\n", " <td>63,092.0000</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " tract_id STATE2KX CNTY2KX TRACT2KX life_expectancy \\\n", "0 1001020100 1 1 20100 73.1000 \n", "1 1001020200 1 1 20200 76.9000 \n", "2 1001020400 1 1 20400 75.4000 \n", "3 1001020500 1 1 20500 79.4000 \n", "4 1001020600 1 1 20600 73.1000 \n", "\n", " life_expectancy_std_err flag Geo_FIPS total_pop unemployed \\\n", "0 2.2348 3 1001020100 1554 54 \n", "1 3.3453 3 1001020200 1731 116 \n", "2 1.0216 3 1001020400 3424 216 \n", "3 1.1768 1 1001020500 8198 221 \n", "4 1.5519 3 1001020600 2855 190 \n", "\n", " pct_unemployment pct_black pct_white pct_hispanic pct_less_than_hs \\\n", "0 3.4749 7.7002 87.4230 0.8727 14.8029 \n", "1 6.7013 53.2931 40.4453 0.7885 25.4832 \n", "2 6.3084 3.6627 82.7945 10.4906 11.6937 \n", "3 2.6958 24.8444 68.4567 0.7433 4.4451 \n", "4 6.6550 11.9190 72.9161 13.0615 17.4873 \n", "\n", " pct_under_150_poverty income \n", "0 9.3429 61,838.0000 \n", "1 14.6243 32,303.0000 \n", "2 7.3027 54,329.0000 \n", "3 12.4964 51,965.0000 \n", "4 10.8543 63,092.0000 " ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged = life_expec.merge(employment, left_on='tract_id', right_on='Geo_FIPS')\n", "merged = merged.merge(census_features, left_on='Geo_FIPS', right_on='Geo_FIPS')\n", "merged.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running the regression\n", "\n", "Using the `statsmodels` package, we'll run a linear regression to find the relationship between **life expectancy** and our **calculated columns**. Note that we're using the **formula method** of writing a regression instead of the dataframes method. I find it both more readable and more useable than the dataframes method.\n", "\n", "> Python note: I'm also using a [multiline string](https://stackoverflow.com/posts/10660443/revisions) which is started and ended using three quotation marks. Multi-line strings and formulas are a match made in heaven!" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<table class=\"simpletable\">\n", "<caption>OLS Regression Results</caption>\n", "<tr>\n", " <th>Dep. Variable:</th> <td>life_expectancy</td> <th> R-squared: </th> <td> 0.490</td> \n", "</tr>\n", "<tr>\n", " <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.490</td> \n", "</tr>\n", "<tr>\n", " <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 8997.</td> \n", "</tr>\n", "<tr>\n", " <th>Date:</th> <td>Thu, 12 Dec 2019</td> <th> Prob (F-statistic):</th> <td> 0.00</td> \n", "</tr>\n", "<tr>\n", " <th>Time:</th> <td>21:50:03</td> <th> Log-Likelihood: </th> <td>-1.6208e+05</td>\n", "</tr>\n", "<tr>\n", " <th>No. Observations:</th> <td> 65656</td> <th> AIC: </th> <td>3.242e+05</td> \n", "</tr>\n", "<tr>\n", " <th>Df Residuals:</th> <td> 65648</td> <th> BIC: </th> <td>3.243e+05</td> \n", "</tr>\n", "<tr>\n", " <th>Df Model:</th> <td> 7</td> <th> </th> <td> </td> \n", "</tr>\n", "<tr>\n", " <th>Covariance Type:</th> <td>nonrobust</td> <th> </th> <td> </td> \n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<tr>\n", " <td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th> \n", "</tr>\n", "<tr>\n", " <th>Intercept</th> <td> 81.2365</td> <td> 0.122</td> <td> 665.628</td> <td> 0.000</td> <td> 80.997</td> <td> 81.476</td>\n", "</tr>\n", "<tr>\n", " <th>pct_black</th> <td> -0.0666</td> <td> 0.001</td> <td> -56.960</td> <td> 0.000</td> <td> -0.069</td> <td> -0.064</td>\n", "</tr>\n", "<tr>\n", " <th>pct_white</th> <td> -0.0386</td> <td> 0.001</td> <td> -36.707</td> <td> 0.000</td> <td> -0.041</td> <td> -0.037</td>\n", "</tr>\n", "<tr>\n", " <th>pct_hispanic</th> <td> 0.0131</td> <td> 0.001</td> <td> 10.298</td> <td> 0.000</td> <td> 0.011</td> <td> 0.016</td>\n", "</tr>\n", "<tr>\n", " <th>pct_less_than_hs</th> <td> -0.0862</td> <td> 0.002</td> <td> -48.979</td> <td> 0.000</td> <td> -0.090</td> <td> -0.083</td>\n", "</tr>\n", "<tr>\n", " <th>pct_under_150_poverty</th> <td> -0.0596</td> <td> 0.003</td> <td> -21.738</td> <td> 0.000</td> <td> -0.065</td> <td> -0.054</td>\n", "</tr>\n", "<tr>\n", " <th>income</th> <td> 4.825e-05</td> <td> 5.8e-07</td> <td> 83.217</td> <td> 0.000</td> <td> 4.71e-05</td> <td> 4.94e-05</td>\n", "</tr>\n", "<tr>\n", " <th>pct_unemployment</th> <td> -0.1490</td> <td> 0.004</td> <td> -33.408</td> <td> 0.000</td> <td> -0.158</td> <td> -0.140</td>\n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<tr>\n", " <th>Omnibus:</th> <td>2114.193</td> <th> Durbin-Watson: </th> <td> 1.520</td>\n", "</tr>\n", "<tr>\n", " <th>Prob(Omnibus):</th> <td> 0.000</td> <th> Jarque-Bera (JB): </th> <td>4788.035</td>\n", "</tr>\n", "<tr>\n", " <th>Skew:</th> <td> 0.183</td> <th> Prob(JB): </th> <td> 0.00</td>\n", "</tr>\n", "<tr>\n", " <th>Kurtosis:</th> <td> 4.271</td> <th> Cond. No. </th> <td>7.06e+05</td>\n", "</tr>\n", "</table><br/><br/>Warnings:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.<br/>[2] The condition number is large, 7.06e+05. This might indicate that there are<br/>strong multicollinearity or other numerical problems." ], "text/plain": [ "<class 'statsmodels.iolib.summary.Summary'>\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: life_expectancy R-squared: 0.490\n", "Model: OLS Adj. R-squared: 0.490\n", "Method: Least Squares F-statistic: 8997.\n", "Date: Thu, 12 Dec 2019 Prob (F-statistic): 0.00\n", "Time: 21:50:03 Log-Likelihood: -1.6208e+05\n", "No. Observations: 65656 AIC: 3.242e+05\n", "Df Residuals: 65648 BIC: 3.243e+05\n", "Df Model: 7 \n", "Covariance Type: nonrobust \n", "=========================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "-----------------------------------------------------------------------------------------\n", "Intercept 81.2365 0.122 665.628 0.000 80.997 81.476\n", "pct_black -0.0666 0.001 -56.960 0.000 -0.069 -0.064\n", "pct_white -0.0386 0.001 -36.707 0.000 -0.041 -0.037\n", "pct_hispanic 0.0131 0.001 10.298 0.000 0.011 0.016\n", "pct_less_than_hs -0.0862 0.002 -48.979 0.000 -0.090 -0.083\n", "pct_under_150_poverty -0.0596 0.003 -21.738 0.000 -0.065 -0.054\n", "income 4.825e-05 5.8e-07 83.217 0.000 4.71e-05 4.94e-05\n", "pct_unemployment -0.1490 0.004 -33.408 0.000 -0.158 -0.140\n", "==============================================================================\n", "Omnibus: 2114.193 Durbin-Watson: 1.520\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 4788.035\n", "Skew: 0.183 Prob(JB): 0.00\n", "Kurtosis: 4.271 Cond. No. 7.06e+05\n", "==============================================================================\n", "\n", "Warnings:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "[2] The condition number is large, 7.06e+05. This might indicate that there are\n", "strong multicollinearity or other numerical problems.\n", "\"\"\"" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import statsmodels.formula.api as smf\n", "\n", "model = smf.ols(\"\"\"\n", " life_expectancy ~ pct_black + pct_white + pct_hispanic + pct_less_than_hs\n", " + pct_under_150_poverty + income + pct_unemployment\n", "\"\"\", data=merged)\n", "\n", "results = model.fit()\n", "results.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's a lot to take in, so I'll zero us in on the important parts:\n", " \n", "<img src=\"data:image/png;base64,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AAsTAAALEwEAmpwYAAAFUWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIzMTciIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxNDciIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTEyVDIxOjQyOjA2LTA1OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0xMlQyMTo0Mjo0Ny0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0xMlQyMTo0Mjo0Ny0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJEaXNwbGF5IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdlYjg4NDJiLTk3OTctNGMzNC04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\">" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The coefficient for `pct_unemployment` is -0.15, which means **\"for every percentage point increase in unemployment, life expectancy drops 0.15 years.\"** While this might be _correct_ it unfortunately sounds very stupid.\n", "\n", "Income's coefficient is rather unfortunate, too. \"For every extra dollar in median income, life expectancy goes up 0.00004825 years.\" No thanks! Individual dollars don't really make sense here.\n", "\n", "Instead, it'd be nice to say something like **\"for every ten point increase of unemployment,\"** or **\"for every 10k increase in income.\"** If we were using the dataframes version of regression, we'd create new columns, maybe something like this:\n", "\n", "```python\n", "merged['income_10k'] = merged.income / 10000\n", "merged['unemployment_pct_10pts'] = merged.pct_unemployment / 10\n", "```\n", "\n", "Since we're using the formulas method, though, we can do the division right in the regression!" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<table class=\"simpletable\">\n", "<caption>OLS Regression Results</caption>\n", "<tr>\n", " <th>Dep. Variable:</th> <td>life_expectancy</td> <th> R-squared: </th> <td> 0.490</td> \n", "</tr>\n", "<tr>\n", " <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.490</td> \n", "</tr>\n", "<tr>\n", " <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 8997.</td> \n", "</tr>\n", "<tr>\n", " <th>Date:</th> <td>Thu, 12 Dec 2019</td> <th> Prob (F-statistic):</th> <td> 0.00</td> \n", "</tr>\n", "<tr>\n", " <th>Time:</th> <td>21:50:50</td> <th> Log-Likelihood: </th> <td>-1.6208e+05</td>\n", "</tr>\n", "<tr>\n", " <th>No. Observations:</th> <td> 65656</td> <th> AIC: </th> <td>3.242e+05</td> \n", "</tr>\n", "<tr>\n", " <th>Df Residuals:</th> <td> 65648</td> <th> BIC: </th> <td>3.243e+05</td> \n", "</tr>\n", "<tr>\n", " <th>Df Model:</th> <td> 7</td> <th> </th> <td> </td> \n", "</tr>\n", "<tr>\n", " <th>Covariance Type:</th> <td>nonrobust</td> <th> </th> <td> </td> \n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<tr>\n", " <td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th> \n", "</tr>\n", "<tr>\n", " <th>Intercept</th> <td> 81.2365</td> <td> 0.122</td> <td> 665.628</td> <td> 0.000</td> <td> 80.997</td> <td> 81.476</td>\n", "</tr>\n", "<tr>\n", " <th>pct_black</th> <td> -0.0666</td> <td> 0.001</td> <td> -56.960</td> <td> 0.000</td> <td> -0.069</td> <td> -0.064</td>\n", "</tr>\n", "<tr>\n", " <th>pct_white</th> <td> -0.0386</td> <td> 0.001</td> <td> -36.707</td> <td> 0.000</td> <td> -0.041</td> <td> -0.037</td>\n", "</tr>\n", "<tr>\n", " <th>pct_hispanic</th> <td> 0.0131</td> <td> 0.001</td> <td> 10.298</td> <td> 0.000</td> <td> 0.011</td> <td> 0.016</td>\n", "</tr>\n", "<tr>\n", " <th>pct_less_than_hs</th> <td> -0.0862</td> <td> 0.002</td> <td> -48.979</td> <td> 0.000</td> <td> -0.090</td> <td> -0.083</td>\n", "</tr>\n", "<tr>\n", " <th>pct_under_150_poverty</th> <td> -0.0596</td> <td> 0.003</td> <td> -21.738</td> <td> 0.000</td> <td> -0.065</td> <td> -0.054</td>\n", "</tr>\n", "<tr>\n", " <th>np.divide(income, 10000)</th> <td> 0.4825</td> <td> 0.006</td> <td> 83.217</td> <td> 0.000</td> <td> 0.471</td> <td> 0.494</td>\n", "</tr>\n", "<tr>\n", " <th>np.divide(pct_unemployment, 10)</th> <td> -1.4900</td> <td> 0.045</td> <td> -33.408</td> <td> 0.000</td> <td> -1.577</td> <td> -1.403</td>\n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<tr>\n", " <th>Omnibus:</th> <td>2114.193</td> <th> Durbin-Watson: </th> <td> 1.520</td>\n", "</tr>\n", "<tr>\n", " <th>Prob(Omnibus):</th> <td> 0.000</td> <th> Jarque-Bera (JB): </th> <td>4788.035</td>\n", "</tr>\n", "<tr>\n", " <th>Skew:</th> <td> 0.183</td> <th> Prob(JB): </th> <td> 0.00</td>\n", "</tr>\n", "<tr>\n", " <th>Kurtosis:</th> <td> 4.271</td> <th> Cond. No. </th> <td> 792.</td>\n", "</tr>\n", "</table><br/><br/>Warnings:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "<class 'statsmodels.iolib.summary.Summary'>\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: life_expectancy R-squared: 0.490\n", "Model: OLS Adj. R-squared: 0.490\n", "Method: Least Squares F-statistic: 8997.\n", "Date: Thu, 12 Dec 2019 Prob (F-statistic): 0.00\n", "Time: 21:50:50 Log-Likelihood: -1.6208e+05\n", "No. Observations: 65656 AIC: 3.242e+05\n", "Df Residuals: 65648 BIC: 3.243e+05\n", "Df Model: 7 \n", "Covariance Type: nonrobust \n", "===================================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "---------------------------------------------------------------------------------------------------\n", "Intercept 81.2365 0.122 665.628 0.000 80.997 81.476\n", "pct_black -0.0666 0.001 -56.960 0.000 -0.069 -0.064\n", "pct_white -0.0386 0.001 -36.707 0.000 -0.041 -0.037\n", "pct_hispanic 0.0131 0.001 10.298 0.000 0.011 0.016\n", "pct_less_than_hs -0.0862 0.002 -48.979 0.000 -0.090 -0.083\n", "pct_under_150_poverty -0.0596 0.003 -21.738 0.000 -0.065 -0.054\n", "np.divide(income, 10000) 0.4825 0.006 83.217 0.000 0.471 0.494\n", "np.divide(pct_unemployment, 10) -1.4900 0.045 -33.408 0.000 -1.577 -1.403\n", "==============================================================================\n", "Omnibus: 2114.193 Durbin-Watson: 1.520\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 4788.035\n", "Skew: 0.183 Prob(JB): 0.00\n", "Kurtosis: 4.271 Cond. No. 792.\n", "==============================================================================\n", "\n", "Warnings:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = smf.ols(\"\"\"\n", " life_expectancy ~ \n", " pct_black \n", " + pct_white \n", " + pct_hispanic \n", " + pct_less_than_hs \n", " + pct_under_150_poverty \n", " + np.divide(income, 10000)\n", " + np.divide(pct_unemployment, 10)\n", "\"\"\", data=merged)\n", "\n", "results = model.fit()\n", "results.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**That's much much nicer!** Unemployment now has a -1.49 coefficient, which (surprise!) leads us right back to the [original article](https://apnews.com/66ac44186b6249709501f07a7eab36da):\n", "\n", "> An increase of 10 percentage points in the unemployment rate in a neighborhood translated to a loss of roughly a year and a half of life expectancy, the AP found. \n", "\n", "Additionally, the negative coefficient for `pct_less_than_hs` is the source of this line:\n", "\n", "> A neighborhood where more adults failed to graduate high school had shorter predicted longevity.\n", "\n", "Even though we accomplished this pretty quickly in very few lines of code, the actual process at the Associated Press was somewhat more complicated. They didn't just throw a bunch of columns in a regression!\n", "\n", "Stats-wise, the AP did things like examined other columns that didn't meet a p-value threshold, and reasoned about [collinearity](http://www.stat.tamu.edu/~hart/652/collinear.pdf) between variables different. For domain expertise, they included a threshold for poverty that's actually _above_ the poverty line. This is due to the way that Medicaid provides health insurance to people in low-income households.\n", "\n", "## Review\n", "\n", "In this exercise, we reproduced [an article from the Associated Press](https://apnews.com/66ac44186b6249709501f07a7eab36da) that analyzed life expectancy and demographic information from the census. They used a linear regression to find the relationship between census tract qualities like unemployment, education, race, and income and how long people live.\n", "\n", "After running the regression once, we ran it a second time to get numbers that were **more human and easier to use in a story**, like a \"1.5 year decrease in life expectancy\" as opposed to a 0.15-year or 8-week decrease. We also used the **formula version** of a statsmodels linear regression to perform those calculations in the regression with `np.divide`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Discussion topics\n", "\n", "Let's say we have the sentence \"a 1 percentage point increase in unemployment translates to a 0.15 year decrease in life expectancy.\" How do we change this into something people can appreciate?\n", "\n", "Translate some of your coefficients into the form **\"every X percentage point change in unemployment translates to a Y change in life expectancy.\"** Do this with numbers that are meaningful, and in a way that is easily understandable to your reader.\n", "\n", "What is the difference between using percentage points (0 to 100) vs fractions (0 to 1) when doing a regression analysis?\n", "\n", "Income, education, and race are all related, which can cause problems related to [multicollinearity](https://www.statisticssolutions.com/multicollinearity/) in our analysis. How can we avoid this?\n", "\n", "We should consult someone who \"knows something\" before publishing this story. Where would we go to find someone who understands statistics and the subject matter?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }