{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Homework Exercise from Week 3\n", "\n", "This file re-uses a lot of the code from the in-class exercises from Week 2, so the first half of it you've already seen. There are two exceptions:\n", "\n", " 1. I have updated all the comments throughout the file to follow the best practices taught in [Chapter 5 of the class notes](https://nathancarter.github.io/MA346-course-notes/_build/html/chapter-5-before-and-after.html). Specifically:\n", " * Before every code cell, I've included the motivation for why we're running it.\n", " * After every code cell, I've interpreted the output for the reader.\n", " 2. I have added new code at the end of the file that wasn't there before. This code is either uncommented or very poorly commented. It's your job to:\n", " * Read all that code until you understand it. (Feel free to utilize office hours, email, Teams, etc. if you need help.)\n", " * Add in comments that follow the best practices covered in class and summarized above.\n", " * Submit your work by publishing it on Deepnote and emailing me the link to the published version.\n", "\n", "This file should be used in the same folder as [the CSV file of mortgage applications](https://nathancarter.github.io/MA346-course-notes/_static/practice-project-dataset-1.csv) discussed in [Chapter 4 of the class notes](https://nathancarter.github.io/MA346-course-notes/_build/html/chapter-4-review-of-python-and-pandas.html).\n", "\n", "---\n", "\n", "# HERE'S THE PART YOU'VE ALREADY SEEN:\n", "\n", "---\n", "\n", "We begin by loading the mortgage dataset, which also requires importing the pandas library." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "df = pd.read_csv( 'practice-project-dataset-1.csv' )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No output from this cell means it succeeded without error. The variable `df` now contains all the data.\n", "\n", "But what's in the dataset? Let's explore." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0Unnamed: 0.1activity_yearleiderived_msa_mdstate_codecounty_codecensus_tractconforming_loan_limitderived_loan_product_type...denial_reason_2denial_reason_3denial_reason_4tract_populationtract_minority_population_percentffiec_msa_md_median_family_incometract_to_msa_income_percentagetract_owner_occupied_unitstract_one_to_four_family_homestract_median_age_of_housing_units
0805458054520185493002QI2ILHHZH8D2031084CA6037.06.037603e+09CConventional:First Lien...NaNNaNNaN702996.766930065885136351
162888628882018549300ALNLUNS3Y53T2444060WA53063.05.306301e+10CConventional:First Lien...NaNNaNNaN756811.19640001382002233822
21402601402602018549300PUSSF737Y6XW8612060GA13223.01.322312e+10CConventional:First Lien...NaNNaNNaN1192426.72744001253082377513
31084561084562018JJKC32MCHWDI71265Z0617900SC45079.04.507901e+10CConventional:First Lien...NaNNaNNaN686053.85688001281815246513
4824678246720185493002UNUIL8WHZAD6331140KY21185.02.118503e+10CConventional:First Lien...NaNNaNNaN47196.42704001611412161633
\n", "

5 rows × 101 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 Unnamed: 0.1 activity_year lei \\\n", "0 80545 80545 2018 5493002QI2ILHHZH8D20 \n", "1 62888 62888 2018 549300ALNLUNS3Y53T24 \n", "2 140260 140260 2018 549300PUSSF737Y6XW86 \n", "3 108456 108456 2018 JJKC32MCHWDI71265Z06 \n", "4 82467 82467 2018 5493002UNUIL8WHZAD63 \n", "\n", " derived_msa_md state_code county_code census_tract conforming_loan_limit \\\n", "0 31084 CA 6037.0 6.037603e+09 C \n", "1 44060 WA 53063.0 5.306301e+10 C \n", "2 12060 GA 13223.0 1.322312e+10 C \n", "3 17900 SC 45079.0 4.507901e+10 C \n", "4 31140 KY 21185.0 2.118503e+10 C \n", "\n", " derived_loan_product_type ... denial_reason_2 denial_reason_3 \\\n", "0 Conventional:First Lien ... NaN NaN \n", "1 Conventional:First Lien ... NaN NaN \n", "2 Conventional:First Lien ... NaN NaN \n", "3 Conventional:First Lien ... NaN NaN \n", "4 Conventional:First Lien ... NaN NaN \n", "\n", " denial_reason_4 tract_population tract_minority_population_percent \\\n", "0 NaN 7029 96.76 \n", "1 NaN 7568 11.19 \n", "2 NaN 11924 26.72 \n", "3 NaN 6860 53.85 \n", "4 NaN 4719 6.42 \n", "\n", " ffiec_msa_md_median_family_income tract_to_msa_income_percentage \\\n", "0 69300 65 \n", "1 64000 138 \n", "2 74400 125 \n", "3 68800 128 \n", "4 70400 161 \n", "\n", " tract_owner_occupied_units tract_one_to_four_family_homes \\\n", "0 885 1363 \n", "1 2002 2338 \n", "2 3082 3775 \n", "3 1815 2465 \n", "4 1412 1616 \n", "\n", " tract_median_age_of_housing_units \n", "0 51 \n", "1 22 \n", "2 13 \n", "3 13 \n", "4 33 \n", "\n", "[5 rows x 101 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The table above shows several of the columns of the dataset, but just the first five rows. It gives us a quick peek at some of the dataset's contents.\n", "\n", "But since we can't see all the columns, we may ask, how many columns are there?" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 15120 entries, 0 to 15119\n", "Columns: 101 entries, Unnamed: 0 to tract_median_age_of_housing_units\n", "dtypes: float64(31), int64(43), object(27)\n", "memory usage: 11.7+ MB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It seems that ther are 101, and because there are so many, pandas did not give us detailed information on each one.\n", "\n", "We care today only about investigating a few of these columns, so we will drop all the others, making our DataFrame more manageable." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 15120 entries, 0 to 15119\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 interest_rate 10061 non-null object \n", " 1 property_value 12424 non-null object \n", " 2 state_code 14929 non-null object \n", " 3 tract_minority_population_percent 15120 non-null float64\n", " 4 derived_race 15120 non-null object \n", " 5 derived_sex 15120 non-null object \n", " 6 applicant_age 15120 non-null object \n", "dtypes: float64(1), object(6)\n", "memory usage: 827.0+ KB\n" ] } ], "source": [ "df = df[['interest_rate','property_value','state_code','tract_minority_population_percent','derived_race','derived_sex','applicant_age']]\n", "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that there are only 7 columns, the `info()` function shows us the name and type of each, as well as how many entries are null/non-null.\n", "\n", "Because \"object\" is the data type pandas uses to mean \"string\" or \"text,\" three of the columns in the above table have the wrong data type. We need to convert `interest_rate` and `property_value` to a numeric type. We'll use `float` to support missing values. We'll return to `applicant_age` later.\n", "\n", "If we tried to convert the `interest_rate` column to `float`, we would get an error, because it contains several instances of the word \"Exempt.\" We want to treat these as missing values, so we will replace them with NumPy's null value." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "df['interest_rate'] = df['interest_rate'].replace( 'Exempt', np.nan )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No output indicates no errors, or success.\n", "\n", "We can therefore convert the column to the correct type." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df['interest_rate'] = df['interest_rate'].astype( float )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, no output means nothing went wrong. We then repeat the process with the `property_value` column as well." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 15120 entries, 0 to 15119\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 interest_rate 9660 non-null float64\n", " 1 property_value 12024 non-null float64\n", " 2 state_code 14929 non-null object \n", " 3 tract_minority_population_percent 15120 non-null float64\n", " 4 derived_race 15120 non-null object \n", " 5 derived_sex 15120 non-null object \n", " 6 applicant_age 15120 non-null object \n", "dtypes: float64(3), object(4)\n", "memory usage: 827.0+ KB\n" ] } ], "source": [ "df['property_value'] = df['property_value'].replace( 'Exempt', np.nan )\n", "df['property_value'] = df['property_value'].astype( float )\n", "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The DataFrame's info table now shows that we've successfully converted those two columns (note their `float64` data type in the right column).\n", "\n", "If we tried to do the same to the `applicant_age` column, it would fail, because the ages aren't actually numbers. We can see their values with the following code." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "35-44 3144\n", "45-54 3033\n", "25-34 2553\n", "55-64 2483\n", "8888 1489\n", "65-74 1454\n", ">74 567\n", "<25 397\n", "Name: applicant_age, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['applicant_age'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So `applicant_age` is a categorical column, because ages have been broken into the eight categories you see above. Like `derived_race` and `derived_sex`, it should have data type categorical.\n", "\n", "We convert each of those columns as follows." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 15120 entries, 0 to 15119\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 interest_rate 9660 non-null float64 \n", " 1 property_value 12024 non-null float64 \n", " 2 state_code 14929 non-null object \n", " 3 tract_minority_population_percent 15120 non-null float64 \n", " 4 derived_race 15120 non-null category\n", " 5 derived_sex 15120 non-null category\n", " 6 applicant_age 15120 non-null category\n", "dtypes: category(3), float64(3), object(1)\n", "memory usage: 517.9+ KB\n" ] } ], "source": [ "df['derived_race'] = df['derived_race'].astype( 'category' )\n", "df['derived_sex'] = df['derived_sex'].astype( 'category' )\n", "df['applicant_age'] = df['applicant_age'].astype( 'category' )\n", "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The info table now shows that each column has the correct data type." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# YOUR WORK BEGINS HERE:\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "lower_prices = df[df['property_value'] < 500000]\n", "high_minority = lower_prices[lower_prices['tract_minority_population_percent'] > 75]\n", "low_minority = lower_prices[lower_prices['tract_minority_population_percent'] < 25]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAEWCAYAAADcsGj7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deZgU1dn///fNsIwICiJ5fiLEQUEjKkEEUSMGNe4iGDWgKO4+mhCT+MQoGhGJCyYx7gaNC0gQcEsgitH8gqgkKqCiIsYEcYwTNAIKCrgA3t8/zpmhaLp7eobpmWLm87quvqb7VNVZqmv67nPqdJW5OyIiImnUrKErICIikouClIiIpJaClIiIpJaClIiIpJaClIiIpJaClIiIpJaClNSYmY02s98XId+tzOxPZrbSzB6q6/xFasPMyszMzax5fP2EmZ1ehHLGmdkVdZ3vlk5BagtiZgea2d/jh/hHZvY3M+vb0PWqQycC/wN0cPeTMhea2elm9pKZfWJmFWb2y8oPjrh8OzP7g5mtNrN3zeyUxLIdzGy6mS2JHzhlGXlvZ2ZTzWxZfEwys22yVTLzQyuRPt7Mrt68XbD5zKzczL40s+0z0udna3sN8j3DzGbXRR2LJX6BcjPbt1hluPtR7j5hc/LIti/d/Xx3/8Xm1a7xUZDaQsQPzMeAW4HtgB2Bq4AvGrJedWwn4J/uvi7H8tbAj4HtgX7AocBPE8tvB74kBLphwG/NbI+47Cvgz8AJOfK+GmgP7AzsEvMYXduGpMA7wMmVL8xsL2Cr2maWGZDTyMwMOA34CKjzno40EHfXYwt4AH2AFXmW7wLMBJYDy4BJQLvE8nLgYuA1YDVwD+GD+AngU+D/B9rHdcsAB84DlgDvA/+XyGs08PvE6/2AvwMrgFeBAXnquTswK677BnBcTL+KEGDWAquAswvYJxcBf4rPt47b75pYPhEYm7FN89i2soz0J4DvJ17/AHgyR7mV+6d5Rvp44OrE6+NiG1fENu9em/ejFvu4HPg5MDeR9mvg8mTbgW2B+4GlwLtxm2Zx2RnA34AbCR/6jwCfA+vj+7MirtcB+BPwCTCXEOxnJ8q9GXgvLn8J6J9YthUwAfgYeBP4GVCRWN4plruUEHQvrOZ4OAj4DDiV8H/QMrGssj23AiuBfwCHJpbPAq4D5sTl04Dtsr3fcd1zEtueG+v/KbAQ6B3TLwXeTqQfn/gfyLYvx7Px8XMusCju/+lAp8QyB84H/hX33+2AxWXdgGdiO5YBUxv682tzHg1eAT0KfKNgm/iPNwE4isQHWFzeDTgMaAV0BJ4FbkosLwdeIHwQ7gh8CLwM7B23mQlcGdet/KecTPjw3yt+UHwnLh9NDFIxr+XA0YSe+WHxdccsbWgR/+kuA1oCh8R/4N0y8y1wn/yRGIRiOz7LWP5TYhBLpOUKUscCMwi9qfZxf/w4R7kbfWgl0qs+ZIBdCcHnsNjun8W2t6zF+1HwPk7k/R3gLcIHYgkhUOzExkHqfsKHcdvYpn8SvxwQPtTXAT+M+2yrmDY7o6wp8dEa6BHLSQapUwmBrDnwf8AHQGlcNpbwYdoe6EwI2BVxWTNCUBsVj5WdgcXAEXmOh3uAB+P+Xg58N7Gssj0/icuHED7EKwPRLOA/wJ6EY/4RNhzjG73fJIIUcFLcri9ghP/DnRLLOsW2DInHww6J+mTuy/FsOH4OIQSY3vF4uBV4NrGuE0ZW2gFfJ/x/HhmXTSZ8IWkGlAIHNvTn1+Y8NNy3hXD3T4ADCQfn74Cl8RzL/8Tli9z9L+7+hbsvBX4DfDsjm1vd/b/u/h/gOeBFd3/F3b8A/kD4gEy6yt1Xu/vrwH0kho8STgVmuPsMd//K3f8CzCN8oGbaD2hDCCxfuvtMwj9atnzzMrMzCb3LX8ekNoQPnaSVhA/gQrxM+DBcHh/rgTuq2WaZma2ofACnJJYNAR6P78naWM+tgAMS6xT6ftRkHydNBIYTgto/CB+mAJhZSazjSHf/1N3LgRsIw2WVlrj7re6+zt0/y8w85nECIZiucfeFhC9RVdz99+6+POZxA+EDd7e4+HvAte7+sbtXALckNu1LCMJj4rGymHDcD83WUDNrTQgKD8T9/TCbDvl9SPjittbdpxKC+DHJ/eXuC9x9NXAF8L3YxnzOAX7p7nM9WOTu78a2P+TuS+J7NpXQ6yn0XNkw4F53fzkeDyOB/TPOJ4519xXu/m/gaaBXTF9L+ELSyd0/d/dUn0esjoLUFsTd33T3M9y9M+EbXyfgJgAz+5qZTTGz/5jZJ8DvCedukv6beP5ZltdtMtZ/L/H83Vhepp2AkzI+rA8EdsiybifgPXf/KiPfHbOsm5OZDSZ8Cz/K3ZfF5FWE3mbSNoSeWiEeIvQk2sbt3ibsw3y2d/d2lQ/ggcSyToS2ARDb/B4bt7XQ96Mm+zhpIiFwnkHoNW1Ud0JQfjeRlvlevEd+HQk9pOR6G21jZv9nZm/GyT4rCEOMlcdlpzzb7gR0ymjzZYSeZzbHE3pKM+LrScBRZtYxsc5/PHY1osxjOvN4b8Gm/0OZuhCOlU2Y2fA4WaWy/nsWkF+lzONnFeHLU/L9+SDxfA0bjpefEXp1c8zsDTM7q8AyU0lBagvl7v8gDA/sGZOuI/Syerr7NoRv37aZxXRJPP864fxUpvcI30DbJR5bu/vYLOsuAbqYWfK4+zqJb/jVMbMjCd+oB8YeXqV/As3NrHsi7ZuEc0KF+CZwZ+w5rgLGUX1PJZ8lhA/aynobYX8W3NaEmuzjKvEb/TuEdjyasXgZG75xV8p8LzJvkZD5eikhMHROpFUdM2bWH7iE0GNqHwP5SjYcl+/n2pbQ5ncy2tzW3XO9J6cTPqT/bWYfEL50tGDjXvqO8X1Itjd5TGce72sJ+ymf9wjngzdiZjsRjtMRhNmq7YAFbGh7dbefyDx+tiYMm1Z7/Lj7B+5+rrt3Av4XuMPMulW3XVopSG0hzOwb8Vtp5/i6C+Ef8IW4SlviSVgz25FwUn5zXWFmreMMuTOBqVnW+T0w0MyOMLMSMys1swGV9czwImFc/mdm1sLMBgADCec0qmVmhxC+IZ/g7nOSy+IQzaPAGDPb2sy+BQwi9CYqty8lDDcBtIqvK80FzrHwW62tCJNGXi2kXjk8CBxjZoeaWQvC+ZgvCJMfaqom+zjT2cAhcf9Ucff1sY7XmFnb+KF6Efl7j/8FOptZy0QejwKj43HyDcLwYqW2hCC2lPAFYhQb93YfBEaaWft4zI5ILJsDfGJml8T3pMTM9rQsP7mI2x5KOK/YKz6+CVzPxkN+XwMujMfeSYTzdTMSy081sx5x6HAM8HBsYz53Az81s30s6Bb35daEQLQ01vFMNnyhhIx9mcUDwJlm1svMWgHXEoaDy6upD2Z2UuLY+DjWo7p2pJaC1JbjU8K06xfNbDUhOC0gfPhBmB3Xm/BN9XE2/eZcG88QTvb/Ffi1uz+VuYK7v0cIBpcR/iHfIwTITY4td/+SMOPtKMI31DuA4bFXWIgrCMNFM8xsVXw8kVj+fcJ5nw8JJ48vcPdkT+ozQiCHcI4meZ7lLMIJ8grCt9WdCcNkteLubxF6s7cS2jqQ0Pv7shZ5FbyPs2z7trvPy7H4h4QvDYuB2YQPxnvzZDeT0DP9wMwqexgjCO/JB4QvBJPZ8LOIJwmzFf9JGLr6nI2H1MYQ9vc7hNmMD1duG4PDQELAeYewD++OZWU6DZjv7k/FXsQH7v4B4RxXTzOrDA4vAt1jXtcAJ7r78kQ+EwmjEx8QJhxcmGdfEOv5UMzrAcL/6B8JkzEWEs7xPU8ISHsRZhdWyrYvk/n+lXC8P0Loce5CjvNxWfQlfE6sIswK/JG7v1PgtqlTOWVRpEo8OfsO0MJz/2ZJZBNmdj3w/7l7jX+nZGYXAEPdPXPCT13U6wzCjLwDcyyfRZjNd3ddly2bRz0pEam1OAzdMw517UsYXvxDgdvuYGbfMrNmZrYbYVSgoG2l6Uj9r8hFJNXaEob4OhGGWW8g/PaqEC2BO4GuhB8pT6H6af/SxGi4T0REUkvDfSIikloa7quB7bff3svKyhq6GiIiW5SXXnppmbt3rH7NTSlI1UBZWRnz5uWazSsiItmY2bvVr5WdhvtERCS1FKRERCS1FKRERCS1dE5KRBrU2rVrqaio4PPPP2/oqshmKi0tpXPnzrRo0aLO8lSQEpEGVVFRQdu2bSkrK2Pji5TLlsTdWb58ORUVFXTt2rXO8tVwn4g0qM8//5wOHTooQG3hzIwOHTrUeY9YQUpEGpwCVONQjPdRQUpERFJL56REJFXKLn28TvMrH3tMteu0adOGVatWVb0eP3488+bN47bbbmPcuHG0bt2a4cOH59w+uX4+w4YN4/XXX+fYY4/l2muvBeAXv/gFPXv2ZNCgQQW2aFOjRo3ioIMO4jvf+U6t86g0b9487r//fm655RZmzZpFy5YtOeCAAzY739pSkJKmZ3S2++YBo1fWbz1ki3D++efXST6vvfZa1d/+/fuzcuVK1qxZw5w5c7jiiis2K+8xY8bURRVZt24dffr0oU+fPgDMmjWLNm3aNGiQ0nCfiEgeo0eP5te//jUAc+fOpWfPnuy///5cfPHF7LnnhjvCL1myhCOPPJLu3bvzs5/9bJN8WrRowWeffcZXX33Fl19+SUlJCaNGjcobYMaPH8/gwYMZOHAgXbt25bbbbuM3v/kNe++9N/vttx8fffQRAGeccQYPP/wwEC7fduWVV9K7d2/22msv/vGPcOPrjz76iMGDB9OzZ0/222+/qqA5evRozjvvPA4//HCGDx/OrFmzOPbYYykvL2fcuHHceOON9OrVi+eee46uXbuydu1aAD755BPKysqqXheLgpSINHmfffYZvXr1qnqMGjUq63pnnnkm48aN4/nnn6ekpGSjZfPnz2fq1Km8/vrrTJ06lffee2+j5bvvvjtf//rX6d27N9/73vdYtGgR7s7ee++dt24LFizggQceYM6cOVx++eW0bt2aV155hf3335/7778/6zbbb789L7/8MhdccEFVgL3yyivZe++9ee2117j22ms3Gr586aWXmDZtGg888EBVWllZGeeffz4/+clPmD9/Pv3792fAgAE8/ngYjp0yZQonnHBCnf4mKhsN94lIk7fVVlsxf/78qteV55iSVqxYwaefflo19HXKKafw2GOPVS0/9NBD2XbbMJTco0cP3n33Xbp06bJRHjfddFPV84EDB3LnnXdyzTXX8Oqrr3LYYYdx7rnnblK3gw8+mLZt29K2bVu23XZbBg4cCMBee+1V1RvK9N3vfheAffbZh0cffRSA2bNn88gjjwBwyCGHsHz5clauDEPcxx13HFtttVV1u4lzzjmHX/7ylwwePJj77ruP3/3ud9Vus7nUkxIRKUB1N4ht1apV1fOSkhLWrVuXc91p06bRp08fVq9ezYIFC3jwwQeZOHEia9asyZtvs2bNql43a9YsZxmV6yTrka3+lVPGt95667xtq/Stb32L8vJynnnmGdavX7/RcGexKEiJiBSgffv2tG3blhdeeAEIw121sXbtWm6++WYuvvhi1qxZUxUoKs9VFctBBx3EpEmTgDAhYvvtt2ebbbbJu03btm359NNPN0obPnw4J598MmeeeWbR6pqk4T6RIsg1jbqQ6dBNXZr30T333MO5557L1ltvzYABA6qG92ri9ttv5/TTT6d169b07NkTd2evvfbi6KOPpl27dkWodTB69GjOPPNMevbsSevWrZkwYUK12wwcOJATTzyRadOmceutt9K/f3+GDRvGz3/+c04++eSi1TXJquvCygZ9+vRx3fSwEaiHKegKUoV788032X333Ru6GgVZtWoVbdq0AWDs2LG8//773HzzzQ1cq/r18MMPM23aNCZOnJh1ebb308xecvc+tSlPPSkRkQI9/vjjXHfddaxbt46ddtqJ8ePHN3SV6tUP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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.hist( [ high_minority['property_value'], low_minority['property_value'] ],\n", " bins=20, density=True )\n", "plt.legend( [ 'High % minority', 'Low % minority' ] )\n", "plt.title( 'Sample of 2018 Home Mortgage Applications' )\n", "plt.xlabel( 'Property Value' )\n", "plt.ylabel( 'Proportion' )\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(229579.64601769912, 240573.24840764332)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "high_minority['property_value'].mean(), low_minority['property_value'].mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Testing null hypothesis $H_0$ = the mean property value is the same for high or low % minority tracts" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import stats\n", "alpha = 0.05\n", "statistic, pvalue = stats.ttest_ind( high_minority['property_value'],\n", " low_minority['property_value'],\n", " equal_var=False )\n", "pvalue < alpha # reject H_0?" ] } ], "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }