"
+ ],
+ "text/plain": [
+ " name FIPS_tract_id \\\n",
+ "4203 Census Tract 3923, Contra Costa County, Califo... 14000US06013392300 \n",
+ "4617 Census Tract 38.06, Kern County, California 14000US06029003806 \n",
+ "5262 Census Tract 2060.20, Los Angeles County, Cali... 14000US06037206020 \n",
+ "5565 Census Tract 2626.01, Los Angeles County, Cali... 14000US06037262601 \n",
+ "12908 Census Tract 303, Fairfield County, Connecticut 14000US09001030300 \n",
+ "14086 Census Tract 102, District of Columbia, Distri... 14000US11001010200 \n",
+ "17668 Census Tract 273.23, Pinellas County, Florida 14000US12103027323 \n",
+ "18102 Census Tract 208.10, Seminole County, Florida 14000US12117020810 \n",
+ "19796 Census Tract 101.02, Liberty County, Georgia 14000US13179010102 \n",
+ "21166 Census Tract 507, Cook County, Illinois 14000US17031050700 \n",
+ "30658 Census Tract 7053, Montgomery County, Maryland 14000US24031705300 \n",
+ "41123 Census Tract 6075.04, Camden County, New Jersey 14000US34007607504 \n",
+ "42632 Census Tract 363.02, Union County, New Jersey 14000US34039036302 \n",
+ "45335 Census Tract 3033.01, Nassau County, New York 14000US36059303301 \n",
+ "51549 Census Tract 69.10, Franklin County, Ohio 14000US39049006910 \n",
+ "62114 Census Tract 1917.01, Bexar County, Texas 14000US48029191701 \n",
+ "66504 Census Tract 22.12, Travis County, Texas 14000US48453002212 \n",
+ "67740 Census Tract 1016.03, Arlington County, Virginia 14000US51013101603 \n",
+ "69094 Census Tract 111, Hampton city, Virginia 14000US51650011100 \n",
+ "69486 Census Tract 432, Virginia Beach city, Virginia 14000US51810043200 \n",
+ "\n",
+ " ratio_pre ratio_post \n",
+ "4203 0.20 1.01 \n",
+ "4617 0.10 1.03 \n",
+ "5262 0.26 1.07 \n",
+ "5565 0.07 1.06 \n",
+ "12908 0.09 1.04 \n",
+ "14086 0.15 1.02 \n",
+ "17668 0.18 1.02 \n",
+ "18102 0.14 1.03 \n",
+ "19796 0.33 1.06 \n",
+ "21166 0.16 1.03 \n",
+ "30658 0.07 1.09 \n",
+ "41123 0.09 1.05 \n",
+ "42632 0.20 1.02 \n",
+ "45335 0.31 1.02 \n",
+ "51549 0.14 1.10 \n",
+ "62114 0.16 1.10 \n",
+ "66504 0.18 1.02 \n",
+ "67740 0.16 1.01 \n",
+ "69094 0.21 1.13 \n",
+ "69486 0.51 1.04 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housing_df[housing_df[\"ratio_post\"] > 1][['name', \"FIPS_tract_id\", \"ratio_pre\", 'ratio_post']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Key Takeaways from the 20 tracts with greater than 100%\n",
+ "\n",
+ "1. Current college enrollment is not prevalent across all tracts\n",
+ "2. The results may make sense - given the median value (USD) of an owned propert any individual, relative to all other low-income housholds (regardless if owned and rented). These may be areas of gentrification, for example. Further analysis through time may be pertinent as a follow-up (not included in this notebook)."
+ ]
+ }
+ ],
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_12_2011_relative_differences_between_methodologies-ranking-percentile.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_12_2011_relative_differences_between_methodologies-ranking-percentile.ipynb
index 7d13e42c..deff9367 100644
--- a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_12_2011_relative_differences_between_methodologies-ranking-percentile.ipynb
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_12_2011_relative_differences_between_methodologies-ranking-percentile.ipynb
@@ -1527,7 +1527,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -1541,7 +1541,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.9"
+ "version": "3.6.2"
}
},
"nbformat": 4,
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_22_2021-revised-denominator_explore_austin_af_analysis.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_22_2021-revised-denominator_explore_austin_af_analysis.ipynb
index 1fb5df81..1eda2136 100644
--- a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_22_2021-revised-denominator_explore_austin_af_analysis.ipynb
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_22_2021-revised-denominator_explore_austin_af_analysis.ipynb
@@ -737,7 +737,7 @@
],
"source": [
"plt.figure(figsize=(12, 8))\n",
- "plt.title('Relative Housing Burden for Low-Income Hosuing Only')\n",
+ "plt.title('Relative Housing Burden for Low-Income Housing Only')\n",
"# Set x-axis label\n",
"plt.xlabel('Ratio')\n",
"# Set y-axis label\n",
@@ -785,147 +785,6 @@
"sns.histplot(housing_df[\"ratio_pre\"])"
]
},
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
FIPS_tract_id
\n",
- "
name
\n",
- "
state
\n",
- "
cnty
\n",
- "
tract
\n",
- "
numerator_pre
\n",
- "
denominator_pre
\n",
- "
denominator_post
\n",
- "
ratio_pre
\n",
- "
ratio_post
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
29008
\n",
- "
14000US22071004402
\n",
- "
Census Tract 44.02, Orleans Parish, Louisiana
\n",
- "
22
\n",
- "
71
\n",
- "
4402
\n",
- "
75
\n",
- "
75
\n",
- "
165
\n",
- "
1.00
\n",
- "
0.45
\n",
- "
\n",
- "
\n",
- "
37514
\n",
- "
14000US29001951000
\n",
- "
Census Tract 9510, Adair County, Missouri
\n",
- "
29
\n",
- "
1
\n",
- "
951000
\n",
- "
55
\n",
- "
55
\n",
- "
75
\n",
- "
1.00
\n",
- "
0.73
\n",
- "
\n",
- "
\n",
- "
43932
\n",
- "
14000US36027640002
\n",
- "
Census Tract 6400.02, Dutchess County, New York
\n",
- "
36
\n",
- "
27
\n",
- "
640002
\n",
- "
48
\n",
- "
50
\n",
- "
50
\n",
- "
0.96
\n",
- "
0.96
\n",
- "
\n",
- "
\n",
- "
71681
\n",
- "
14000US55025001102
\n",
- "
Census Tract 11.02, Dane County, Wisconsin
\n",
- "
55
\n",
- "
25
\n",
- "
1102
\n",
- "
60
\n",
- "
60
\n",
- "
89
\n",
- "
1.00
\n",
- "
0.67
\n",
- "
\n",
- "
\n",
- "
71689
\n",
- "
14000US55025001603
\n",
- "
Census Tract 16.03, Dane County, Wisconsin
\n",
- "
55
\n",
- "
25
\n",
- "
1603
\n",
- "
1460
\n",
- "
1599
\n",
- "
1934
\n",
- "
0.91
\n",
- "
0.75
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " FIPS_tract_id name \\\n",
- "29008 14000US22071004402 Census Tract 44.02, Orleans Parish, Louisiana \n",
- "37514 14000US29001951000 Census Tract 9510, Adair County, Missouri \n",
- "43932 14000US36027640002 Census Tract 6400.02, Dutchess County, New York \n",
- "71681 14000US55025001102 Census Tract 11.02, Dane County, Wisconsin \n",
- "71689 14000US55025001603 Census Tract 16.03, Dane County, Wisconsin \n",
- "\n",
- " state cnty tract numerator_pre denominator_pre denominator_post \\\n",
- "29008 22 71 4402 75 75 165 \n",
- "37514 29 1 951000 55 55 75 \n",
- "43932 36 27 640002 48 50 50 \n",
- "71681 55 25 1102 60 60 89 \n",
- "71689 55 25 1603 1460 1599 1934 \n",
- "\n",
- " ratio_pre ratio_post \n",
- "29008 1.00 0.45 \n",
- "37514 1.00 0.73 \n",
- "43932 0.96 0.96 \n",
- "71681 1.00 0.67 \n",
- "71689 0.91 0.75 "
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# So only 4 that are > 90%\n",
- "housing_df[housing_df[\"ratio_pre\"] > 0.90]"
- ]
- },
{
"cell_type": "code",
"execution_count": 15,
@@ -2617,18 +2476,11 @@
"source": [
"seg_austin_2013.statistic"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -2642,7 +2494,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.4"
+ "version": "3.6.2"
}
},
"nbformat": 4,
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_26_2011_relative_differences_between_methodologies-ranking-percentile-comparison-difference-presentation.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_26_2011_relative_differences_between_methodologies-ranking-percentile-comparison-difference-presentation.ipynb
new file mode 100644
index 00000000..d8af856a
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_26_2011_relative_differences_between_methodologies-ranking-percentile-comparison-difference-presentation.ipynb
@@ -0,0 +1,2992 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Current methodology for housing burden where tracts meet the environemental burden threshold (n = 7323 tracts)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 85,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 85,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title(\"Distribution of Percentiles for Housing Burden (Score L)\")\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Percentile (although currently not represented as a percentage)')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(non_null_df[\"current_methodology_percentile_rank\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Below is the summarization of the tracts that are not common between Score L and the CalEnviroScreen's Ranked Percentile \n",
+ "\n",
+ "Here (n = 5013 tracts in the set of 67, 813 tracts with reliable population estimates - as per CalEnviroScreen's methodology). Of these 2, 741 tracts met Score L's threshold for environemental burden (I will be reviewing this with further summaries), but were not in the burdened threshold using CalEnviroScreen's Ranked Percentile methodology. Conversely, 2, 272 did _not_ meet Score L's threshold for environemental burden (again, I will be reviewing this with further summaries), but were not in the burdened threshold using CalEnviroScreen's Ranked Percentile methodology.\n",
+ "\n",
+ "It should be noted that 53 tracts, because of unreliable population estimates - as per CalEnviroScreen's methodology - were not included in the threshold computation. However, these same 53 tracts are considered burdened in Score L. This is equivalent to 3145 households.\n",
+ "\n",
+ "Below is a summary of the aggregate 5013 tracts. Each column presents a grouped statistic of the median percentage of the specified population characteristic across all tracts in that state. To present trends and contrasts between states, I prepared bar graphs relative to the midpoint value of the medians in that given column (really the median of medians). The attached Excel file represents the same data, but I highlight the cells where the given median for the state is greater than the median of all of the state samples for any given population characteristic."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 86,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
Percent individuals age 25 or over with less than high school degree (median across all tracts)
Percent enrollment in college or graduate school (median across all tracts)
Percent Black or African American alone (median across all tracts)
Percent American Indian and Alaska Native alone (median across all tracts)
Percent Non-Hispanic White (median across all tracts)
Percent Hispanic or Latino (median across all tracts)
Total Number of Unique Tracts
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Compute the correlation matrix\n",
+ "import seaborn as sns\n",
+ "corr = merged_df[[\"hbrd_rank\", \n",
+ " \"current_methodology_percentile_rank\"] + percent_cols].corr()\n",
+ "\n",
+ "# Generate a mask for the upper triangle\n",
+ "mask = np.triu(np.ones_like(corr, dtype=bool))\n",
+ "\n",
+ "# Set up the matplotlib figure\n",
+ "f, ax = plt.subplots(figsize=(15, 12))\n",
+ "\n",
+ "# Generate a custom diverging colormap\n",
+ "cmap = sns.diverging_palette(230, 20, as_cmap=True)\n",
+ "\n",
+ "# Draw the heatmap with the mask and correct aspect ratio\n",
+ "sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,\n",
+ " square=True, linewidths=.5, cbar_kws={\"shrink\": .5})"
]
},
{
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization-variance.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization-variance.ipynb
new file mode 100644
index 00000000..caa4202d
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization-variance.ipynb
@@ -0,0 +1,8783 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Whereas we have presented statistics that describe the central tendencies of a data set, we are also interested in ones that describe the spread or variability of the data values. A statistic that could be used for this purpose would be one that measures the average value of the squares of the distances between the data values and the sample mean. This is accomplished by the sample variance, which for technical reasons divides the sum of the squares of the differences by $n-1$ rather than $n$, where $n$ is the size of the data set."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Indicator reviewed: \n",
+ "\n",
+ "Socioeconomic Factors Indicator reviewed\n",
+ "* [Extreme Housing Burden](#housingburden)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Packages"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### ETL process for acquiring relevant tables"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### NOTE: If you ran the ETL Process to acquire Table 8 in the other notebook of this draft PR you do not need to run the ETL cell block again"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Copy and adapt certain sections of code from data_pipeline.utils \n",
+ "\n",
+ "def download_hud_dataset():\n",
+ " DOWNLOAD_FILENAME = \"HUD_ZIPPED.csv\"\n",
+ " HOUSING_FTP_URL = \"https://www.huduser.gov/portal/datasets/cp/2014thru2018-140-csv.zip\" \n",
+ " response = requests.get(HOUSING_FTP_URL, verify=True)\n",
+ " if response.status_code == 200:\n",
+ " file_contents = response.content\n",
+ " else:\n",
+ " sys.exit(\n",
+ " f\"HTTP response {response.status_code} from url {file_url}. Info: {response.content}\"\n",
+ " )\n",
+ "\n",
+ " # Write the contents to disk.\n",
+ " file = open(DOWNLOAD_FILENAME, \"wb\")\n",
+ " file.write(file_contents)\n",
+ " file.close()\n",
+ " \n",
+ "def extract_zipped_download(zip_file_path, unzipped_path):\n",
+ " with zipfile.ZipFile(zip_file_path, \"r\") as zip_ref:\n",
+ " zip_ref.extractall(unzipped_path)\n",
+ " # cleanup temporary file\n",
+ " os.remove(zip_file_path)\n",
+ " \n",
+ "def up_one_directory(path):\n",
+ " try:\n",
+ " # from Python 3.6\n",
+ " parent_dir = Path(path).parents[1]\n",
+ " # for Python 3.4/3.5, use str to convert the path to string\n",
+ " # parent_dir = str(Path(path).parents[1])\n",
+ " shutil.move(path, parent_dir)\n",
+ " except IndexError:\n",
+ " # no upper directory\n",
+ " pass\n",
+ "\n",
+ "CURRENT_DIRECTORY = os.getcwd()\n",
+ "download_hud_dataset()\n",
+ "extract_zipped_download(CURRENT_DIRECTORY + \"/HUD_ZIPPED.csv\", CURRENT_DIRECTORY) \n",
+ "up_one_directory(CURRENT_DIRECTORY + \"/140/Table8.csv\")\n",
+ "shutil.rmtree(\"./140/\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Below I also propose an alternate means for ranking census tracts\n",
+ "### These steps are outlined and commented below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/series.py:726: RuntimeWarning: invalid value encountered in sqrt\n",
+ " result = getattr(ufunc, method)(*inputs, **kwargs)\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " iloc._setitem_with_indexer(indexer, value)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Read in the data from https://www.huduser.gov/portal/datasets/cp.html\n",
+ "housing = pd.read_csv(\"Table8.csv\", \n",
+ " encoding = \"ISO-8859-1\", \n",
+ " dtype = {'Tract_ID': object, 'st': object, 'geoid': object})\n",
+ "\n",
+ "# Remove data for states that aren't included in the census (e.g. American Samoa, Guam, etc.):\n",
+ "housing.drop(housing.loc[housing['st'] == '72'].index, inplace = True)\n",
+ "\n",
+ "# Combine owner and renter occupied low-income households that make less than 80% of HAMFI into one variable\n",
+ "housing['summed'] = (housing['T8_est10'] + \n",
+ " housing['T8_est23'] + \n",
+ " housing['T8_est36'] + \n",
+ " housing['T8_est76'] + \n",
+ " housing['T8_est89'] + \n",
+ " housing['T8_est102'])\n",
+ "\n",
+ "# Create a variable for the standard error of the summed variables\n",
+ "housing['summed_se'] = np.sqrt((housing['T8_moe10'] / 1.645)**2 + \n",
+ " (housing['T8_moe23'] / 1.645)**2 + \n",
+ " (housing['T8_moe36'] / 1.645)**2 + \n",
+ " (housing['T8_moe76'] / 1.645)**2 + \n",
+ " (housing['T8_moe89'] / 1.645)**2 + \n",
+ " (housing['T8_moe102'] / 1.645)**2)\n",
+ "\n",
+ "# Remove the first 7 digits in the FIPS Census Tract ID \n",
+ "housing['geoid'] = housing['geoid'].str[-11:]\n",
+ "\n",
+ "# Find the estimate of the proportion of the population that is heavily rent burdened\n",
+ "housing['hbrd_score'] = housing['summed'] / housing['T8_est1']\n",
+ "\n",
+ "# Change rates where the population is 0 to nan\n",
+ "housing['hbrd_score'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Create function for calculating the standard error, using the proportions standard error formula\n",
+ "# if the value under the radical is negative, use the ratio standard error formula\n",
+ "def se_prop(x, y, se_x, moe_y): \n",
+ " se_y = moe_y / 1.645\n",
+ " test = se_x**2 - (((x**2)/(y**2))*((se_y)**2))\n",
+ " se = np.where(test < 0,\n",
+ " (1/y) * np.sqrt(se_x**2 + (((x**2)/(y**2))*(se_y**2))), \n",
+ " (1/y) * np.sqrt(se_x**2 - (((x**2)/(y**2))*(se_y**2))))\n",
+ " return se\n",
+ "\n",
+ "housing['se'] = se_prop(housing['summed'], housing['T8_est1'], housing['summed_se'], housing['T8_moe1'])\n",
+ "\n",
+ "# Calculate the relative standard error\n",
+ "housing['rse'] = housing['se'] / housing['hbrd_score']*100\n",
+ "\n",
+ "# Change infinite rse's where the housing burden is 0 to np.nan\n",
+ "housing['rse'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Calculate the mean standard error for each state\n",
+ "housing['mean_state_se'] = np.zeros(len(housing))\n",
+ "\n",
+ "for state in housing['st'].unique():\n",
+ " mean_se = np.mean(housing[housing['st'] == state]['se'])\n",
+ " housing['mean_state_se'].loc[housing['st'] == state] = mean_se\n",
+ " \n",
+ "# Find census tract estimates that meet both of the following criteria and are thus considered unreliable estimates: \n",
+ "# RSE less than 50 AND\n",
+ "# SE less than the mean state SE or housing burdened low income households\n",
+ "# Convert these scores to nan\n",
+ "housing.loc[(housing['rse'] >= 50) & (housing['rse'] >= housing['mean_state_se']), 'hbrd_score'] = np.nan\n",
+ "\n",
+ "# Rename columns\n",
+ "housing = housing.rename(columns = {'geoid' :'FIPS_tract_id',\n",
+ " 'st' : 'state'\n",
+ " })\n",
+ "\n",
+ "# Calculate percentile rank for census tracts with a score above 0, set percentile to 0 if score is 0, for each state\n",
+ "housing['hbrd_rank'] = housing[\n",
+ " housing['hbrd_score'] != 0][['hbrd_score',\n",
+ " 'state']].groupby('state').rank( \n",
+ " na_option = 'keep', \n",
+ " pct = True) * 100\n",
+ "\n",
+ "housing.loc[housing['hbrd_score'] == 0, 'hbrd_rank'] = 0\n",
+ "\n",
+ "# Create final housing burden df\n",
+ "housingburden = housing.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
source
\n",
+ "
sumlevel
\n",
+ "
FIPS_tract_id
\n",
+ "
name
\n",
+ "
state
\n",
+ "
cnty
\n",
+ "
tract
\n",
+ "
T8_est1
\n",
+ "
T8_est2
\n",
+ "
T8_est3
\n",
+ "
...
\n",
+ "
T8_moe131
\n",
+ "
T8_moe132
\n",
+ "
T8_moe133
\n",
+ "
summed
\n",
+ "
summed_se
\n",
+ "
hbrd_score
\n",
+ "
se
\n",
+ "
rse
\n",
+ "
mean_state_se
\n",
+ "
hbrd_rank
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020100
\n",
+ "
Census Tract 201, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20100
\n",
+ "
765
\n",
+ "
570
\n",
+ "
50
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
80
\n",
+ "
31.721807
\n",
+ "
0.104575
\n",
+ "
0.041032
\n",
+ "
39.237314
\n",
+ "
0.036604
\n",
+ "
46.298077
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020200
\n",
+ "
Census Tract 202, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20200
\n",
+ "
720
\n",
+ "
465
\n",
+ "
65
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
138
\n",
+ "
45.531874
\n",
+ "
0.191667
\n",
+ "
0.061614
\n",
+ "
32.146659
\n",
+ "
0.036604
\n",
+ "
83.269231
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020300
\n",
+ "
Census Tract 203, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20300
\n",
+ "
1295
\n",
+ "
840
\n",
+ "
60
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
170
\n",
+ "
53.722921
\n",
+ "
0.131274
\n",
+ "
0.040927
\n",
+ "
31.176999
\n",
+ "
0.036604
\n",
+ "
63.653846
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020400
\n",
+ "
Census Tract 204, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20400
\n",
+ "
1640
\n",
+ "
1260
\n",
+ "
15
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
145
\n",
+ "
46.288510
\n",
+ "
0.088415
\n",
+ "
0.027822
\n",
+ "
31.467397
\n",
+ "
0.036604
\n",
+ "
34.615385
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020500
\n",
+ "
Census Tract 205, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20500
\n",
+ "
4175
\n",
+ "
2320
\n",
+ "
175
\n",
+ "
...
\n",
+ "
17
\n",
+ "
17
\n",
+ "
17
\n",
+ "
595
\n",
+ "
147.221693
\n",
+ "
0.142515
\n",
+ "
0.034760
\n",
+ "
24.390193
\n",
+ "
0.036604
\n",
+ "
68.221154
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 280 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source sumlevel FIPS_tract_id \\\n",
+ "0 2014thru2018 140 01001020100 \n",
+ "1 2014thru2018 140 01001020200 \n",
+ "2 2014thru2018 140 01001020300 \n",
+ "3 2014thru2018 140 01001020400 \n",
+ "4 2014thru2018 140 01001020500 \n",
+ "\n",
+ " name state cnty tract T8_est1 \\\n",
+ "0 Census Tract 201, Autauga County, Alabama 01 1 20100 765 \n",
+ "1 Census Tract 202, Autauga County, Alabama 01 1 20200 720 \n",
+ "2 Census Tract 203, Autauga County, Alabama 01 1 20300 1295 \n",
+ "3 Census Tract 204, Autauga County, Alabama 01 1 20400 1640 \n",
+ "4 Census Tract 205, Autauga County, Alabama 01 1 20500 4175 \n",
+ "\n",
+ " T8_est2 T8_est3 ... T8_moe131 T8_moe132 T8_moe133 summed summed_se \\\n",
+ "0 570 50 ... 12 12 12 80 31.721807 \n",
+ "1 465 65 ... 12 12 12 138 45.531874 \n",
+ "2 840 60 ... 12 12 12 170 53.722921 \n",
+ "3 1260 15 ... 12 12 12 145 46.288510 \n",
+ "4 2320 175 ... 17 17 17 595 147.221693 \n",
+ "\n",
+ " hbrd_score se rse mean_state_se hbrd_rank \n",
+ "0 0.104575 0.041032 39.237314 0.036604 46.298077 \n",
+ "1 0.191667 0.061614 32.146659 0.036604 83.269231 \n",
+ "2 0.131274 0.040927 31.176999 0.036604 63.653846 \n",
+ "3 0.088415 0.027822 31.467397 0.036604 34.615385 \n",
+ "4 0.142515 0.034760 24.390193 0.036604 68.221154 \n",
+ "\n",
+ "[5 rows x 280 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(73056, 280)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As desired we see a uniform distribution for the percentile rank for burdened households"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we compute for a baseline comparison "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Owner occupied numerator fields\n",
+ "OWNER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est7\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est10\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est20\",\n",
+ " \n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est23\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est33\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est36\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "OWNER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est13\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est26\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est39\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est52\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est65\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_FIELD = \"T8_est2\"\n",
+ "# Subtotal\n",
+ "# Owner occupied\n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_HAMFI_FIELD = \"T8_est3\"\n",
+ "# Subtotal\n",
+ "# Owner occupied \n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "# Renter occupied numerator fields\n",
+ "RENTER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est73\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est76\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est86\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est89\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est99\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est102\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "RENTER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est79\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tless than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est92\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est105\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est118\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est131\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# T8_est68\tSubtotalRenter occupied\tAll\tAll\tAll\n",
+ "RENTER_OCCUPIED_POPULATION_FIELD = \"T8_est68\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_summed_methodology\"] = housingburden[\n",
+ " OWNER_OCCUPIED_NUMERATOR_FIELDS\n",
+ "].sum(axis=1) + housingburden[RENTER_OCCUPIED_NUMERATOR_FIELDS].sum(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ " - housingburden[OWNER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ " - housingburden[RENTER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator_sans_not_computed\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_percent\"] = np.round(\n",
+ " (housingburden[\"current_summed_methodology\"] / housingburden[\"current_methodology_denominator\"] ), 2) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we construct the distribution of differences in the number of owned and rented burdened households\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_df = housingburden[['FIPS_tract_id', 'state','hbrd_rank','hbrd_score', 'summed', \n",
+ " 'current_summed_methodology', 'T8_est1', \n",
+ " \"current_methodology_denominator_sans_not_computed\",\n",
+ " 'current_methodology_denominator', 'current_methodology_percent']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### First notice here that **T8_est1** and **current_methodology_denominator** should represent same or similar aggregates. In general, we cen see that the current computation performed results in a differerntial that undercounts the total occupied and rental households."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator_sans_not_computed\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title('Distribution of differences between aggregate totals that normalizes tabulation of poverty households (with removal of not computed fields) ')\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Aggregate differences in total owner and renter occupied low-income households')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(final_df[\"differences_aggregate_denominator_sans_not_computed\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " after removing the cwd from sys.path.\n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"current_methodology_percentile_rank\"] = final_df[\"current_methodology_percent\"].rank(\n",
+ " pct=True,\n",
+ " # Set ascending to the parameter value.\n",
+ " ascending=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \"\"\"Entry point for launching an IPython kernel.\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " after removing the cwd from sys.path.\n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"new_threshold_exceeded\"] = (final_df['hbrd_rank'] >= 90)\n",
+ "\n",
+ "final_df[\"current_threshold_exceeded\"] = (final_df[\n",
+ " 'current_methodology_percentile_rank'] >= 0.90)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Only include non-NA tracts for comparison purposes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# first save NA tracts that were considered unreliable\n",
+ "ineligible_tracts = list(final_df[final_df[\"hbrd_rank\"].isna()][\"FIPS_tract_id\"].values)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5243"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(ineligible_tracts)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### How many tracts are ineligible according to CalEnvironScreen but are considerd in Score L?\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_current_methodology = final_df[final_df[\"current_methodology_percentile_rank\"] >= 0.90]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(7323, 15)"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final_current_methodology.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(53, 15)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 53 tracts\n",
+ "final_current_methodology[\n",
+ " final_current_methodology.FIPS_tract_id.isin(ineligible_tracts)].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "non_null_df = final_df.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(7323, 15)"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# number of tracks eligible\n",
+ "non_null_df[non_null_df[\"current_methodology_percentile_rank\"] >= 0.90].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title(\"Distribution of Percentiles for Housing Burden (Score L)\")\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Percentile (although currently not represented as a percentage)')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(non_null_df[\"current_methodology_percentile_rank\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False 65733\n",
+ "True 7323\n",
+ "Name: current_threshold_exceeded, dtype: int64"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "non_null_df[\"current_threshold_exceeded\"].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False 66255\n",
+ "True 6801\n",
+ "Name: new_threshold_exceeded, dtype: int64"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "non_null_df[\"new_threshold_exceeded\"].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Score L Criterion as burden but not Calenvironscreen"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2794, 15)"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# this includes uineligible np.nan values too\n",
+ "predicate_1 = (non_null_df['current_threshold_exceeded'] == True) & (non_null_df['new_threshold_exceeded'] != True)\n",
+ "\n",
+ "non_null_df[predicate_1].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Where Score L is considered burdened but not in CalEnviroScreen\n",
+ "score_l_considered_burdened = non_null_df[predicate_1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import us\n",
+ "\n",
+ "mapping = us.states.mapping('fips', 'abbr')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Inserted after the basic stats definition.\n",
+ "# Load demographic data\n",
+ "import pathlib\n",
+ "\n",
+ "DATA_DIR = pathlib.Path.cwd().parent / \"data\"\n",
+ "COMPARISON_OUTPUTS_DIR = DATA_DIR / \"comparison_outputs\"\n",
+ "\n",
+ "demographics_path = DATA_DIR / \"dataset\" / \"census_acs_2019\" / \"usa.csv\"\n",
+ "\n",
+ "demographics_df = pd.read_csv(\n",
+ " demographics_path,\n",
+ " dtype={\"GEOID10_TRACT\": \"string\"},\n",
+ ")\n",
+ "\n",
+ "# Set some field names\n",
+ "BLACK_FIELD_NAME = \"Black or African American alone\"\n",
+ "AMERICAN_INDIAN_FIELD_NAME = \"American Indian and Alaska Native alone\"\n",
+ "ASIAN_FIELD_NAME = \"Asian alone\"\n",
+ "HAWAIIAN_FIELD_NAME = \"Native Hawaiian and Other Pacific alone\"\n",
+ "TWO_OR_MORE_RACES_FIELD_NAME = \"Two or more races\"\n",
+ "NON_HISPANIC_WHITE_FIELD_NAME = \"Non-Hispanic White\"\n",
+ "HISPANIC_FIELD_NAME = \"Hispanic or Latino\"\n",
+ "PERCENT_PREFIX = \"Percent \"\n",
+ "\n",
+ "RE_OUTPUT_FIELDS = [\n",
+ " BLACK_FIELD_NAME,\n",
+ " AMERICAN_INDIAN_FIELD_NAME,\n",
+ " ASIAN_FIELD_NAME,\n",
+ " HAWAIIAN_FIELD_NAME,\n",
+ " TWO_OR_MORE_RACES_FIELD_NAME,\n",
+ " NON_HISPANIC_WHITE_FIELD_NAME,\n",
+ " HISPANIC_FIELD_NAME,\n",
+ "]\n",
+ "\n",
+ "RE_PERCENT_OUTPUT_FIELDS = [PERCENT_PREFIX + field for field in RE_OUTPUT_FIELDS]\n",
+ "\n",
+ "columns_to_keep = (\n",
+ " [\"GEOID10_TRACT\"]\n",
+ " + RE_OUTPUT_FIELDS\n",
+ " + RE_PERCENT_OUTPUT_FIELDS\n",
+ " + ['Percent of individuals < 200% Federal Poverty Line', \n",
+ " 'Median value ($) of owner-occupied housing units',\n",
+ " 'Percent individuals age 25 or over with less than high school degree',\n",
+ " 'Percent enrollment in college or graduate school',\n",
+ " 'Linguistic isolation (percent)']\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def highlight_deviations(s):\n",
+ " # unbiased estimate of variance N-1\n",
+ " # \n",
+ " is_greater_than_std = s > np.var(s, ddof=1) \n",
+ " return ['color: pink; background-color:#7272FE'\n",
+ " if cell else '' for cell in is_greater_than_std]\n",
+ "# Join the demographics in.\n",
+ "merged_df_score_l = score_l_considered_burdened.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_score_l.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_score_l[\n",
+ " percent_cols] = merged_df_score_l[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_score_l.iterrows():\n",
+ " current_row = str(merged_df_score_l.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_score_l.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_score_l = merged_df_score_l.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': ['nunique'],\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_score_l.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_score_l.columns.values]\n",
+ "\n",
+ "grouped_stats_score_l = grouped_stats_score_l[[x for x in grouped_stats_score_l \n",
+ " if \"std\" in x and \n",
+ " \"Percent\" in x] + [\"state_name\", \"current_summed_methodology std\"]]\n",
+ "\n",
+ "grouped_stats_score_l.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_score_l = grouped_stats_score_l.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line std'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (variance across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree std':\n",
+ "'Percent individuals age 25 or over with less than high school degree (variance across all tracts)', \n",
+ "'Percent enrollment in college or graduate school std'\n",
+ " :'Percent enrollment in college or graduate school (variance across all tracts)',\n",
+ "'Percent Black or African American alone std':\n",
+ " 'Percent Black or African American alone (variance across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone std':\n",
+ " 'Percent American Indian and Alaska Native alone (variance across all tracts)',\n",
+ "'Percent Non-Hispanic White std':\n",
+ " 'Percent Non-Hispanic White (variance across all tracts)',\n",
+ "'Percent Hispanic or Latino std':\n",
+ " 'Percent Hispanic or Latino (variance across all tracts)',\n",
+ "'GEOID10_TRACT std': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology std\": \"Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (variance across all tracts)
Percent individuals age 25 or over with less than high school degree (variance across all tracts)
Percent enrollment in college or graduate school (variance across all tracts)
Percent Black or African American alone (variance across all tracts)
Percent American Indian and Alaska Native alone (variance across all tracts)
Percent Non-Hispanic White (variance across all tracts)
Percent Hispanic or Latino (variance across all tracts)
Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)
state_name
\n",
+ "
\n",
+ "
AK
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
13.096420
\n",
+ "
6.644986
\n",
+ "
18.768604
\n",
+ "
22.959179
\n",
+ "
0.223087
\n",
+ "
19.330296
\n",
+ "
8.007999
\n",
+ "
270.819158
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
10.127382
\n",
+ "
2.668122
\n",
+ "
18.672822
\n",
+ "
27.711878
\n",
+ "
0.128748
\n",
+ "
25.898087
\n",
+ "
10.756406
\n",
+ "
209.143292
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
10.486301
\n",
+ "
12.746237
\n",
+ "
10.384138
\n",
+ "
6.623942
\n",
+ "
3.516648
\n",
+ "
20.546898
\n",
+ "
22.871205
\n",
+ "
256.224598
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
12.549906
\n",
+ "
14.188819
\n",
+ "
6.086854
\n",
+ "
10.530709
\n",
+ "
1.368453
\n",
+ "
15.571862
\n",
+ "
23.690174
\n",
+ "
256.209407
\n",
+ "
\n",
+ "
\n",
+ "
CO
\n",
+ "
10.722463
\n",
+ "
11.736295
\n",
+ "
3.463817
\n",
+ "
10.505513
\n",
+ "
1.945477
\n",
+ "
14.866184
\n",
+ "
20.168076
\n",
+ "
332.327502
\n",
+ "
\n",
+ "
\n",
+ "
CT
\n",
+ "
15.465593
\n",
+ "
8.918645
\n",
+ "
15.309077
\n",
+ "
15.980431
\n",
+ "
1.014369
\n",
+ "
18.551638
\n",
+ "
16.610853
\n",
+ "
308.514106
\n",
+ "
\n",
+ "
\n",
+ "
DC
\n",
+ "
8.961433
\n",
+ "
5.354725
\n",
+ "
9.025222
\n",
+ "
15.403556
\n",
+ "
0.762443
\n",
+ "
6.219621
\n",
+ "
11.580841
\n",
+ "
205.735892
\n",
+ "
\n",
+ "
\n",
+ "
DE
\n",
+ "
14.287035
\n",
+ "
5.871034
\n",
+ "
1.561105
\n",
+ "
39.316172
\n",
+ "
0.528421
\n",
+ "
23.042214
\n",
+ "
16.399730
\n",
+ "
186.876965
\n",
+ "
\n",
+ "
\n",
+ "
FL
\n",
+ "
11.714190
\n",
+ "
10.517453
\n",
+ "
11.329509
\n",
+ "
28.076545
\n",
+ "
1.098837
\n",
+ "
22.576143
\n",
+ "
27.968331
\n",
+ "
336.712451
\n",
+ "
\n",
+ "
\n",
+ "
GA
\n",
+ "
12.454072
\n",
+ "
10.852123
\n",
+ "
10.962984
\n",
+ "
28.469164
\n",
+ "
1.329249
\n",
+ "
15.984924
\n",
+ "
20.115423
\n",
+ "
397.215028
\n",
+ "
\n",
+ "
\n",
+ "
HI
\n",
+ "
13.353624
\n",
+ "
10.272067
\n",
+ "
4.015181
\n",
+ "
1.586014
\n",
+ "
0.424435
\n",
+ "
12.917891
\n",
+ "
7.466775
\n",
+ "
234.634661
\n",
+ "
\n",
+ "
\n",
+ "
IA
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
2.004231
\n",
+ "
2.748204
\n",
+ "
11.360449
\n",
+ "
0.175057
\n",
+ "
0.037512
\n",
+ "
22.369833
\n",
+ "
19.631435
\n",
+ "
659.730627
\n",
+ "
\n",
+ "
\n",
+ "
IL
\n",
+ "
13.006770
\n",
+ "
12.071458
\n",
+ "
13.097981
\n",
+ "
36.591041
\n",
+ "
0.845755
\n",
+ "
19.745136
\n",
+ "
33.788104
\n",
+ "
262.443072
\n",
+ "
\n",
+ "
\n",
+ "
IN
\n",
+ "
15.355784
\n",
+ "
8.296981
\n",
+ "
31.632866
\n",
+ "
28.682654
\n",
+ "
0.642208
\n",
+ "
27.218018
\n",
+ "
7.313774
\n",
+ "
427.114975
\n",
+ "
\n",
+ "
\n",
+ "
KS
\n",
+ "
0.105077
\n",
+ "
14.301996
\n",
+ "
0.843603
\n",
+ "
12.411843
\n",
+ "
0.074661
\n",
+ "
0.480065
\n",
+ "
6.454849
\n",
+ "
308.298557
\n",
+ "
\n",
+ "
\n",
+ "
KY
\n",
+ "
6.181253
\n",
+ "
9.634419
\n",
+ "
38.657259
\n",
+ "
11.530427
\n",
+ "
0.635681
\n",
+ "
12.385339
\n",
+ "
10.232876
\n",
+ "
336.240655
\n",
+ "
\n",
+ "
\n",
+ "
LA
\n",
+ "
12.026310
\n",
+ "
10.236242
\n",
+ "
14.053154
\n",
+ "
20.922732
\n",
+ "
0.560395
\n",
+ "
14.902354
\n",
+ "
9.279719
\n",
+ "
305.110126
\n",
+ "
\n",
+ "
\n",
+ "
MA
\n",
+ "
11.892144
\n",
+ "
8.977388
\n",
+ "
13.075436
\n",
+ "
20.118430
\n",
+ "
1.210053
\n",
+ "
22.399207
\n",
+ "
20.572927
\n",
+ "
253.379191
\n",
+ "
\n",
+ "
\n",
+ "
MD
\n",
+ "
13.540719
\n",
+ "
8.718223
\n",
+ "
8.779790
\n",
+ "
27.535370
\n",
+ "
2.603511
\n",
+ "
19.685054
\n",
+ "
14.383766
\n",
+ "
259.769712
\n",
+ "
\n",
+ "
\n",
+ "
ME
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
\n",
+ "
\n",
+ "
MI
\n",
+ "
12.206230
\n",
+ "
10.414820
\n",
+ "
8.344255
\n",
+ "
32.771988
\n",
+ "
1.274467
\n",
+ "
23.474760
\n",
+ "
15.933231
\n",
+ "
243.462106
\n",
+ "
\n",
+ "
\n",
+ "
MN
\n",
+ "
12.561878
\n",
+ "
12.686021
\n",
+ "
2.782432
\n",
+ "
6.117358
\n",
+ "
2.959547
\n",
+ "
5.976334
\n",
+ "
7.635743
\n",
+ "
372.645274
\n",
+ "
\n",
+ "
\n",
+ "
MO
\n",
+ "
13.801131
\n",
+ "
6.159233
\n",
+ "
28.603340
\n",
+ "
32.635864
\n",
+ "
0.684768
\n",
+ "
27.405787
\n",
+ "
8.255299
\n",
+ "
432.829801
\n",
+ "
\n",
+ "
\n",
+ "
MS
\n",
+ "
12.689076
\n",
+ "
14.917930
\n",
+ "
3.427233
\n",
+ "
31.276492
\n",
+ "
0.196270
\n",
+ "
18.861527
\n",
+ "
9.070286
\n",
+ "
261.432326
\n",
+ "
\n",
+ "
\n",
+ "
NC
\n",
+ "
9.108144
\n",
+ "
11.824309
\n",
+ "
27.548123
\n",
+ "
21.370015
\n",
+ "
0.743425
\n",
+ "
20.209928
\n",
+ "
15.247821
\n",
+ "
347.903709
\n",
+ "
\n",
+ "
\n",
+ "
NE
\n",
+ "
13.801541
\n",
+ "
31.910941
\n",
+ "
5.980482
\n",
+ "
5.475750
\n",
+ "
0.314786
\n",
+ "
26.539885
\n",
+ "
35.131407
\n",
+ "
280.014285
\n",
+ "
\n",
+ "
\n",
+ "
NH
\n",
+ "
13.905494
\n",
+ "
5.839268
\n",
+ "
2.002443
\n",
+ "
6.864877
\n",
+ "
0.045579
\n",
+ "
19.519998
\n",
+ "
9.904841
\n",
+ "
107.145929
\n",
+ "
\n",
+ "
\n",
+ "
NJ
\n",
+ "
12.751987
\n",
+ "
10.917427
\n",
+ "
7.627366
\n",
+ "
29.765513
\n",
+ "
0.828170
\n",
+ "
20.250063
\n",
+ "
26.757247
\n",
+ "
250.668671
\n",
+ "
\n",
+ "
\n",
+ "
NV
\n",
+ "
8.890420
\n",
+ "
13.933522
\n",
+ "
9.220581
\n",
+ "
8.618445
\n",
+ "
1.541162
\n",
+ "
12.816087
\n",
+ "
20.475023
\n",
+ "
281.744159
\n",
+ "
\n",
+ "
\n",
+ "
NY
\n",
+ "
15.367349
\n",
+ "
10.482482
\n",
+ "
9.360769
\n",
+ "
27.298293
\n",
+ "
1.159137
\n",
+ "
23.472950
\n",
+ "
24.695955
\n",
+ "
355.029729
\n",
+ "
\n",
+ "
\n",
+ "
OH
\n",
+ "
12.115013
\n",
+ "
7.563112
\n",
+ "
17.611845
\n",
+ "
28.132683
\n",
+ "
0.520454
\n",
+ "
22.310130
\n",
+ "
8.078694
\n",
+ "
232.867404
\n",
+ "
\n",
+ "
\n",
+ "
OK
\n",
+ "
16.722990
\n",
+ "
12.331665
\n",
+ "
26.929758
\n",
+ "
10.812809
\n",
+ "
2.692355
\n",
+ "
22.097798
\n",
+ "
21.618860
\n",
+ "
282.164508
\n",
+ "
\n",
+ "
\n",
+ "
OR
\n",
+ "
8.049124
\n",
+ "
7.106145
\n",
+ "
2.336371
\n",
+ "
6.059180
\n",
+ "
1.664208
\n",
+ "
16.590982
\n",
+ "
17.607034
\n",
+ "
339.545074
\n",
+ "
\n",
+ "
\n",
+ "
PA
\n",
+ "
13.320894
\n",
+ "
8.621532
\n",
+ "
12.548759
\n",
+ "
29.858866
\n",
+ "
0.511653
\n",
+ "
24.167443
\n",
+ "
25.464024
\n",
+ "
244.351269
\n",
+ "
\n",
+ "
\n",
+ "
RI
\n",
+ "
9.497666
\n",
+ "
10.185129
\n",
+ "
7.827082
\n",
+ "
7.240360
\n",
+ "
1.648013
\n",
+ "
16.325544
\n",
+ "
18.332274
\n",
+ "
162.327648
\n",
+ "
\n",
+ "
\n",
+ "
SC
\n",
+ "
5.626563
\n",
+ "
8.208185
\n",
+ "
4.638011
\n",
+ "
21.833560
\n",
+ "
0.298131
\n",
+ "
20.698122
\n",
+ "
4.274111
\n",
+ "
230.949161
\n",
+ "
\n",
+ "
\n",
+ "
SD
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
\n",
+ "
\n",
+ "
TN
\n",
+ "
11.489832
\n",
+ "
9.057370
\n",
+ "
18.859428
\n",
+ "
33.167614
\n",
+ "
0.212381
\n",
+ "
25.728519
\n",
+ "
13.148975
\n",
+ "
353.619736
\n",
+ "
\n",
+ "
\n",
+ "
TX
\n",
+ "
10.942711
\n",
+ "
13.820835
\n",
+ "
6.522051
\n",
+ "
24.081024
\n",
+ "
0.963748
\n",
+ "
13.660377
\n",
+ "
26.095366
\n",
+ "
338.926031
\n",
+ "
\n",
+ "
\n",
+ "
UT
\n",
+ "
26.412869
\n",
+ "
11.331583
\n",
+ "
59.414547
\n",
+ "
0.127636
\n",
+ "
1.377046
\n",
+ "
31.890933
\n",
+ "
34.367822
\n",
+ "
372.645274
\n",
+ "
\n",
+ "
\n",
+ "
VA
\n",
+ "
8.769725
\n",
+ "
8.298224
\n",
+ "
21.723519
\n",
+ "
24.526696
\n",
+ "
0.354601
\n",
+ "
18.392528
\n",
+ "
14.595742
\n",
+ "
336.832852
\n",
+ "
\n",
+ "
\n",
+ "
WA
\n",
+ "
15.505374
\n",
+ "
12.217954
\n",
+ "
3.154185
\n",
+ "
8.710185
\n",
+ "
0.981045
\n",
+ "
20.333769
\n",
+ "
22.762020
\n",
+ "
268.429693
\n",
+ "
\n",
+ "
\n",
+ "
WI
\n",
+ "
9.369116
\n",
+ "
14.496039
\n",
+ "
9.633473
\n",
+ "
33.212954
\n",
+ "
1.195305
\n",
+ "
15.495687
\n",
+ "
22.123829
\n",
+ "
215.928941
\n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_score_l.style.bar(\n",
+ " subset=grouped_stats_score_l.columns, align='mid', color=['#d65f5f', '#5fba7d'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['Percent of individuals < 200% Federal Poverty Line (variance across all tracts)',\n",
+ " 'Percent individuals age 25 or over with less than high school degree (variance across all tracts)',\n",
+ " 'Percent enrollment in college or graduate school (variance across all tracts)',\n",
+ " 'Percent Black or African American alone (variance across all tracts)',\n",
+ " 'Percent American Indian and Alaska Native alone (variance across all tracts)',\n",
+ " 'Percent Non-Hispanic White (variance across all tracts)',\n",
+ " 'Percent Hispanic or Latino (variance across all tracts)'],\n",
+ " dtype='object')"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_score_l.columns"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If the samples are samples from the population - a big assumption - in question and the sampling follows rules and things we take the mean:\n",
+ "\n",
+ "The mean of the median distribution (an order statistic) is the best estimate for the median. It's the best least unbiased estimator. The answer is not the median of that distribution.\n",
+ "\n",
+ "The answer is also not if the mean is an estimate of the median. Completely unrelated.\n",
+ "\n",
+ "Even if the original population is skewed, the distribution of a sampling statistic will be normalized - recall the the central limit theorem for more details\n",
+ "\n",
+ "The standard error of that mean should give you what you want to know to confidently make statements of the true population median across all states"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "list_of_columns = list(grouped_stats_score_l.columns)\n",
+ "values_1 = list(grouped_stats_score_l[list_of_columns].var())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_1.extend([True, False])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[17.256903160392767,\n",
+ " 21.04537908818882,\n",
+ " 134.1363662670021,\n",
+ " 126.27122759971488,\n",
+ " 0.6672345565394615,\n",
+ " 37.71963763383144,\n",
+ " 66.32917757533399,\n",
+ " 8194.046353700449,\n",
+ " True,\n",
+ " False]"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "values_1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# CalenviroScreen Burden"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_2 = (non_null_df['current_threshold_exceeded'] == False) & (non_null_df['new_threshold_exceeded'] == True)\n",
+ "\n",
+ "cal_ej_screen_burdened = non_null_df[predicate_2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_score_ejcreen = cal_ej_screen_burdened.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_score_ejcreen.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_score_ejcreen[\n",
+ " percent_cols] = merged_df_score_ejcreen[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_score_ejcreen.iterrows():\n",
+ " current_row = str(merged_df_score_ejcreen.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_score_ejcreen.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_score_ej_screen = merged_df_score_ejcreen.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_score_ej_screen.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_score_ej_screen.columns.values]\n",
+ "\n",
+ "grouped_stats_score_ej_screen = grouped_stats_score_ej_screen[[x for x in grouped_stats_score_ej_screen \n",
+ " if \"std\" in x and \n",
+ " \"Percent\" in x] + [\n",
+ " 'current_summed_methodology std', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_score_ej_screen.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_score_ej_screen = grouped_stats_score_ej_screen.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line std'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (variance across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree std':\n",
+ "'Percent individuals age 25 or over with less than high school degree (variance across all tracts)', \n",
+ "'Percent enrollment in college or graduate school std'\n",
+ " :'Percent enrollment in college or graduate school (variance across all tracts)',\n",
+ "'Percent Black or African American alone std':\n",
+ " 'Percent Black or African American alone (variance across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone std':\n",
+ " 'Percent American Indian and Alaska Native alone (variance across all tracts)',\n",
+ "'Percent Non-Hispanic White std':\n",
+ " 'Percent Non-Hispanic White (variance across all tracts)',\n",
+ "'Percent Hispanic or Latino std':\n",
+ " 'Percent Hispanic or Latino (variance across all tracts)',\n",
+ "'GEOID10_TRACT std': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology std\": \"Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (variance across all tracts)
Percent individuals age 25 or over with less than high school degree (variance across all tracts)
Percent enrollment in college or graduate school (variance across all tracts)
Percent Black or African American alone (variance across all tracts)
Percent American Indian and Alaska Native alone (variance across all tracts)
Percent Non-Hispanic White (variance across all tracts)
Percent Hispanic or Latino (variance across all tracts)
Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)
state_name
\n",
+ "
\n",
+ "
AK
\n",
+ "
13.520895
\n",
+ "
4.615880
\n",
+ "
4.223458
\n",
+ "
4.322703
\n",
+ "
6.659459
\n",
+ "
20.079234
\n",
+ "
4.363742
\n",
+ "
259.106717
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
10.125709
\n",
+ "
9.439090
\n",
+ "
11.872275
\n",
+ "
26.542148
\n",
+ "
0.835248
\n",
+ "
22.611835
\n",
+ "
7.001758
\n",
+ "
248.330726
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
12.281127
\n",
+ "
7.975936
\n",
+ "
12.495043
\n",
+ "
30.476852
\n",
+ "
1.371498
\n",
+ "
24.599422
\n",
+ "
9.514320
\n",
+ "
192.426182
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
12.946036
\n",
+ "
15.447142
\n",
+ "
15.468539
\n",
+ "
5.601762
\n",
+ "
4.027090
\n",
+ "
24.939213
\n",
+ "
27.758437
\n",
+ "
248.404072
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
12.487873
\n",
+ "
12.922233
\n",
+ "
12.461067
\n",
+ "
12.222976
\n",
+ "
0.789972
\n",
+ "
25.345393
\n",
+ "
23.401828
\n",
+ "
249.579452
\n",
+ "
\n",
+ "
\n",
+ "
CO
\n",
+ "
12.350719
\n",
+ "
10.420574
\n",
+ "
13.955004
\n",
+ "
7.747167
\n",
+ "
3.147796
\n",
+ "
24.315130
\n",
+ "
22.744562
\n",
+ "
263.838721
\n",
+ "
\n",
+ "
\n",
+ "
CT
\n",
+ "
6.712412
\n",
+ "
5.502453
\n",
+ "
2.335335
\n",
+ "
14.655833
\n",
+ "
0.221906
\n",
+ "
16.956516
\n",
+ "
9.128131
\n",
+ "
273.860001
\n",
+ "
\n",
+ "
\n",
+ "
DC
\n",
+ "
5.839941
\n",
+ "
2.632636
\n",
+ "
8.647272
\n",
+ "
28.325298
\n",
+ "
0.000000
\n",
+ "
16.555237
\n",
+ "
7.311294
\n",
+ "
73.539105
\n",
+ "
\n",
+ "
\n",
+ "
DE
\n",
+ "
8.080726
\n",
+ "
4.024877
\n",
+ "
13.093286
\n",
+ "
25.002276
\n",
+ "
0.601911
\n",
+ "
19.263794
\n",
+ "
7.124579
\n",
+ "
206.473727
\n",
+ "
\n",
+ "
\n",
+ "
FL
\n",
+ "
12.291765
\n",
+ "
8.443308
\n",
+ "
11.206603
\n",
+ "
23.985808
\n",
+ "
0.650698
\n",
+ "
26.291813
\n",
+ "
30.672446
\n",
+ "
263.872563
\n",
+ "
\n",
+ "
\n",
+ "
GA
\n",
+ "
10.406307
\n",
+ "
8.469707
\n",
+ "
11.379100
\n",
+ "
22.869892
\n",
+ "
0.866079
\n",
+ "
17.937022
\n",
+ "
9.939746
\n",
+ "
291.040808
\n",
+ "
\n",
+ "
\n",
+ "
HI
\n",
+ "
8.953741
\n",
+ "
4.119816
\n",
+ "
4.230463
\n",
+ "
5.903393
\n",
+ "
0.567517
\n",
+ "
20.414592
\n",
+ "
7.826224
\n",
+ "
195.415711
\n",
+ "
\n",
+ "
\n",
+ "
IA
\n",
+ "
10.607442
\n",
+ "
8.335171
\n",
+ "
12.622566
\n",
+ "
9.346253
\n",
+ "
0.885379
\n",
+ "
15.040902
\n",
+ "
8.480330
\n",
+ "
244.410783
\n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
11.219832
\n",
+ "
7.881505
\n",
+ "
18.597185
\n",
+ "
1.203050
\n",
+ "
1.182857
\n",
+ "
9.968177
\n",
+ "
9.736982
\n",
+ "
324.961525
\n",
+ "
\n",
+ "
\n",
+ "
IL
\n",
+ "
14.026649
\n",
+ "
10.140918
\n",
+ "
13.752964
\n",
+ "
37.268619
\n",
+ "
0.698281
\n",
+ "
25.750998
\n",
+ "
23.486043
\n",
+ "
247.083538
\n",
+ "
\n",
+ "
\n",
+ "
IN
\n",
+ "
10.234744
\n",
+ "
10.471140
\n",
+ "
15.462955
\n",
+ "
27.768428
\n",
+ "
0.562845
\n",
+ "
26.950047
\n",
+ "
11.500188
\n",
+ "
339.918101
\n",
+ "
\n",
+ "
\n",
+ "
KS
\n",
+ "
10.066779
\n",
+ "
10.860425
\n",
+ "
13.582433
\n",
+ "
19.523683
\n",
+ "
2.086300
\n",
+ "
25.585689
\n",
+ "
17.249613
\n",
+ "
243.666729
\n",
+ "
\n",
+ "
\n",
+ "
KY
\n",
+ "
11.979435
\n",
+ "
8.389199
\n",
+ "
8.836230
\n",
+ "
24.464310
\n",
+ "
0.664383
\n",
+ "
24.782279
\n",
+ "
5.415088
\n",
+ "
223.379490
\n",
+ "
\n",
+ "
\n",
+ "
LA
\n",
+ "
13.215265
\n",
+ "
6.155072
\n",
+ "
12.233619
\n",
+ "
24.269290
\n",
+ "
0.146634
\n",
+ "
20.015625
\n",
+ "
3.790697
\n",
+ "
157.788981
\n",
+ "
\n",
+ "
\n",
+ "
MA
\n",
+ "
10.359133
\n",
+ "
10.151970
\n",
+ "
18.937744
\n",
+ "
24.069256
\n",
+ "
0.348046
\n",
+ "
26.092471
\n",
+ "
19.800689
\n",
+ "
197.928531
\n",
+ "
\n",
+ "
\n",
+ "
MD
\n",
+ "
12.835824
\n",
+ "
10.586967
\n",
+ "
10.320206
\n",
+ "
31.095121
\n",
+ "
0.687262
\n",
+ "
23.988533
\n",
+ "
15.032420
\n",
+ "
207.664458
\n",
+ "
\n",
+ "
\n",
+ "
ME
\n",
+ "
13.685119
\n",
+ "
7.099519
\n",
+ "
12.289457
\n",
+ "
4.392563
\n",
+ "
0.765678
\n",
+ "
5.400656
\n",
+ "
1.556741
\n",
+ "
268.108982
\n",
+ "
\n",
+ "
\n",
+ "
MI
\n",
+ "
11.787155
\n",
+ "
7.968431
\n",
+ "
14.673247
\n",
+ "
36.100852
\n",
+ "
0.794458
\n",
+ "
30.927621
\n",
+ "
6.316568
\n",
+ "
222.209551
\n",
+ "
\n",
+ "
\n",
+ "
MN
\n",
+ "
13.723010
\n",
+ "
9.739200
\n",
+ "
13.172282
\n",
+ "
14.211796
\n",
+ "
2.745100
\n",
+ "
24.799241
\n",
+ "
9.580859
\n",
+ "
236.647262
\n",
+ "
\n",
+ "
\n",
+ "
MO
\n",
+ "
13.926854
\n",
+ "
8.268839
\n",
+ "
9.004131
\n",
+ "
32.274333
\n",
+ "
0.522477
\n",
+ "
31.766367
\n",
+ "
14.184567
\n",
+ "
221.671125
\n",
+ "
\n",
+ "
\n",
+ "
MS
\n",
+ "
11.128920
\n",
+ "
9.303949
\n",
+ "
11.954882
\n",
+ "
23.550758
\n",
+ "
0.457355
\n",
+ "
21.335399
\n",
+ "
3.288823
\n",
+ "
233.658743
\n",
+ "
\n",
+ "
\n",
+ "
MT
\n",
+ "
10.119607
\n",
+ "
3.559417
\n",
+ "
14.846792
\n",
+ "
1.429825
\n",
+ "
4.761037
\n",
+ "
5.548337
\n",
+ "
1.904990
\n",
+ "
284.061423
\n",
+ "
\n",
+ "
\n",
+ "
NC
\n",
+ "
12.884796
\n",
+ "
9.594227
\n",
+ "
15.499084
\n",
+ "
24.784252
\n",
+ "
1.981525
\n",
+ "
24.213073
\n",
+ "
8.841596
\n",
+ "
299.583580
\n",
+ "
\n",
+ "
\n",
+ "
ND
\n",
+ "
9.021654
\n",
+ "
5.289198
\n",
+ "
19.126451
\n",
+ "
7.711368
\n",
+ "
1.653742
\n",
+ "
12.206947
\n",
+ "
3.783639
\n",
+ "
202.671137
\n",
+ "
\n",
+ "
\n",
+ "
NE
\n",
+ "
13.838250
\n",
+ "
12.069916
\n",
+ "
14.020891
\n",
+ "
10.927751
\n",
+ "
1.369888
\n",
+ "
20.152953
\n",
+ "
18.238305
\n",
+ "
228.345148
\n",
+ "
\n",
+ "
\n",
+ "
NH
\n",
+ "
10.990331
\n",
+ "
6.745657
\n",
+ "
7.744067
\n",
+ "
4.439421
\n",
+ "
0.279980
\n",
+ "
12.905667
\n",
+ "
7.710063
\n",
+ "
247.971051
\n",
+ "
\n",
+ "
\n",
+ "
NJ
\n",
+ "
12.662421
\n",
+ "
4.374319
\n",
+ "
3.457423
\n",
+ "
34.125623
\n",
+ "
0.062942
\n",
+ "
27.425144
\n",
+ "
23.794351
\n",
+ "
121.752090
\n",
+ "
\n",
+ "
\n",
+ "
NM
\n",
+ "
13.703794
\n",
+ "
11.957349
\n",
+ "
8.582104
\n",
+ "
3.015090
\n",
+ "
11.554536
\n",
+ "
18.853656
\n",
+ "
21.865586
\n",
+ "
219.885214
\n",
+ "
\n",
+ "
\n",
+ "
NV
\n",
+ "
13.591475
\n",
+ "
14.487448
\n",
+ "
10.431661
\n",
+ "
16.143358
\n",
+ "
1.001012
\n",
+ "
23.914023
\n",
+ "
22.030263
\n",
+ "
163.780341
\n",
+ "
\n",
+ "
\n",
+ "
NY
\n",
+ "
13.790519
\n",
+ "
8.052658
\n",
+ "
14.377376
\n",
+ "
35.581151
\n",
+ "
1.505131
\n",
+ "
23.625736
\n",
+ "
21.544354
\n",
+ "
149.887672
\n",
+ "
\n",
+ "
\n",
+ "
OH
\n",
+ "
12.318027
\n",
+ "
7.705678
\n",
+ "
9.509734
\n",
+ "
30.867198
\n",
+ "
0.765228
\n",
+ "
27.528987
\n",
+ "
8.507085
\n",
+ "
189.476546
\n",
+ "
\n",
+ "
\n",
+ "
OK
\n",
+ "
15.699078
\n",
+ "
10.370803
\n",
+ "
13.945978
\n",
+ "
22.133927
\n",
+ "
3.633287
\n",
+ "
20.906816
\n",
+ "
17.779218
\n",
+ "
211.075700
\n",
+ "
\n",
+ "
\n",
+ "
OR
\n",
+ "
9.306317
\n",
+ "
6.689131
\n",
+ "
7.925363
\n",
+ "
3.815764
\n",
+ "
1.439716
\n",
+ "
13.331581
\n",
+ "
10.691046
\n",
+ "
268.643525
\n",
+ "
\n",
+ "
\n",
+ "
PA
\n",
+ "
14.894647
\n",
+ "
8.630037
\n",
+ "
9.495274
\n",
+ "
34.093890
\n",
+ "
0.876892
\n",
+ "
30.973814
\n",
+ "
18.200768
\n",
+ "
237.806669
\n",
+ "
\n",
+ "
\n",
+ "
RI
\n",
+ "
11.146019
\n",
+ "
4.435617
\n",
+ "
32.918187
\n",
+ "
7.412547
\n",
+ "
0.241216
\n",
+ "
23.036924
\n",
+ "
16.407429
\n",
+ "
257.420168
\n",
+ "
\n",
+ "
\n",
+ "
SC
\n",
+ "
12.230901
\n",
+ "
9.140531
\n",
+ "
15.994662
\n",
+ "
28.200957
\n",
+ "
0.541914
\n",
+ "
24.205295
\n",
+ "
8.326607
\n",
+ "
299.090600
\n",
+ "
\n",
+ "
\n",
+ "
SD
\n",
+ "
10.762269
\n",
+ "
6.350754
\n",
+ "
18.344069
\n",
+ "
6.482646
\n",
+ "
17.759617
\n",
+ "
17.513471
\n",
+ "
3.146443
\n",
+ "
231.027858
\n",
+ "
\n",
+ "
\n",
+ "
TN
\n",
+ "
13.134597
\n",
+ "
8.462203
\n",
+ "
18.732469
\n",
+ "
31.389712
\n",
+ "
0.724456
\n",
+ "
27.535573
\n",
+ "
8.915858
\n",
+ "
260.655771
\n",
+ "
\n",
+ "
\n",
+ "
TX
\n",
+ "
13.578461
\n",
+ "
14.435436
\n",
+ "
10.950813
\n",
+ "
21.904895
\n",
+ "
0.885379
\n",
+ "
22.327223
\n",
+ "
28.187346
\n",
+ "
326.165285
\n",
+ "
\n",
+ "
\n",
+ "
UT
\n",
+ "
11.688057
\n",
+ "
9.505571
\n",
+ "
11.614578
\n",
+ "
2.352014
\n",
+ "
2.323857
\n",
+ "
18.718422
\n",
+ "
16.466781
\n",
+ "
255.040636
\n",
+ "
\n",
+ "
\n",
+ "
VA
\n",
+ "
12.373895
\n",
+ "
8.151552
\n",
+ "
13.045575
\n",
+ "
25.425311
\n",
+ "
0.558601
\n",
+ "
22.041004
\n",
+ "
14.043601
\n",
+ "
239.139561
\n",
+ "
\n",
+ "
\n",
+ "
VT
\n",
+ "
10.180275
\n",
+ "
5.438204
\n",
+ "
21.609560
\n",
+ "
4.073187
\n",
+ "
0.985815
\n",
+ "
10.981419
\n",
+ "
1.490384
\n",
+ "
224.502561
\n",
+ "
\n",
+ "
\n",
+ "
WA
\n",
+ "
12.497007
\n",
+ "
8.339197
\n",
+ "
10.260304
\n",
+ "
7.753262
\n",
+ "
1.636725
\n",
+ "
19.165341
\n",
+ "
13.734670
\n",
+ "
298.822930
\n",
+ "
\n",
+ "
\n",
+ "
WI
\n",
+ "
13.738968
\n",
+ "
10.500006
\n",
+ "
12.713038
\n",
+ "
31.859261
\n",
+ "
1.823214
\n",
+ "
29.772296
\n",
+ "
24.227007
\n",
+ "
151.094338
\n",
+ "
\n",
+ "
\n",
+ "
WV
\n",
+ "
13.313674
\n",
+ "
6.107206
\n",
+ "
17.045398
\n",
+ "
11.091388
\n",
+ "
0.344967
\n",
+ "
12.586416
\n",
+ "
3.074087
\n",
+ "
227.309836
\n",
+ "
\n",
+ "
\n",
+ "
WY
\n",
+ "
8.312618
\n",
+ "
7.088938
\n",
+ "
14.926238
\n",
+ "
1.773146
\n",
+ "
3.098632
\n",
+ "
10.233686
\n",
+ "
9.157789
\n",
+ "
255.577994
\n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_score_ej_screen.style.bar(\n",
+ " subset=grouped_stats_score_ej_screen.columns, align='mid', color=['#d65f5f', '#5fba7d'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2272, 36)"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "merged_df_score_ejcreen.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_2 = list(grouped_stats_score_ej_screen[list_of_columns].mean())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_2.extend([False, True])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Both Met Criterion"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_3 = (non_null_df['current_threshold_exceeded'] == True) & (non_null_df['new_threshold_exceeded'] == True)\n",
+ "\n",
+ "union_df = non_null_df[predicate_3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(4529, 15)"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "union_df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_both_met = union_df.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_both_met.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_both_met[\n",
+ " percent_cols] = merged_df_both_met[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_both_met.iterrows():\n",
+ " current_row = str(merged_df_both_met.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_both_met.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_both_met = merged_df_both_met.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_both_met.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_both_met.columns.values]\n",
+ "\n",
+ "grouped_stats_both_met = grouped_stats_both_met[[x for x in grouped_stats_both_met \n",
+ " if \"std\" in x and \n",
+ " \"Percent\" in x] + [\n",
+ " 'current_summed_methodology std', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_both_met.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_both_met = grouped_stats_both_met.rename(columns={\n",
+ " 'Percent of individuals < 200% Federal Poverty Line std'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (variance across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree std':\n",
+ "'Percent individuals age 25 or over with less than high school degree (variance across all tracts)', \n",
+ "'Percent enrollment in college or graduate school std'\n",
+ " :'Percent enrollment in college or graduate school (variance across all tracts)',\n",
+ "'Percent Black or African American alone std':\n",
+ " 'Percent Black or African American alone (variance across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone std':\n",
+ " 'Percent American Indian and Alaska Native alone (variance across all tracts)',\n",
+ "'Percent Non-Hispanic White std':\n",
+ " 'Percent Non-Hispanic White (variance across all tracts)',\n",
+ "'Percent Hispanic or Latino std':\n",
+ " 'Percent Hispanic or Latino (variance across all tracts)',\n",
+ "'GEOID10_TRACT std': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology std\": \"Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (variance across all tracts)
Percent individuals age 25 or over with less than high school degree (variance across all tracts)
Percent enrollment in college or graduate school (variance across all tracts)
Percent Black or African American alone (variance across all tracts)
Percent American Indian and Alaska Native alone (variance across all tracts)
Percent Non-Hispanic White (variance across all tracts)
Percent Hispanic or Latino (variance across all tracts)
Variance: Owned and Rented Burdened Households (Current Aggregation Methodology)
state_name
\n",
+ "
\n",
+ "
AK
\n",
+ "
5.362564
\n",
+ "
6.866730
\n",
+ "
4.713743
\n",
+ "
4.359215
\n",
+ "
4.461964
\n",
+ "
4.464435
\n",
+ "
5.648686
\n",
+ "
200.852350
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
10.762316
\n",
+ "
8.759849
\n",
+ "
26.357589
\n",
+ "
29.542667
\n",
+ "
0.983361
\n",
+ "
26.170044
\n",
+ "
6.445044
\n",
+ "
241.026314
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
8.955506
\n",
+ "
6.661830
\n",
+ "
21.335498
\n",
+ "
29.046109
\n",
+ "
0.376642
\n",
+ "
26.230211
\n",
+ "
7.373333
\n",
+ "
386.784673
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
9.734770
\n",
+ "
13.667529
\n",
+ "
21.385000
\n",
+ "
5.929329
\n",
+ "
3.031099
\n",
+ "
18.395655
\n",
+ "
21.505953
\n",
+ "
264.572097
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
12.839478
\n",
+ "
15.519094
\n",
+ "
15.965302
\n",
+ "
12.108554
\n",
+ "
1.274808
\n",
+ "
19.065738
\n",
+ "
26.046888
\n",
+ "
300.670483
\n",
+ "
\n",
+ "
\n",
+ "
CO
\n",
+ "
12.013508
\n",
+ "
12.057231
\n",
+ "
22.895904
\n",
+ "
11.301122
\n",
+ "
2.011565
\n",
+ "
24.484957
\n",
+ "
21.863004
\n",
+ "
381.523930
\n",
+ "
\n",
+ "
\n",
+ "
CT
\n",
+ "
10.322097
\n",
+ "
10.498181
\n",
+ "
15.641987
\n",
+ "
17.945122
\n",
+ "
1.126035
\n",
+ "
17.177253
\n",
+ "
19.111784
\n",
+ "
294.901340
\n",
+ "
\n",
+ "
\n",
+ "
DC
\n",
+ "
9.353163
\n",
+ "
5.744292
\n",
+ "
21.807513
\n",
+ "
22.181755
\n",
+ "
0.865375
\n",
+ "
16.106402
\n",
+ "
4.547917
\n",
+ "
187.708717
\n",
+ "
\n",
+ "
\n",
+ "
DE
\n",
+ "
10.044318
\n",
+ "
9.207932
\n",
+ "
32.720012
\n",
+ "
29.569930
\n",
+ "
0.572551
\n",
+ "
27.481490
\n",
+ "
15.873234
\n",
+ "
110.123365
\n",
+ "
\n",
+ "
\n",
+ "
FL
\n",
+ "
11.807584
\n",
+ "
10.359419
\n",
+ "
14.810645
\n",
+ "
31.244787
\n",
+ "
0.955248
\n",
+ "
16.990042
\n",
+ "
33.349320
\n",
+ "
409.998796
\n",
+ "
\n",
+ "
\n",
+ "
GA
\n",
+ "
11.579126
\n",
+ "
11.217565
\n",
+ "
21.469723
\n",
+ "
28.052059
\n",
+ "
1.598846
\n",
+ "
18.907615
\n",
+ "
16.634868
\n",
+ "
413.546272
\n",
+ "
\n",
+ "
\n",
+ "
HI
\n",
+ "
7.488105
\n",
+ "
3.886126
\n",
+ "
6.737730
\n",
+ "
7.302510
\n",
+ "
0.600968
\n",
+ "
15.793943
\n",
+ "
8.150455
\n",
+ "
267.260404
\n",
+ "
\n",
+ "
\n",
+ "
IA
\n",
+ "
9.367440
\n",
+ "
12.733213
\n",
+ "
33.960889
\n",
+ "
19.537493
\n",
+ "
2.646528
\n",
+ "
22.302319
\n",
+ "
11.377196
\n",
+ "
527.841747
\n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
13.135462
\n",
+ "
12.427059
\n",
+ "
23.083662
\n",
+ "
0.424381
\n",
+ "
2.924023
\n",
+ "
21.731829
\n",
+ "
23.764339
\n",
+ "
974.017967
\n",
+ "
\n",
+ "
\n",
+ "
IL
\n",
+ "
14.365266
\n",
+ "
9.961048
\n",
+ "
18.641863
\n",
+ "
34.710751
\n",
+ "
0.667958
\n",
+ "
19.929638
\n",
+ "
24.171428
\n",
+ "
300.228779
\n",
+ "
\n",
+ "
\n",
+ "
IN
\n",
+ "
10.502570
\n",
+ "
10.009589
\n",
+ "
26.208742
\n",
+ "
29.408204
\n",
+ "
0.531106
\n",
+ "
28.719219
\n",
+ "
10.778399
\n",
+ "
331.278547
\n",
+ "
\n",
+ "
\n",
+ "
KS
\n",
+ "
9.343448
\n",
+ "
11.563216
\n",
+ "
31.571527
\n",
+ "
27.818353
\n",
+ "
1.680673
\n",
+ "
27.077467
\n",
+ "
18.532743
\n",
+ "
424.193116
\n",
+ "
\n",
+ "
\n",
+ "
KY
\n",
+ "
10.353541
\n",
+ "
10.491346
\n",
+ "
29.524277
\n",
+ "
31.184962
\n",
+ "
0.885588
\n",
+ "
28.091972
\n",
+ "
14.085954
\n",
+ "
289.382905
\n",
+ "
\n",
+ "
\n",
+ "
LA
\n",
+ "
11.485870
\n",
+ "
8.786543
\n",
+ "
15.562703
\n",
+ "
20.008507
\n",
+ "
0.527876
\n",
+ "
15.520856
\n",
+ "
7.542826
\n",
+ "
305.445267
\n",
+ "
\n",
+ "
\n",
+ "
MA
\n",
+ "
13.415892
\n",
+ "
11.856250
\n",
+ "
21.686145
\n",
+ "
25.576649
\n",
+ "
0.763304
\n",
+ "
23.189013
\n",
+ "
27.384592
\n",
+ "
261.976125
\n",
+ "
\n",
+ "
\n",
+ "
MD
\n",
+ "
14.611597
\n",
+ "
9.260909
\n",
+ "
17.774458
\n",
+ "
28.430971
\n",
+ "
0.755644
\n",
+ "
17.883547
\n",
+ "
15.157175
\n",
+ "
308.477828
\n",
+ "
\n",
+ "
\n",
+ "
ME
\n",
+ "
5.983994
\n",
+ "
8.778858
\n",
+ "
25.805900
\n",
+ "
9.016565
\n",
+ "
0.598179
\n",
+ "
12.236258
\n",
+ "
2.361052
\n",
+ "
354.752227
\n",
+ "
\n",
+ "
\n",
+ "
MI
\n",
+ "
11.364613
\n",
+ "
10.104722
\n",
+ "
24.604378
\n",
+ "
35.740705
\n",
+ "
0.749980
\n",
+ "
29.139941
\n",
+ "
9.723557
\n",
+ "
270.032843
\n",
+ "
\n",
+ "
\n",
+ "
MN
\n",
+ "
11.155877
\n",
+ "
10.702122
\n",
+ "
25.205802
\n",
+ "
20.883018
\n",
+ "
2.011065
\n",
+ "
26.127868
\n",
+ "
7.197320
\n",
+ "
373.996267
\n",
+ "
\n",
+ "
\n",
+ "
MO
\n",
+ "
10.137324
\n",
+ "
8.592364
\n",
+ "
22.712005
\n",
+ "
35.098282
\n",
+ "
0.526103
\n",
+ "
29.599300
\n",
+ "
10.088432
\n",
+ "
324.569103
\n",
+ "
\n",
+ "
\n",
+ "
MS
\n",
+ "
9.854816
\n",
+ "
6.811832
\n",
+ "
24.155295
\n",
+ "
23.449468
\n",
+ "
0.638943
\n",
+ "
20.710178
\n",
+ "
3.181963
\n",
+ "
235.058305
\n",
+ "
\n",
+ "
\n",
+ "
MT
\n",
+ "
4.115267
\n",
+ "
7.633925
\n",
+ "
31.654537
\n",
+ "
0.466736
\n",
+ "
6.593054
\n",
+ "
12.042715
\n",
+ "
6.102896
\n",
+ "
260.969730
\n",
+ "
\n",
+ "
\n",
+ "
NC
\n",
+ "
10.390897
\n",
+ "
10.501628
\n",
+ "
23.544817
\n",
+ "
24.377819
\n",
+ "
1.166064
\n",
+ "
23.259549
\n",
+ "
13.346942
\n",
+ "
342.769565
\n",
+ "
\n",
+ "
\n",
+ "
ND
\n",
+ "
13.065586
\n",
+ "
5.245493
\n",
+ "
34.210278
\n",
+ "
3.511070
\n",
+ "
5.104930
\n",
+ "
5.105851
\n",
+ "
2.359395
\n",
+ "
297.654162
\n",
+ "
\n",
+ "
\n",
+ "
NE
\n",
+ "
8.350455
\n",
+ "
8.893226
\n",
+ "
21.948548
\n",
+ "
23.075337
\n",
+ "
0.585448
\n",
+ "
21.662061
\n",
+ "
5.582370
\n",
+ "
202.499665
\n",
+ "
\n",
+ "
\n",
+ "
NH
\n",
+ "
11.683527
\n",
+ "
11.311405
\n",
+ "
37.639709
\n",
+ "
4.998337
\n",
+ "
0.403837
\n",
+ "
16.842827
\n",
+ "
13.079522
\n",
+ "
419.520096
\n",
+ "
\n",
+ "
\n",
+ "
NJ
\n",
+ "
12.203217
\n",
+ "
10.473662
\n",
+ "
7.610944
\n",
+ "
30.106950
\n",
+ "
0.811802
\n",
+ "
21.229334
\n",
+ "
26.540235
\n",
+ "
275.002256
\n",
+ "
\n",
+ "
\n",
+ "
NM
\n",
+ "
11.397865
\n",
+ "
11.011395
\n",
+ "
26.601550
\n",
+ "
2.963015
\n",
+ "
4.720711
\n",
+ "
10.616521
\n",
+ "
16.064664
\n",
+ "
411.970186
\n",
+ "
\n",
+ "
\n",
+ "
NV
\n",
+ "
10.157125
\n",
+ "
10.395277
\n",
+ "
7.134588
\n",
+ "
9.786716
\n",
+ "
1.241392
\n",
+ "
15.752480
\n",
+ "
18.739589
\n",
+ "
211.298685
\n",
+ "
\n",
+ "
\n",
+ "
NY
\n",
+ "
13.488737
\n",
+ "
9.898986
\n",
+ "
8.697032
\n",
+ "
26.867533
\n",
+ "
1.609412
\n",
+ "
28.820923
\n",
+ "
26.174584
\n",
+ "
370.123164
\n",
+ "
\n",
+ "
\n",
+ "
OH
\n",
+ "
10.825822
\n",
+ "
9.178838
\n",
+ "
26.332892
\n",
+ "
32.219266
\n",
+ "
1.052610
\n",
+ "
28.183901
\n",
+ "
9.513140
\n",
+ "
261.267771
\n",
+ "
\n",
+ "
\n",
+ "
OK
\n",
+ "
11.690984
\n",
+ "
11.778162
\n",
+ "
29.823430
\n",
+ "
25.811025
\n",
+ "
3.282949
\n",
+ "
22.038322
\n",
+ "
16.282388
\n",
+ "
313.721214
\n",
+ "
\n",
+ "
\n",
+ "
OR
\n",
+ "
11.672362
\n",
+ "
8.560431
\n",
+ "
26.402550
\n",
+ "
4.438473
\n",
+ "
1.999473
\n",
+ "
11.497117
\n",
+ "
11.710487
\n",
+ "
390.637347
\n",
+ "
\n",
+ "
\n",
+ "
PA
\n",
+ "
12.482215
\n",
+ "
11.954000
\n",
+ "
23.383473
\n",
+ "
30.664060
\n",
+ "
1.107837
\n",
+ "
25.268762
\n",
+ "
26.123990
\n",
+ "
265.380774
\n",
+ "
\n",
+ "
\n",
+ "
RI
\n",
+ "
9.292574
\n",
+ "
8.244244
\n",
+ "
8.293391
\n",
+ "
11.734409
\n",
+ "
1.084689
\n",
+ "
29.769755
\n",
+ "
26.781181
\n",
+ "
253.312496
\n",
+ "
\n",
+ "
\n",
+ "
SC
\n",
+ "
10.633839
\n",
+ "
10.503194
\n",
+ "
25.396787
\n",
+ "
29.221893
\n",
+ "
0.617377
\n",
+ "
24.669126
\n",
+ "
12.992547
\n",
+ "
230.947955
\n",
+ "
\n",
+ "
\n",
+ "
SD
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
nan
\n",
+ "
\n",
+ "
\n",
+ "
TN
\n",
+ "
9.858797
\n",
+ "
8.620668
\n",
+ "
18.128720
\n",
+ "
27.453093
\n",
+ "
0.411158
\n",
+ "
20.791161
\n",
+ "
11.842790
\n",
+ "
344.209468
\n",
+ "
\n",
+ "
\n",
+ "
TX
\n",
+ "
10.613484
\n",
+ "
14.759169
\n",
+ "
22.114764
\n",
+ "
22.973454
\n",
+ "
0.898911
\n",
+ "
19.668712
\n",
+ "
26.558668
\n",
+ "
366.266727
\n",
+ "
\n",
+ "
\n",
+ "
UT
\n",
+ "
13.791322
\n",
+ "
10.330279
\n",
+ "
33.796530
\n",
+ "
6.021641
\n",
+ "
1.631398
\n",
+ "
23.358438
\n",
+ "
17.502232
\n",
+ "
212.805390
\n",
+ "
\n",
+ "
\n",
+ "
VA
\n",
+ "
14.130616
\n",
+ "
11.286115
\n",
+ "
23.743179
\n",
+ "
32.125657
\n",
+ "
0.984275
\n",
+ "
22.722607
\n",
+ "
16.743508
\n",
+ "
315.503703
\n",
+ "
\n",
+ "
\n",
+ "
VT
\n",
+ "
9.574526
\n",
+ "
5.947329
\n",
+ "
23.245865
\n",
+ "
3.339003
\n",
+ "
0.026920
\n",
+ "
5.228800
\n",
+ "
1.019496
\n",
+ "
268.424260
\n",
+ "
\n",
+ "
\n",
+ "
WA
\n",
+ "
13.330610
\n",
+ "
9.590603
\n",
+ "
28.396426
\n",
+ "
8.269962
\n",
+ "
2.267946
\n",
+ "
19.266576
\n",
+ "
12.581541
\n",
+ "
510.235920
\n",
+ "
\n",
+ "
\n",
+ "
WI
\n",
+ "
12.645607
\n",
+ "
11.622318
\n",
+ "
27.077443
\n",
+ "
36.808805
\n",
+ "
0.896910
\n",
+ "
30.237449
\n",
+ "
23.002879
\n",
+ "
303.044555
\n",
+ "
\n",
+ "
\n",
+ "
WV
\n",
+ "
14.195970
\n",
+ "
8.054310
\n",
+ "
33.530553
\n",
+ "
14.305199
\n",
+ "
0.324366
\n",
+ "
12.987162
\n",
+ "
2.963561
\n",
+ "
256.028444
\n",
+ "
\n",
+ "
\n",
+ "
WY
\n",
+ "
4.924008
\n",
+ "
0.138082
\n",
+ "
28.231683
\n",
+ "
0.664380
\n",
+ "
0.198144
\n",
+ "
4.387199
\n",
+ "
1.966222
\n",
+ "
361.222000
\n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_both_met.style.bar(\n",
+ " subset=grouped_stats_both_met.columns, align='mid', color=['#d65f5f', '#5fba7d'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_3 = list(grouped_stats_both_met[list_of_columns].mean())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 243,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_3.extend([True, True])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Neither Met Criterion "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 244,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_4 = (non_null_df[\n",
+ " 'current_threshold_exceeded'] == False) & (\n",
+ " non_null_df['new_threshold_exceeded'] == False)\n",
+ "\n",
+ "negation_union_df = non_null_df[predicate_4]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 245,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_negation_union = negation_union_df.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_negation_union.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_negation_union[\n",
+ " percent_cols] = merged_df_negation_union[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_negation_union.iterrows():\n",
+ " current_row = str(merged_df_negation_union.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_negation_union.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_both_not_met = merged_df_negation_union.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_both_not_met.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_both_not_met.columns.values]\n",
+ "\n",
+ "grouped_stats_both_not_met = grouped_stats_both_not_met[[x for x in grouped_stats_both_not_met \n",
+ " if \"median\" in x and \n",
+ " \"Percent\" in x] + [\"GEOID10_TRACT nunique\", \n",
+ " 'current_summed_methodology sum', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_both_not_met.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_both_not_met = grouped_stats_both_not_met.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line median'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (median across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (median across all tracts)', \n",
+ "'Percent enrollment in college or graduate school median'\n",
+ " :'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ "'Percent Black or African American alone median':\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone median':\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ "'Percent Non-Hispanic White median':\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ "'Percent Hispanic or Latino median':\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ "'GEOID10_TRACT nunique': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology sum\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 246,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_4 = list(grouped_stats_both_not_met[list_of_columns].mean())\n",
+ "\n",
+ "values_4.extend([False, False])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 247,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
0
\n",
+ "
1
\n",
+ "
2
\n",
+ "
3
\n",
+ "
4
\n",
+ "
5
\n",
+ "
6
\n",
+ "
7
\n",
+ "
8
\n",
+ "
9
\n",
+ "
10
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
57.052724
\n",
+ "
19.383813
\n",
+ "
8.132533
\n",
+ "
33.692806
\n",
+ "
1.221395
\n",
+ "
31.321886
\n",
+ "
19.378348
\n",
+ "
62.088889
\n",
+ "
40949.200000
\n",
+ "
True
\n",
+ "
False
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
47.082927
\n",
+ "
13.224927
\n",
+ "
8.685441
\n",
+ "
23.061683
\n",
+ "
0.772400
\n",
+ "
48.240042
\n",
+ "
12.553371
\n",
+ "
44.549020
\n",
+ "
24719.098039
\n",
+ "
False
\n",
+ "
True
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
62.331263
\n",
+ "
17.689811
\n",
+ "
11.824205
\n",
+ "
33.455525
\n",
+ "
0.921755
\n",
+ "
34.495797
\n",
+ "
15.855933
\n",
+ "
88.803922
\n",
+ "
60757.901961
\n",
+ "
True
\n",
+ "
True
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
27.736502
\n",
+ "
8.785280
\n",
+ "
5.847120
\n",
+ "
5.729181
\n",
+ "
0.537429
\n",
+ "
75.916536
\n",
+ "
7.463468
\n",
+ "
1244.333333
\n",
+ "
443680.568627
\n",
+ "
False
\n",
+ "
False
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0 1 2 3 4 5 6 \\\n",
+ "0 57.052724 19.383813 8.132533 33.692806 1.221395 31.321886 19.378348 \n",
+ "1 47.082927 13.224927 8.685441 23.061683 0.772400 48.240042 12.553371 \n",
+ "2 62.331263 17.689811 11.824205 33.455525 0.921755 34.495797 15.855933 \n",
+ "3 27.736502 8.785280 5.847120 5.729181 0.537429 75.916536 7.463468 \n",
+ "\n",
+ " 7 8 9 10 \n",
+ "0 62.088889 40949.200000 True False \n",
+ "1 44.549020 24719.098039 False True \n",
+ "2 88.803922 60757.901961 True True \n",
+ "3 1244.333333 443680.568627 False False "
+ ]
+ },
+ "execution_count": 247,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final_summary_data_values = [values_1, values_2, values_3, values_4]\n",
+ " \n",
+ "# Create the pandas DataFrame\n",
+ "df = pd.DataFrame(final_summary_data_values)\n",
+ " \n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 248,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cols = list(grouped_stats_both_not_met.columns)\n",
+ "cols.extend([\n",
+ " 'Score L Relative Housing Burden for all households met burden threshold', \n",
+ " 'CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 249,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df.rename(columns={df.columns[idx]: cols[idx] for idx, _ in enumerate(cols)}, inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 250,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = df.set_index([\n",
+ " 'Score L Relative Housing Burden for all households met burden threshold', \n",
+ " 'CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)'], inplace=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 251,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = df.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line (median across all tracts)'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (mean of median across all states)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (mean of median across all states)', \n",
+ "'Percent enrollment in college or graduate school (median across all states)'\n",
+ " :'Percent enrollment in college or graduate school (mean of median across all states)',\n",
+ "'Percent Black or African American alone (median across all tracts)':\n",
+ " 'Percent Black or African American alone (mean of median across all states)',\n",
+ "'Percent American Indian and Alaska Native alone (median across all tracts)':\n",
+ " 'Percent American Indian and Alaska Native alone (mean of median across all states)',\n",
+ "'Percent Non-Hispanic White (median across all tracts)':\n",
+ " 'Percent Non-Hispanic White (mean of median across all states)',\n",
+ "'Percent Hispanic or Latino (median across all tracts)':\n",
+ " 'Percent Hispanic or Latino (mean of median across all states)',\n",
+ "\"Total Number of Unique Tracts\": \"Total Number of Tracts - Mean of median across all states\",\n",
+ "\"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states\"\n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 252,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
Percent of individuals < 200% Federal Poverty Line (mean of median across all states)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (mean of median across all states)
\n",
+ "
Percent American Indian and Alaska Native alone (mean of median across all states)
\n",
+ "
Percent Non-Hispanic White (mean of median across all states)
\n",
+ "
Percent Hispanic or Latino (mean of median across all states)
\n",
+ "
Total Number of Tracts - Mean of median across all states
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states
\n",
+ "
\n",
+ "
\n",
+ "
Score L Relative Housing Burden for all households met burden threshold
\n",
+ "
CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
True
\n",
+ "
False
\n",
+ "
57.052724
\n",
+ "
19.383813
\n",
+ "
8.132533
\n",
+ "
33.692806
\n",
+ "
1.221395
\n",
+ "
31.321886
\n",
+ "
19.378348
\n",
+ "
62.088889
\n",
+ "
40949.200000
\n",
+ "
\n",
+ "
\n",
+ "
False
\n",
+ "
True
\n",
+ "
47.082927
\n",
+ "
13.224927
\n",
+ "
8.685441
\n",
+ "
23.061683
\n",
+ "
0.772400
\n",
+ "
48.240042
\n",
+ "
12.553371
\n",
+ "
44.549020
\n",
+ "
24719.098039
\n",
+ "
\n",
+ "
\n",
+ "
True
\n",
+ "
True
\n",
+ "
62.331263
\n",
+ "
17.689811
\n",
+ "
11.824205
\n",
+ "
33.455525
\n",
+ "
0.921755
\n",
+ "
34.495797
\n",
+ "
15.855933
\n",
+ "
88.803922
\n",
+ "
60757.901961
\n",
+ "
\n",
+ "
\n",
+ "
False
\n",
+ "
False
\n",
+ "
27.736502
\n",
+ "
8.785280
\n",
+ "
5.847120
\n",
+ "
5.729181
\n",
+ "
0.537429
\n",
+ "
75.916536
\n",
+ "
7.463468
\n",
+ "
1244.333333
\n",
+ "
443680.568627
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 57.052724 \n",
+ "False True 47.082927 \n",
+ "True True 62.331263 \n",
+ "False False 27.736502 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 19.383813 \n",
+ "False True 13.224927 \n",
+ "True True 17.689811 \n",
+ "False False 8.785280 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 8.132533 \n",
+ "False True 8.685441 \n",
+ "True True 11.824205 \n",
+ "False False 5.847120 \n",
+ "\n",
+ " Percent Black or African American alone (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 33.692806 \n",
+ "False True 23.061683 \n",
+ "True True 33.455525 \n",
+ "False False 5.729181 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 1.221395 \n",
+ "False True 0.772400 \n",
+ "True True 0.921755 \n",
+ "False False 0.537429 \n",
+ "\n",
+ " Percent Non-Hispanic White (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 31.321886 \n",
+ "False True 48.240042 \n",
+ "True True 34.495797 \n",
+ "False False 75.916536 \n",
+ "\n",
+ " Percent Hispanic or Latino (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 19.378348 \n",
+ "False True 12.553371 \n",
+ "True True 15.855933 \n",
+ "False False 7.463468 \n",
+ "\n",
+ " Total Number of Tracts - Mean of median across all states \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 62.088889 \n",
+ "False True 44.549020 \n",
+ "True True 88.803922 \n",
+ "False False 1244.333333 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states \n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 40949.200000 \n",
+ "False True 24719.098039 \n",
+ "True True 60757.901961 \n",
+ "False False 443680.568627 "
+ ]
+ },
+ "execution_count": 252,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 211,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def highlight_min(s, props=''):\n",
+ " return np.where(s == np.nanmin(s.values), props, '')\n",
+ "\n",
+ "def highlight_max(s, props=''):\n",
+ " return np.where(s == np.nanmax(s.values), props, '')\n",
+ "\n",
+ "df_styled = df.style.format(\n",
+ " na_rep='MISSING',\n",
+ " formatter={df.columns[idx]: \"{:.2f}\" for idx, _ in enumerate(df.columns) })"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 255,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_styled_max_min = df_styled.apply(highlight_max, props='color:#FFFFFF;background-color:#00008b', axis=0)\\\n",
+ " .apply(highlight_min, props='color:#FFFFFF;background-color:#FF0000', axis=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 256,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_styled_max_min.to_excel(\"summary_all_states.xlsx\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 257,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (mean of median across all states)
Percent individuals age 25 or over with less than high school degree (median across all tracts)
Percent enrollment in college or graduate school (median across all tracts)
Percent Black or African American alone (mean of median across all states)
Percent American Indian and Alaska Native alone (mean of median across all states)
Percent Non-Hispanic White (mean of median across all states)
Percent Hispanic or Latino (mean of median across all states)
Total Number of Tracts - Mean of median across all states
Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states
Score L Relative Housing Burden for all households met burden threshold
CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (median across all tracts)
\n",
+ "
Percent American Indian and Alaska Native alone (median across all tracts)
\n",
+ "
Percent Non-Hispanic White (median across all tracts)
\n",
+ "
Percent Hispanic or Latino (median across all tracts)
\n",
+ "
Total Number of Unique Tracts
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
\n",
+ "
\n",
+ "
\n",
+ "
state_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AK
\n",
+ "
33.563081
\n",
+ "
10.407240
\n",
+ "
9.485638
\n",
+ "
4.553571
\n",
+ "
21.279762
\n",
+ "
48.839286
\n",
+ "
9.375000
\n",
+ "
1
\n",
+ "
825
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
63.335854
\n",
+ "
20.273617
\n",
+ "
7.895408
\n",
+ "
79.236090
\n",
+ "
0.000000
\n",
+ "
8.436779
\n",
+ "
1.986055
\n",
+ "
14
\n",
+ "
7107
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 33.563081 \n",
+ "AL 63.335854 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 10.407240 \n",
+ "AL 20.273617 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 9.485638 \n",
+ "AL 7.895408 \n",
+ "\n",
+ " Percent Black or African American alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 4.553571 \n",
+ "AL 79.236090 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 21.279762 \n",
+ "AL 0.000000 \n",
+ "\n",
+ " Percent Non-Hispanic White (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 48.839286 \n",
+ "AL 8.436779 \n",
+ "\n",
+ " Percent Hispanic or Latino (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 9.375000 \n",
+ "AL 1.986055 \n",
+ "\n",
+ " Total Number of Unique Tracts \\\n",
+ "state_name \n",
+ "AK 1 \n",
+ "AL 14 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology) \n",
+ "state_name \n",
+ "AK 825 \n",
+ "AL 7107 "
+ ]
+ },
+ "execution_count": 272,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_1.head(2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 273,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "candidate_columns = ['Percent of individuals < 200% Federal Poverty Line (median across all tracts)',\n",
+ " 'Percent individuals age 25 or over with less than high school degree (median across all tracts)',\n",
+ " 'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ " 'Total Number of Unique Tracts',\n",
+ " 'Total Owned and Rented Burdened Households (Current Aggregation Methodology)']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 276,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "diff = (df_1[candidate_columns] - df_2[candidate_columns]).fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 277,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (median across all tracts)
\n",
+ "
Percent American Indian and Alaska Native alone (median across all tracts)
\n",
+ "
Percent Non-Hispanic White (median across all tracts)
\n",
+ "
Percent Hispanic or Latino (median across all tracts)
\n",
+ "
Total Number of Unique Tracts
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
\n",
+ "
\n",
+ "
\n",
+ "
state_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AK
\n",
+ "
0.985223
\n",
+ "
-0.274578
\n",
+ "
3.206568
\n",
+ "
-1.085258
\n",
+ "
8.721076
\n",
+ "
-6.803172
\n",
+ "
-1.778285
\n",
+ "
-10.0
\n",
+ "
-4179.0
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
6.211917
\n",
+ "
4.283941
\n",
+ "
0.331430
\n",
+ "
6.212278
\n",
+ "
0.000000
\n",
+ "
-9.011147
\n",
+ "
-0.630017
\n",
+ "
-28.0
\n",
+ "
-15422.0
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
5.432052
\n",
+ "
1.601861
\n",
+ "
3.942754
\n",
+ "
20.319049
\n",
+ "
0.102459
\n",
+ "
-23.263854
\n",
+ "
-0.896646
\n",
+ "
-35.0
\n",
+ "
-16843.0
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
13.594871
\n",
+ "
11.979424
\n",
+ "
-0.272040
\n",
+ "
1.361388
\n",
+ "
-0.915677
\n",
+ "
-8.953361
\n",
+ "
8.757832
\n",
+ "
-39.0
\n",
+ "
-23253.0
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
15.717598
\n",
+ "
16.799587
\n",
+ "
-0.702951
\n",
+ "
0.247647
\n",
+ "
0.415820
\n",
+ "
-21.870519
\n",
+ "
40.216194
\n",
+ "
783.0
\n",
+ "
542144.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 0.985223 \n",
+ "AL 6.211917 \n",
+ "AR 5.432052 \n",
+ "AZ 13.594871 \n",
+ "CA 15.717598 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -0.274578 \n",
+ "AL 4.283941 \n",
+ "AR 1.601861 \n",
+ "AZ 11.979424 \n",
+ "CA 16.799587 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 3.206568 \n",
+ "AL 0.331430 \n",
+ "AR 3.942754 \n",
+ "AZ -0.272040 \n",
+ "CA -0.702951 \n",
+ "\n",
+ " Percent Black or African American alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -1.085258 \n",
+ "AL 6.212278 \n",
+ "AR 20.319049 \n",
+ "AZ 1.361388 \n",
+ "CA 0.247647 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 8.721076 \n",
+ "AL 0.000000 \n",
+ "AR 0.102459 \n",
+ "AZ -0.915677 \n",
+ "CA 0.415820 \n",
+ "\n",
+ " Percent Non-Hispanic White (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -6.803172 \n",
+ "AL -9.011147 \n",
+ "AR -23.263854 \n",
+ "AZ -8.953361 \n",
+ "CA -21.870519 \n",
+ "\n",
+ " Percent Hispanic or Latino (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -1.778285 \n",
+ "AL -0.630017 \n",
+ "AR -0.896646 \n",
+ "AZ 8.757832 \n",
+ "CA 40.216194 \n",
+ "\n",
+ " Total Number of Unique Tracts \\\n",
+ "state_name \n",
+ "AK -10.0 \n",
+ "AL -28.0 \n",
+ "AR -35.0 \n",
+ "AZ -39.0 \n",
+ "CA 783.0 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology) \n",
+ "state_name \n",
+ "AK -4179.0 \n",
+ "AL -15422.0 \n",
+ "AR -16843.0 \n",
+ "AZ -23253.0 \n",
+ "CA 542144.0 "
+ ]
+ },
+ "execution_count": 277,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "diff.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 279,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
Percent individuals age 25 or over with less than high school degree (median across all tracts)
Percent enrollment in college or graduate school (median across all tracts)
Percent Black or African American alone (median across all tracts)
Percent American Indian and Alaska Native alone (median across all tracts)
Percent Non-Hispanic White (median across all tracts)
Percent Hispanic or Latino (median across all tracts)
Total Number of Unique Tracts
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
state_name
\n",
+ "
\n",
+ "
AK
\n",
+ "
0.985223
\n",
+ "
-0.274578
\n",
+ "
3.206568
\n",
+ "
-1.085258
\n",
+ "
8.721076
\n",
+ "
-6.803172
\n",
+ "
-1.778285
\n",
+ "
-10.000000
\n",
+ "
-4179.000000
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
6.211917
\n",
+ "
4.283941
\n",
+ "
0.331430
\n",
+ "
6.212278
\n",
+ "
0.000000
\n",
+ "
-9.011147
\n",
+ "
-0.630017
\n",
+ "
-28.000000
\n",
+ "
-15422.000000
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
5.432052
\n",
+ "
1.601861
\n",
+ "
3.942754
\n",
+ "
20.319049
\n",
+ "
0.102459
\n",
+ "
-23.263854
\n",
+ "
-0.896646
\n",
+ "
-35.000000
\n",
+ "
-16843.000000
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
13.594871
\n",
+ "
11.979424
\n",
+ "
-0.272040
\n",
+ "
1.361388
\n",
+ "
-0.915677
\n",
+ "
-8.953361
\n",
+ "
8.757832
\n",
+ "
-39.000000
\n",
+ "
-23253.000000
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
15.717598
\n",
+ "
16.799587
\n",
+ "
-0.702951
\n",
+ "
0.247647
\n",
+ "
0.415820
\n",
+ "
-21.870519
\n",
+ "
40.216194
\n",
+ "
783.000000
\n",
+ "
542144.000000
\n",
+ "
\n",
+ "
\n",
+ "
CO
\n",
+ "
5.267963
\n",
+ "
0.816207
\n",
+ "
0.089370
\n",
+ "
5.338649
\n",
+ "
0.149809
\n",
+ "
-24.425903
\n",
+ "
10.133080
\n",
+ "
-34.000000
\n",
+ "
-17296.000000
\n",
+ "
\n",
+ "
\n",
+ "
CT
\n",
+ "
20.337916
\n",
+ "
6.865214
\n",
+ "
0.574592
\n",
+ "
-7.952396
\n",
+ "
0.000000
\n",
+ "
-9.384233
\n",
+ "
3.734253
\n",
+ "
48.000000
\n",
+ "
33786.000000
\n",
+ "
\n",
+ "
\n",
+ "
DC
\n",
+ "
20.225619
\n",
+ "
9.277701
\n",
+ "
-10.589364
\n",
+ "
65.946763
\n",
+ "
0.000000
\n",
+ "
-49.789447
\n",
+ "
-6.124777
\n",
+ "
13.000000
\n",
+ "
9673.000000
\n",
+ "
\n",
+ "
\n",
+ "
DE
\n",
+ "
1.370275
\n",
+ "
-1.231413
\n",
+ "
-4.499021
\n",
+ "
-27.806872
\n",
+ "
0.581898
\n",
+ "
9.572051
\n",
+ "
6.704117
\n",
+ "
-8.000000
\n",
+ "
-2816.000000
\n",
+ "
\n",
+ "
\n",
+ "
FL
\n",
+ "
12.798641
\n",
+ "
7.913089
\n",
+ "
-0.464450
\n",
+ "
13.453116
\n",
+ "
0.000000
\n",
+ "
-19.567955
\n",
+ "
2.960044
\n",
+ "
88.000000
\n",
+ "
71042.000000
\n",
+ "
\n",
+ "
\n",
+ "
GA
\n",
+ "
0.623927
\n",
+ "
2.733393
\n",
+ "
-0.799951
\n",
+ "
1.511527
\n",
+ "
-0.093487
\n",
+ "
-9.680710
\n",
+ "
2.172740
\n",
+ "
-3.000000
\n",
+ "
12615.000000
\n",
+ "
\n",
+ "
\n",
+ "
HI
\n",
+ "
4.897141
\n",
+ "
9.101461
\n",
+ "
0.265372
\n",
+ "
-0.896060
\n",
+ "
-0.094805
\n",
+ "
-35.939385
\n",
+ "
0.379145
\n",
+ "
7.000000
\n",
+ "
4771.000000
\n",
+ "
\n",
+ "
\n",
+ "
IA
\n",
+ "
10.953716
\n",
+ "
-0.708470
\n",
+ "
-4.742017
\n",
+ "
-1.623474
\n",
+ "
0.732012
\n",
+ "
19.552402
\n",
+ "
-7.997991
\n",
+ "
-53.000000
\n",
+ "
-25766.000000
\n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
4.722145
\n",
+ "
9.643493
\n",
+ "
7.189788
\n",
+ "
-0.311804
\n",
+ "
-1.015539
\n",
+ "
-15.992569
\n",
+ "
19.816490
\n",
+ "
-23.000000
\n",
+ "
-16597.000000
\n",
+ "
\n",
+ "
\n",
+ "
IL
\n",
+ "
5.155379
\n",
+ "
5.303919
\n",
+ "
-0.630714
\n",
+ "
5.037600
\n",
+ "
0.000000
\n",
+ "
-25.049480
\n",
+ "
6.050435
\n",
+ "
93.000000
\n",
+ "
54402.000000
\n",
+ "
\n",
+ "
\n",
+ "
IN
\n",
+ "
2.113662
\n",
+ "
2.437293
\n",
+ "
0.719657
\n",
+ "
7.315713
\n",
+ "
0.000000
\n",
+ "
1.347745
\n",
+ "
0.492553
\n",
+ "
-36.000000
\n",
+ "
-16444.000000
\n",
+ "
\n",
+ "
\n",
+ "
KS
\n",
+ "
5.264502
\n",
+ "
-7.562943
\n",
+ "
0.627460
\n",
+ "
12.245890
\n",
+ "
0.466634
\n",
+ "
1.465143
\n",
+ "
-0.964424
\n",
+ "
-46.000000
\n",
+ "
-21169.000000
\n",
+ "
\n",
+ "
\n",
+ "
KY
\n",
+ "
8.794436
\n",
+ "
6.683970
\n",
+ "
0.862572
\n",
+ "
-0.575122
\n",
+ "
0.578035
\n",
+ "
-6.133101
\n",
+ "
5.455541
\n",
+ "
-57.000000
\n",
+ "
-27542.000000
\n",
+ "
\n",
+ "
\n",
+ "
LA
\n",
+ "
8.343117
\n",
+ "
3.494850
\n",
+ "
1.398804
\n",
+ "
7.964377
\n",
+ "
0.000000
\n",
+ "
-11.833643
\n",
+ "
-1.607310
\n",
+ "
27.000000
\n",
+ "
19739.000000
\n",
+ "
\n",
+ "
\n",
+ "
MA
\n",
+ "
8.936772
\n",
+ "
7.732666
\n",
+ "
1.005028
\n",
+ "
8.415698
\n",
+ "
0.000000
\n",
+ "
-19.359667
\n",
+ "
15.170475
\n",
+ "
38.000000
\n",
+ "
28222.000000
\n",
+ "
\n",
+ "
\n",
+ "
MD
\n",
+ "
9.100530
\n",
+ "
3.424516
\n",
+ "
-1.341899
\n",
+ "
21.848353
\n",
+ "
0.000000
\n",
+ "
-10.271062
\n",
+ "
-2.199229
\n",
+ "
-26.000000
\n",
+ "
-8900.000000
\n",
+ "
\n",
+ "
\n",
+ "
ME
\n",
+ "
12.565009
\n",
+ "
9.122611
\n",
+ "
-3.922820
\n",
+ "
-0.880265
\n",
+ "
-0.439467
\n",
+ "
-5.913473
\n",
+ "
-0.866007
\n",
+ "
-25.000000
\n",
+ "
-14441.000000
\n",
+ "
\n",
+ "
\n",
+ "
MI
\n",
+ "
6.453785
\n",
+ "
1.068588
\n",
+ "
0.689832
\n",
+ "
6.708850
\n",
+ "
0.000000
\n",
+ "
-8.072578
\n",
+ "
-1.350049
\n",
+ "
-23.000000
\n",
+ "
-6868.000000
\n",
+ "
\n",
+ "
\n",
+ "
MN
\n",
+ "
15.920965
\n",
+ "
17.740780
\n",
+ "
3.141607
\n",
+ "
22.498320
\n",
+ "
1.758343
\n",
+ "
-38.332396
\n",
+ "
22.509297
\n",
+ "
-87.000000
\n",
+ "
-46742.000000
\n",
+ "
\n",
+ "
\n",
+ "
MO
\n",
+ "
4.976759
\n",
+ "
-0.085646
\n",
+ "
-3.577408
\n",
+ "
47.102090
\n",
+ "
0.000000
\n",
+ "
-35.919908
\n",
+ "
-2.378652
\n",
+ "
-30.000000
\n",
+ "
-13248.000000
\n",
+ "
\n",
+ "
\n",
+ "
MS
\n",
+ "
8.484879
\n",
+ "
1.040226
\n",
+ "
-0.572744
\n",
+ "
24.863184
\n",
+ "
0.000000
\n",
+ "
-22.951000
\n",
+ "
0.051741
\n",
+ "
-27.000000
\n",
+ "
-12524.000000
\n",
+ "
\n",
+ "
\n",
+ "
MT
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NC
\n",
+ "
8.153384
\n",
+ "
11.292289
\n",
+ "
-2.811982
\n",
+ "
6.496331
\n",
+ "
0.078513
\n",
+ "
-19.504668
\n",
+ "
11.151508
\n",
+ "
-71.000000
\n",
+ "
-45011.000000
\n",
+ "
\n",
+ "
\n",
+ "
ND
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NE
\n",
+ "
7.484343
\n",
+ "
37.676269
\n",
+ "
-9.271518
\n",
+ "
-7.562947
\n",
+ "
0.634817
\n",
+ "
-37.670893
\n",
+ "
58.015686
\n",
+ "
-27.000000
\n",
+ "
-13452.000000
\n",
+ "
\n",
+ "
\n",
+ "
NH
\n",
+ "
11.333692
\n",
+ "
7.394888
\n",
+ "
-1.695591
\n",
+ "
2.079689
\n",
+ "
0.000000
\n",
+ "
-14.216572
\n",
+ "
9.124264
\n",
+ "
-16.000000
\n",
+ "
-11851.000000
\n",
+ "
\n",
+ "
\n",
+ "
NJ
\n",
+ "
5.927327
\n",
+ "
8.713014
\n",
+ "
-2.337923
\n",
+ "
-10.341142
\n",
+ "
0.000000
\n",
+ "
-5.623117
\n",
+ "
25.764242
\n",
+ "
151.000000
\n",
+ "
102626.000000
\n",
+ "
\n",
+ "
\n",
+ "
NM
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NV
\n",
+ "
7.485453
\n",
+ "
2.632552
\n",
+ "
-0.783104
\n",
+ "
-0.500327
\n",
+ "
0.076985
\n",
+ "
2.512022
\n",
+ "
8.687485
\n",
+ "
12.000000
\n",
+ "
14693.000000
\n",
+ "
\n",
+ "
\n",
+ "
NY
\n",
+ "
12.369088
\n",
+ "
8.434444
\n",
+ "
-0.870792
\n",
+ "
-10.437037
\n",
+ "
0.000000
\n",
+ "
4.477567
\n",
+ "
15.929982
\n",
+ "
573.000000
\n",
+ "
407383.000000
\n",
+ "
\n",
+ "
\n",
+ "
OH
\n",
+ "
5.166431
\n",
+ "
2.626470
\n",
+ "
0.160945
\n",
+ "
16.322108
\n",
+ "
0.000000
\n",
+ "
-16.400598
\n",
+ "
0.628654
\n",
+ "
-21.000000
\n",
+ "
355.000000
\n",
+ "
\n",
+ "
\n",
+ "
OK
\n",
+ "
17.267863
\n",
+ "
5.687201
\n",
+ "
-2.733525
\n",
+ "
5.227426
\n",
+ "
-1.254840
\n",
+ "
-4.629739
\n",
+ "
13.684527
\n",
+ "
-60.000000
\n",
+ "
-25920.000000
\n",
+ "
\n",
+ "
\n",
+ "
OR
\n",
+ "
10.312702
\n",
+ "
7.677240
\n",
+ "
-0.667578
\n",
+ "
1.177527
\n",
+ "
-0.110343
\n",
+ "
-15.168623
\n",
+ "
16.277201
\n",
+ "
-35.000000
\n",
+ "
-26320.000000
\n",
+ "
\n",
+ "
\n",
+ "
PA
\n",
+ "
9.568567
\n",
+ "
6.789819
\n",
+ "
-1.100045
\n",
+ "
2.768551
\n",
+ "
0.000000
\n",
+ "
-7.188058
\n",
+ "
6.730014
\n",
+ "
-63.000000
\n",
+ "
-33293.000000
\n",
+ "
\n",
+ "
\n",
+ "
RI
\n",
+ "
28.097665
\n",
+ "
18.885313
\n",
+ "
-28.064680
\n",
+ "
9.569074
\n",
+ "
0.344864
\n",
+ "
-42.404295
\n",
+ "
39.740670
\n",
+ "
5.000000
\n",
+ "
4138.000000
\n",
+ "
\n",
+ "
\n",
+ "
SC
\n",
+ "
3.709508
\n",
+ "
2.304021
\n",
+ "
3.766892
\n",
+ "
19.048750
\n",
+ "
0.000000
\n",
+ "
-12.734147
\n",
+ "
1.243649
\n",
+ "
-43.000000
\n",
+ "
-22081.000000
\n",
+ "
\n",
+ "
\n",
+ "
SD
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
TN
\n",
+ "
8.692949
\n",
+ "
4.908793
\n",
+ "
-1.487781
\n",
+ "
31.162224
\n",
+ "
0.000000
\n",
+ "
-26.640514
\n",
+ "
2.135541
\n",
+ "
-31.000000
\n",
+ "
-13021.000000
\n",
+ "
\n",
+ "
\n",
+ "
TX
\n",
+ "
8.229632
\n",
+ "
4.785835
\n",
+ "
-0.018445
\n",
+ "
7.608903
\n",
+ "
0.000000
\n",
+ "
-6.991503
\n",
+ "
11.472775
\n",
+ "
-103.000000
\n",
+ "
-58670.000000
\n",
+ "
\n",
+ "
\n",
+ "
UT
\n",
+ "
12.401135
\n",
+ "
9.279480
\n",
+ "
2.393714
\n",
+ "
-1.095225
\n",
+ "
2.211103
\n",
+ "
-27.444168
\n",
+ "
33.552393
\n",
+ "
-31.000000
\n",
+ "
-18553.000000
\n",
+ "
\n",
+ "
\n",
+ "
VA
\n",
+ "
12.747983
\n",
+ "
4.210496
\n",
+ "
-2.294801
\n",
+ "
20.581487
\n",
+ "
0.000000
\n",
+ "
-12.192675
\n",
+ "
2.823834
\n",
+ "
-48.000000
\n",
+ "
-24962.000000
\n",
+ "
\n",
+ "
\n",
+ "
VT
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
WA
\n",
+ "
0.836843
\n",
+ "
3.285992
\n",
+ "
-2.853985
\n",
+ "
1.365010
\n",
+ "
0.242227
\n",
+ "
-14.708699
\n",
+ "
5.595930
\n",
+ "
-84.000000
\n",
+ "
-61277.000000
\n",
+ "
\n",
+ "
\n",
+ "
WI
\n",
+ "
15.552119
\n",
+ "
4.422237
\n",
+ "
-0.796047
\n",
+ "
40.591511
\n",
+ "
-0.526995
\n",
+ "
-20.282972
\n",
+ "
-3.363747
\n",
+ "
-17.000000
\n",
+ "
-8795.000000
\n",
+ "
\n",
+ "
\n",
+ "
WV
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
WY
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 279,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def style_negative(v, props=''):\n",
+ " return props if v < 0 else None\n",
+ "\n",
+ "diff_style = diff.style.applymap(style_negative, props='color:red;')\\\n",
+ " .applymap(lambda v: 'opacity: 20%;' if (v < 0.0) and (v > 0.0) else None)\n",
+ "diff_style"
+ ]
+ },
+ {
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization.ipynb
new file mode 100644
index 00000000..9c671466
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27-highlevel-summarization.ipynb
@@ -0,0 +1,3434 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Methodology to address fundamental problem 1 itemized in Issue 1024 - follow-up compare tabulations and relative household burden. This time I extend the 12-11 notebook to look at how the percentile ranks affects the proportion of tracts considered as burdened versus the current methodology."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Indicator reviewed: \n",
+ "\n",
+ "Socioeconomic Factors Indicator reviewed\n",
+ "* [Extreme Housing Burden](#housingburden)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Packages"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### ETL process for acquiring relevant tables"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### NOTE: If you ran the ETL Process to acquire Table 8 in the other notebook of this draft PR you do not need to run the ETL cell block again"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Copy and adapt certain sections of code from data_pipeline.utils \n",
+ "\n",
+ "def download_hud_dataset():\n",
+ " DOWNLOAD_FILENAME = \"HUD_ZIPPED.csv\"\n",
+ " HOUSING_FTP_URL = \"https://www.huduser.gov/portal/datasets/cp/2014thru2018-140-csv.zip\" \n",
+ " response = requests.get(HOUSING_FTP_URL, verify=True)\n",
+ " if response.status_code == 200:\n",
+ " file_contents = response.content\n",
+ " else:\n",
+ " sys.exit(\n",
+ " f\"HTTP response {response.status_code} from url {file_url}. Info: {response.content}\"\n",
+ " )\n",
+ "\n",
+ " # Write the contents to disk.\n",
+ " file = open(DOWNLOAD_FILENAME, \"wb\")\n",
+ " file.write(file_contents)\n",
+ " file.close()\n",
+ " \n",
+ "def extract_zipped_download(zip_file_path, unzipped_path):\n",
+ " with zipfile.ZipFile(zip_file_path, \"r\") as zip_ref:\n",
+ " zip_ref.extractall(unzipped_path)\n",
+ " # cleanup temporary file\n",
+ " os.remove(zip_file_path)\n",
+ " \n",
+ "def up_one_directory(path):\n",
+ " try:\n",
+ " # from Python 3.6\n",
+ " parent_dir = Path(path).parents[1]\n",
+ " # for Python 3.4/3.5, use str to convert the path to string\n",
+ " # parent_dir = str(Path(path).parents[1])\n",
+ " shutil.move(path, parent_dir)\n",
+ " except IndexError:\n",
+ " # no upper directory\n",
+ " pass\n",
+ "\n",
+ "CURRENT_DIRECTORY = os.getcwd()\n",
+ "download_hud_dataset()\n",
+ "extract_zipped_download(CURRENT_DIRECTORY + \"/HUD_ZIPPED.csv\", CURRENT_DIRECTORY) \n",
+ "up_one_directory(CURRENT_DIRECTORY + \"/140/Table8.csv\")\n",
+ "shutil.rmtree(\"./140/\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Below I also propose an alternate means for ranking census tracts\n",
+ "### These steps are outlined and commented below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/series.py:726: RuntimeWarning: invalid value encountered in sqrt\n",
+ " result = getattr(ufunc, method)(*inputs, **kwargs)\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " iloc._setitem_with_indexer(indexer, value)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Read in the data from https://www.huduser.gov/portal/datasets/cp.html\n",
+ "housing = pd.read_csv(\"Table8.csv\", \n",
+ " encoding = \"ISO-8859-1\", \n",
+ " dtype = {'Tract_ID': object, 'st': object, 'geoid': object})\n",
+ "\n",
+ "# Remove data for states that aren't included in the census (e.g. American Samoa, Guam, etc.):\n",
+ "housing.drop(housing.loc[housing['st'] == '72'].index, inplace = True)\n",
+ "\n",
+ "# Combine owner and renter occupied low-income households that make less than 80% of HAMFI into one variable\n",
+ "housing['summed'] = (housing['T8_est10'] + \n",
+ " housing['T8_est23'] + \n",
+ " housing['T8_est36'] + \n",
+ " housing['T8_est76'] + \n",
+ " housing['T8_est89'] + \n",
+ " housing['T8_est102'])\n",
+ "\n",
+ "# Create a variable for the standard error of the summed variables\n",
+ "housing['summed_se'] = np.sqrt((housing['T8_moe10'] / 1.645)**2 + \n",
+ " (housing['T8_moe23'] / 1.645)**2 + \n",
+ " (housing['T8_moe36'] / 1.645)**2 + \n",
+ " (housing['T8_moe76'] / 1.645)**2 + \n",
+ " (housing['T8_moe89'] / 1.645)**2 + \n",
+ " (housing['T8_moe102'] / 1.645)**2)\n",
+ "\n",
+ "# Remove the first 7 digits in the FIPS Census Tract ID \n",
+ "housing['geoid'] = housing['geoid'].str[-11:]\n",
+ "\n",
+ "# Find the estimate of the proportion of the population that is heavily rent burdened\n",
+ "housing['hbrd_score'] = housing['summed'] / housing['T8_est1']\n",
+ "\n",
+ "# Change rates where the population is 0 to nan\n",
+ "housing['hbrd_score'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Create function for calculating the standard error, using the proportions standard error formula\n",
+ "# if the value under the radical is negative, use the ratio standard error formula\n",
+ "def se_prop(x, y, se_x, moe_y): \n",
+ " se_y = moe_y / 1.645\n",
+ " test = se_x**2 - (((x**2)/(y**2))*((se_y)**2))\n",
+ " se = np.where(test < 0,\n",
+ " (1/y) * np.sqrt(se_x**2 + (((x**2)/(y**2))*(se_y**2))), \n",
+ " (1/y) * np.sqrt(se_x**2 - (((x**2)/(y**2))*(se_y**2))))\n",
+ " return se\n",
+ "\n",
+ "housing['se'] = se_prop(housing['summed'], housing['T8_est1'], housing['summed_se'], housing['T8_moe1'])\n",
+ "\n",
+ "# Calculate the relative standard error\n",
+ "housing['rse'] = housing['se'] / housing['hbrd_score']*100\n",
+ "\n",
+ "# Change infinite rse's where the housing burden is 0 to np.nan\n",
+ "housing['rse'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Calculate the mean standard error for each state\n",
+ "housing['mean_state_se'] = np.zeros(len(housing))\n",
+ "\n",
+ "for state in housing['st'].unique():\n",
+ " mean_se = np.mean(housing[housing['st'] == state]['se'])\n",
+ " housing['mean_state_se'].loc[housing['st'] == state] = mean_se\n",
+ " \n",
+ "# Find census tract estimates that meet both of the following criteria and are thus considered unreliable estimates: \n",
+ "# RSE less than 50 AND\n",
+ "# SE less than the mean state SE or housing burdened low income households\n",
+ "# Convert these scores to nan\n",
+ "housing.loc[(housing['rse'] >= 50) & (housing['rse'] >= housing['mean_state_se']), 'hbrd_score'] = np.nan\n",
+ "\n",
+ "# Rename columns\n",
+ "housing = housing.rename(columns = {'geoid' :'FIPS_tract_id',\n",
+ " 'st' : 'state'\n",
+ " })\n",
+ "\n",
+ "# Calculate percentile rank for census tracts with a score above 0, set percentile to 0 if score is 0, for each state\n",
+ "housing['hbrd_rank'] = housing[\n",
+ " housing['hbrd_score'] != 0][['hbrd_score',\n",
+ " 'state']].groupby('state').rank( \n",
+ " na_option = 'keep', \n",
+ " pct = True) * 100\n",
+ "\n",
+ "housing.loc[housing['hbrd_score'] == 0, 'hbrd_rank'] = 0\n",
+ "\n",
+ "# Create final housing burden df\n",
+ "housingburden = housing.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
source
\n",
+ "
sumlevel
\n",
+ "
FIPS_tract_id
\n",
+ "
name
\n",
+ "
state
\n",
+ "
cnty
\n",
+ "
tract
\n",
+ "
T8_est1
\n",
+ "
T8_est2
\n",
+ "
T8_est3
\n",
+ "
...
\n",
+ "
T8_moe131
\n",
+ "
T8_moe132
\n",
+ "
T8_moe133
\n",
+ "
summed
\n",
+ "
summed_se
\n",
+ "
hbrd_score
\n",
+ "
se
\n",
+ "
rse
\n",
+ "
mean_state_se
\n",
+ "
hbrd_rank
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020100
\n",
+ "
Census Tract 201, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20100
\n",
+ "
765
\n",
+ "
570
\n",
+ "
50
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
80
\n",
+ "
31.721807
\n",
+ "
0.104575
\n",
+ "
0.041032
\n",
+ "
39.237314
\n",
+ "
0.036604
\n",
+ "
46.298077
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020200
\n",
+ "
Census Tract 202, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20200
\n",
+ "
720
\n",
+ "
465
\n",
+ "
65
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
138
\n",
+ "
45.531874
\n",
+ "
0.191667
\n",
+ "
0.061614
\n",
+ "
32.146659
\n",
+ "
0.036604
\n",
+ "
83.269231
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020300
\n",
+ "
Census Tract 203, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20300
\n",
+ "
1295
\n",
+ "
840
\n",
+ "
60
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
170
\n",
+ "
53.722921
\n",
+ "
0.131274
\n",
+ "
0.040927
\n",
+ "
31.176999
\n",
+ "
0.036604
\n",
+ "
63.653846
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020400
\n",
+ "
Census Tract 204, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20400
\n",
+ "
1640
\n",
+ "
1260
\n",
+ "
15
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
145
\n",
+ "
46.288510
\n",
+ "
0.088415
\n",
+ "
0.027822
\n",
+ "
31.467397
\n",
+ "
0.036604
\n",
+ "
34.615385
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020500
\n",
+ "
Census Tract 205, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20500
\n",
+ "
4175
\n",
+ "
2320
\n",
+ "
175
\n",
+ "
...
\n",
+ "
17
\n",
+ "
17
\n",
+ "
17
\n",
+ "
595
\n",
+ "
147.221693
\n",
+ "
0.142515
\n",
+ "
0.034760
\n",
+ "
24.390193
\n",
+ "
0.036604
\n",
+ "
68.221154
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 280 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source sumlevel FIPS_tract_id \\\n",
+ "0 2014thru2018 140 01001020100 \n",
+ "1 2014thru2018 140 01001020200 \n",
+ "2 2014thru2018 140 01001020300 \n",
+ "3 2014thru2018 140 01001020400 \n",
+ "4 2014thru2018 140 01001020500 \n",
+ "\n",
+ " name state cnty tract T8_est1 \\\n",
+ "0 Census Tract 201, Autauga County, Alabama 01 1 20100 765 \n",
+ "1 Census Tract 202, Autauga County, Alabama 01 1 20200 720 \n",
+ "2 Census Tract 203, Autauga County, Alabama 01 1 20300 1295 \n",
+ "3 Census Tract 204, Autauga County, Alabama 01 1 20400 1640 \n",
+ "4 Census Tract 205, Autauga County, Alabama 01 1 20500 4175 \n",
+ "\n",
+ " T8_est2 T8_est3 ... T8_moe131 T8_moe132 T8_moe133 summed summed_se \\\n",
+ "0 570 50 ... 12 12 12 80 31.721807 \n",
+ "1 465 65 ... 12 12 12 138 45.531874 \n",
+ "2 840 60 ... 12 12 12 170 53.722921 \n",
+ "3 1260 15 ... 12 12 12 145 46.288510 \n",
+ "4 2320 175 ... 17 17 17 595 147.221693 \n",
+ "\n",
+ " hbrd_score se rse mean_state_se hbrd_rank \n",
+ "0 0.104575 0.041032 39.237314 0.036604 46.298077 \n",
+ "1 0.191667 0.061614 32.146659 0.036604 83.269231 \n",
+ "2 0.131274 0.040927 31.176999 0.036604 63.653846 \n",
+ "3 0.088415 0.027822 31.467397 0.036604 34.615385 \n",
+ "4 0.142515 0.034760 24.390193 0.036604 68.221154 \n",
+ "\n",
+ "[5 rows x 280 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(73056, 280)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As desired we see a uniform distribution for the percentile rank for burdened households"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we compute for a baseline comparison "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Owner occupied numerator fields\n",
+ "OWNER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est7\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est10\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est20\",\n",
+ " \n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est23\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est33\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est36\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "OWNER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est13\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est26\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est39\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est52\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est65\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_FIELD = \"T8_est2\"\n",
+ "# Subtotal\n",
+ "# Owner occupied\n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_HAMFI_FIELD = \"T8_est3\"\n",
+ "# Subtotal\n",
+ "# Owner occupied \n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "# Renter occupied numerator fields\n",
+ "RENTER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est73\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est76\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est86\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est89\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est99\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est102\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "RENTER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est79\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tless than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est92\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est105\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est118\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est131\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# T8_est68\tSubtotalRenter occupied\tAll\tAll\tAll\n",
+ "RENTER_OCCUPIED_POPULATION_FIELD = \"T8_est68\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_summed_methodology\"] = housingburden[\n",
+ " OWNER_OCCUPIED_NUMERATOR_FIELDS\n",
+ "].sum(axis=1) + housingburden[RENTER_OCCUPIED_NUMERATOR_FIELDS].sum(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ " - housingburden[OWNER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ " - housingburden[RENTER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator_sans_not_computed\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_percent\"] = np.round(\n",
+ " (housingburden[\"current_summed_methodology\"] / housingburden[\"current_methodology_denominator\"] ), 2) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we construct the distribution of differences in the number of owned and rented burdened households\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_df = housingburden[['FIPS_tract_id', 'state','hbrd_rank','hbrd_score', 'summed', \n",
+ " 'current_summed_methodology', 'T8_est1', \n",
+ " \"current_methodology_denominator_sans_not_computed\",\n",
+ " 'current_methodology_denominator', 'current_methodology_percent']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### First notice here that **T8_est1** and **current_methodology_denominator** should represent same or similar aggregates. In general, we cen see that the current computation performed results in a differerntial that undercounts the total occupied and rental households."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator_sans_not_computed\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title('Distribution of differences between aggregate totals that normalizes tabulation of poverty households (with removal of not computed fields) ')\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Aggregate differences in total owner and renter occupied low-income households')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(final_df[\"differences_aggregate_denominator_sans_not_computed\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " after removing the cwd from sys.path.\n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"current_methodology_percentile_rank\"] = final_df[\"current_methodology_percent\"].rank(\n",
+ " pct=True,\n",
+ " # Set ascending to the parameter value.\n",
+ " ascending=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \"\"\"Entry point for launching an IPython kernel.\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " after removing the cwd from sys.path.\n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"new_threshold_exceeded\"] = (final_df['hbrd_rank'] >= 90)\n",
+ "\n",
+ "final_df[\"current_threshold_exceeded\"] = (final_df[\n",
+ " 'current_methodology_percentile_rank'] >= 0.90)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Only include non-NA tracts for comparison purposes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# first save NA tracts that were considered unreliable\n",
+ "ineligible_tracts = list(final_df[final_df[\"hbrd_rank\"].isna()][\"FIPS_tract_id\"].values)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5243"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(ineligible_tracts)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### How many tracts are ineligible according to CalEnvironScreen but are considerd in Score L?\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_current_methodology = final_df[final_df[\"current_methodology_percentile_rank\"] >= 0.90]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(7323, 15)"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final_current_methodology.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(53, 15)"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# 53 tracts\n",
+ "final_current_methodology[\n",
+ " final_current_methodology.FIPS_tract_id.isin(ineligible_tracts)].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "non_null_df = final_df.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(7323, 15)"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# number of tracks eligible\n",
+ "non_null_df[non_null_df[\"current_methodology_percentile_rank\"] >= 0.90].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title(\"Distribution of Percentiles for Housing Burden (Score L)\")\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Percentile (although currently not represented as a percentage)')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(non_null_df[\"current_methodology_percentile_rank\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False 65733\n",
+ "True 7323\n",
+ "Name: current_threshold_exceeded, dtype: int64"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "non_null_df[\"current_threshold_exceeded\"].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False 66255\n",
+ "True 6801\n",
+ "Name: new_threshold_exceeded, dtype: int64"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "non_null_df[\"new_threshold_exceeded\"].value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Score L Criterion as burden but not Calvironscreen"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 217,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2794, 15)"
+ ]
+ },
+ "execution_count": 217,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# this includes uineligible np.nan values too\n",
+ "predicate_1 = (non_null_df['current_threshold_exceeded'] == True) & (non_null_df['new_threshold_exceeded'] != True)\n",
+ "\n",
+ "non_null_df[predicate_1].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 218,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Where Score L is considered burdened but not in CalEnviroScreen\n",
+ "score_l_considered_burdened = non_null_df[predicate_1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import us\n",
+ "\n",
+ "mapping = us.states.mapping('fips', 'abbr')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 219,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Inserted after the basic stats definition.\n",
+ "# Load demographic data\n",
+ "import pathlib\n",
+ "\n",
+ "DATA_DIR = pathlib.Path.cwd().parent / \"data\"\n",
+ "COMPARISON_OUTPUTS_DIR = DATA_DIR / \"comparison_outputs\"\n",
+ "\n",
+ "demographics_path = DATA_DIR / \"dataset\" / \"census_acs_2019\" / \"usa.csv\"\n",
+ "\n",
+ "demographics_df = pd.read_csv(\n",
+ " demographics_path,\n",
+ " dtype={\"GEOID10_TRACT\": \"string\"},\n",
+ ")\n",
+ "\n",
+ "# Set some field names\n",
+ "BLACK_FIELD_NAME = \"Black or African American alone\"\n",
+ "AMERICAN_INDIAN_FIELD_NAME = \"American Indian and Alaska Native alone\"\n",
+ "ASIAN_FIELD_NAME = \"Asian alone\"\n",
+ "HAWAIIAN_FIELD_NAME = \"Native Hawaiian and Other Pacific alone\"\n",
+ "TWO_OR_MORE_RACES_FIELD_NAME = \"Two or more races\"\n",
+ "NON_HISPANIC_WHITE_FIELD_NAME = \"Non-Hispanic White\"\n",
+ "HISPANIC_FIELD_NAME = \"Hispanic or Latino\"\n",
+ "PERCENT_PREFIX = \"Percent \"\n",
+ "\n",
+ "RE_OUTPUT_FIELDS = [\n",
+ " BLACK_FIELD_NAME,\n",
+ " AMERICAN_INDIAN_FIELD_NAME,\n",
+ " ASIAN_FIELD_NAME,\n",
+ " HAWAIIAN_FIELD_NAME,\n",
+ " TWO_OR_MORE_RACES_FIELD_NAME,\n",
+ " NON_HISPANIC_WHITE_FIELD_NAME,\n",
+ " HISPANIC_FIELD_NAME,\n",
+ "]\n",
+ "\n",
+ "RE_PERCENT_OUTPUT_FIELDS = [PERCENT_PREFIX + field for field in RE_OUTPUT_FIELDS]\n",
+ "\n",
+ "columns_to_keep = (\n",
+ " [\"GEOID10_TRACT\"]\n",
+ " + RE_OUTPUT_FIELDS\n",
+ " + RE_PERCENT_OUTPUT_FIELDS\n",
+ " + ['Percent of individuals < 200% Federal Poverty Line', \n",
+ " 'Median value ($) of owner-occupied housing units',\n",
+ " 'Percent individuals age 25 or over with less than high school degree',\n",
+ " 'Percent enrollment in college or graduate school',\n",
+ " 'Linguistic isolation (percent)']\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def highlight_medians(s):\n",
+ " # highlight if the current median is greater than the median of medians for that series\n",
+ " is_greater_than_median = s > s.median()\n",
+ " return ['color: pink; background-color:#7272FE'\n",
+ " if cell else '' for cell in is_greater_than_median]\n",
+ "# Join the demographics in.\n",
+ "merged_df_score_l = score_l_considered_burdened.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_score_l.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_score_l[\n",
+ " percent_cols] = merged_df_score_l[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_score_l.iterrows():\n",
+ " current_row = str(merged_df_score_l.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_score_l.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_score_l = merged_df_score_l.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_score_l.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_score_l.columns.values]\n",
+ "\n",
+ "grouped_stats_score_l = grouped_stats_score_l[[x for x in grouped_stats_score_l \n",
+ " if \"median\" in x and \n",
+ " \"Percent\" in x] + [\"GEOID10_TRACT nunique\", \n",
+ " 'current_summed_methodology sum', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_score_l.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_score_l = grouped_stats_score_l.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line median'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (median across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (median across all tracts)', \n",
+ "'Percent enrollment in college or graduate school median'\n",
+ " :'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ "'Percent Black or African American alone median':\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone median':\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ "'Percent Non-Hispanic White median':\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ "'Percent Hispanic or Latino median':\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ "'GEOID10_TRACT nunique': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology sum\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 220,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['Percent of individuals < 200% Federal Poverty Line (median across all tracts)',\n",
+ " 'Percent individuals age 25 or over with less than high school degree (median across all tracts)',\n",
+ " 'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ " 'Total Number of Unique Tracts',\n",
+ " 'Total Owned and Rented Burdened Households (Current Aggregation Methodology)'],\n",
+ " dtype='object')"
+ ]
+ },
+ "execution_count": 220,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_score_l.columns"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If the samples are samples from the population - a big assumption - in question and the sampling follows rules and things we take the mean:\n",
+ "\n",
+ "The mean of the median distribution (an order statistic) is the best estimate for the median. It's the best least unbiased estimator. The answer is not the median of that distribution.\n",
+ "\n",
+ "The answer is also not if the mean is an estimate of the median. Completely unrelated.\n",
+ "\n",
+ "Even if the original population is skewed, the distribution of a sampling statistic will be normalized - recall the the central limit theorem for more details\n",
+ "\n",
+ "The standard error of that mean should give you what you want to know to confidently make statements of the true population median across all states"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 221,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "list_of_columns = list(grouped_stats_score_l.columns)\n",
+ "values_1 = list(grouped_stats_score_l[list_of_columns].mean())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 222,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_1.extend([True, False])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 223,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[57.05272445515469,\n",
+ " 19.383812769449793,\n",
+ " 8.132533443213486,\n",
+ " 33.69280603472747,\n",
+ " 1.2213947311592683,\n",
+ " 31.32188596954498,\n",
+ " 19.378347515748676,\n",
+ " 62.08888888888889,\n",
+ " 40949.2,\n",
+ " True,\n",
+ " False]"
+ ]
+ },
+ "execution_count": 223,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "values_1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# CalenviroScreen Burden"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 224,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_2 = (non_null_df['current_threshold_exceeded'] == False) & (non_null_df['new_threshold_exceeded'] == True)\n",
+ "\n",
+ "cal_ej_screen_burdened = non_null_df[predicate_2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 225,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_score_ejcreen = cal_ej_screen_burdened.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_score_ejcreen.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_score_ejcreen[\n",
+ " percent_cols] = merged_df_score_ejcreen[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_score_ejcreen.iterrows():\n",
+ " current_row = str(merged_df_score_ejcreen.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_score_ejcreen.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_score_ej_screen = merged_df_score_ejcreen.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_score_ej_screen.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_score_ej_screen.columns.values]\n",
+ "\n",
+ "grouped_stats_score_ej_screen = grouped_stats_score_ej_screen[[x for x in grouped_stats_score_ej_screen \n",
+ " if \"median\" in x and \n",
+ " \"Percent\" in x] + [\"GEOID10_TRACT nunique\", \n",
+ " 'current_summed_methodology sum', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_score_ej_screen.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_score_ej_screen = grouped_stats_score_ej_screen.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line median'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (median across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (median across all tracts)', \n",
+ "'Percent enrollment in college or graduate school median'\n",
+ " :'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ "'Percent Black or African American alone median':\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone median':\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ "'Percent Non-Hispanic White median':\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ "'Percent Hispanic or Latino median':\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ "'GEOID10_TRACT nunique': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology sum\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 235,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2272, 36)"
+ ]
+ },
+ "execution_count": 235,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "merged_df_score_ejcreen.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 236,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2272"
+ ]
+ },
+ "execution_count": 236,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "grouped_stats_score_ej_screen['Total Number of Unique Tracts'].sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 237,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_2 = list(grouped_stats_score_ej_screen[list_of_columns].mean())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 238,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_2.extend([False, True])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Both Met Criterion"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 239,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_3 = (non_null_df['current_threshold_exceeded'] == True) & (non_null_df['new_threshold_exceeded'] == True)\n",
+ "\n",
+ "union_df = non_null_df[predicate_3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 240,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(4529, 15)"
+ ]
+ },
+ "execution_count": 240,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "union_df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 241,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_both_met = union_df.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_both_met.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_both_met[\n",
+ " percent_cols] = merged_df_both_met[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_both_met.iterrows():\n",
+ " current_row = str(merged_df_both_met.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_both_met.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_both_met = merged_df_both_met.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_both_met.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_both_met.columns.values]\n",
+ "\n",
+ "grouped_stats_both_met = grouped_stats_both_met[[x for x in grouped_stats_both_met \n",
+ " if \"median\" in x and \n",
+ " \"Percent\" in x] + [\"GEOID10_TRACT nunique\", \n",
+ " 'current_summed_methodology sum', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_both_met.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_both_met = grouped_stats_both_met.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line median'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (median across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (median across all tracts)', \n",
+ "'Percent enrollment in college or graduate school median'\n",
+ " :'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ "'Percent Black or African American alone median':\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone median':\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ "'Percent Non-Hispanic White median':\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ "'Percent Hispanic or Latino median':\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ "'GEOID10_TRACT nunique': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology sum\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 242,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_3 = list(grouped_stats_both_met[list_of_columns].mean())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 243,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_3.extend([True, True])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Neither Met Criterion "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 244,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predicate_4 = (non_null_df[\n",
+ " 'current_threshold_exceeded'] == False) & (\n",
+ " non_null_df['new_threshold_exceeded'] == False)\n",
+ "\n",
+ "negation_union_df = non_null_df[predicate_4]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 245,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Join the demographics in.\n",
+ "merged_df_negation_union = negation_union_df.merge(\n",
+ " demographics_df[columns_to_keep],\n",
+ " left_on=\"FIPS_tract_id\",\n",
+ " right_on=\"GEOID10_TRACT\",\n",
+ " how=\"inner\"\n",
+ ")\n",
+ "\n",
+ "# these are not converted into percent 0 - 100 scale\n",
+ "percent_cols = [x for x in merged_df_negation_union.columns if \n",
+ " 'Percent' in x or '(percent)' in x\n",
+ " ]\n",
+ "\n",
+ "merged_df_negation_union[\n",
+ " percent_cols] = merged_df_negation_union[\n",
+ " percent_cols].apply(lambda x: x * 100)\n",
+ "\n",
+ "for idx, row in merged_df_negation_union.iterrows():\n",
+ " current_row = str(merged_df_negation_union.loc[idx, 'state'])\n",
+ " state = mapping.get(current_row, None)\n",
+ " merged_df_negation_union.loc[idx, 'state_name'] = state\n",
+ "\n",
+ "grouped_stats_both_not_met = merged_df_negation_union.groupby([\"state_name\"]).agg({\n",
+ " 'GEOID10_TRACT': 'nunique',\n",
+ " 'Percent of individuals < 200% Federal Poverty Line': [np.median, np.std],\n",
+ " 'Median value ($) of owner-occupied housing units': [np.median, np.std],\n",
+ " 'Percent individuals age 25 or over with less than high school degree': [np.median, np.std],\n",
+ " 'Percent enrollment in college or graduate school': [np.median, np.std],\n",
+ " 'Percent Black or African American alone': [np.median, np.std],\n",
+ " 'Percent American Indian and Alaska Native alone': [np.median, np.std],\n",
+ " 'Percent Non-Hispanic White': [np.median, np.std], \n",
+ " 'Linguistic isolation (percent)': [np.median, np.std],\n",
+ " 'Percent Hispanic or Latino': [np.median, np.std],\n",
+ " 'hbrd_rank': [np.median, np.std],\n",
+ " 'current_methodology_percent': [np.median, np.std],\n",
+ " 'current_summed_methodology': [np.median, np.std, np.sum]\n",
+ "}).reset_index()\n",
+ "\n",
+ "\n",
+ "grouped_stats_both_not_met.columns = [' '.join(col).strip() for \n",
+ " col in grouped_stats_both_not_met.columns.values]\n",
+ "\n",
+ "grouped_stats_both_not_met = grouped_stats_both_not_met[[x for x in grouped_stats_both_not_met \n",
+ " if \"median\" in x and \n",
+ " \"Percent\" in x] + [\"GEOID10_TRACT nunique\", \n",
+ " 'current_summed_methodology sum', \"state_name\"]]\n",
+ "\n",
+ "grouped_stats_both_not_met.set_index(\"state_name\", inplace=True)\n",
+ "\n",
+ "grouped_stats_both_not_met = grouped_stats_both_not_met.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line median'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (median across all tracts)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (median across all tracts)', \n",
+ "'Percent enrollment in college or graduate school median'\n",
+ " :'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ "'Percent Black or African American alone median':\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ "'Percent American Indian and Alaska Native alone median':\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ "'Percent Non-Hispanic White median':\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ "'Percent Hispanic or Latino median':\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ "'GEOID10_TRACT nunique': \"Total Number of Unique Tracts\",\n",
+ "\"current_summed_methodology sum\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\" \n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 246,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "values_4 = list(grouped_stats_both_not_met[list_of_columns].mean())\n",
+ "\n",
+ "values_4.extend([False, False])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 247,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
0
\n",
+ "
1
\n",
+ "
2
\n",
+ "
3
\n",
+ "
4
\n",
+ "
5
\n",
+ "
6
\n",
+ "
7
\n",
+ "
8
\n",
+ "
9
\n",
+ "
10
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
57.052724
\n",
+ "
19.383813
\n",
+ "
8.132533
\n",
+ "
33.692806
\n",
+ "
1.221395
\n",
+ "
31.321886
\n",
+ "
19.378348
\n",
+ "
62.088889
\n",
+ "
40949.200000
\n",
+ "
True
\n",
+ "
False
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
47.082927
\n",
+ "
13.224927
\n",
+ "
8.685441
\n",
+ "
23.061683
\n",
+ "
0.772400
\n",
+ "
48.240042
\n",
+ "
12.553371
\n",
+ "
44.549020
\n",
+ "
24719.098039
\n",
+ "
False
\n",
+ "
True
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
62.331263
\n",
+ "
17.689811
\n",
+ "
11.824205
\n",
+ "
33.455525
\n",
+ "
0.921755
\n",
+ "
34.495797
\n",
+ "
15.855933
\n",
+ "
88.803922
\n",
+ "
60757.901961
\n",
+ "
True
\n",
+ "
True
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
27.736502
\n",
+ "
8.785280
\n",
+ "
5.847120
\n",
+ "
5.729181
\n",
+ "
0.537429
\n",
+ "
75.916536
\n",
+ "
7.463468
\n",
+ "
1244.333333
\n",
+ "
443680.568627
\n",
+ "
False
\n",
+ "
False
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0 1 2 3 4 5 6 \\\n",
+ "0 57.052724 19.383813 8.132533 33.692806 1.221395 31.321886 19.378348 \n",
+ "1 47.082927 13.224927 8.685441 23.061683 0.772400 48.240042 12.553371 \n",
+ "2 62.331263 17.689811 11.824205 33.455525 0.921755 34.495797 15.855933 \n",
+ "3 27.736502 8.785280 5.847120 5.729181 0.537429 75.916536 7.463468 \n",
+ "\n",
+ " 7 8 9 10 \n",
+ "0 62.088889 40949.200000 True False \n",
+ "1 44.549020 24719.098039 False True \n",
+ "2 88.803922 60757.901961 True True \n",
+ "3 1244.333333 443680.568627 False False "
+ ]
+ },
+ "execution_count": 247,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final_summary_data_values = [values_1, values_2, values_3, values_4]\n",
+ " \n",
+ "# Create the pandas DataFrame\n",
+ "df = pd.DataFrame(final_summary_data_values)\n",
+ " \n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 248,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cols = list(grouped_stats_both_not_met.columns)\n",
+ "cols.extend([\n",
+ " 'Score L Relative Housing Burden for all households met burden threshold', \n",
+ " 'CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 249,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df.rename(columns={df.columns[idx]: cols[idx] for idx, _ in enumerate(cols)}, inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 250,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = df.set_index([\n",
+ " 'Score L Relative Housing Burden for all households met burden threshold', \n",
+ " 'CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)'], inplace=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 251,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = df.rename(columns={\n",
+ "'Percent of individuals < 200% Federal Poverty Line (median across all tracts)'\n",
+ " : 'Percent of individuals < 200% Federal Poverty Line (mean of median across all states)', \n",
+ "'Percent individuals age 25 or over with less than high school degree median':\n",
+ "'Percent individuals age 25 or over with less than high school degree (mean of median across all states)', \n",
+ "'Percent enrollment in college or graduate school (median across all states)'\n",
+ " :'Percent enrollment in college or graduate school (mean of median across all states)',\n",
+ "'Percent Black or African American alone (median across all tracts)':\n",
+ " 'Percent Black or African American alone (mean of median across all states)',\n",
+ "'Percent American Indian and Alaska Native alone (median across all tracts)':\n",
+ " 'Percent American Indian and Alaska Native alone (mean of median across all states)',\n",
+ "'Percent Non-Hispanic White (median across all tracts)':\n",
+ " 'Percent Non-Hispanic White (mean of median across all states)',\n",
+ "'Percent Hispanic or Latino (median across all tracts)':\n",
+ " 'Percent Hispanic or Latino (mean of median across all states)',\n",
+ "\"Total Number of Unique Tracts\": \"Total Number of Tracts - Mean of median across all states\",\n",
+ "\"Total Owned and Rented Burdened Households (Current Aggregation Methodology)\": \"Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states\"\n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 252,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
Percent of individuals < 200% Federal Poverty Line (mean of median across all states)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (mean of median across all states)
\n",
+ "
Percent American Indian and Alaska Native alone (mean of median across all states)
\n",
+ "
Percent Non-Hispanic White (mean of median across all states)
\n",
+ "
Percent Hispanic or Latino (mean of median across all states)
\n",
+ "
Total Number of Tracts - Mean of median across all states
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states
\n",
+ "
\n",
+ "
\n",
+ "
Score L Relative Housing Burden for all households met burden threshold
\n",
+ "
CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
True
\n",
+ "
False
\n",
+ "
57.052724
\n",
+ "
19.383813
\n",
+ "
8.132533
\n",
+ "
33.692806
\n",
+ "
1.221395
\n",
+ "
31.321886
\n",
+ "
19.378348
\n",
+ "
62.088889
\n",
+ "
40949.200000
\n",
+ "
\n",
+ "
\n",
+ "
False
\n",
+ "
True
\n",
+ "
47.082927
\n",
+ "
13.224927
\n",
+ "
8.685441
\n",
+ "
23.061683
\n",
+ "
0.772400
\n",
+ "
48.240042
\n",
+ "
12.553371
\n",
+ "
44.549020
\n",
+ "
24719.098039
\n",
+ "
\n",
+ "
\n",
+ "
True
\n",
+ "
True
\n",
+ "
62.331263
\n",
+ "
17.689811
\n",
+ "
11.824205
\n",
+ "
33.455525
\n",
+ "
0.921755
\n",
+ "
34.495797
\n",
+ "
15.855933
\n",
+ "
88.803922
\n",
+ "
60757.901961
\n",
+ "
\n",
+ "
\n",
+ "
False
\n",
+ "
False
\n",
+ "
27.736502
\n",
+ "
8.785280
\n",
+ "
5.847120
\n",
+ "
5.729181
\n",
+ "
0.537429
\n",
+ "
75.916536
\n",
+ "
7.463468
\n",
+ "
1244.333333
\n",
+ "
443680.568627
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 57.052724 \n",
+ "False True 47.082927 \n",
+ "True True 62.331263 \n",
+ "False False 27.736502 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 19.383813 \n",
+ "False True 13.224927 \n",
+ "True True 17.689811 \n",
+ "False False 8.785280 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 8.132533 \n",
+ "False True 8.685441 \n",
+ "True True 11.824205 \n",
+ "False False 5.847120 \n",
+ "\n",
+ " Percent Black or African American alone (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 33.692806 \n",
+ "False True 23.061683 \n",
+ "True True 33.455525 \n",
+ "False False 5.729181 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 1.221395 \n",
+ "False True 0.772400 \n",
+ "True True 0.921755 \n",
+ "False False 0.537429 \n",
+ "\n",
+ " Percent Non-Hispanic White (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 31.321886 \n",
+ "False True 48.240042 \n",
+ "True True 34.495797 \n",
+ "False False 75.916536 \n",
+ "\n",
+ " Percent Hispanic or Latino (mean of median across all states) \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 19.378348 \n",
+ "False True 12.553371 \n",
+ "True True 15.855933 \n",
+ "False False 7.463468 \n",
+ "\n",
+ " Total Number of Tracts - Mean of median across all states \\\n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 62.088889 \n",
+ "False True 44.549020 \n",
+ "True True 88.803922 \n",
+ "False False 1244.333333 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states \n",
+ "Score L Relative Housing Burden for all househo... CalEnviroScreen Housing Burden Met Burden Thres... \n",
+ "True False 40949.200000 \n",
+ "False True 24719.098039 \n",
+ "True True 60757.901961 \n",
+ "False False 443680.568627 "
+ ]
+ },
+ "execution_count": 252,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 211,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def highlight_min(s, props=''):\n",
+ " return np.where(s == np.nanmin(s.values), props, '')\n",
+ "\n",
+ "def highlight_max(s, props=''):\n",
+ " return np.where(s == np.nanmax(s.values), props, '')\n",
+ "\n",
+ "df_styled = df.style.format(\n",
+ " na_rep='MISSING',\n",
+ " formatter={df.columns[idx]: \"{:.2f}\" for idx, _ in enumerate(df.columns) })"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 255,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_styled_max_min = df_styled.apply(highlight_max, props='color:#FFFFFF;background-color:#00008b', axis=0)\\\n",
+ " .apply(highlight_min, props='color:#FFFFFF;background-color:#FF0000', axis=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 256,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_styled_max_min.to_excel(\"summary_all_states.xlsx\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 257,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (mean of median across all states)
Percent individuals age 25 or over with less than high school degree (median across all tracts)
Percent enrollment in college or graduate school (median across all tracts)
Percent Black or African American alone (mean of median across all states)
Percent American Indian and Alaska Native alone (mean of median across all states)
Percent Non-Hispanic White (mean of median across all states)
Percent Hispanic or Latino (mean of median across all states)
Total Number of Tracts - Mean of median across all states
Total Owned and Rented Burdened Households (Current Aggregation Methodology)- Mean of median across all states
Score L Relative Housing Burden for all households met burden threshold
CalEnviroScreen Housing Burden Met Burden Threshold (Ranked Percentile)
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (median across all tracts)
\n",
+ "
Percent American Indian and Alaska Native alone (median across all tracts)
\n",
+ "
Percent Non-Hispanic White (median across all tracts)
\n",
+ "
Percent Hispanic or Latino (median across all tracts)
\n",
+ "
Total Number of Unique Tracts
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
\n",
+ "
\n",
+ "
\n",
+ "
state_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AK
\n",
+ "
33.563081
\n",
+ "
10.407240
\n",
+ "
9.485638
\n",
+ "
4.553571
\n",
+ "
21.279762
\n",
+ "
48.839286
\n",
+ "
9.375000
\n",
+ "
1
\n",
+ "
825
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
63.335854
\n",
+ "
20.273617
\n",
+ "
7.895408
\n",
+ "
79.236090
\n",
+ "
0.000000
\n",
+ "
8.436779
\n",
+ "
1.986055
\n",
+ "
14
\n",
+ "
7107
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 33.563081 \n",
+ "AL 63.335854 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 10.407240 \n",
+ "AL 20.273617 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 9.485638 \n",
+ "AL 7.895408 \n",
+ "\n",
+ " Percent Black or African American alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 4.553571 \n",
+ "AL 79.236090 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 21.279762 \n",
+ "AL 0.000000 \n",
+ "\n",
+ " Percent Non-Hispanic White (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 48.839286 \n",
+ "AL 8.436779 \n",
+ "\n",
+ " Percent Hispanic or Latino (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 9.375000 \n",
+ "AL 1.986055 \n",
+ "\n",
+ " Total Number of Unique Tracts \\\n",
+ "state_name \n",
+ "AK 1 \n",
+ "AL 14 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology) \n",
+ "state_name \n",
+ "AK 825 \n",
+ "AL 7107 "
+ ]
+ },
+ "execution_count": 272,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_1.head(2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 273,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "candidate_columns = ['Percent of individuals < 200% Federal Poverty Line (median across all tracts)',\n",
+ " 'Percent individuals age 25 or over with less than high school degree (median across all tracts)',\n",
+ " 'Percent enrollment in college or graduate school (median across all tracts)',\n",
+ " 'Percent Black or African American alone (median across all tracts)',\n",
+ " 'Percent American Indian and Alaska Native alone (median across all tracts)',\n",
+ " 'Percent Non-Hispanic White (median across all tracts)',\n",
+ " 'Percent Hispanic or Latino (median across all tracts)',\n",
+ " 'Total Number of Unique Tracts',\n",
+ " 'Total Owned and Rented Burdened Households (Current Aggregation Methodology)']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 276,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "diff = (df_1[candidate_columns] - df_2[candidate_columns]).fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 277,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
\n",
+ "
Percent individuals age 25 or over with less than high school degree (median across all tracts)
\n",
+ "
Percent enrollment in college or graduate school (median across all tracts)
\n",
+ "
Percent Black or African American alone (median across all tracts)
\n",
+ "
Percent American Indian and Alaska Native alone (median across all tracts)
\n",
+ "
Percent Non-Hispanic White (median across all tracts)
\n",
+ "
Percent Hispanic or Latino (median across all tracts)
\n",
+ "
Total Number of Unique Tracts
\n",
+ "
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
\n",
+ "
\n",
+ "
\n",
+ "
state_name
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AK
\n",
+ "
0.985223
\n",
+ "
-0.274578
\n",
+ "
3.206568
\n",
+ "
-1.085258
\n",
+ "
8.721076
\n",
+ "
-6.803172
\n",
+ "
-1.778285
\n",
+ "
-10.0
\n",
+ "
-4179.0
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
6.211917
\n",
+ "
4.283941
\n",
+ "
0.331430
\n",
+ "
6.212278
\n",
+ "
0.000000
\n",
+ "
-9.011147
\n",
+ "
-0.630017
\n",
+ "
-28.0
\n",
+ "
-15422.0
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
5.432052
\n",
+ "
1.601861
\n",
+ "
3.942754
\n",
+ "
20.319049
\n",
+ "
0.102459
\n",
+ "
-23.263854
\n",
+ "
-0.896646
\n",
+ "
-35.0
\n",
+ "
-16843.0
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
13.594871
\n",
+ "
11.979424
\n",
+ "
-0.272040
\n",
+ "
1.361388
\n",
+ "
-0.915677
\n",
+ "
-8.953361
\n",
+ "
8.757832
\n",
+ "
-39.0
\n",
+ "
-23253.0
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
15.717598
\n",
+ "
16.799587
\n",
+ "
-0.702951
\n",
+ "
0.247647
\n",
+ "
0.415820
\n",
+ "
-21.870519
\n",
+ "
40.216194
\n",
+ "
783.0
\n",
+ "
542144.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Percent of individuals < 200% Federal Poverty Line (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 0.985223 \n",
+ "AL 6.211917 \n",
+ "AR 5.432052 \n",
+ "AZ 13.594871 \n",
+ "CA 15.717598 \n",
+ "\n",
+ " Percent individuals age 25 or over with less than high school degree (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -0.274578 \n",
+ "AL 4.283941 \n",
+ "AR 1.601861 \n",
+ "AZ 11.979424 \n",
+ "CA 16.799587 \n",
+ "\n",
+ " Percent enrollment in college or graduate school (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 3.206568 \n",
+ "AL 0.331430 \n",
+ "AR 3.942754 \n",
+ "AZ -0.272040 \n",
+ "CA -0.702951 \n",
+ "\n",
+ " Percent Black or African American alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -1.085258 \n",
+ "AL 6.212278 \n",
+ "AR 20.319049 \n",
+ "AZ 1.361388 \n",
+ "CA 0.247647 \n",
+ "\n",
+ " Percent American Indian and Alaska Native alone (median across all tracts) \\\n",
+ "state_name \n",
+ "AK 8.721076 \n",
+ "AL 0.000000 \n",
+ "AR 0.102459 \n",
+ "AZ -0.915677 \n",
+ "CA 0.415820 \n",
+ "\n",
+ " Percent Non-Hispanic White (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -6.803172 \n",
+ "AL -9.011147 \n",
+ "AR -23.263854 \n",
+ "AZ -8.953361 \n",
+ "CA -21.870519 \n",
+ "\n",
+ " Percent Hispanic or Latino (median across all tracts) \\\n",
+ "state_name \n",
+ "AK -1.778285 \n",
+ "AL -0.630017 \n",
+ "AR -0.896646 \n",
+ "AZ 8.757832 \n",
+ "CA 40.216194 \n",
+ "\n",
+ " Total Number of Unique Tracts \\\n",
+ "state_name \n",
+ "AK -10.0 \n",
+ "AL -28.0 \n",
+ "AR -35.0 \n",
+ "AZ -39.0 \n",
+ "CA 783.0 \n",
+ "\n",
+ " Total Owned and Rented Burdened Households (Current Aggregation Methodology) \n",
+ "state_name \n",
+ "AK -4179.0 \n",
+ "AL -15422.0 \n",
+ "AR -16843.0 \n",
+ "AZ -23253.0 \n",
+ "CA 542144.0 "
+ ]
+ },
+ "execution_count": 277,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "diff.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 279,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Percent of individuals < 200% Federal Poverty Line (median across all tracts)
Percent individuals age 25 or over with less than high school degree (median across all tracts)
Percent enrollment in college or graduate school (median across all tracts)
Percent Black or African American alone (median across all tracts)
Percent American Indian and Alaska Native alone (median across all tracts)
Percent Non-Hispanic White (median across all tracts)
Percent Hispanic or Latino (median across all tracts)
Total Number of Unique Tracts
Total Owned and Rented Burdened Households (Current Aggregation Methodology)
state_name
\n",
+ "
\n",
+ "
AK
\n",
+ "
0.985223
\n",
+ "
-0.274578
\n",
+ "
3.206568
\n",
+ "
-1.085258
\n",
+ "
8.721076
\n",
+ "
-6.803172
\n",
+ "
-1.778285
\n",
+ "
-10.000000
\n",
+ "
-4179.000000
\n",
+ "
\n",
+ "
\n",
+ "
AL
\n",
+ "
6.211917
\n",
+ "
4.283941
\n",
+ "
0.331430
\n",
+ "
6.212278
\n",
+ "
0.000000
\n",
+ "
-9.011147
\n",
+ "
-0.630017
\n",
+ "
-28.000000
\n",
+ "
-15422.000000
\n",
+ "
\n",
+ "
\n",
+ "
AR
\n",
+ "
5.432052
\n",
+ "
1.601861
\n",
+ "
3.942754
\n",
+ "
20.319049
\n",
+ "
0.102459
\n",
+ "
-23.263854
\n",
+ "
-0.896646
\n",
+ "
-35.000000
\n",
+ "
-16843.000000
\n",
+ "
\n",
+ "
\n",
+ "
AZ
\n",
+ "
13.594871
\n",
+ "
11.979424
\n",
+ "
-0.272040
\n",
+ "
1.361388
\n",
+ "
-0.915677
\n",
+ "
-8.953361
\n",
+ "
8.757832
\n",
+ "
-39.000000
\n",
+ "
-23253.000000
\n",
+ "
\n",
+ "
\n",
+ "
CA
\n",
+ "
15.717598
\n",
+ "
16.799587
\n",
+ "
-0.702951
\n",
+ "
0.247647
\n",
+ "
0.415820
\n",
+ "
-21.870519
\n",
+ "
40.216194
\n",
+ "
783.000000
\n",
+ "
542144.000000
\n",
+ "
\n",
+ "
\n",
+ "
CO
\n",
+ "
5.267963
\n",
+ "
0.816207
\n",
+ "
0.089370
\n",
+ "
5.338649
\n",
+ "
0.149809
\n",
+ "
-24.425903
\n",
+ "
10.133080
\n",
+ "
-34.000000
\n",
+ "
-17296.000000
\n",
+ "
\n",
+ "
\n",
+ "
CT
\n",
+ "
20.337916
\n",
+ "
6.865214
\n",
+ "
0.574592
\n",
+ "
-7.952396
\n",
+ "
0.000000
\n",
+ "
-9.384233
\n",
+ "
3.734253
\n",
+ "
48.000000
\n",
+ "
33786.000000
\n",
+ "
\n",
+ "
\n",
+ "
DC
\n",
+ "
20.225619
\n",
+ "
9.277701
\n",
+ "
-10.589364
\n",
+ "
65.946763
\n",
+ "
0.000000
\n",
+ "
-49.789447
\n",
+ "
-6.124777
\n",
+ "
13.000000
\n",
+ "
9673.000000
\n",
+ "
\n",
+ "
\n",
+ "
DE
\n",
+ "
1.370275
\n",
+ "
-1.231413
\n",
+ "
-4.499021
\n",
+ "
-27.806872
\n",
+ "
0.581898
\n",
+ "
9.572051
\n",
+ "
6.704117
\n",
+ "
-8.000000
\n",
+ "
-2816.000000
\n",
+ "
\n",
+ "
\n",
+ "
FL
\n",
+ "
12.798641
\n",
+ "
7.913089
\n",
+ "
-0.464450
\n",
+ "
13.453116
\n",
+ "
0.000000
\n",
+ "
-19.567955
\n",
+ "
2.960044
\n",
+ "
88.000000
\n",
+ "
71042.000000
\n",
+ "
\n",
+ "
\n",
+ "
GA
\n",
+ "
0.623927
\n",
+ "
2.733393
\n",
+ "
-0.799951
\n",
+ "
1.511527
\n",
+ "
-0.093487
\n",
+ "
-9.680710
\n",
+ "
2.172740
\n",
+ "
-3.000000
\n",
+ "
12615.000000
\n",
+ "
\n",
+ "
\n",
+ "
HI
\n",
+ "
4.897141
\n",
+ "
9.101461
\n",
+ "
0.265372
\n",
+ "
-0.896060
\n",
+ "
-0.094805
\n",
+ "
-35.939385
\n",
+ "
0.379145
\n",
+ "
7.000000
\n",
+ "
4771.000000
\n",
+ "
\n",
+ "
\n",
+ "
IA
\n",
+ "
10.953716
\n",
+ "
-0.708470
\n",
+ "
-4.742017
\n",
+ "
-1.623474
\n",
+ "
0.732012
\n",
+ "
19.552402
\n",
+ "
-7.997991
\n",
+ "
-53.000000
\n",
+ "
-25766.000000
\n",
+ "
\n",
+ "
\n",
+ "
ID
\n",
+ "
4.722145
\n",
+ "
9.643493
\n",
+ "
7.189788
\n",
+ "
-0.311804
\n",
+ "
-1.015539
\n",
+ "
-15.992569
\n",
+ "
19.816490
\n",
+ "
-23.000000
\n",
+ "
-16597.000000
\n",
+ "
\n",
+ "
\n",
+ "
IL
\n",
+ "
5.155379
\n",
+ "
5.303919
\n",
+ "
-0.630714
\n",
+ "
5.037600
\n",
+ "
0.000000
\n",
+ "
-25.049480
\n",
+ "
6.050435
\n",
+ "
93.000000
\n",
+ "
54402.000000
\n",
+ "
\n",
+ "
\n",
+ "
IN
\n",
+ "
2.113662
\n",
+ "
2.437293
\n",
+ "
0.719657
\n",
+ "
7.315713
\n",
+ "
0.000000
\n",
+ "
1.347745
\n",
+ "
0.492553
\n",
+ "
-36.000000
\n",
+ "
-16444.000000
\n",
+ "
\n",
+ "
\n",
+ "
KS
\n",
+ "
5.264502
\n",
+ "
-7.562943
\n",
+ "
0.627460
\n",
+ "
12.245890
\n",
+ "
0.466634
\n",
+ "
1.465143
\n",
+ "
-0.964424
\n",
+ "
-46.000000
\n",
+ "
-21169.000000
\n",
+ "
\n",
+ "
\n",
+ "
KY
\n",
+ "
8.794436
\n",
+ "
6.683970
\n",
+ "
0.862572
\n",
+ "
-0.575122
\n",
+ "
0.578035
\n",
+ "
-6.133101
\n",
+ "
5.455541
\n",
+ "
-57.000000
\n",
+ "
-27542.000000
\n",
+ "
\n",
+ "
\n",
+ "
LA
\n",
+ "
8.343117
\n",
+ "
3.494850
\n",
+ "
1.398804
\n",
+ "
7.964377
\n",
+ "
0.000000
\n",
+ "
-11.833643
\n",
+ "
-1.607310
\n",
+ "
27.000000
\n",
+ "
19739.000000
\n",
+ "
\n",
+ "
\n",
+ "
MA
\n",
+ "
8.936772
\n",
+ "
7.732666
\n",
+ "
1.005028
\n",
+ "
8.415698
\n",
+ "
0.000000
\n",
+ "
-19.359667
\n",
+ "
15.170475
\n",
+ "
38.000000
\n",
+ "
28222.000000
\n",
+ "
\n",
+ "
\n",
+ "
MD
\n",
+ "
9.100530
\n",
+ "
3.424516
\n",
+ "
-1.341899
\n",
+ "
21.848353
\n",
+ "
0.000000
\n",
+ "
-10.271062
\n",
+ "
-2.199229
\n",
+ "
-26.000000
\n",
+ "
-8900.000000
\n",
+ "
\n",
+ "
\n",
+ "
ME
\n",
+ "
12.565009
\n",
+ "
9.122611
\n",
+ "
-3.922820
\n",
+ "
-0.880265
\n",
+ "
-0.439467
\n",
+ "
-5.913473
\n",
+ "
-0.866007
\n",
+ "
-25.000000
\n",
+ "
-14441.000000
\n",
+ "
\n",
+ "
\n",
+ "
MI
\n",
+ "
6.453785
\n",
+ "
1.068588
\n",
+ "
0.689832
\n",
+ "
6.708850
\n",
+ "
0.000000
\n",
+ "
-8.072578
\n",
+ "
-1.350049
\n",
+ "
-23.000000
\n",
+ "
-6868.000000
\n",
+ "
\n",
+ "
\n",
+ "
MN
\n",
+ "
15.920965
\n",
+ "
17.740780
\n",
+ "
3.141607
\n",
+ "
22.498320
\n",
+ "
1.758343
\n",
+ "
-38.332396
\n",
+ "
22.509297
\n",
+ "
-87.000000
\n",
+ "
-46742.000000
\n",
+ "
\n",
+ "
\n",
+ "
MO
\n",
+ "
4.976759
\n",
+ "
-0.085646
\n",
+ "
-3.577408
\n",
+ "
47.102090
\n",
+ "
0.000000
\n",
+ "
-35.919908
\n",
+ "
-2.378652
\n",
+ "
-30.000000
\n",
+ "
-13248.000000
\n",
+ "
\n",
+ "
\n",
+ "
MS
\n",
+ "
8.484879
\n",
+ "
1.040226
\n",
+ "
-0.572744
\n",
+ "
24.863184
\n",
+ "
0.000000
\n",
+ "
-22.951000
\n",
+ "
0.051741
\n",
+ "
-27.000000
\n",
+ "
-12524.000000
\n",
+ "
\n",
+ "
\n",
+ "
MT
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NC
\n",
+ "
8.153384
\n",
+ "
11.292289
\n",
+ "
-2.811982
\n",
+ "
6.496331
\n",
+ "
0.078513
\n",
+ "
-19.504668
\n",
+ "
11.151508
\n",
+ "
-71.000000
\n",
+ "
-45011.000000
\n",
+ "
\n",
+ "
\n",
+ "
ND
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NE
\n",
+ "
7.484343
\n",
+ "
37.676269
\n",
+ "
-9.271518
\n",
+ "
-7.562947
\n",
+ "
0.634817
\n",
+ "
-37.670893
\n",
+ "
58.015686
\n",
+ "
-27.000000
\n",
+ "
-13452.000000
\n",
+ "
\n",
+ "
\n",
+ "
NH
\n",
+ "
11.333692
\n",
+ "
7.394888
\n",
+ "
-1.695591
\n",
+ "
2.079689
\n",
+ "
0.000000
\n",
+ "
-14.216572
\n",
+ "
9.124264
\n",
+ "
-16.000000
\n",
+ "
-11851.000000
\n",
+ "
\n",
+ "
\n",
+ "
NJ
\n",
+ "
5.927327
\n",
+ "
8.713014
\n",
+ "
-2.337923
\n",
+ "
-10.341142
\n",
+ "
0.000000
\n",
+ "
-5.623117
\n",
+ "
25.764242
\n",
+ "
151.000000
\n",
+ "
102626.000000
\n",
+ "
\n",
+ "
\n",
+ "
NM
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
NV
\n",
+ "
7.485453
\n",
+ "
2.632552
\n",
+ "
-0.783104
\n",
+ "
-0.500327
\n",
+ "
0.076985
\n",
+ "
2.512022
\n",
+ "
8.687485
\n",
+ "
12.000000
\n",
+ "
14693.000000
\n",
+ "
\n",
+ "
\n",
+ "
NY
\n",
+ "
12.369088
\n",
+ "
8.434444
\n",
+ "
-0.870792
\n",
+ "
-10.437037
\n",
+ "
0.000000
\n",
+ "
4.477567
\n",
+ "
15.929982
\n",
+ "
573.000000
\n",
+ "
407383.000000
\n",
+ "
\n",
+ "
\n",
+ "
OH
\n",
+ "
5.166431
\n",
+ "
2.626470
\n",
+ "
0.160945
\n",
+ "
16.322108
\n",
+ "
0.000000
\n",
+ "
-16.400598
\n",
+ "
0.628654
\n",
+ "
-21.000000
\n",
+ "
355.000000
\n",
+ "
\n",
+ "
\n",
+ "
OK
\n",
+ "
17.267863
\n",
+ "
5.687201
\n",
+ "
-2.733525
\n",
+ "
5.227426
\n",
+ "
-1.254840
\n",
+ "
-4.629739
\n",
+ "
13.684527
\n",
+ "
-60.000000
\n",
+ "
-25920.000000
\n",
+ "
\n",
+ "
\n",
+ "
OR
\n",
+ "
10.312702
\n",
+ "
7.677240
\n",
+ "
-0.667578
\n",
+ "
1.177527
\n",
+ "
-0.110343
\n",
+ "
-15.168623
\n",
+ "
16.277201
\n",
+ "
-35.000000
\n",
+ "
-26320.000000
\n",
+ "
\n",
+ "
\n",
+ "
PA
\n",
+ "
9.568567
\n",
+ "
6.789819
\n",
+ "
-1.100045
\n",
+ "
2.768551
\n",
+ "
0.000000
\n",
+ "
-7.188058
\n",
+ "
6.730014
\n",
+ "
-63.000000
\n",
+ "
-33293.000000
\n",
+ "
\n",
+ "
\n",
+ "
RI
\n",
+ "
28.097665
\n",
+ "
18.885313
\n",
+ "
-28.064680
\n",
+ "
9.569074
\n",
+ "
0.344864
\n",
+ "
-42.404295
\n",
+ "
39.740670
\n",
+ "
5.000000
\n",
+ "
4138.000000
\n",
+ "
\n",
+ "
\n",
+ "
SC
\n",
+ "
3.709508
\n",
+ "
2.304021
\n",
+ "
3.766892
\n",
+ "
19.048750
\n",
+ "
0.000000
\n",
+ "
-12.734147
\n",
+ "
1.243649
\n",
+ "
-43.000000
\n",
+ "
-22081.000000
\n",
+ "
\n",
+ "
\n",
+ "
SD
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
TN
\n",
+ "
8.692949
\n",
+ "
4.908793
\n",
+ "
-1.487781
\n",
+ "
31.162224
\n",
+ "
0.000000
\n",
+ "
-26.640514
\n",
+ "
2.135541
\n",
+ "
-31.000000
\n",
+ "
-13021.000000
\n",
+ "
\n",
+ "
\n",
+ "
TX
\n",
+ "
8.229632
\n",
+ "
4.785835
\n",
+ "
-0.018445
\n",
+ "
7.608903
\n",
+ "
0.000000
\n",
+ "
-6.991503
\n",
+ "
11.472775
\n",
+ "
-103.000000
\n",
+ "
-58670.000000
\n",
+ "
\n",
+ "
\n",
+ "
UT
\n",
+ "
12.401135
\n",
+ "
9.279480
\n",
+ "
2.393714
\n",
+ "
-1.095225
\n",
+ "
2.211103
\n",
+ "
-27.444168
\n",
+ "
33.552393
\n",
+ "
-31.000000
\n",
+ "
-18553.000000
\n",
+ "
\n",
+ "
\n",
+ "
VA
\n",
+ "
12.747983
\n",
+ "
4.210496
\n",
+ "
-2.294801
\n",
+ "
20.581487
\n",
+ "
0.000000
\n",
+ "
-12.192675
\n",
+ "
2.823834
\n",
+ "
-48.000000
\n",
+ "
-24962.000000
\n",
+ "
\n",
+ "
\n",
+ "
VT
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
WA
\n",
+ "
0.836843
\n",
+ "
3.285992
\n",
+ "
-2.853985
\n",
+ "
1.365010
\n",
+ "
0.242227
\n",
+ "
-14.708699
\n",
+ "
5.595930
\n",
+ "
-84.000000
\n",
+ "
-61277.000000
\n",
+ "
\n",
+ "
\n",
+ "
WI
\n",
+ "
15.552119
\n",
+ "
4.422237
\n",
+ "
-0.796047
\n",
+ "
40.591511
\n",
+ "
-0.526995
\n",
+ "
-20.282972
\n",
+ "
-3.363747
\n",
+ "
-17.000000
\n",
+ "
-8795.000000
\n",
+ "
\n",
+ "
\n",
+ "
WV
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
\n",
+ "
WY
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 279,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def style_negative(v, props=''):\n",
+ " return props if v < 0 else None\n",
+ "\n",
+ "diff_style = diff.style.applymap(style_negative, props='color:red;')\\\n",
+ " .applymap(lambda v: 'opacity: 20%;' if (v < 0.0) and (v > 0.0) else None)\n",
+ "diff_style"
+ ]
+ },
+ {
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_2011_relative_differences_between_methodologies-ranking-percentile.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_2011_relative_differences_between_methodologies-ranking-percentile.ipynb
new file mode 100644
index 00000000..3ca6fd6a
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_2011_relative_differences_between_methodologies-ranking-percentile.ipynb
@@ -0,0 +1,5701 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Methodology to address fundamental problem 1 itemized in Issue 1024 - follow-up compare tabulations and relative household burden. This time I extend the 12-11 notebook to look at how the percentile ranks affects the proportion of tracts considered as burdened versus the current methodology."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Indicator reviewed: \n",
+ "\n",
+ "Socioeconomic Factors Indicator reviewed\n",
+ "* [Extreme Housing Burden](#housingburden)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Packages"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### ETL process for acquiring relevant tables"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### NOTE: If you ran the ETL Process to acquire Table 8 in the other notebook of this draft PR you do not need to run the ETL cell block again"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Copy and adapt certain sections of code from data_pipeline.utils \n",
+ "\n",
+ "def download_hud_dataset():\n",
+ " DOWNLOAD_FILENAME = \"HUD_ZIPPED.csv\"\n",
+ " HOUSING_FTP_URL = \"https://www.huduser.gov/portal/datasets/cp/2014thru2018-140-csv.zip\" \n",
+ " response = requests.get(HOUSING_FTP_URL, verify=True)\n",
+ " if response.status_code == 200:\n",
+ " file_contents = response.content\n",
+ " else:\n",
+ " sys.exit(\n",
+ " f\"HTTP response {response.status_code} from url {file_url}. Info: {response.content}\"\n",
+ " )\n",
+ "\n",
+ " # Write the contents to disk.\n",
+ " file = open(DOWNLOAD_FILENAME, \"wb\")\n",
+ " file.write(file_contents)\n",
+ " file.close()\n",
+ " \n",
+ "def extract_zipped_download(zip_file_path, unzipped_path):\n",
+ " with zipfile.ZipFile(zip_file_path, \"r\") as zip_ref:\n",
+ " zip_ref.extractall(unzipped_path)\n",
+ " # cleanup temporary file\n",
+ " os.remove(zip_file_path)\n",
+ " \n",
+ "def up_one_directory(path):\n",
+ " try:\n",
+ " # from Python 3.6\n",
+ " parent_dir = Path(path).parents[1]\n",
+ " # for Python 3.4/3.5, use str to convert the path to string\n",
+ " # parent_dir = str(Path(path).parents[1])\n",
+ " shutil.move(path, parent_dir)\n",
+ " except IndexError:\n",
+ " # no upper directory\n",
+ " pass\n",
+ "\n",
+ "CURRENT_DIRECTORY = os.getcwd()\n",
+ "download_hud_dataset()\n",
+ "extract_zipped_download(CURRENT_DIRECTORY + \"/HUD_ZIPPED.csv\", CURRENT_DIRECTORY) \n",
+ "up_one_directory(CURRENT_DIRECTORY + \"/140/Table8.csv\")\n",
+ "shutil.rmtree(\"./140/\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Below I also propose an alternate means for ranking census tracts\n",
+ "### These steps are outlined and commented below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/series.py:726: RuntimeWarning: invalid value encountered in sqrt\n",
+ " result = getattr(ufunc, method)(*inputs, **kwargs)\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " iloc._setitem_with_indexer(indexer, value)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Read in the data from https://www.huduser.gov/portal/datasets/cp.html\n",
+ "housing = pd.read_csv(\"Table8.csv\", \n",
+ " encoding = \"ISO-8859-1\", \n",
+ " dtype = {'Tract_ID': object, 'st': object, 'geoid': object})\n",
+ "\n",
+ "# Remove data for states that aren't included in the census (e.g. American Samoa, Guam, etc.):\n",
+ "housing.drop(housing.loc[housing['st'] == '72'].index, inplace = True)\n",
+ "\n",
+ "# Combine owner and renter occupied low-income households that make less than 80% of HAMFI into one variable\n",
+ "housing['summed'] = (housing['T8_est10'] + \n",
+ " housing['T8_est23'] + \n",
+ " housing['T8_est36'] + \n",
+ " housing['T8_est76'] + \n",
+ " housing['T8_est89'] + \n",
+ " housing['T8_est102'])\n",
+ "\n",
+ "# Create a variable for the standard error of the summed variables\n",
+ "housing['summed_se'] = np.sqrt((housing['T8_moe10'] / 1.645)**2 + \n",
+ " (housing['T8_moe23'] / 1.645)**2 + \n",
+ " (housing['T8_moe36'] / 1.645)**2 + \n",
+ " (housing['T8_moe76'] / 1.645)**2 + \n",
+ " (housing['T8_moe89'] / 1.645)**2 + \n",
+ " (housing['T8_moe102'] / 1.645)**2)\n",
+ "\n",
+ "# Remove the first 7 digits in the FIPS Census Tract ID \n",
+ "housing['geoid'] = housing['geoid'].str[-11:]\n",
+ "\n",
+ "# Find the estimate of the proportion of the population that is heavily rent burdened\n",
+ "housing['hbrd_score'] = housing['summed'] / housing['T8_est1']\n",
+ "\n",
+ "# Change rates where the population is 0 to nan\n",
+ "housing['hbrd_score'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Create function for calculating the standard error, using the proportions standard error formula\n",
+ "# if the value under the radical is negative, use the ratio standard error formula\n",
+ "def se_prop(x, y, se_x, moe_y): \n",
+ " se_y = moe_y / 1.645\n",
+ " test = se_x**2 - (((x**2)/(y**2))*((se_y)**2))\n",
+ " se = np.where(test < 0,\n",
+ " (1/y) * np.sqrt(se_x**2 + (((x**2)/(y**2))*(se_y**2))), \n",
+ " (1/y) * np.sqrt(se_x**2 - (((x**2)/(y**2))*(se_y**2))))\n",
+ " return se\n",
+ "\n",
+ "housing['se'] = se_prop(housing['summed'], housing['T8_est1'], housing['summed_se'], housing['T8_moe1'])\n",
+ "\n",
+ "# Calculate the relative standard error\n",
+ "housing['rse'] = housing['se'] / housing['hbrd_score']*100\n",
+ "\n",
+ "# Change infinite rse's where the housing burden is 0 to np.nan\n",
+ "housing['rse'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Calculate the mean standard error for each state\n",
+ "housing['mean_state_se'] = np.zeros(len(housing))\n",
+ "\n",
+ "for state in housing['st'].unique():\n",
+ " mean_se = np.mean(housing[housing['st'] == state]['se'])\n",
+ " housing['mean_state_se'].loc[housing['st'] == state] = mean_se\n",
+ " \n",
+ "# Find census tract estimates that meet both of the following criteria and are thus considered unreliable estimates: \n",
+ "# RSE less than 50 AND\n",
+ "# SE less than the mean state SE or housing burdened low income households\n",
+ "# Convert these scores to nan\n",
+ "housing.loc[(housing['rse'] >= 50) & (housing['rse'] >= housing['mean_state_se']), 'hbrd_score'] = np.nan\n",
+ "\n",
+ "# Rename columns\n",
+ "housing = housing.rename(columns = {'geoid' :'FIPS_tract_id',\n",
+ " 'st' : 'state'\n",
+ " })\n",
+ "\n",
+ "# Calculate percentile rank for census tracts with a score above 0, set percentile to 0 if score is 0, for each state\n",
+ "housing['hbrd_rank'] = housing[\n",
+ " housing['hbrd_score'] != 0][['hbrd_score',\n",
+ " 'state']].groupby('state').rank( \n",
+ " na_option = 'keep', \n",
+ " pct = True) * 100\n",
+ "\n",
+ "housing.loc[housing['hbrd_score'] == 0, 'hbrd_rank'] = 0\n",
+ "\n",
+ "# Create final housing burden df\n",
+ "housingburden = housing.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
source
\n",
+ "
sumlevel
\n",
+ "
FIPS_tract_id
\n",
+ "
name
\n",
+ "
state
\n",
+ "
cnty
\n",
+ "
tract
\n",
+ "
T8_est1
\n",
+ "
T8_est2
\n",
+ "
T8_est3
\n",
+ "
...
\n",
+ "
T8_moe131
\n",
+ "
T8_moe132
\n",
+ "
T8_moe133
\n",
+ "
summed
\n",
+ "
summed_se
\n",
+ "
hbrd_score
\n",
+ "
se
\n",
+ "
rse
\n",
+ "
mean_state_se
\n",
+ "
hbrd_rank
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020100
\n",
+ "
Census Tract 201, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20100
\n",
+ "
765
\n",
+ "
570
\n",
+ "
50
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
80
\n",
+ "
31.721807
\n",
+ "
0.104575
\n",
+ "
0.041032
\n",
+ "
39.237314
\n",
+ "
0.036604
\n",
+ "
46.298077
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020200
\n",
+ "
Census Tract 202, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20200
\n",
+ "
720
\n",
+ "
465
\n",
+ "
65
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
138
\n",
+ "
45.531874
\n",
+ "
0.191667
\n",
+ "
0.061614
\n",
+ "
32.146659
\n",
+ "
0.036604
\n",
+ "
83.269231
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020300
\n",
+ "
Census Tract 203, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20300
\n",
+ "
1295
\n",
+ "
840
\n",
+ "
60
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
170
\n",
+ "
53.722921
\n",
+ "
0.131274
\n",
+ "
0.040927
\n",
+ "
31.176999
\n",
+ "
0.036604
\n",
+ "
63.653846
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020400
\n",
+ "
Census Tract 204, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20400
\n",
+ "
1640
\n",
+ "
1260
\n",
+ "
15
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
145
\n",
+ "
46.288510
\n",
+ "
0.088415
\n",
+ "
0.027822
\n",
+ "
31.467397
\n",
+ "
0.036604
\n",
+ "
34.615385
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020500
\n",
+ "
Census Tract 205, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20500
\n",
+ "
4175
\n",
+ "
2320
\n",
+ "
175
\n",
+ "
...
\n",
+ "
17
\n",
+ "
17
\n",
+ "
17
\n",
+ "
595
\n",
+ "
147.221693
\n",
+ "
0.142515
\n",
+ "
0.034760
\n",
+ "
24.390193
\n",
+ "
0.036604
\n",
+ "
68.221154
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 280 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source sumlevel FIPS_tract_id \\\n",
+ "0 2014thru2018 140 01001020100 \n",
+ "1 2014thru2018 140 01001020200 \n",
+ "2 2014thru2018 140 01001020300 \n",
+ "3 2014thru2018 140 01001020400 \n",
+ "4 2014thru2018 140 01001020500 \n",
+ "\n",
+ " name state cnty tract T8_est1 \\\n",
+ "0 Census Tract 201, Autauga County, Alabama 01 1 20100 765 \n",
+ "1 Census Tract 202, Autauga County, Alabama 01 1 20200 720 \n",
+ "2 Census Tract 203, Autauga County, Alabama 01 1 20300 1295 \n",
+ "3 Census Tract 204, Autauga County, Alabama 01 1 20400 1640 \n",
+ "4 Census Tract 205, Autauga County, Alabama 01 1 20500 4175 \n",
+ "\n",
+ " T8_est2 T8_est3 ... T8_moe131 T8_moe132 T8_moe133 summed summed_se \\\n",
+ "0 570 50 ... 12 12 12 80 31.721807 \n",
+ "1 465 65 ... 12 12 12 138 45.531874 \n",
+ "2 840 60 ... 12 12 12 170 53.722921 \n",
+ "3 1260 15 ... 12 12 12 145 46.288510 \n",
+ "4 2320 175 ... 17 17 17 595 147.221693 \n",
+ "\n",
+ " hbrd_score se rse mean_state_se hbrd_rank \n",
+ "0 0.104575 0.041032 39.237314 0.036604 46.298077 \n",
+ "1 0.191667 0.061614 32.146659 0.036604 83.269231 \n",
+ "2 0.131274 0.040927 31.176999 0.036604 63.653846 \n",
+ "3 0.088415 0.027822 31.467397 0.036604 34.615385 \n",
+ "4 0.142515 0.034760 24.390193 0.036604 68.221154 \n",
+ "\n",
+ "[5 rows x 280 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(73056, 280)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As desired we see a uniform distribution for the percentile rank for burdened households"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we compute for a baseline comparison "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Owner occupied numerator fields\n",
+ "OWNER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est7\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est10\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est20\",\n",
+ " \n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est23\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est33\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est36\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "OWNER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est13\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est26\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est39\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est52\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est65\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_FIELD = \"T8_est2\"\n",
+ "# Subtotal\n",
+ "# Owner occupied\n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_HAMFI_FIELD = \"T8_est3\"\n",
+ "# Subtotal\n",
+ "# Owner occupied \n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "# Renter occupied numerator fields\n",
+ "RENTER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est73\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est76\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est86\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est89\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est99\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est102\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "RENTER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est79\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tless than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est92\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est105\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est118\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est131\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# T8_est68\tSubtotalRenter occupied\tAll\tAll\tAll\n",
+ "RENTER_OCCUPIED_POPULATION_FIELD = \"T8_est68\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_summed_methodology\"] = housingburden[\n",
+ " OWNER_OCCUPIED_NUMERATOR_FIELDS\n",
+ "].sum(axis=1) + housingburden[RENTER_OCCUPIED_NUMERATOR_FIELDS].sum(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ " - housingburden[OWNER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ " - housingburden[RENTER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator_sans_not_computed\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_percent\"] = np.round(\n",
+ " (housingburden[\"current_summed_methodology\"] / housingburden[\"current_methodology_denominator\"] ), 2) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we construct the distribution of differences in the number of owned and rented burdened households\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_df = housingburden[['FIPS_tract_id', 'state','hbrd_rank','hbrd_score', 'summed', \n",
+ " 'current_summed_methodology', 'T8_est1', \n",
+ " \"current_methodology_denominator_sans_not_computed\",\n",
+ " 'current_methodology_denominator', 'current_methodology_percent']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### First notice here that **T8_est1** and **current_methodology_denominator** should represent same or similar aggregates. In general, we cen see that the current computation performed results in a differerntial that undercounts the total occupied and rental households."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator_sans_not_computed\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Compute the correlation matrix\n",
+ "import seaborn as sns\n",
+ "corr = merged_df[[\"hbrd_rank\", \n",
+ " \"current_methodology_percentile_rank\"] + percent_cols].corr()\n",
+ "\n",
+ "# Generate a mask for the upper triangle\n",
+ "mask = np.triu(np.ones_like(corr, dtype=bool))\n",
+ "\n",
+ "# Set up the matplotlib figure\n",
+ "f, ax = plt.subplots(figsize=(15, 12))\n",
+ "\n",
+ "# Generate a custom diverging colormap\n",
+ "cmap = sns.diverging_palette(230, 20, as_cmap=True)\n",
+ "\n",
+ "# Draw the heatmap with the mask and correct aspect ratio\n",
+ "sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,\n",
+ " square=True, linewidths=.5, cbar_kws={\"shrink\": .5})"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the previous, comparing both methodologies. \n",
+ "\n",
+ "1. "
+ ]
+ }
+ ],
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_reference.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_reference.ipynb
new file mode 100644
index 00000000..3efdbb67
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_eda_se_12_27_reference.ipynb
@@ -0,0 +1,865 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Indicator reviewed: \n",
+ "\n",
+ "Socioeconomic Factors Indicator reviewed\n",
+ "* [Extreme Housing Burden](#housingburden)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Packages"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Below I also propose an alternate means for ranking census tracts\n",
+ "### These steps are outlined and commented below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/series.py:726: RuntimeWarning: invalid value encountered in sqrt\n",
+ " result = getattr(ufunc, method)(*inputs, **kwargs)\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " iloc._setitem_with_indexer(indexer, value)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Read in the data from https://www.huduser.gov/portal/datasets/cp.html\n",
+ "housing = pd.read_csv(\"Table8.csv\", \n",
+ " encoding = \"ISO-8859-1\", \n",
+ " dtype = {'Tract_ID': object, 'st': object, 'geoid': object})\n",
+ "\n",
+ "# Remove data for states that aren't included in the census (e.g. American Samoa, Guam, etc.):\n",
+ "housing.drop(housing.loc[housing['st'] == '72'].index, inplace = True)\n",
+ "\n",
+ "# Combine owner and renter occupied low-income households that make less than 80% of HAMFI into one variable\n",
+ "housing['summed'] = (housing['T8_est10'] + \n",
+ " housing['T8_est23'] + \n",
+ " housing['T8_est36'] + \n",
+ " housing['T8_est76'] + \n",
+ " housing['T8_est89'] + \n",
+ " housing['T8_est102'])\n",
+ "\n",
+ "# Create a variable for the standard error of the summed variables\n",
+ "housing['summed_se'] = np.sqrt((housing['T8_moe10'] / 1.645)**2 + \n",
+ " (housing['T8_moe23'] / 1.645)**2 + \n",
+ " (housing['T8_moe36'] / 1.645)**2 + \n",
+ " (housing['T8_moe76'] / 1.645)**2 + \n",
+ " (housing['T8_moe89'] / 1.645)**2 + \n",
+ " (housing['T8_moe102'] / 1.645)**2)\n",
+ "\n",
+ "# Remove the first 7 digits in the FIPS Census Tract ID \n",
+ "housing['geoid'] = housing['geoid'].str[-11:]\n",
+ "\n",
+ "# Find the estimate of the proportion of the population that is heavily rent burdened\n",
+ "housing['hbrd_score'] = housing['summed'] / housing['T8_est1']\n",
+ "\n",
+ "# Change rates where the population is 0 to nan\n",
+ "housing['hbrd_score'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Create function for calculating the standard error, using the proportions standard error formula\n",
+ "# if the value under the radical is negative, use the ratio standard error formula\n",
+ "def se_prop(x, y, se_x, moe_y): \n",
+ " se_y = moe_y / 1.645\n",
+ " test = se_x**2 - (((x**2)/(y**2))*((se_y)**2))\n",
+ " se = np.where(test < 0,\n",
+ " (1/y) * np.sqrt(se_x**2 + (((x**2)/(y**2))*(se_y**2))), \n",
+ " (1/y) * np.sqrt(se_x**2 - (((x**2)/(y**2))*(se_y**2))))\n",
+ " return se\n",
+ "\n",
+ "housing['se'] = se_prop(housing['summed'], housing['T8_est1'], housing['summed_se'], housing['T8_moe1'])\n",
+ "\n",
+ "# Calculate the relative standard error\n",
+ "housing['rse'] = housing['se'] / housing['hbrd_score']*100\n",
+ "\n",
+ "# Change infinite rse's where the housing burden is 0 to np.nan\n",
+ "housing['rse'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Calculate the mean standard error for each state\n",
+ "housing['mean_state_se'] = np.zeros(len(housing))\n",
+ "\n",
+ "for state in housing['st'].unique():\n",
+ " mean_se = np.mean(housing[housing['st'] == state]['se'])\n",
+ " housing['mean_state_se'].loc[housing['st'] == state] = mean_se\n",
+ " \n",
+ "# Find census tract estimates that meet both of the following criteria and are thus considered unreliable estimates: \n",
+ "# RSE less than 50 AND\n",
+ "# SE less than the mean state SE or housing burdened low income households\n",
+ "# Convert these scores to nan\n",
+ "housing.loc[(housing['rse'] >= 50) & (housing['rse'] >= housing['mean_state_se']), 'hbrd_score'] = np.nan\n",
+ "\n",
+ "# Rename columns\n",
+ "housing = housing.rename(columns = {'geoid' :'FIPS_tract_id',\n",
+ " 'st' : 'state'\n",
+ " })\n",
+ "\n",
+ "# Calculate percentile rank for census tracts with a score above 0, set percentile to 0 if score is 0, for each state\n",
+ "housing['hbrd_rank'] = housing[\n",
+ " housing['hbrd_score'] != 0][['hbrd_score',\n",
+ " 'state']].groupby('state').rank( \n",
+ " na_option = 'keep', \n",
+ " pct = True) * 100\n",
+ "\n",
+ "housing.loc[housing['hbrd_score'] == 0, 'hbrd_rank'] = 0\n",
+ "\n",
+ "# Create final housing burden df\n",
+ "housingburden = housing.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
source
\n",
+ "
sumlevel
\n",
+ "
FIPS_tract_id
\n",
+ "
name
\n",
+ "
state
\n",
+ "
cnty
\n",
+ "
tract
\n",
+ "
T8_est1
\n",
+ "
T8_est2
\n",
+ "
T8_est3
\n",
+ "
...
\n",
+ "
T8_moe131
\n",
+ "
T8_moe132
\n",
+ "
T8_moe133
\n",
+ "
summed
\n",
+ "
summed_se
\n",
+ "
hbrd_score
\n",
+ "
se
\n",
+ "
rse
\n",
+ "
mean_state_se
\n",
+ "
hbrd_rank
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020100
\n",
+ "
Census Tract 201, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20100
\n",
+ "
765
\n",
+ "
570
\n",
+ "
50
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
80
\n",
+ "
31.721807
\n",
+ "
0.104575
\n",
+ "
0.041032
\n",
+ "
39.237314
\n",
+ "
0.036604
\n",
+ "
46.298077
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020200
\n",
+ "
Census Tract 202, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20200
\n",
+ "
720
\n",
+ "
465
\n",
+ "
65
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
138
\n",
+ "
45.531874
\n",
+ "
0.191667
\n",
+ "
0.061614
\n",
+ "
32.146659
\n",
+ "
0.036604
\n",
+ "
83.269231
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020300
\n",
+ "
Census Tract 203, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20300
\n",
+ "
1295
\n",
+ "
840
\n",
+ "
60
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
170
\n",
+ "
53.722921
\n",
+ "
0.131274
\n",
+ "
0.040927
\n",
+ "
31.176999
\n",
+ "
0.036604
\n",
+ "
63.653846
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020400
\n",
+ "
Census Tract 204, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20400
\n",
+ "
1640
\n",
+ "
1260
\n",
+ "
15
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
145
\n",
+ "
46.288510
\n",
+ "
0.088415
\n",
+ "
0.027822
\n",
+ "
31.467397
\n",
+ "
0.036604
\n",
+ "
34.615385
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020500
\n",
+ "
Census Tract 205, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20500
\n",
+ "
4175
\n",
+ "
2320
\n",
+ "
175
\n",
+ "
...
\n",
+ "
17
\n",
+ "
17
\n",
+ "
17
\n",
+ "
595
\n",
+ "
147.221693
\n",
+ "
0.142515
\n",
+ "
0.034760
\n",
+ "
24.390193
\n",
+ "
0.036604
\n",
+ "
68.221154
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 280 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source sumlevel FIPS_tract_id \\\n",
+ "0 2014thru2018 140 01001020100 \n",
+ "1 2014thru2018 140 01001020200 \n",
+ "2 2014thru2018 140 01001020300 \n",
+ "3 2014thru2018 140 01001020400 \n",
+ "4 2014thru2018 140 01001020500 \n",
+ "\n",
+ " name state cnty tract T8_est1 \\\n",
+ "0 Census Tract 201, Autauga County, Alabama 01 1 20100 765 \n",
+ "1 Census Tract 202, Autauga County, Alabama 01 1 20200 720 \n",
+ "2 Census Tract 203, Autauga County, Alabama 01 1 20300 1295 \n",
+ "3 Census Tract 204, Autauga County, Alabama 01 1 20400 1640 \n",
+ "4 Census Tract 205, Autauga County, Alabama 01 1 20500 4175 \n",
+ "\n",
+ " T8_est2 T8_est3 ... T8_moe131 T8_moe132 T8_moe133 summed summed_se \\\n",
+ "0 570 50 ... 12 12 12 80 31.721807 \n",
+ "1 465 65 ... 12 12 12 138 45.531874 \n",
+ "2 840 60 ... 12 12 12 170 53.722921 \n",
+ "3 1260 15 ... 12 12 12 145 46.288510 \n",
+ "4 2320 175 ... 17 17 17 595 147.221693 \n",
+ "\n",
+ " hbrd_score se rse mean_state_se hbrd_rank \n",
+ "0 0.104575 0.041032 39.237314 0.036604 46.298077 \n",
+ "1 0.191667 0.061614 32.146659 0.036604 83.269231 \n",
+ "2 0.131274 0.040927 31.176999 0.036604 63.653846 \n",
+ "3 0.088415 0.027822 31.467397 0.036604 34.615385 \n",
+ "4 0.142515 0.034760 24.390193 0.036604 68.221154 \n",
+ "\n",
+ "[5 rows x 280 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(73056, 280)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As desired we see a uniform distribution for the percentile rank for burdened households"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we compute for a baseline comparison "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Owner occupied numerator fields\n",
+ "OWNER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est7\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est10\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est20\",\n",
+ " \n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est23\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est33\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est36\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "OWNER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est13\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est26\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est39\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est52\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est65\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_FIELD = \"T8_est2\"\n",
+ "# Subtotal\n",
+ "# Owner occupied\n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_HAMFI_FIELD = \"T8_est3\"\n",
+ "# Subtotal\n",
+ "# Owner occupied \n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "# Renter occupied numerator fields\n",
+ "RENTER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est73\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est76\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est86\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est89\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est99\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est102\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "RENTER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est79\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tless than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est92\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est105\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est118\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est131\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# T8_est68\tSubtotalRenter occupied\tAll\tAll\tAll\n",
+ "RENTER_OCCUPIED_POPULATION_FIELD = \"T8_est68\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_summed_methodology\"] = housingburden[\n",
+ " OWNER_OCCUPIED_NUMERATOR_FIELDS\n",
+ "].sum(axis=1) + housingburden[RENTER_OCCUPIED_NUMERATOR_FIELDS].sum(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ " - housingburden[OWNER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ " - housingburden[RENTER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator_sans_not_computed\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_percent\"] = np.round(\n",
+ " (housingburden[\"current_summed_methodology\"] / housingburden[\"current_methodology_denominator\"] ), 2) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we construct the distribution of differences in the number of owned and rented burdened households\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_df = housingburden[['FIPS_tract_id', 'state','hbrd_rank','hbrd_score', 'summed', \n",
+ " 'current_summed_methodology', 'T8_est1', \n",
+ " \"current_methodology_denominator_sans_not_computed\",\n",
+ " 'current_methodology_denominator', 'current_methodology_percent']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### First notice here that **T8_est1** and **current_methodology_denominator** should represent same or similar aggregates. In general, we cen see that the current computation performed results in a differential that undercounts the total occupied and rental households."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator_sans_not_computed\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(12, 8))\n",
+ "plt.title('Distribution of differences between aggregate totals that normalizes tabulation of poverty households (with removal of not computed fields) ')\n",
+ "# Set x-axis label\n",
+ "plt.xlabel('Aggregate differences in total owner and renter occupied low-income households')\n",
+ "# Set y-axis label\n",
+ "plt.ylabel('Relative Frequency in Support')\n",
+ "\n",
+ "sns.histplot(final_df[\"differences_aggregate_denominator_sans_not_computed\"])"
+ ]
+ }
+ ],
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/data/data-pipeline/data_pipeline/ipython/hud_notebook_tabulation_differences_12_27_2021.ipynb b/data/data-pipeline/data_pipeline/ipython/hud_notebook_tabulation_differences_12_27_2021.ipynb
new file mode 100644
index 00000000..2ce5a35b
--- /dev/null
+++ b/data/data-pipeline/data_pipeline/ipython/hud_notebook_tabulation_differences_12_27_2021.ipynb
@@ -0,0 +1,9194 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Extreme Housing Burden \n",
+ "\n",
+ "The Extreme Housing Burden indicator represents the proportion of low-income households that have to spend more than half their income on rent. These households experience higher levels of stress, report lower health, and may delay medical treatment because of its high cost.\n",
+ "\n",
+ "The Extreme Housing Burden indicator measures the percent of households in a census tract that are:\n",
+ "\n",
+ "1. Making less than 80% of the Area Median Family Income as determined by the Department of Housing and Urban Development (HUD), and\n",
+ "2. Paying greater than 50% of their income to housing costs. \n",
+ "\n",
+ "This data is sourced from the 2014-2018 Comprehensive Housing Affordability Strategy dataset from the Department of Housing and Urban Development (HUD) using the census tract geographic summary level, and contains cost burdens for households by percent HUD-adjusted median family income (HAMFI) category. This data can be found [here](https://www.huduser.gov/portal/datasets/cp.html). \n",
+ "\n",
+ "Because CHAS data is based on American Communities Survey (ACS) estimates, which come from a sample of the population, they may be unreliable if based on a small sample or population size.\n",
+ "\n",
+ "The standard error and relative standard error were used to evaluate the reliability of each estimate using CalEnviroScreen’s methodology. \n",
+ "\n",
+ "Census tract estimates that met either of the following criteria were considered reliable and included in the analysis [(CalEnviroScreen, 2017, page 129)](https://oehha.ca.gov/media/downloads/calenviroscreen/report/ces3report.pdf ):\n",
+ "\n",
+ "- Relative standard error less than 50 (meaning the standard error was less than half of the estimate), OR \n",
+ "- Standard error less than the mean standard error of all census tract estimates \n",
+ "\n",
+ "Formulas for calculating the standard error of sums, proportions, and ratio come from the [American Communities Survey Office](https://www2.census.gov/programs-surveys/acs/tech_docs/accuracy/MultiyearACSAccuracyofData2013.pdf).\n",
+ "\n",
+ "Note that this code creates a score and rank by state, for every state."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The relevant variables in table 8 of the CHAS dataset are the following (CHAS data dictionary available [here](https://www.huduser.gov/portal/datasets/cp/CHAS-data-dictionary-14-18.xlsx)):\n",
+ "\n",
+ "| Name | Label |\n",
+ "|---------|-----------------------------------------------------|\n",
+ "|T1_est1 | Total Occupied housing units | \n",
+ "|T8_est10 | Owner occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est23 |Owner occupied greater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est36 |Owner occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est76 | Renter occupied less than or equal to 30% of HAMFI cost burden greater than 50% |\n",
+ "|T8_est89 |Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\tcost burden greater than 50%|\n",
+ "|T8_est102|Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\tcost burden greater than 50%|\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Below I also propose an alternate means for ranking census tracts\n",
+ "### These steps are outlined and commented below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/series.py:726: RuntimeWarning: invalid value encountered in sqrt\n",
+ " result = getattr(ufunc, method)(*inputs, **kwargs)\n",
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " iloc._setitem_with_indexer(indexer, value)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Read in the data from https://www.huduser.gov/portal/datasets/cp.html\n",
+ "housing = pd.read_csv(\"Table8.csv\", \n",
+ " encoding = \"ISO-8859-1\", \n",
+ " dtype = {'Tract_ID': object, 'st': object, 'geoid': object})\n",
+ "\n",
+ "# Remove data for states that aren't included in the census (e.g. American Samoa, Guam, etc.):\n",
+ "housing.drop(housing.loc[housing['st'] == '72'].index, inplace = True)\n",
+ "\n",
+ "# Combine owner and renter occupied low-income households that make less than 80% of HAMFI into one variable\n",
+ "housing['summed'] = (housing['T8_est10'] + \n",
+ " housing['T8_est23'] + \n",
+ " housing['T8_est36'] + \n",
+ " housing['T8_est76'] + \n",
+ " housing['T8_est89'] + \n",
+ " housing['T8_est102'])\n",
+ "\n",
+ "# Create a variable for the standard error of the summed variables\n",
+ "housing['summed_se'] = np.sqrt((housing['T8_moe10'] / 1.645)**2 + \n",
+ " (housing['T8_moe23'] / 1.645)**2 + \n",
+ " (housing['T8_moe36'] / 1.645)**2 + \n",
+ " (housing['T8_moe76'] / 1.645)**2 + \n",
+ " (housing['T8_moe89'] / 1.645)**2 + \n",
+ " (housing['T8_moe102'] / 1.645)**2)\n",
+ "\n",
+ "# Remove the first 7 digits in the FIPS Census Tract ID \n",
+ "housing['geoid'] = housing['geoid'].str[-11:]\n",
+ "\n",
+ "# Find the estimate of the proportion of the population that is heavily rent burdened\n",
+ "housing['hbrd_score'] = housing['summed'] / housing['T8_est1']\n",
+ "\n",
+ "# Change rates where the population is 0 to nan\n",
+ "housing['hbrd_score'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Create function for calculating the standard error, using the proportions standard error formula\n",
+ "# if the value under the radical is negative, use the ratio standard error formula\n",
+ "def se_prop(x, y, se_x, moe_y): \n",
+ " se_y = moe_y / 1.645\n",
+ " test = se_x**2 - (((x**2)/(y**2))*((se_y)**2))\n",
+ " se = np.where(test < 0,\n",
+ " (1/y) * np.sqrt(se_x**2 + (((x**2)/(y**2))*(se_y**2))), \n",
+ " (1/y) * np.sqrt(se_x**2 - (((x**2)/(y**2))*(se_y**2))))\n",
+ " return se\n",
+ "\n",
+ "housing['se'] = se_prop(housing['summed'], housing['T8_est1'], housing['summed_se'], housing['T8_moe1'])\n",
+ "\n",
+ "# Calculate the relative standard error\n",
+ "housing['rse'] = housing['se'] / housing['hbrd_score']*100\n",
+ "\n",
+ "# Change infinite rse's where the housing burden is 0 to np.nan\n",
+ "housing['rse'].replace(np.inf, np.nan, inplace = True)\n",
+ "\n",
+ "# Calculate the mean standard error for each state\n",
+ "housing['mean_state_se'] = np.zeros(len(housing))\n",
+ "\n",
+ "for state in housing['st'].unique():\n",
+ " mean_se = np.mean(housing[housing['st'] == state]['se'])\n",
+ " housing['mean_state_se'].loc[housing['st'] == state] = mean_se\n",
+ " \n",
+ "# Find census tract estimates that meet both of the following criteria and are thus considered unreliable estimates: \n",
+ "# RSE less than 50 AND\n",
+ "# SE less than the mean state SE or housing burdened low income households\n",
+ "# Convert these scores to nan\n",
+ "housing.loc[(housing['rse'] >= 50) & (housing['rse'] >= housing['mean_state_se']), 'hbrd_score'] = np.nan\n",
+ "\n",
+ "# Rename columns\n",
+ "housing = housing.rename(columns = {'geoid' :'FIPS_tract_id',\n",
+ " 'st' : 'state'\n",
+ " })\n",
+ "\n",
+ "# Calculate percentile rank for census tracts with a score above 0, set percentile to 0 if score is 0, for each state\n",
+ "housing['hbrd_rank'] = housing[\n",
+ " housing['hbrd_score'] != 0][['hbrd_score',\n",
+ " 'state']].groupby('state').rank( \n",
+ " na_option = 'keep', \n",
+ " pct = True) * 100\n",
+ "\n",
+ "housing.loc[housing['hbrd_score'] == 0, 'hbrd_rank'] = 0\n",
+ "\n",
+ "# Create final housing burden df\n",
+ "housingburden = housing.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
source
\n",
+ "
sumlevel
\n",
+ "
FIPS_tract_id
\n",
+ "
name
\n",
+ "
state
\n",
+ "
cnty
\n",
+ "
tract
\n",
+ "
T8_est1
\n",
+ "
T8_est2
\n",
+ "
T8_est3
\n",
+ "
...
\n",
+ "
T8_moe131
\n",
+ "
T8_moe132
\n",
+ "
T8_moe133
\n",
+ "
summed
\n",
+ "
summed_se
\n",
+ "
hbrd_score
\n",
+ "
se
\n",
+ "
rse
\n",
+ "
mean_state_se
\n",
+ "
hbrd_rank
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020100
\n",
+ "
Census Tract 201, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20100
\n",
+ "
765
\n",
+ "
570
\n",
+ "
50
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
80
\n",
+ "
31.721807
\n",
+ "
0.104575
\n",
+ "
0.041032
\n",
+ "
39.237314
\n",
+ "
0.036604
\n",
+ "
46.298077
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020200
\n",
+ "
Census Tract 202, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20200
\n",
+ "
720
\n",
+ "
465
\n",
+ "
65
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
138
\n",
+ "
45.531874
\n",
+ "
0.191667
\n",
+ "
0.061614
\n",
+ "
32.146659
\n",
+ "
0.036604
\n",
+ "
83.269231
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020300
\n",
+ "
Census Tract 203, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20300
\n",
+ "
1295
\n",
+ "
840
\n",
+ "
60
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
170
\n",
+ "
53.722921
\n",
+ "
0.131274
\n",
+ "
0.040927
\n",
+ "
31.176999
\n",
+ "
0.036604
\n",
+ "
63.653846
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020400
\n",
+ "
Census Tract 204, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20400
\n",
+ "
1640
\n",
+ "
1260
\n",
+ "
15
\n",
+ "
...
\n",
+ "
12
\n",
+ "
12
\n",
+ "
12
\n",
+ "
145
\n",
+ "
46.288510
\n",
+ "
0.088415
\n",
+ "
0.027822
\n",
+ "
31.467397
\n",
+ "
0.036604
\n",
+ "
34.615385
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
2014thru2018
\n",
+ "
140
\n",
+ "
01001020500
\n",
+ "
Census Tract 205, Autauga County, Alabama
\n",
+ "
01
\n",
+ "
1
\n",
+ "
20500
\n",
+ "
4175
\n",
+ "
2320
\n",
+ "
175
\n",
+ "
...
\n",
+ "
17
\n",
+ "
17
\n",
+ "
17
\n",
+ "
595
\n",
+ "
147.221693
\n",
+ "
0.142515
\n",
+ "
0.034760
\n",
+ "
24.390193
\n",
+ "
0.036604
\n",
+ "
68.221154
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 280 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source sumlevel FIPS_tract_id \\\n",
+ "0 2014thru2018 140 01001020100 \n",
+ "1 2014thru2018 140 01001020200 \n",
+ "2 2014thru2018 140 01001020300 \n",
+ "3 2014thru2018 140 01001020400 \n",
+ "4 2014thru2018 140 01001020500 \n",
+ "\n",
+ " name state cnty tract T8_est1 \\\n",
+ "0 Census Tract 201, Autauga County, Alabama 01 1 20100 765 \n",
+ "1 Census Tract 202, Autauga County, Alabama 01 1 20200 720 \n",
+ "2 Census Tract 203, Autauga County, Alabama 01 1 20300 1295 \n",
+ "3 Census Tract 204, Autauga County, Alabama 01 1 20400 1640 \n",
+ "4 Census Tract 205, Autauga County, Alabama 01 1 20500 4175 \n",
+ "\n",
+ " T8_est2 T8_est3 ... T8_moe131 T8_moe132 T8_moe133 summed summed_se \\\n",
+ "0 570 50 ... 12 12 12 80 31.721807 \n",
+ "1 465 65 ... 12 12 12 138 45.531874 \n",
+ "2 840 60 ... 12 12 12 170 53.722921 \n",
+ "3 1260 15 ... 12 12 12 145 46.288510 \n",
+ "4 2320 175 ... 17 17 17 595 147.221693 \n",
+ "\n",
+ " hbrd_score se rse mean_state_se hbrd_rank \n",
+ "0 0.104575 0.041032 39.237314 0.036604 46.298077 \n",
+ "1 0.191667 0.061614 32.146659 0.036604 83.269231 \n",
+ "2 0.131274 0.040927 31.176999 0.036604 63.653846 \n",
+ "3 0.088415 0.027822 31.467397 0.036604 34.615385 \n",
+ "4 0.142515 0.034760 24.390193 0.036604 68.221154 \n",
+ "\n",
+ "[5 rows x 280 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(73056, 280)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "housingburden.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As desired we see a uniform distribution for the percentile rank for burdened households"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we compute for a baseline comparison "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Owner occupied numerator fields\n",
+ "OWNER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est7\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est10\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est20\",\n",
+ " \n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est23\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est33\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est36\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "OWNER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est13\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est26\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est39\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est52\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est65\",\n",
+ " # Subtotal\n",
+ " # Owner occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_FIELD = \"T8_est2\"\n",
+ "# Subtotal\n",
+ "# Owner occupied\n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "OWNER_OCCUPIED_POPULATION_HAMFI_FIELD = \"T8_est3\"\n",
+ "# Subtotal\n",
+ "# Owner occupied \n",
+ "# All\n",
+ "# All\n",
+ "# All\n",
+ "\n",
+ "# Renter occupied numerator fields\n",
+ "RENTER_OCCUPIED_NUMERATOR_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est73\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est76\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # less than or equal to 30% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est86\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est89\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 30% but less than or equal to 50% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ " \"T8_est99\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 30% but less than or equal to 50%\n",
+ " # All\n",
+ " \"T8_est102\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # greater than 50%\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# These rows have the values where HAMFI was not computed, b/c of no or negative income.\n",
+ "RENTER_OCCUPIED_NOT_COMPUTED_FIELDS = [\n",
+ " # Column Name\n",
+ " # Line_Type\n",
+ " # Tenure\n",
+ " # Household income\n",
+ " # Cost burden\n",
+ " # Facilities\n",
+ " \"T8_est79\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tless than or equal to 30% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est92\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 30% but less than or equal to 50% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est105\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 50% but less than or equal to 80% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est118\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\tgreater than 80% but less than or equal to 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ " \"T8_est131\",\n",
+ " # Subtotal\n",
+ " # Renter occupied\n",
+ " # greater than 100% of HAMFI\n",
+ " # not computed (no/negative income)\n",
+ " # All\n",
+ "]\n",
+ "\n",
+ "# T8_est68\tSubtotalRenter occupied\tAll\tAll\tAll\n",
+ "RENTER_OCCUPIED_POPULATION_FIELD = \"T8_est68\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_summed_methodology\"] = housingburden[\n",
+ " OWNER_OCCUPIED_NUMERATOR_FIELDS\n",
+ "].sum(axis=1) + housingburden[RENTER_OCCUPIED_NUMERATOR_FIELDS].sum(axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ " - housingburden[OWNER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ " - housingburden[RENTER_OCCUPIED_NOT_COMPUTED_FIELDS].sum(axis=1)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_denominator_sans_not_computed\"] = (\n",
+ " housingburden[OWNER_OCCUPIED_POPULATION_FIELD]\n",
+ " + housingburden[RENTER_OCCUPIED_POPULATION_FIELD]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "housingburden[\"current_methodology_percent\"] = np.round(\n",
+ " (housingburden[\"current_summed_methodology\"] / housingburden[\"current_methodology_denominator\"] ), 2) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now we construct the distribution of differences in the number of owned and rented burdened households\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Percentiles Comparison"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "final_df = housingburden[['FIPS_tract_id', 'state','hbrd_rank','hbrd_score', 'summed', \n",
+ " 'current_summed_methodology', 'T8_est1', \n",
+ " \"current_methodology_denominator_sans_not_computed\",\n",
+ " 'current_methodology_denominator', 'current_methodology_percent']]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### First notice here that **T8_est1** and **current_methodology_denominator** should represent same or similar aggregates. In general, we cen see that the current computation performed results in a differerntial that undercounts the total occupied and rental households."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/sarahluw/.pyenv/versions/3.6.2/envs/my-virtual-env-3.6.2/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
+ "A value is trying to be set on a copy of a slice from a DataFrame.\n",
+ "Try using .loc[row_indexer,col_indexer] = value instead\n",
+ "\n",
+ "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "final_df[\"differences_aggregate_denominator_sans_not_computed\"] = (\n",
+ " final_df[\"current_methodology_denominator\"] - final_df[\"T8_est1\"] \n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "