{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Cleaning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## \"Housekeeping\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import all the third-party (scientific) libraries needed."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import missingno as msno\n",
"import numpy as np\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The *utils.py* module defines helper dictionaries, lists, and functions that help with parsing the data types correctly, look up column descriptions, and refer to groups of data columns.\n",
"\n",
"**Note:** the suffix \\_*COLUMNS* indicates a dictionary with all meta information on the provided data file and \\_*VARIABLES* a list with only the column names (i.e., the keys of the respective \\_*COLUMNS* dictionary)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from utils import (\n",
" ALL_COLUMNS,\n",
" ALL_VARIABLES,\n",
" CONTINUOUS_COLUMNS,\n",
" CONTINUOUS_VARIABLES,\n",
" DISCRETE_COLUMNS,\n",
" DISCRETE_VARIABLES,\n",
" INDEX_COLUMNS,\n",
" LABEL_COLUMNS, # groups nominal and ordinal\n",
" LABEL_TYPES,\n",
" NOMINAL_COLUMNS,\n",
" NOMINAL_VARIABLES,\n",
" NUMERIC_VARIABLES, # groups continuous and discrete\n",
" ORDINAL_COLUMNS,\n",
" ORDINAL_VARIABLES,\n",
" TARGET_VARIABLES, # = Sale Price\n",
" correct_column_names,\n",
" print_column_list,\n",
" update_column_descriptions,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Show all data columns.\n",
"pd.set_option(\"display.max_columns\", 100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The original data are available for [download](https://www.amstat.org/publications/jse/v19n3/decock/AmesHousing.xls) and a detailed description of the data types for each column can be found [here](https://www.amstat.org/publications/jse/v19n3/decock/DataDocumentation.txt). These meta data go into the `dtype` argument of the `read_excel` function below to parse the data correctly. There are four different generic data types defined that are casted as follows:\n",
"\n",
"- continuous -> np.float64\n",
"- discrete -> actually np.int64 but np.float64 because of missing values\n",
"- nominal -> object (str)\n",
"- ordinal -> object (str), the order can be looked up in the above mentioned *ALL_COLUMNS* dictionary\n",
"\n",
"**Note 1:** the data come with a lot of \"NA\" text strings that do **not** indicate missing data but, for example, the absence of a basement or a parking lot (see the linked data description).\n",
"\n",
"**Note 2:** the mappings from column names to data types are encoded in the \"utils.py\" module that defines the aforementioned helper dictionaries / lists.\n",
"\n",
"**Note 3:** the Excel file with all the data is either loaded from the local dictionary (= \"cache\") or obtained fresh from the source."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# To avoid redundancy.\n",
"kwargs = {\n",
" \"dtype\": { # Ensure each column is parsed as the correct data type.\n",
" column: ( # This creates a mapping from column name to data type.\n",
" object if mapping_info[\"type\"] in LABEL_TYPES else np.float64\n",
" )\n",
" for (column, mapping_info) in ALL_COLUMNS.items()\n",
" },\n",
" \"na_values\": \"\", # By default, pandas treats NA strings as missing,\n",
" \"keep_default_na\": False, # which is not the correct meaning here.\n",
"}\n",
"\n",
"try:\n",
" df = pd.read_excel(\"data/data_raw.xls\", **kwargs)\n",
"except FileNotFoundError:\n",
" df = pd.read_excel(\n",
" \"https://www.amstat.org/publications/jse/v19n3/decock/AmesHousing.xls\", **kwargs\n",
" )\n",
" # Cache the obtained file.\n",
" df.to_excel(\"data/data_raw.xls\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Some columns names differ between the Excel file and\n",
"# the data description file. Correct that with the values\n",
"# in the Excel file.\n",
"correct_column_names(df.columns)\n",
"# Use a compound index and keep both\n",
"# identifying columns in the DataFrame.\n",
"df = df.set_index(INDEX_COLUMNS)\n",
"# Put the provided columns into the same\n",
"# order as in the encoded description file.\n",
"# Note that the target variable \"SalePrice\"\n",
"# is not in the description file.\n",
"df = df[ALL_VARIABLES + TARGET_VARIABLES]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
1st Flr SF
\n",
"
2nd Flr SF
\n",
"
3Ssn Porch
\n",
"
Alley
\n",
"
Bedroom AbvGr
\n",
"
Bldg Type
\n",
"
Bsmt Cond
\n",
"
Bsmt Exposure
\n",
"
Bsmt Full Bath
\n",
"
Bsmt Half Bath
\n",
"
Bsmt Qual
\n",
"
Bsmt Unf SF
\n",
"
BsmtFin SF 1
\n",
"
BsmtFin SF 2
\n",
"
BsmtFin Type 1
\n",
"
BsmtFin Type 2
\n",
"
Central Air
\n",
"
Condition 1
\n",
"
Condition 2
\n",
"
Electrical
\n",
"
Enclosed Porch
\n",
"
Exter Cond
\n",
"
Exter Qual
\n",
"
Exterior 1st
\n",
"
Exterior 2nd
\n",
"
Fence
\n",
"
Fireplace Qu
\n",
"
Fireplaces
\n",
"
Foundation
\n",
"
Full Bath
\n",
"
Functional
\n",
"
Garage Area
\n",
"
Garage Cars
\n",
"
Garage Cond
\n",
"
Garage Finish
\n",
"
Garage Qual
\n",
"
Garage Type
\n",
"
Garage Yr Blt
\n",
"
Gr Liv Area
\n",
"
Half Bath
\n",
"
Heating
\n",
"
Heating QC
\n",
"
House Style
\n",
"
Kitchen AbvGr
\n",
"
Kitchen Qual
\n",
"
Land Contour
\n",
"
Land Slope
\n",
"
Lot Area
\n",
"
Lot Config
\n",
"
Lot Frontage
\n",
"
Lot Shape
\n",
"
Low Qual Fin SF
\n",
"
MS SubClass
\n",
"
MS Zoning
\n",
"
Mas Vnr Area
\n",
"
Mas Vnr Type
\n",
"
Misc Feature
\n",
"
Misc Val
\n",
"
Mo Sold
\n",
"
Neighborhood
\n",
"
Open Porch SF
\n",
"
Overall Cond
\n",
"
Overall Qual
\n",
"
Paved Drive
\n",
"
Pool Area
\n",
"
Pool QC
\n",
"
Roof Matl
\n",
"
Roof Style
\n",
"
Sale Condition
\n",
"
Sale Type
\n",
"
Screen Porch
\n",
"
Street
\n",
"
TotRms AbvGrd
\n",
"
Total Bsmt SF
\n",
"
Utilities
\n",
"
Wood Deck SF
\n",
"
Year Built
\n",
"
Year Remod/Add
\n",
"
Yr Sold
\n",
"
SalePrice
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\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",
"
1
\n",
"
526301100
\n",
"
1656.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
Gd
\n",
"
Gd
\n",
"
1.0
\n",
"
0.0
\n",
"
TA
\n",
"
441.0
\n",
"
639.0
\n",
"
0.0
\n",
"
BLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
BrkFace
\n",
"
Plywood
\n",
"
NA
\n",
"
Gd
\n",
"
2.0
\n",
"
CBlock
\n",
"
1.0
\n",
"
Typ
\n",
"
528.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1960.0
\n",
"
1656.0
\n",
"
0.0
\n",
"
GasA
\n",
"
Fa
\n",
"
1Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
31770.0
\n",
"
Corner
\n",
"
141.0
\n",
"
IR1
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
112.0
\n",
"
Stone
\n",
"
NA
\n",
"
0.0
\n",
"
5.0
\n",
"
NAmes
\n",
"
62.0
\n",
"
5
\n",
"
6
\n",
"
P
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
7
\n",
"
1080.0
\n",
"
AllPub
\n",
"
210.0
\n",
"
1960.0
\n",
"
1960.0
\n",
"
2010.0
\n",
"
215000
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
896.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
2
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
TA
\n",
"
270.0
\n",
"
468.0
\n",
"
144.0
\n",
"
Rec
\n",
"
LwQ
\n",
"
Y
\n",
"
Feedr
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
MnPrv
\n",
"
NA
\n",
"
0.0
\n",
"
CBlock
\n",
"
1.0
\n",
"
Typ
\n",
"
730.0
\n",
"
1.0
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
Attchd
\n",
"
1961.0
\n",
"
896.0
\n",
"
0.0
\n",
"
GasA
\n",
"
TA
\n",
"
1Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
11622.0
\n",
"
Inside
\n",
"
80.0
\n",
"
Reg
\n",
"
0.0
\n",
"
020
\n",
"
RH
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
6.0
\n",
"
NAmes
\n",
"
0.0
\n",
"
6
\n",
"
5
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
120.0
\n",
"
Pave
\n",
"
5
\n",
"
882.0
\n",
"
AllPub
\n",
"
140.0
\n",
"
1961.0
\n",
"
1961.0
\n",
"
2010.0
\n",
"
105000
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
1329.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
TA
\n",
"
406.0
\n",
"
923.0
\n",
"
0.0
\n",
"
ALQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
Wd Sdng
\n",
"
Wd Sdng
\n",
"
NA
\n",
"
NA
\n",
"
0.0
\n",
"
CBlock
\n",
"
1.0
\n",
"
Typ
\n",
"
312.0
\n",
"
1.0
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
Attchd
\n",
"
1958.0
\n",
"
1329.0
\n",
"
1.0
\n",
"
GasA
\n",
"
TA
\n",
"
1Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
14267.0
\n",
"
Corner
\n",
"
81.0
\n",
"
IR1
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
108.0
\n",
"
BrkFace
\n",
"
Gar2
\n",
"
12500.0
\n",
"
6.0
\n",
"
NAmes
\n",
"
36.0
\n",
"
6
\n",
"
6
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
6
\n",
"
1329.0
\n",
"
AllPub
\n",
"
393.0
\n",
"
1958.0
\n",
"
1958.0
\n",
"
2010.0
\n",
"
172000
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
2110.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
1.0
\n",
"
0.0
\n",
"
TA
\n",
"
1045.0
\n",
"
1065.0
\n",
"
0.0
\n",
"
ALQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
Gd
\n",
"
BrkFace
\n",
"
BrkFace
\n",
"
NA
\n",
"
TA
\n",
"
2.0
\n",
"
CBlock
\n",
"
2.0
\n",
"
Typ
\n",
"
522.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1968.0
\n",
"
2110.0
\n",
"
1.0
\n",
"
GasA
\n",
"
Ex
\n",
"
1Story
\n",
"
1
\n",
"
Ex
\n",
"
Lvl
\n",
"
Gtl
\n",
"
11160.0
\n",
"
Corner
\n",
"
93.0
\n",
"
Reg
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
4.0
\n",
"
NAmes
\n",
"
0.0
\n",
"
5
\n",
"
7
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
8
\n",
"
2110.0
\n",
"
AllPub
\n",
"
0.0
\n",
"
1968.0
\n",
"
1968.0
\n",
"
2010.0
\n",
"
244000
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
928.0
\n",
"
701.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
Gd
\n",
"
137.0
\n",
"
791.0
\n",
"
0.0
\n",
"
GLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
MnPrv
\n",
"
TA
\n",
"
1.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
482.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1997.0
\n",
"
1629.0
\n",
"
1.0
\n",
"
GasA
\n",
"
Gd
\n",
"
2Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
13830.0
\n",
"
Inside
\n",
"
74.0
\n",
"
IR1
\n",
"
0.0
\n",
"
060
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
3.0
\n",
"
Gilbert
\n",
"
34.0
\n",
"
5
\n",
"
5
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
6
\n",
"
928.0
\n",
"
AllPub
\n",
"
212.0
\n",
"
1997.0
\n",
"
1998.0
\n",
"
2010.0
\n",
"
189900
\n",
"
\n",
"
\n",
"
6
\n",
"
527105030
\n",
"
926.0
\n",
"
678.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
TA
\n",
"
324.0
\n",
"
602.0
\n",
"
0.0
\n",
"
GLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
NA
\n",
"
Gd
\n",
"
1.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
470.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1998.0
\n",
"
1604.0
\n",
"
1.0
\n",
"
GasA
\n",
"
Ex
\n",
"
2Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
9978.0
\n",
"
Inside
\n",
"
78.0
\n",
"
IR1
\n",
"
0.0
\n",
"
060
\n",
"
RL
\n",
"
20.0
\n",
"
BrkFace
\n",
"
NA
\n",
"
0.0
\n",
"
6.0
\n",
"
Gilbert
\n",
"
36.0
\n",
"
6
\n",
"
6
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
7
\n",
"
926.0
\n",
"
AllPub
\n",
"
360.0
\n",
"
1998.0
\n",
"
1998.0
\n",
"
2010.0
\n",
"
195500
\n",
"
\n",
"
\n",
"
7
\n",
"
527127150
\n",
"
1338.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
2
\n",
"
TwnhsE
\n",
"
TA
\n",
"
Mn
\n",
"
1.0
\n",
"
0.0
\n",
"
Gd
\n",
"
722.0
\n",
"
616.0
\n",
"
0.0
\n",
"
GLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
170.0
\n",
"
TA
\n",
"
Gd
\n",
"
CemntBd
\n",
"
CmentBd
\n",
"
NA
\n",
"
NA
\n",
"
0.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
582.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
2001.0
\n",
"
1338.0
\n",
"
0.0
\n",
"
GasA
\n",
"
Ex
\n",
"
1Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
4920.0
\n",
"
Inside
\n",
"
41.0
\n",
"
Reg
\n",
"
0.0
\n",
"
120
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
4.0
\n",
"
StoneBr
\n",
"
0.0
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
6
\n",
"
1338.0
\n",
"
AllPub
\n",
"
0.0
\n",
"
2001.0
\n",
"
2001.0
\n",
"
2010.0
\n",
"
213500
\n",
"
\n",
"
\n",
"
8
\n",
"
527145080
\n",
"
1280.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
2
\n",
"
TwnhsE
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
Gd
\n",
"
1017.0
\n",
"
263.0
\n",
"
0.0
\n",
"
ALQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
Gd
\n",
"
HdBoard
\n",
"
HdBoard
\n",
"
NA
\n",
"
NA
\n",
"
0.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
506.0
\n",
"
2.0
\n",
"
TA
\n",
"
RFn
\n",
"
TA
\n",
"
Attchd
\n",
"
1992.0
\n",
"
1280.0
\n",
"
0.0
\n",
"
GasA
\n",
"
Ex
\n",
"
1Story
\n",
"
1
\n",
"
Gd
\n",
"
HLS
\n",
"
Gtl
\n",
"
5005.0
\n",
"
Inside
\n",
"
43.0
\n",
"
IR1
\n",
"
0.0
\n",
"
120
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
1.0
\n",
"
StoneBr
\n",
"
82.0
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
144.0
\n",
"
Pave
\n",
"
5
\n",
"
1280.0
\n",
"
AllPub
\n",
"
0.0
\n",
"
1992.0
\n",
"
1992.0
\n",
"
2010.0
\n",
"
191500
\n",
"
\n",
"
\n",
"
9
\n",
"
527146030
\n",
"
1616.0
\n",
"
0.0
\n",
"
0
\n",
"
NA
\n",
"
2
\n",
"
TwnhsE
\n",
"
TA
\n",
"
No
\n",
"
1.0
\n",
"
0.0
\n",
"
Gd
\n",
"
415.0
\n",
"
1180.0
\n",
"
0.0
\n",
"
GLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
Gd
\n",
"
CemntBd
\n",
"
CmentBd
\n",
"
NA
\n",
"
TA
\n",
"
1.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
608.0
\n",
"
2.0
\n",
"
TA
\n",
"
RFn
\n",
"
TA
\n",
"
Attchd
\n",
"
1995.0
\n",
"
1616.0
\n",
"
0.0
\n",
"
GasA
\n",
"
Ex
\n",
"
1Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
5389.0
\n",
"
Inside
\n",
"
39.0
\n",
"
IR1
\n",
"
0.0
\n",
"
120
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
3.0
\n",
"
StoneBr
\n",
"
152.0
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
5
\n",
"
1595.0
\n",
"
AllPub
\n",
"
237.0
\n",
"
1995.0
\n",
"
1996.0
\n",
"
2010.0
\n",
"
236500
\n",
"
\n",
"
\n",
"
10
\n",
"
527162130
\n",
"
1028.0
\n",
"
776.0
\n",
"
0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0.0
\n",
"
0.0
\n",
"
TA
\n",
"
994.0
\n",
"
0.0
\n",
"
0.0
\n",
"
Unf
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
NA
\n",
"
TA
\n",
"
1.0
\n",
"
PConc
\n",
"
2.0
\n",
"
Typ
\n",
"
442.0
\n",
"
2.0
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1999.0
\n",
"
1804.0
\n",
"
1.0
\n",
"
GasA
\n",
"
Gd
\n",
"
2Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
7500.0
\n",
"
Inside
\n",
"
60.0
\n",
"
Reg
\n",
"
0.0
\n",
"
060
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
6.0
\n",
"
Gilbert
\n",
"
60.0
\n",
"
5
\n",
"
7
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
7
\n",
"
994.0
\n",
"
AllPub
\n",
"
140.0
\n",
"
1999.0
\n",
"
1999.0
\n",
"
2010.0
\n",
"
189000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 1st Flr SF 2nd Flr SF 3Ssn Porch Alley Bedroom AbvGr \\\n",
"Order PID \n",
"1 526301100 1656.0 0.0 0 NA 3 \n",
"2 526350040 896.0 0.0 0 NA 2 \n",
"3 526351010 1329.0 0.0 0 NA 3 \n",
"4 526353030 2110.0 0.0 0 NA 3 \n",
"5 527105010 928.0 701.0 0 NA 3 \n",
"6 527105030 926.0 678.0 0 NA 3 \n",
"7 527127150 1338.0 0.0 0 NA 2 \n",
"8 527145080 1280.0 0.0 0 NA 2 \n",
"9 527146030 1616.0 0.0 0 NA 2 \n",
"10 527162130 1028.0 776.0 0 NA 3 \n",
"\n",
" Bldg Type Bsmt Cond Bsmt Exposure Bsmt Full Bath \\\n",
"Order PID \n",
"1 526301100 1Fam Gd Gd 1.0 \n",
"2 526350040 1Fam TA No 0.0 \n",
"3 526351010 1Fam TA No 0.0 \n",
"4 526353030 1Fam TA No 1.0 \n",
"5 527105010 1Fam TA No 0.0 \n",
"6 527105030 1Fam TA No 0.0 \n",
"7 527127150 TwnhsE TA Mn 1.0 \n",
"8 527145080 TwnhsE TA No 0.0 \n",
"9 527146030 TwnhsE TA No 1.0 \n",
"10 527162130 1Fam TA No 0.0 \n",
"\n",
" Bsmt Half Bath Bsmt Qual Bsmt Unf SF BsmtFin SF 1 \\\n",
"Order PID \n",
"1 526301100 0.0 TA 441.0 639.0 \n",
"2 526350040 0.0 TA 270.0 468.0 \n",
"3 526351010 0.0 TA 406.0 923.0 \n",
"4 526353030 0.0 TA 1045.0 1065.0 \n",
"5 527105010 0.0 Gd 137.0 791.0 \n",
"6 527105030 0.0 TA 324.0 602.0 \n",
"7 527127150 0.0 Gd 722.0 616.0 \n",
"8 527145080 0.0 Gd 1017.0 263.0 \n",
"9 527146030 0.0 Gd 415.0 1180.0 \n",
"10 527162130 0.0 TA 994.0 0.0 \n",
"\n",
" BsmtFin SF 2 BsmtFin Type 1 BsmtFin Type 2 Central Air \\\n",
"Order PID \n",
"1 526301100 0.0 BLQ Unf Y \n",
"2 526350040 144.0 Rec LwQ Y \n",
"3 526351010 0.0 ALQ Unf Y \n",
"4 526353030 0.0 ALQ Unf Y \n",
"5 527105010 0.0 GLQ Unf Y \n",
"6 527105030 0.0 GLQ Unf Y \n",
"7 527127150 0.0 GLQ Unf Y \n",
"8 527145080 0.0 ALQ Unf Y \n",
"9 527146030 0.0 GLQ Unf Y \n",
"10 527162130 0.0 Unf Unf Y \n",
"\n",
" Condition 1 Condition 2 Electrical Enclosed Porch Exter Cond \\\n",
"Order PID \n",
"1 526301100 Norm Norm SBrkr 0.0 TA \n",
"2 526350040 Feedr Norm SBrkr 0.0 TA \n",
"3 526351010 Norm Norm SBrkr 0.0 TA \n",
"4 526353030 Norm Norm SBrkr 0.0 TA \n",
"5 527105010 Norm Norm SBrkr 0.0 TA \n",
"6 527105030 Norm Norm SBrkr 0.0 TA \n",
"7 527127150 Norm Norm SBrkr 170.0 TA \n",
"8 527145080 Norm Norm SBrkr 0.0 TA \n",
"9 527146030 Norm Norm SBrkr 0.0 TA \n",
"10 527162130 Norm Norm SBrkr 0.0 TA \n",
"\n",
" Exter Qual Exterior 1st Exterior 2nd Fence Fireplace Qu \\\n",
"Order PID \n",
"1 526301100 TA BrkFace Plywood NA Gd \n",
"2 526350040 TA VinylSd VinylSd MnPrv NA \n",
"3 526351010 TA Wd Sdng Wd Sdng NA NA \n",
"4 526353030 Gd BrkFace BrkFace NA TA \n",
"5 527105010 TA VinylSd VinylSd MnPrv TA \n",
"6 527105030 TA VinylSd VinylSd NA Gd \n",
"7 527127150 Gd CemntBd CmentBd NA NA \n",
"8 527145080 Gd HdBoard HdBoard NA NA \n",
"9 527146030 Gd CemntBd CmentBd NA TA \n",
"10 527162130 TA VinylSd VinylSd NA TA \n",
"\n",
" Fireplaces Foundation Full Bath Functional Garage Area \\\n",
"Order PID \n",
"1 526301100 2.0 CBlock 1.0 Typ 528.0 \n",
"2 526350040 0.0 CBlock 1.0 Typ 730.0 \n",
"3 526351010 0.0 CBlock 1.0 Typ 312.0 \n",
"4 526353030 2.0 CBlock 2.0 Typ 522.0 \n",
"5 527105010 1.0 PConc 2.0 Typ 482.0 \n",
"6 527105030 1.0 PConc 2.0 Typ 470.0 \n",
"7 527127150 0.0 PConc 2.0 Typ 582.0 \n",
"8 527145080 0.0 PConc 2.0 Typ 506.0 \n",
"9 527146030 1.0 PConc 2.0 Typ 608.0 \n",
"10 527162130 1.0 PConc 2.0 Typ 442.0 \n",
"\n",
" Garage Cars Garage Cond Garage Finish Garage Qual \\\n",
"Order PID \n",
"1 526301100 2.0 TA Fin TA \n",
"2 526350040 1.0 TA Unf TA \n",
"3 526351010 1.0 TA Unf TA \n",
"4 526353030 2.0 TA Fin TA \n",
"5 527105010 2.0 TA Fin TA \n",
"6 527105030 2.0 TA Fin TA \n",
"7 527127150 2.0 TA Fin TA \n",
"8 527145080 2.0 TA RFn TA \n",
"9 527146030 2.0 TA RFn TA \n",
"10 527162130 2.0 TA Fin TA \n",
"\n",
" Garage Type Garage Yr Blt Gr Liv Area Half Bath Heating \\\n",
"Order PID \n",
"1 526301100 Attchd 1960.0 1656.0 0.0 GasA \n",
"2 526350040 Attchd 1961.0 896.0 0.0 GasA \n",
"3 526351010 Attchd 1958.0 1329.0 1.0 GasA \n",
"4 526353030 Attchd 1968.0 2110.0 1.0 GasA \n",
"5 527105010 Attchd 1997.0 1629.0 1.0 GasA \n",
"6 527105030 Attchd 1998.0 1604.0 1.0 GasA \n",
"7 527127150 Attchd 2001.0 1338.0 0.0 GasA \n",
"8 527145080 Attchd 1992.0 1280.0 0.0 GasA \n",
"9 527146030 Attchd 1995.0 1616.0 0.0 GasA \n",
"10 527162130 Attchd 1999.0 1804.0 1.0 GasA \n",
"\n",
" Heating QC House Style Kitchen AbvGr Kitchen Qual \\\n",
"Order PID \n",
"1 526301100 Fa 1Story 1 TA \n",
"2 526350040 TA 1Story 1 TA \n",
"3 526351010 TA 1Story 1 Gd \n",
"4 526353030 Ex 1Story 1 Ex \n",
"5 527105010 Gd 2Story 1 TA \n",
"6 527105030 Ex 2Story 1 Gd \n",
"7 527127150 Ex 1Story 1 Gd \n",
"8 527145080 Ex 1Story 1 Gd \n",
"9 527146030 Ex 1Story 1 Gd \n",
"10 527162130 Gd 2Story 1 Gd \n",
"\n",
" Land Contour Land Slope Lot Area Lot Config Lot Frontage \\\n",
"Order PID \n",
"1 526301100 Lvl Gtl 31770.0 Corner 141.0 \n",
"2 526350040 Lvl Gtl 11622.0 Inside 80.0 \n",
"3 526351010 Lvl Gtl 14267.0 Corner 81.0 \n",
"4 526353030 Lvl Gtl 11160.0 Corner 93.0 \n",
"5 527105010 Lvl Gtl 13830.0 Inside 74.0 \n",
"6 527105030 Lvl Gtl 9978.0 Inside 78.0 \n",
"7 527127150 Lvl Gtl 4920.0 Inside 41.0 \n",
"8 527145080 HLS Gtl 5005.0 Inside 43.0 \n",
"9 527146030 Lvl Gtl 5389.0 Inside 39.0 \n",
"10 527162130 Lvl Gtl 7500.0 Inside 60.0 \n",
"\n",
" Lot Shape Low Qual Fin SF MS SubClass MS Zoning \\\n",
"Order PID \n",
"1 526301100 IR1 0.0 020 RL \n",
"2 526350040 Reg 0.0 020 RH \n",
"3 526351010 IR1 0.0 020 RL \n",
"4 526353030 Reg 0.0 020 RL \n",
"5 527105010 IR1 0.0 060 RL \n",
"6 527105030 IR1 0.0 060 RL \n",
"7 527127150 Reg 0.0 120 RL \n",
"8 527145080 IR1 0.0 120 RL \n",
"9 527146030 IR1 0.0 120 RL \n",
"10 527162130 Reg 0.0 060 RL \n",
"\n",
" Mas Vnr Area Mas Vnr Type Misc Feature Misc Val Mo Sold \\\n",
"Order PID \n",
"1 526301100 112.0 Stone NA 0.0 5.0 \n",
"2 526350040 0.0 None NA 0.0 6.0 \n",
"3 526351010 108.0 BrkFace Gar2 12500.0 6.0 \n",
"4 526353030 0.0 None NA 0.0 4.0 \n",
"5 527105010 0.0 None NA 0.0 3.0 \n",
"6 527105030 20.0 BrkFace NA 0.0 6.0 \n",
"7 527127150 0.0 None NA 0.0 4.0 \n",
"8 527145080 0.0 None NA 0.0 1.0 \n",
"9 527146030 0.0 None NA 0.0 3.0 \n",
"10 527162130 0.0 None NA 0.0 6.0 \n",
"\n",
" Neighborhood Open Porch SF Overall Cond Overall Qual \\\n",
"Order PID \n",
"1 526301100 NAmes 62.0 5 6 \n",
"2 526350040 NAmes 0.0 6 5 \n",
"3 526351010 NAmes 36.0 6 6 \n",
"4 526353030 NAmes 0.0 5 7 \n",
"5 527105010 Gilbert 34.0 5 5 \n",
"6 527105030 Gilbert 36.0 6 6 \n",
"7 527127150 StoneBr 0.0 5 8 \n",
"8 527145080 StoneBr 82.0 5 8 \n",
"9 527146030 StoneBr 152.0 5 8 \n",
"10 527162130 Gilbert 60.0 5 7 \n",
"\n",
" Paved Drive Pool Area Pool QC Roof Matl Roof Style \\\n",
"Order PID \n",
"1 526301100 P 0.0 NA CompShg Hip \n",
"2 526350040 Y 0.0 NA CompShg Gable \n",
"3 526351010 Y 0.0 NA CompShg Hip \n",
"4 526353030 Y 0.0 NA CompShg Hip \n",
"5 527105010 Y 0.0 NA CompShg Gable \n",
"6 527105030 Y 0.0 NA CompShg Gable \n",
"7 527127150 Y 0.0 NA CompShg Gable \n",
"8 527145080 Y 0.0 NA CompShg Gable \n",
"9 527146030 Y 0.0 NA CompShg Gable \n",
"10 527162130 Y 0.0 NA CompShg Gable \n",
"\n",
" Sale Condition Sale Type Screen Porch Street TotRms AbvGrd \\\n",
"Order PID \n",
"1 526301100 Normal WD 0.0 Pave 7 \n",
"2 526350040 Normal WD 120.0 Pave 5 \n",
"3 526351010 Normal WD 0.0 Pave 6 \n",
"4 526353030 Normal WD 0.0 Pave 8 \n",
"5 527105010 Normal WD 0.0 Pave 6 \n",
"6 527105030 Normal WD 0.0 Pave 7 \n",
"7 527127150 Normal WD 0.0 Pave 6 \n",
"8 527145080 Normal WD 144.0 Pave 5 \n",
"9 527146030 Normal WD 0.0 Pave 5 \n",
"10 527162130 Normal WD 0.0 Pave 7 \n",
"\n",
" Total Bsmt SF Utilities Wood Deck SF Year Built \\\n",
"Order PID \n",
"1 526301100 1080.0 AllPub 210.0 1960.0 \n",
"2 526350040 882.0 AllPub 140.0 1961.0 \n",
"3 526351010 1329.0 AllPub 393.0 1958.0 \n",
"4 526353030 2110.0 AllPub 0.0 1968.0 \n",
"5 527105010 928.0 AllPub 212.0 1997.0 \n",
"6 527105030 926.0 AllPub 360.0 1998.0 \n",
"7 527127150 1338.0 AllPub 0.0 2001.0 \n",
"8 527145080 1280.0 AllPub 0.0 1992.0 \n",
"9 527146030 1595.0 AllPub 237.0 1995.0 \n",
"10 527162130 994.0 AllPub 140.0 1999.0 \n",
"\n",
" Year Remod/Add Yr Sold SalePrice \n",
"Order PID \n",
"1 526301100 1960.0 2010.0 215000 \n",
"2 526350040 1961.0 2010.0 105000 \n",
"3 526351010 1958.0 2010.0 172000 \n",
"4 526353030 1968.0 2010.0 244000 \n",
"5 527105010 1998.0 2010.0 189900 \n",
"6 527105030 1998.0 2010.0 195500 \n",
"7 527127150 2001.0 2010.0 213500 \n",
"8 527145080 1992.0 2010.0 191500 \n",
"9 527146030 1996.0 2010.0 236500 \n",
"10 527162130 1999.0 2010.0 189000 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Spelling Mistakes & Data Types"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some textual values appear differently in the provided data file as compared to the specification. These inconsistencies are manually repaired."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Repair spelling and whitespace mistakes.\n",
"df[\"Bldg Type\"] = df[\"Bldg Type\"].replace(to_replace=\"2fmCon\", value=\"2FmCon\")\n",
"df[\"Bldg Type\"] = df[\"Bldg Type\"].replace(to_replace=\"Duplex\", value=\"Duplx\")\n",
"df[\"Bldg Type\"] = df[\"Bldg Type\"].replace(to_replace=\"Twnhs\", value=\"TwnhsI\")\n",
"df[\"Exterior 2nd\"] = df[\"Exterior 2nd\"].replace(to_replace=\"Brk Cmn\", value=\"BrkComm\")\n",
"df[\"Exterior 2nd\"] = df[\"Exterior 2nd\"].replace(to_replace=\"CmentBd\", value=\"CemntBd\")\n",
"df[\"Exterior 2nd\"] = df[\"Exterior 2nd\"].replace(to_replace=\"Wd Shng\", value=\"WdShing\")\n",
"df[\"MS Zoning\"] = df[\"MS Zoning\"].replace(to_replace=\"A (agr)\", value=\"A\")\n",
"df[\"MS Zoning\"] = df[\"MS Zoning\"].replace(to_replace=\"C (all)\", value=\"C\")\n",
"df[\"MS Zoning\"] = df[\"MS Zoning\"].replace(to_replace=\"I (all)\", value=\"I\")\n",
"df[\"Neighborhood\"] = df[\"Neighborhood\"].replace(to_replace=\"NAmes\", value=\"Names\")\n",
"df[\"Sale Type\"] = df[\"Sale Type\"].replace(to_replace=\"WD \", value=\"WD\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Ensure that the remaining textual values in the data file are a subset\n",
"# of the values allowed in the specification.\n",
"for column, mapping_info in LABEL_COLUMNS.items():\n",
" # Note that .unique() returns a numpy array with integer dtype in cases\n",
" # where the provided data can be casted as such (e.g., \"Overall Qual\" column).\n",
" values_in_data = set(str(x) for x in df[column].unique() if x is not np.nan)\n",
" values_in_description = set(mapping_info[\"lookups\"].keys())\n",
" assert values_in_data <= values_in_description"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Interestingly, all numeric columns (i.e. also \"continuous\" variables) come with only integer values."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Show that all \"continuous\" variables come as integers.\n",
"for column in NUMERIC_VARIABLES + TARGET_VARIABLES:\n",
" not_null = df[column].notnull()\n",
" mask = (\n",
" df.loc[not_null, column].astype(np.int64)\n",
" != df.loc[not_null, column].astype(np.float64)\n",
" )\n",
" assert not mask.any()\n",
"# Cast discrete fields as integers where possible,\n",
"# i.e., all columns without missing values.\n",
"for column in DISCRETE_VARIABLES:\n",
" try:\n",
" df[column] = df[column].astype(np.int64)\n",
" except ValueError:\n",
" mask = df[column].notnull()\n",
" df.loc[mask, column].astype(np.int64)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Raw Data Overview"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The overall shape of the data is a 2930 rows x 80 columns matrix."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2930, 80)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Continuous Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The continuous columns are truly continuous in the sense that each column has at least 14 unique value realizations."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"for column in CONTINUOUS_VARIABLES:\n",
" mask = df[column].notnull()\n",
" num_realizations = len(list(x for x in df.loc[mask, column].unique()))\n",
" assert num_realizations > 13"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A brief description of the variables:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1st Flr SF First Floor square feet\n",
"2nd Flr SF Second floor square feet\n",
"3Ssn Porch Three season porch area in square feet\n",
"Bsmt Unf SF Unfinished square feet of basement area\n",
"BsmtFin SF 1 Type 1 finished square feet\n",
"BsmtFin SF 2 Type 2 finished square feet\n",
"Enclosed Porch Enclosed porch area in square feet\n",
"Garage Area Size of garage in square feet\n",
"Gr Liv Area Above grade (ground) living area square feet\n",
"Lot Area Lot size in square feet\n",
"Lot Frontage Linear feet of street connected to property\n",
"Low Qual Fin SF Low quality finished square feet (all floors)\n",
"Mas Vnr Area Masonry veneer area in square feet\n",
"Misc Val $Value of miscellaneous feature\n",
"Open Porch SF Open porch area in square feet\n",
"Pool Area Pool area in square feet\n",
"Screen Porch Screen porch area in square feet\n",
"Total Bsmt SF Total square feet of basement area\n",
"Wood Deck SF Wood deck area in square feet\n"
]
}
],
"source": [
"print_column_list(CONTINUOUS_COLUMNS)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
1st Flr SF
\n",
"
2nd Flr SF
\n",
"
3Ssn Porch
\n",
"
Bsmt Unf SF
\n",
"
BsmtFin SF 1
\n",
"
BsmtFin SF 2
\n",
"
Enclosed Porch
\n",
"
Garage Area
\n",
"
Gr Liv Area
\n",
"
Lot Area
\n",
"
Lot Frontage
\n",
"
Low Qual Fin SF
\n",
"
Mas Vnr Area
\n",
"
Misc Val
\n",
"
Open Porch SF
\n",
"
Pool Area
\n",
"
Screen Porch
\n",
"
Total Bsmt SF
\n",
"
Wood Deck SF
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
526301100
\n",
"
1656.0
\n",
"
0.0
\n",
"
0
\n",
"
441.0
\n",
"
639.0
\n",
"
0.0
\n",
"
0.0
\n",
"
528.0
\n",
"
1656.0
\n",
"
31770.0
\n",
"
141.0
\n",
"
0.0
\n",
"
112.0
\n",
"
0.0
\n",
"
62.0
\n",
"
0.0
\n",
"
0.0
\n",
"
1080.0
\n",
"
210.0
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
896.0
\n",
"
0.0
\n",
"
0
\n",
"
270.0
\n",
"
468.0
\n",
"
144.0
\n",
"
0.0
\n",
"
730.0
\n",
"
896.0
\n",
"
11622.0
\n",
"
80.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
120.0
\n",
"
882.0
\n",
"
140.0
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
1329.0
\n",
"
0.0
\n",
"
0
\n",
"
406.0
\n",
"
923.0
\n",
"
0.0
\n",
"
0.0
\n",
"
312.0
\n",
"
1329.0
\n",
"
14267.0
\n",
"
81.0
\n",
"
0.0
\n",
"
108.0
\n",
"
12500.0
\n",
"
36.0
\n",
"
0.0
\n",
"
0.0
\n",
"
1329.0
\n",
"
393.0
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
2110.0
\n",
"
0.0
\n",
"
0
\n",
"
1045.0
\n",
"
1065.0
\n",
"
0.0
\n",
"
0.0
\n",
"
522.0
\n",
"
2110.0
\n",
"
11160.0
\n",
"
93.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
2110.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
928.0
\n",
"
701.0
\n",
"
0
\n",
"
137.0
\n",
"
791.0
\n",
"
0.0
\n",
"
0.0
\n",
"
482.0
\n",
"
1629.0
\n",
"
13830.0
\n",
"
74.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
34.0
\n",
"
0.0
\n",
"
0.0
\n",
"
928.0
\n",
"
212.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 1st Flr SF 2nd Flr SF 3Ssn Porch Bsmt Unf SF \\\n",
"Order PID \n",
"1 526301100 1656.0 0.0 0 441.0 \n",
"2 526350040 896.0 0.0 0 270.0 \n",
"3 526351010 1329.0 0.0 0 406.0 \n",
"4 526353030 2110.0 0.0 0 1045.0 \n",
"5 527105010 928.0 701.0 0 137.0 \n",
"\n",
" BsmtFin SF 1 BsmtFin SF 2 Enclosed Porch Garage Area \\\n",
"Order PID \n",
"1 526301100 639.0 0.0 0.0 528.0 \n",
"2 526350040 468.0 144.0 0.0 730.0 \n",
"3 526351010 923.0 0.0 0.0 312.0 \n",
"4 526353030 1065.0 0.0 0.0 522.0 \n",
"5 527105010 791.0 0.0 0.0 482.0 \n",
"\n",
" Gr Liv Area Lot Area Lot Frontage Low Qual Fin SF \\\n",
"Order PID \n",
"1 526301100 1656.0 31770.0 141.0 0.0 \n",
"2 526350040 896.0 11622.0 80.0 0.0 \n",
"3 526351010 1329.0 14267.0 81.0 0.0 \n",
"4 526353030 2110.0 11160.0 93.0 0.0 \n",
"5 527105010 1629.0 13830.0 74.0 0.0 \n",
"\n",
" Mas Vnr Area Misc Val Open Porch SF Pool Area \\\n",
"Order PID \n",
"1 526301100 112.0 0.0 62.0 0.0 \n",
"2 526350040 0.0 0.0 0.0 0.0 \n",
"3 526351010 108.0 12500.0 36.0 0.0 \n",
"4 526353030 0.0 0.0 0.0 0.0 \n",
"5 527105010 0.0 0.0 34.0 0.0 \n",
"\n",
" Screen Porch Total Bsmt SF Wood Deck SF \n",
"Order PID \n",
"1 526301100 0.0 1080.0 210.0 \n",
"2 526350040 120.0 882.0 140.0 \n",
"3 526351010 0.0 1329.0 393.0 \n",
"4 526353030 0.0 2110.0 0.0 \n",
"5 527105010 0.0 928.0 212.0 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[CONTINUOUS_VARIABLES].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Except for the column *Lot Frontage* the columns with missing data only have a couple of missing values (i.e., < 1% of all the rows)."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"MultiIndex: 2930 entries, (np.int64(1), np.int64(526301100)) to (np.int64(2930), np.int64(924151050))\n",
"Data columns (total 19 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 1st Flr SF 2930 non-null float64\n",
" 1 2nd Flr SF 2930 non-null float64\n",
" 2 3Ssn Porch 2930 non-null int64 \n",
" 3 Bsmt Unf SF 2929 non-null float64\n",
" 4 BsmtFin SF 1 2929 non-null float64\n",
" 5 BsmtFin SF 2 2929 non-null float64\n",
" 6 Enclosed Porch 2930 non-null float64\n",
" 7 Garage Area 2929 non-null float64\n",
" 8 Gr Liv Area 2930 non-null float64\n",
" 9 Lot Area 2930 non-null float64\n",
" 10 Lot Frontage 2440 non-null float64\n",
" 11 Low Qual Fin SF 2930 non-null float64\n",
" 12 Mas Vnr Area 2907 non-null float64\n",
" 13 Misc Val 2930 non-null float64\n",
" 14 Open Porch SF 2930 non-null float64\n",
" 15 Pool Area 2930 non-null float64\n",
" 16 Screen Porch 2930 non-null float64\n",
" 17 Total Bsmt SF 2929 non-null float64\n",
" 18 Wood Deck SF 2930 non-null float64\n",
"dtypes: float64(18), int64(1)\n",
"memory usage: 621.3 KB\n"
]
}
],
"source": [
"df[CONTINUOUS_VARIABLES].info()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# The columns with a lot of missing\n",
"# values will be treated seperately below.\n",
"missing_a_lot = [\"Lot Frontage\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Discrete Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The discrete columns have between 2 and 15 unique realizations each if year numbers are excluded from the analysis."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"for column in DISCRETE_VARIABLES:\n",
" mask = df[column].notnull()\n",
" num_realizations = len(list(x for x in df.loc[mask, column].unique()))\n",
" if column not in (\"Year Built\", \"Year Remod/Add\", \"Garage Yr Blt\"):\n",
" assert num_realizations < 15\n",
" assert num_realizations > 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A brief description of the variables:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bedroom AbvGr Bedrooms above grade (does NOT include basement bedrooms)\n",
"Bsmt Full Bath Basement full bathrooms\n",
"Bsmt Half Bath Basement half bathrooms\n",
"Fireplaces Number of fireplaces\n",
"Full Bath Full bathrooms above grade\n",
"Garage Cars Size of garage in car capacity\n",
"Garage Yr Blt Year garage was built\n",
"Half Bath Half baths above grade\n",
"Kitchen AbvGr Kitchens above grade\n",
"Mo Sold Month Sold (MM)\n",
"TotRms AbvGrd Total rooms above grade (does not include bathrooms)\n",
"Year Built Original construction date\n",
"Year Remod/Add Remodel date (same as construction date if no remodeling or additions)\n",
"Yr Sold Year Sold (YYYY)\n"
]
}
],
"source": [
"print_column_list(DISCRETE_COLUMNS)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Note:** columns with missing values are implicitly casted to a *float64* type an the *int64* type has no concept of a NaN (=\"Not a number\") value."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
Bedroom AbvGr
\n",
"
Bsmt Full Bath
\n",
"
Bsmt Half Bath
\n",
"
Fireplaces
\n",
"
Full Bath
\n",
"
Garage Cars
\n",
"
Garage Yr Blt
\n",
"
Half Bath
\n",
"
Kitchen AbvGr
\n",
"
Mo Sold
\n",
"
TotRms AbvGrd
\n",
"
Year Built
\n",
"
Year Remod/Add
\n",
"
Yr Sold
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
526301100
\n",
"
3
\n",
"
1.0
\n",
"
0.0
\n",
"
2
\n",
"
1
\n",
"
2.0
\n",
"
1960.0
\n",
"
0
\n",
"
1
\n",
"
5
\n",
"
7
\n",
"
1960
\n",
"
1960
\n",
"
2010
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
2
\n",
"
0.0
\n",
"
0.0
\n",
"
0
\n",
"
1
\n",
"
1.0
\n",
"
1961.0
\n",
"
0
\n",
"
1
\n",
"
6
\n",
"
5
\n",
"
1961
\n",
"
1961
\n",
"
2010
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
3
\n",
"
0.0
\n",
"
0.0
\n",
"
0
\n",
"
1
\n",
"
1.0
\n",
"
1958.0
\n",
"
1
\n",
"
1
\n",
"
6
\n",
"
6
\n",
"
1958
\n",
"
1958
\n",
"
2010
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
3
\n",
"
1.0
\n",
"
0.0
\n",
"
2
\n",
"
2
\n",
"
2.0
\n",
"
1968.0
\n",
"
1
\n",
"
1
\n",
"
4
\n",
"
8
\n",
"
1968
\n",
"
1968
\n",
"
2010
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
3
\n",
"
0.0
\n",
"
0.0
\n",
"
1
\n",
"
2
\n",
"
2.0
\n",
"
1997.0
\n",
"
1
\n",
"
1
\n",
"
3
\n",
"
6
\n",
"
1997
\n",
"
1998
\n",
"
2010
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Bedroom AbvGr Bsmt Full Bath Bsmt Half Bath Fireplaces \\\n",
"Order PID \n",
"1 526301100 3 1.0 0.0 2 \n",
"2 526350040 2 0.0 0.0 0 \n",
"3 526351010 3 0.0 0.0 0 \n",
"4 526353030 3 1.0 0.0 2 \n",
"5 527105010 3 0.0 0.0 1 \n",
"\n",
" Full Bath Garage Cars Garage Yr Blt Half Bath \\\n",
"Order PID \n",
"1 526301100 1 2.0 1960.0 0 \n",
"2 526350040 1 1.0 1961.0 0 \n",
"3 526351010 1 1.0 1958.0 1 \n",
"4 526353030 2 2.0 1968.0 1 \n",
"5 527105010 2 2.0 1997.0 1 \n",
"\n",
" Kitchen AbvGr Mo Sold TotRms AbvGrd Year Built \\\n",
"Order PID \n",
"1 526301100 1 5 7 1960 \n",
"2 526350040 1 6 5 1961 \n",
"3 526351010 1 6 6 1958 \n",
"4 526353030 1 4 8 1968 \n",
"5 527105010 1 3 6 1997 \n",
"\n",
" Year Remod/Add Yr Sold \n",
"Order PID \n",
"1 526301100 1960 2010 \n",
"2 526350040 1961 2010 \n",
"3 526351010 1958 2010 \n",
"4 526353030 1968 2010 \n",
"5 527105010 1998 2010 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[DISCRETE_VARIABLES].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Except for the *Garage Yr Blt* column no variable has a significant number of missing values (i.e., > 1% of all rows)."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"MultiIndex: 2930 entries, (np.int64(1), np.int64(526301100)) to (np.int64(2930), np.int64(924151050))\n",
"Data columns (total 14 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Bedroom AbvGr 2930 non-null int64 \n",
" 1 Bsmt Full Bath 2928 non-null float64\n",
" 2 Bsmt Half Bath 2928 non-null float64\n",
" 3 Fireplaces 2930 non-null int64 \n",
" 4 Full Bath 2930 non-null int64 \n",
" 5 Garage Cars 2929 non-null float64\n",
" 6 Garage Yr Blt 2771 non-null float64\n",
" 7 Half Bath 2930 non-null int64 \n",
" 8 Kitchen AbvGr 2930 non-null int64 \n",
" 9 Mo Sold 2930 non-null int64 \n",
" 10 TotRms AbvGrd 2930 non-null int64 \n",
" 11 Year Built 2930 non-null int64 \n",
" 12 Year Remod/Add 2930 non-null int64 \n",
" 13 Yr Sold 2930 non-null int64 \n",
"dtypes: float64(4), int64(10)\n",
"memory usage: 506.9 KB\n"
]
}
],
"source": [
"df[DISCRETE_VARIABLES].info()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"missing_a_lot.append(\"Garage Yr Blt\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Nominal Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Except for the total of 28 neighborhoods, the nominal columns come with anywhere between 1 and 18 different labels each."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"for column in NOMINAL_VARIABLES:\n",
" mask = df[column].notnull()\n",
" num_realizations = len(list(x for x in df.loc[mask, column].unique()))\n",
" if column not in (\"Neighborhood\"):\n",
" assert num_realizations < 18\n",
" assert num_realizations > 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A brief description of the variables:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Alley Type of alley access to property\n",
"Bldg Type Type of dwelling\n",
"Central Air Central air conditioning\n",
"Condition 1 Proximity to various conditions\n",
"Condition 2 Proximity to various conditions (if more than one is present)\n",
"Exterior 1st Exterior covering on house\n",
"Exterior 2nd Exterior covering on house (if more than one material)\n",
"Foundation Type of foundation\n",
"Garage Type Garage location\n",
"Heating Type of heating\n",
"House Style Style of dwelling\n",
"Land Contour Flatness of the property\n",
"Lot Config Lot configuration\n",
"MS SubClass Identifies the type of dwelling involved in the sale.\n",
"MS Zoning Identifies the general zoning classification of the sale.\n",
"Mas Vnr Type Masonry veneer type\n",
"Misc Feature Miscellaneous feature not covered in other categories\n",
"Neighborhood Physical locations within Ames city limits (map available)\n",
"Roof Matl Roof material\n",
"Roof Style Type of roof\n",
"Sale Condition Condition of sale\n",
"Sale Type Type of sale\n",
"Street Type of road access to property\n"
]
}
],
"source": [
"print_column_list(NOMINAL_COLUMNS)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
Alley
\n",
"
Bldg Type
\n",
"
Central Air
\n",
"
Condition 1
\n",
"
Condition 2
\n",
"
Exterior 1st
\n",
"
Exterior 2nd
\n",
"
Foundation
\n",
"
Garage Type
\n",
"
Heating
\n",
"
House Style
\n",
"
Land Contour
\n",
"
Lot Config
\n",
"
MS SubClass
\n",
"
MS Zoning
\n",
"
Mas Vnr Type
\n",
"
Misc Feature
\n",
"
Neighborhood
\n",
"
Roof Matl
\n",
"
Roof Style
\n",
"
Sale Condition
\n",
"
Sale Type
\n",
"
Street
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\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",
"
1
\n",
"
526301100
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
BrkFace
\n",
"
Plywood
\n",
"
CBlock
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Corner
\n",
"
020
\n",
"
RL
\n",
"
Stone
\n",
"
NA
\n",
"
Names
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Feedr
\n",
"
Norm
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
CBlock
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
020
\n",
"
RH
\n",
"
None
\n",
"
NA
\n",
"
Names
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
Wd Sdng
\n",
"
Wd Sdng
\n",
"
CBlock
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Corner
\n",
"
020
\n",
"
RL
\n",
"
BrkFace
\n",
"
Gar2
\n",
"
Names
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
BrkFace
\n",
"
BrkFace
\n",
"
CBlock
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Corner
\n",
"
020
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
Names
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
2Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
060
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
Gilbert
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
6
\n",
"
527105030
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
2Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
060
\n",
"
RL
\n",
"
BrkFace
\n",
"
NA
\n",
"
Gilbert
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
7
\n",
"
527127150
\n",
"
NA
\n",
"
TwnhsE
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
CemntBd
\n",
"
CemntBd
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
120
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
StoneBr
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
8
\n",
"
527145080
\n",
"
NA
\n",
"
TwnhsE
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
HdBoard
\n",
"
HdBoard
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
HLS
\n",
"
Inside
\n",
"
120
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
StoneBr
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
9
\n",
"
527146030
\n",
"
NA
\n",
"
TwnhsE
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
CemntBd
\n",
"
CemntBd
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
1Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
120
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
StoneBr
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
"
\n",
"
10
\n",
"
527162130
\n",
"
NA
\n",
"
1Fam
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
PConc
\n",
"
Attchd
\n",
"
GasA
\n",
"
2Story
\n",
"
Lvl
\n",
"
Inside
\n",
"
060
\n",
"
RL
\n",
"
None
\n",
"
NA
\n",
"
Gilbert
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
Pave
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Alley Bldg Type Central Air Condition 1 Condition 2 \\\n",
"Order PID \n",
"1 526301100 NA 1Fam Y Norm Norm \n",
"2 526350040 NA 1Fam Y Feedr Norm \n",
"3 526351010 NA 1Fam Y Norm Norm \n",
"4 526353030 NA 1Fam Y Norm Norm \n",
"5 527105010 NA 1Fam Y Norm Norm \n",
"6 527105030 NA 1Fam Y Norm Norm \n",
"7 527127150 NA TwnhsE Y Norm Norm \n",
"8 527145080 NA TwnhsE Y Norm Norm \n",
"9 527146030 NA TwnhsE Y Norm Norm \n",
"10 527162130 NA 1Fam Y Norm Norm \n",
"\n",
" Exterior 1st Exterior 2nd Foundation Garage Type Heating \\\n",
"Order PID \n",
"1 526301100 BrkFace Plywood CBlock Attchd GasA \n",
"2 526350040 VinylSd VinylSd CBlock Attchd GasA \n",
"3 526351010 Wd Sdng Wd Sdng CBlock Attchd GasA \n",
"4 526353030 BrkFace BrkFace CBlock Attchd GasA \n",
"5 527105010 VinylSd VinylSd PConc Attchd GasA \n",
"6 527105030 VinylSd VinylSd PConc Attchd GasA \n",
"7 527127150 CemntBd CemntBd PConc Attchd GasA \n",
"8 527145080 HdBoard HdBoard PConc Attchd GasA \n",
"9 527146030 CemntBd CemntBd PConc Attchd GasA \n",
"10 527162130 VinylSd VinylSd PConc Attchd GasA \n",
"\n",
" House Style Land Contour Lot Config MS SubClass MS Zoning \\\n",
"Order PID \n",
"1 526301100 1Story Lvl Corner 020 RL \n",
"2 526350040 1Story Lvl Inside 020 RH \n",
"3 526351010 1Story Lvl Corner 020 RL \n",
"4 526353030 1Story Lvl Corner 020 RL \n",
"5 527105010 2Story Lvl Inside 060 RL \n",
"6 527105030 2Story Lvl Inside 060 RL \n",
"7 527127150 1Story Lvl Inside 120 RL \n",
"8 527145080 1Story HLS Inside 120 RL \n",
"9 527146030 1Story Lvl Inside 120 RL \n",
"10 527162130 2Story Lvl Inside 060 RL \n",
"\n",
" Mas Vnr Type Misc Feature Neighborhood Roof Matl Roof Style \\\n",
"Order PID \n",
"1 526301100 Stone NA Names CompShg Hip \n",
"2 526350040 None NA Names CompShg Gable \n",
"3 526351010 BrkFace Gar2 Names CompShg Hip \n",
"4 526353030 None NA Names CompShg Hip \n",
"5 527105010 None NA Gilbert CompShg Gable \n",
"6 527105030 BrkFace NA Gilbert CompShg Gable \n",
"7 527127150 None NA StoneBr CompShg Gable \n",
"8 527145080 None NA StoneBr CompShg Gable \n",
"9 527146030 None NA StoneBr CompShg Gable \n",
"10 527162130 None NA Gilbert CompShg Gable \n",
"\n",
" Sale Condition Sale Type Street \n",
"Order PID \n",
"1 526301100 Normal WD Pave \n",
"2 526350040 Normal WD Pave \n",
"3 526351010 Normal WD Pave \n",
"4 526353030 Normal WD Pave \n",
"5 527105010 Normal WD Pave \n",
"6 527105030 Normal WD Pave \n",
"7 527127150 Normal WD Pave \n",
"8 527145080 Normal WD Pave \n",
"9 527146030 Normal WD Pave \n",
"10 527162130 Normal WD Pave "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[NOMINAL_VARIABLES].head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the nominal variables there is only a neglectable number of missing values."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"MultiIndex: 2930 entries, (np.int64(1), np.int64(526301100)) to (np.int64(2930), np.int64(924151050))\n",
"Data columns (total 23 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Alley 2930 non-null object\n",
" 1 Bldg Type 2930 non-null object\n",
" 2 Central Air 2930 non-null object\n",
" 3 Condition 1 2930 non-null object\n",
" 4 Condition 2 2930 non-null object\n",
" 5 Exterior 1st 2930 non-null object\n",
" 6 Exterior 2nd 2930 non-null object\n",
" 7 Foundation 2930 non-null object\n",
" 8 Garage Type 2930 non-null object\n",
" 9 Heating 2930 non-null object\n",
" 10 House Style 2930 non-null object\n",
" 11 Land Contour 2930 non-null object\n",
" 12 Lot Config 2930 non-null object\n",
" 13 MS SubClass 2930 non-null object\n",
" 14 MS Zoning 2930 non-null object\n",
" 15 Mas Vnr Type 2907 non-null object\n",
" 16 Misc Feature 2930 non-null object\n",
" 17 Neighborhood 2930 non-null object\n",
" 18 Roof Matl 2930 non-null object\n",
" 19 Roof Style 2930 non-null object\n",
" 20 Sale Condition 2930 non-null object\n",
" 21 Sale Type 2930 non-null object\n",
" 22 Street 2930 non-null object\n",
"dtypes: object(23)\n",
"memory usage: 712.9+ KB\n"
]
}
],
"source": [
"df[NOMINAL_VARIABLES].info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ordinal Variables"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The ordinal columns come with anywhere between 2 and 11 distinct labels each."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"for column in ORDINAL_VARIABLES:\n",
" mask = df[column].notnull()\n",
" num_realizations = len(list(x for x in df.loc[mask, column].unique()))\n",
" assert 2 < num_realizations < 11"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A brief description of the variables:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bsmt Cond Evaluates the general condition of the basement\n",
"Bsmt Exposure Refers to walkout or garden level walls\n",
"Bsmt Qual Evaluates the height of the basement\n",
"BsmtFin Type 1 Rating of basement finished area\n",
"BsmtFin Type 2 Rating of basement finished area (if multiple types)\n",
"Electrical Electrical system\n",
"Exter Cond Evaluates the present condition of the material on the exterior\n",
"Exter Qual Evaluates the quality of the material on the exterior\n",
"Fence Fence quality\n",
"Fireplace Qu Fireplace quality\n",
"Functional Home functionality (Assume typical unless deductions are warranted)\n",
"Garage Cond Garage condition\n",
"Garage Finish Interior finish of the garage\n",
"Garage Qual Garage quality\n",
"Heating QC Heating quality and condition\n",
"Kitchen Qual Kitchen quality\n",
"Land Slope Slope of property\n",
"Lot Shape General shape of property\n",
"Overall Cond Rates the overall condition of the house\n",
"Overall Qual Rates the overall material and finish of the house\n",
"Paved Drive Paved driveway\n",
"Pool QC Pool quality\n",
"Utilities Type of utilities available\n"
]
}
],
"source": [
"print_column_list(ORDINAL_COLUMNS)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
Bsmt Cond
\n",
"
Bsmt Exposure
\n",
"
Bsmt Qual
\n",
"
BsmtFin Type 1
\n",
"
BsmtFin Type 2
\n",
"
Electrical
\n",
"
Exter Cond
\n",
"
Exter Qual
\n",
"
Fence
\n",
"
Fireplace Qu
\n",
"
Functional
\n",
"
Garage Cond
\n",
"
Garage Finish
\n",
"
Garage Qual
\n",
"
Heating QC
\n",
"
Kitchen Qual
\n",
"
Land Slope
\n",
"
Lot Shape
\n",
"
Overall Cond
\n",
"
Overall Qual
\n",
"
Paved Drive
\n",
"
Pool QC
\n",
"
Utilities
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\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",
"
1
\n",
"
526301100
\n",
"
Gd
\n",
"
Gd
\n",
"
TA
\n",
"
BLQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
NA
\n",
"
Gd
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Fa
\n",
"
TA
\n",
"
Gtl
\n",
"
IR1
\n",
"
5
\n",
"
6
\n",
"
P
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
TA
\n",
"
No
\n",
"
TA
\n",
"
Rec
\n",
"
LwQ
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
MnPrv
\n",
"
NA
\n",
"
Typ
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
TA
\n",
"
TA
\n",
"
Gtl
\n",
"
Reg
\n",
"
6
\n",
"
5
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
TA
\n",
"
No
\n",
"
TA
\n",
"
ALQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
NA
\n",
"
NA
\n",
"
Typ
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
TA
\n",
"
Gd
\n",
"
Gtl
\n",
"
IR1
\n",
"
6
\n",
"
6
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
TA
\n",
"
No
\n",
"
TA
\n",
"
ALQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
Gd
\n",
"
NA
\n",
"
TA
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Ex
\n",
"
Ex
\n",
"
Gtl
\n",
"
Reg
\n",
"
5
\n",
"
7
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
TA
\n",
"
No
\n",
"
Gd
\n",
"
GLQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
MnPrv
\n",
"
TA
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Gd
\n",
"
TA
\n",
"
Gtl
\n",
"
IR1
\n",
"
5
\n",
"
5
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
6
\n",
"
527105030
\n",
"
TA
\n",
"
No
\n",
"
TA
\n",
"
GLQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
NA
\n",
"
Gd
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Ex
\n",
"
Gd
\n",
"
Gtl
\n",
"
IR1
\n",
"
6
\n",
"
6
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
7
\n",
"
527127150
\n",
"
TA
\n",
"
Mn
\n",
"
Gd
\n",
"
GLQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
Gd
\n",
"
NA
\n",
"
NA
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Ex
\n",
"
Gd
\n",
"
Gtl
\n",
"
Reg
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
8
\n",
"
527145080
\n",
"
TA
\n",
"
No
\n",
"
Gd
\n",
"
ALQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
Gd
\n",
"
NA
\n",
"
NA
\n",
"
Typ
\n",
"
TA
\n",
"
RFn
\n",
"
TA
\n",
"
Ex
\n",
"
Gd
\n",
"
Gtl
\n",
"
IR1
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
9
\n",
"
527146030
\n",
"
TA
\n",
"
No
\n",
"
Gd
\n",
"
GLQ
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
Gd
\n",
"
NA
\n",
"
TA
\n",
"
Typ
\n",
"
TA
\n",
"
RFn
\n",
"
TA
\n",
"
Ex
\n",
"
Gd
\n",
"
Gtl
\n",
"
IR1
\n",
"
5
\n",
"
8
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
"
\n",
"
10
\n",
"
527162130
\n",
"
TA
\n",
"
No
\n",
"
TA
\n",
"
Unf
\n",
"
Unf
\n",
"
SBrkr
\n",
"
TA
\n",
"
TA
\n",
"
NA
\n",
"
TA
\n",
"
Typ
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Gd
\n",
"
Gd
\n",
"
Gtl
\n",
"
Reg
\n",
"
5
\n",
"
7
\n",
"
Y
\n",
"
NA
\n",
"
AllPub
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Bsmt Cond Bsmt Exposure Bsmt Qual BsmtFin Type 1 \\\n",
"Order PID \n",
"1 526301100 Gd Gd TA BLQ \n",
"2 526350040 TA No TA Rec \n",
"3 526351010 TA No TA ALQ \n",
"4 526353030 TA No TA ALQ \n",
"5 527105010 TA No Gd GLQ \n",
"6 527105030 TA No TA GLQ \n",
"7 527127150 TA Mn Gd GLQ \n",
"8 527145080 TA No Gd ALQ \n",
"9 527146030 TA No Gd GLQ \n",
"10 527162130 TA No TA Unf \n",
"\n",
" BsmtFin Type 2 Electrical Exter Cond Exter Qual Fence \\\n",
"Order PID \n",
"1 526301100 Unf SBrkr TA TA NA \n",
"2 526350040 LwQ SBrkr TA TA MnPrv \n",
"3 526351010 Unf SBrkr TA TA NA \n",
"4 526353030 Unf SBrkr TA Gd NA \n",
"5 527105010 Unf SBrkr TA TA MnPrv \n",
"6 527105030 Unf SBrkr TA TA NA \n",
"7 527127150 Unf SBrkr TA Gd NA \n",
"8 527145080 Unf SBrkr TA Gd NA \n",
"9 527146030 Unf SBrkr TA Gd NA \n",
"10 527162130 Unf SBrkr TA TA NA \n",
"\n",
" Fireplace Qu Functional Garage Cond Garage Finish Garage Qual \\\n",
"Order PID \n",
"1 526301100 Gd Typ TA Fin TA \n",
"2 526350040 NA Typ TA Unf TA \n",
"3 526351010 NA Typ TA Unf TA \n",
"4 526353030 TA Typ TA Fin TA \n",
"5 527105010 TA Typ TA Fin TA \n",
"6 527105030 Gd Typ TA Fin TA \n",
"7 527127150 NA Typ TA Fin TA \n",
"8 527145080 NA Typ TA RFn TA \n",
"9 527146030 TA Typ TA RFn TA \n",
"10 527162130 TA Typ TA Fin TA \n",
"\n",
" Heating QC Kitchen Qual Land Slope Lot Shape Overall Cond \\\n",
"Order PID \n",
"1 526301100 Fa TA Gtl IR1 5 \n",
"2 526350040 TA TA Gtl Reg 6 \n",
"3 526351010 TA Gd Gtl IR1 6 \n",
"4 526353030 Ex Ex Gtl Reg 5 \n",
"5 527105010 Gd TA Gtl IR1 5 \n",
"6 527105030 Ex Gd Gtl IR1 6 \n",
"7 527127150 Ex Gd Gtl Reg 5 \n",
"8 527145080 Ex Gd Gtl IR1 5 \n",
"9 527146030 Ex Gd Gtl IR1 5 \n",
"10 527162130 Gd Gd Gtl Reg 5 \n",
"\n",
" Overall Qual Paved Drive Pool QC Utilities \n",
"Order PID \n",
"1 526301100 6 P NA AllPub \n",
"2 526350040 5 Y NA AllPub \n",
"3 526351010 6 Y NA AllPub \n",
"4 526353030 7 Y NA AllPub \n",
"5 527105010 5 Y NA AllPub \n",
"6 527105030 6 Y NA AllPub \n",
"7 527127150 8 Y NA AllPub \n",
"8 527145080 8 Y NA AllPub \n",
"9 527146030 8 Y NA AllPub \n",
"10 527162130 7 Y NA AllPub "
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[ORDINAL_VARIABLES].head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the ordinal variables there is only a neglectable number of missing values."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"MultiIndex: 2930 entries, (np.int64(1), np.int64(526301100)) to (np.int64(2930), np.int64(924151050))\n",
"Data columns (total 23 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Bsmt Cond 2929 non-null object\n",
" 1 Bsmt Exposure 2926 non-null object\n",
" 2 Bsmt Qual 2929 non-null object\n",
" 3 BsmtFin Type 1 2929 non-null object\n",
" 4 BsmtFin Type 2 2928 non-null object\n",
" 5 Electrical 2929 non-null object\n",
" 6 Exter Cond 2930 non-null object\n",
" 7 Exter Qual 2930 non-null object\n",
" 8 Fence 2930 non-null object\n",
" 9 Fireplace Qu 2930 non-null object\n",
" 10 Functional 2930 non-null object\n",
" 11 Garage Cond 2929 non-null object\n",
" 12 Garage Finish 2928 non-null object\n",
" 13 Garage Qual 2929 non-null object\n",
" 14 Heating QC 2930 non-null object\n",
" 15 Kitchen Qual 2930 non-null object\n",
" 16 Land Slope 2930 non-null object\n",
" 17 Lot Shape 2930 non-null object\n",
" 18 Overall Cond 2930 non-null object\n",
" 19 Overall Qual 2930 non-null object\n",
" 20 Paved Drive 2930 non-null object\n",
" 21 Pool QC 2930 non-null object\n",
" 22 Utilities 2930 non-null object\n",
"dtypes: object(23)\n",
"memory usage: 712.9+ KB\n"
]
}
],
"source": [
"df[ORDINAL_VARIABLES].info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Missing Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualizations"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc0AAAKkCAYAAADSjxeQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAADEW0lEQVR4nOzdd7gkRdXH8e/ZDLvLknOQJCBpkRyUnLPgC5JFQJKygJJBUESCyIIgQVgEyaCSJIclZ1mCBMk5LTlvuOf941Tv1J29d/cCM7eZvr/P8/TD3p4Zra7p6a4+VXXK3B0REREREREREREREYFeZRdAREREREREREREROTbQkFzEREREREREREREZFEQXMRERERERERERERkURBcxERERERERERERGRREFzEREREREREREREZFEQXMRERERERERERERkURBcxEREREREflKzGyasssgIiIi0iwKmouIiIiIiEiXmdmdwA5mpudJERERqSQ1ckRERERERKRLzOxmYA7gBndvK7s8IiIiIs3Qp+wCiIiIiIiIyLefmY0EZgHWdfcnSi6OiIiISNNopLmIiIiIiIhMkpndCswAbOruT+SpWcxsgfJKJiIiItJ4CpqLiIiIiIhIp8xsR2Bl4LIiYF6kZjGzK4E/mtkUpRZSREREpIGUnkVEREREREQm5QFgBHCQmb3p7qcCmNlVwFBgfXf/vMTyiYiIiDSUguYiIiLSY5lZb3cfX3Y5RES+jcxsgLt/4e6PmdkfiOfHk83sc2ATYDFgA3d/tMxyinQnM5vW3d8ruxwiItJc5u5ll0FERESk25lZf3f/Mv17LSJX773AW+7+SamFExEpmZn9HJgKuNHdR6V98wKHAdsCnwHLaEFQ6UnM7AfA74Fdde6LiFSbcpqLiIhIj2FmU6ZAEFnA/ELgEuDvwKPA4WY2V3mlFBEpl5ldCuwDrASMLva7+3NEwPAvwBTpdZEeIQXMbyPSFT1bcnFE5FvGzAab2S/LLoc0joLmIiIi0pMcTaQWOAzAzHYGlgR2AL4HnAPsBBxmZnOXVUgRkbKY2b+BRYBfAj9z91ctAXD3/wEnER2Np5rZruWVVqR7pID5zcBw4BB3H1NuiUTk28TMpiIG36xiZgPLLo80hnKai4iISE/yZ2AuYBczc8CA04Er3b0N2N3MPiEC52Zmv3P3F8orrohI9zGz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jhxZdjFK16q5K0VEREREQEFzEREREZGGGTVqFMOGDSu7GKUaPnx42UUQEREREflGFDQXEREREWkQjTQPGmkuIiIiUl277bYbN910U6evt7W1MW7cON58802+/PLLbixZ4yhoLiIiIiLSIBpprpHmIiIiIlV36qmnll2EplPQXERERESkQTTSPGikuYiIiIi0MgXNRUREREQaRCPNNdJcRERERFpfr7ILICIiIiIiIiIiIiLybaGguYiIiIiIiIiIiIhIovQsIiIiIiIiIiIiItIlxx9/PPfcc89k3/f444/z1FNPdUOJGk9BcxERERERERERERHpkssvv5w77rij7GI0ldKziIiIiIiIiIiIiEiXVD1gDgqai4iIiIiIiIiIiIhMoPQsIiIiIiIiIiIiItIlZ5xxBrfccstk33f//ffz/PPPd0OJGk9BcxERERERERERERHpkmeeeYYbbrhhsu977733uqE0zaGguYiIiIiIiIiIiIh0yXHHHVd2EZpOQXMRERERERERERER6ZLrr7+ejz76CAB3p62tjfHjxzNu3DjGjx8/Ybv88su5/vrrSy7t16OguYiIiIiIiIiIiIh0Sb9+/Zh++ukn+74ZZpihG0rTHAqai4iIiIg0yNChQxk5cmTZxSjdqFGjyi6CiIiIiDTJOeecw9/+9reyi9FUCpqLiIiIiDTIqFGjGDZsWNnFKNXw4cPLLoKIiIiINNGll15adhGaTkFzEREREREREREREemSI488kquuugroPKf5uHHjePrpp/nyyy9LLu3Xo6C5iIiIiIiIiIiIiHTJ3nvvXXYRmk5BcxERERERERERERHpkosvvphHH310su+77bbbuOuuu7qhRI2noLmIiIiIiIiIiIiIdMmLL77IjTfeONn3PfbYY7h7N5So8RQ0FxEREREREREREZEu2X///csuQtP1KrsAIiIiIiIiIiIiIiLfFgqai4iIiIiIiIiIiIgkCpqLiIiIiIiIiIiIiCQKmouIiIiIiIiIiIiIJAqai4iIiIiIiIiIiEiXrLTSSmUXoekUNBcRERERERERERGRLrnzzjvLLkLT9Sm7ACIiIiIiIiIiIiLSGn71q19x1llnTfZ977//fjeUpjkUNBcRERERERERERGRLllggQVYd911J/u+++67j+eee64bStR4CpqLiIiIiIiIiIiISJfsvPPOZReh6ZTTXEREREREREREREQkUdBcRERERERERERERCRRehYRERERERERERER6ZJDDz2UK6+8crLve/755/n444+7oUSNp6C5iIiIiIiIiIiIiHTJaqutxmqrrTbZ940YMYLzzjuvG0rUeAqai4iIiIiIiIiIiEiXPPLII10aaT5q1CjcvRtK1HgKmouIiIiIiIiIiIhIlwwbNqzsIjSdguYiIiIiIiIiIiIi0iUXX3wxjzzyyGTfd/vtt3PXXXd1Q4kaT0FzEREREREREREREemSGWeckTXXXHOy73vllVcUNBcRERERERERERGRahs3bhyff/4548aNY9y4cYwfP37Clu975513yi7q16aguYiIiIiIiIiIiIh0yVZbbdXSAfGu6FV2AURERERERERERESkNSy00EJlF6HpNNJcRERERKRBhg4dysiRI8suRulGjRpVdhFEREREpEnmnntubr/99rKL0VQKmouIiIiINMioUaMYNmxY2cUo1fDhw8sugoiIiIg00bXXXlt2EZpO6VlEREREREREREREpEvee++9sovQdAqai4iIiIiIiIiIiEiX7LDDDmUXoekUNBcRERERERERERGRLjnzzDPLLkLTKWguIiIiIiIiIiIiIpJoIVARERERkQYZOnQoI0eOLLsYpRs1alTZRRARERGRJll66aV54IEHyi5GU2mkuYiIiIiIiIiIiIh0SdUD5qCR5iIiIiIiDTNq1CiGDRtWdjFKNXz48LKLICIiIiLyjShoLiIiIiLSIErPEpSeRURERKS6Zp55Zt58882yi9FUCpqLiIiIiDSIRpprpLmIiIhI1VU9YA4KmouIiIiINIxGmgeNNBcRERGRVqaguYiIiIhIg2ikuUaai4iIiEjrU9BcRERERKRBNNI8aKS5iIiIiLQyBc1FRERERBpEI8010lxEREREWp+C5iIiIiIiIiIiIiLSJSNGjOCmm25i/PjxjBs3rsP/jh8/nqeeeoq33nqr7OJ+LQqai4iIiIiIiIiIiEiX7LjjjmUXoel6lV0AEREREREREREREWkNv/vd75hqqqk63IYMGTJha2UaaS4iIiIiIiIiIiIiXXLooYeWXYSmU9BcRERERERERERERLrk5JNP5pprrpns+x566CHlNBcRERERERERERGRalt44YVZeOGFJ/u+ESNGcN5553VDiRpPOc1FRERERERERERERBIFzUVEREREREREREREEgXNRUREREREREREREQSBc1FRERERERERERERBIFzUVEREREREREREREEgXNRUREREREREREREQSBc1FRERERERERERERJI+ZRdARERERERERERERFrDBhtswKefflp2MZpKQXMRERERERERERGRHu7pp5/mk08+6fT18ePHM378+MoHzEFBcxEREREREREREZEe7Y477uCwww4ruxjfGgqai4iIiIg0yNChQxk5cmTZxSjdqFGjyi6CiIiIiHwFSy+9NOuttx5vvPHGZN/78MMPd0OJyqWguYiIiIhIg4waNYphw4aVXYxSDR8+vOwiiIiIiMhXNGDAAH7961936b2rrrpqk0tTPgXNRUREREQaRCPNg0aai4iIiEgrU9BcRERERKRBNNJcI81FREREpPUpaC4iIiIiIiIiIiIiXXLGGWdwww03MH78+AnbuHHjGDduHGPHjuXLL79kzJgxPP7444wdO7bs4n4tCpqLiIiIiIiIiIiISJfssssuZReh6XqVXQARERERERERERERaQ177rknvXr1muzWyjTSXERERERERERERES6ZLPNNmOzzTab7PtGjBjBeeed1w0lajwFzUVERERERERERESkSz755BNeeumlDl9ra2ubkOf89ddf7+aSNY6C5iIiIiIiIiIiIiLSJRtuuGHZRWg6Bc1FREREREREREREpEt++9vfcuGFF3b4mrtPGGn+/PPPd3PJGkdBcxERERERERERERHpktNOO62lU690hYLmIiIiIiINMnToUEaOHFl2MUo3atSososgIiIiIk1S9YA5KGguIiIiItIwo0aNYtiwYWUXo1TDhw8vuwgiIiIiIt+IguYiIiIiIg2ikeZBI81FREREpJUpaC4iIiIi0iAaaa6R5iIiIiLS+nqVXQARERERERERERERkW8LjTQXEREREWkQpWcJSs8iIiIiIq1MI81FRERERERERERERBKNNBcRERERaRDlNFdOcxERERFpfRppLiIiIiIiIiIiIiKSKGguIiIiIiIiIiIiIpIoaC4iIiIiIiIiIiIikihoLiIiIiIiIiIiIiKSKGguIiIiIiIiIiIiIl2y5JJLll2EplPQXERERERERERERES65KGHHiq7CE3Xp+wCiIiIiIhUxdChQxk5cmTZxSjdqFGjyi6CiIiIiMjXpqC5iIiIiEiDjBo1imHDhpVdjFINHz687CKIiIiIiHwjCpqLiIiIiIiIiIiISJfceuutXXrfiBEjOO+885pcmuZQTnMRERERERERERERkURBcxERERERERERERGRREFzEREREREREREREZFEQXMRERERERERERERkUQLgYqIiIiIiIiIiIhIl4wZM4YPPvhgwt9tbW2MHz+ecePGtfvvO++8U14hvyEFzUVERERERERERESkS9Zee+2yi9B0CpqLiIiIiIiIiIiISJfsv//+nHXWWZN93+jRo7uhNM2hoLmIiIiIiIiIiIiIdMk666zDOuusM9n3jRgxgvPOO68bStR4CpqLiIiIiIiIiIiISJccdthh3HHHHWUXo6l6lV0AEREREREREREREWkNH374YdlFaDqNNBcRERERERERERGRLjnxxBO79L5WTs+ikeYiIiIiIiIiIiIiIomC5iIiIiIiIiIiIiIiidKziIiIiIiIiIiIiEiXPPzww1xxxRWTfd8jjzyCu3dDiRpPQXMRERERERERERER6ZJ99tmn7CI0nYLmIiIiIiINMnToUEaOHFl2MUo3atSososgIiIiIk2y0EIL8eSTT5ZdjKZS0FxEREREpEFGjRrFsGHDyi5GqYYPH152EURERESkiaoeMAcFzUVERERERERERESki4444gguvPDCTl8v8pg//fTT3VWkhlPQXERERERERERERES6ZMiQIcw222yTfd/o0aN59913u6FEjaeguYiIiIiIiIiIiIh0SU9IR6iguYiIiIhIg2gh0KCFQEVERESqa5llluH+++8vuxhNpaC5iIiIiEiDaCFQLQQqIiIiUnXPPvts2UVoul5lF0BEREREREREREREWsPYsWPLLkLTKWguIiIiIiIiIiIiIl0y99xzl12EplPQXERERERERERERES65NFHHy27CE2nnOYiIiIiIg2ihUCDFgIVERERkVamoLmIiIiISINoIVAtBCoiIiIirU9BcxERERGRBtFI86CR5iIiIiLV1atXL9ra2souRlMpaC4iIiIi0iAaaa6R5iIiIiJVN9100/HOO++UXYymUtBcRERERERERERERLrkkksu6XB/W1sbbW1tjBs3jvHjx/P3v/+90/d+2yloLiIiIiIiIiIiIiLfSK9evejVqxd9+kTI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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"msno.matrix(df[ORDINAL_VARIABLES]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Cleansing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since only about 1% of the overall number of observations exhibit variables with missing data (disregarding the columns *Lot Frontage* and *Garage Yr Blt*), the decision is made to discard these rows entirely to not have to deal with interpolating meaningful replacements for the missing values."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"remaining_columns = sorted(set(ALL_VARIABLES) - set(missing_a_lot)) + TARGET_VARIABLES\n",
"mask = df[remaining_columns].isnull().any(axis=1)\n",
"assert (100 * mask.sum() / df.shape[0]) < 1.1 # percent\n",
"df = df[~mask]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The two columns with a lot of missing values regard the age of a house's optional garage and the length of the intersection with the street where the house is located. The first is assumed as not important for the house appraisal and the second is assumed to be captured in other variables (e.g. overall size of the house). Therefore, for sake of simplicity both columns are dropped from the DataFrame."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Garage Yr Blt Year garage was built\n",
"Lot Frontage Linear feet of street connected to property\n"
]
}
],
"source": [
"print_column_list(missing_a_lot)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"df = df[remaining_columns]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Remove the discarded columns from the helper dictionaries / lists.\n",
"update_column_descriptions(df.columns)\n",
"# Without any more missing data, cast all numeric\n",
"# columns as floats or integers respectively.\n",
"for column in CONTINUOUS_VARIABLES + TARGET_VARIABLES:\n",
" df[column] = df[column].astype(np.float64)\n",
"for column in DISCRETE_VARIABLES:\n",
" df[column] = df[column].astype(np.int64)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Clean Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The cleaned data comes as a 2898 rows x 78 columns matrix."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2898, 78)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.shape"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
1st Flr SF
\n",
"
2nd Flr SF
\n",
"
3Ssn Porch
\n",
"
Alley
\n",
"
Bedroom AbvGr
\n",
"
Bldg Type
\n",
"
Bsmt Cond
\n",
"
Bsmt Exposure
\n",
"
Bsmt Full Bath
\n",
"
Bsmt Half Bath
\n",
"
Bsmt Qual
\n",
"
Bsmt Unf SF
\n",
"
BsmtFin SF 1
\n",
"
BsmtFin SF 2
\n",
"
BsmtFin Type 1
\n",
"
BsmtFin Type 2
\n",
"
Central Air
\n",
"
Condition 1
\n",
"
Condition 2
\n",
"
Electrical
\n",
"
Enclosed Porch
\n",
"
Exter Cond
\n",
"
Exter Qual
\n",
"
Exterior 1st
\n",
"
Exterior 2nd
\n",
"
Fence
\n",
"
Fireplace Qu
\n",
"
Fireplaces
\n",
"
Foundation
\n",
"
Full Bath
\n",
"
Functional
\n",
"
Garage Area
\n",
"
Garage Cars
\n",
"
Garage Cond
\n",
"
Garage Finish
\n",
"
Garage Qual
\n",
"
Garage Type
\n",
"
Gr Liv Area
\n",
"
Half Bath
\n",
"
Heating
\n",
"
Heating QC
\n",
"
House Style
\n",
"
Kitchen AbvGr
\n",
"
Kitchen Qual
\n",
"
Land Contour
\n",
"
Land Slope
\n",
"
Lot Area
\n",
"
Lot Config
\n",
"
Lot Shape
\n",
"
Low Qual Fin SF
\n",
"
MS SubClass
\n",
"
MS Zoning
\n",
"
Mas Vnr Area
\n",
"
Mas Vnr Type
\n",
"
Misc Feature
\n",
"
Misc Val
\n",
"
Mo Sold
\n",
"
Neighborhood
\n",
"
Open Porch SF
\n",
"
Overall Cond
\n",
"
Overall Qual
\n",
"
Paved Drive
\n",
"
Pool Area
\n",
"
Pool QC
\n",
"
Roof Matl
\n",
"
Roof Style
\n",
"
Sale Condition
\n",
"
Sale Type
\n",
"
Screen Porch
\n",
"
Street
\n",
"
TotRms AbvGrd
\n",
"
Total Bsmt SF
\n",
"
Utilities
\n",
"
Wood Deck SF
\n",
"
Year Built
\n",
"
Year Remod/Add
\n",
"
Yr Sold
\n",
"
SalePrice
\n",
"
\n",
"
\n",
"
Order
\n",
"
PID
\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",
"
1
\n",
"
526301100
\n",
"
1656.0
\n",
"
0.0
\n",
"
0.0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
Gd
\n",
"
Gd
\n",
"
1
\n",
"
0
\n",
"
TA
\n",
"
441.0
\n",
"
639.0
\n",
"
0.0
\n",
"
BLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
BrkFace
\n",
"
Plywood
\n",
"
NA
\n",
"
Gd
\n",
"
2
\n",
"
CBlock
\n",
"
1
\n",
"
Typ
\n",
"
528.0
\n",
"
2
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1656.0
\n",
"
0
\n",
"
GasA
\n",
"
Fa
\n",
"
1Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
31770.0
\n",
"
Corner
\n",
"
IR1
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
112.0
\n",
"
Stone
\n",
"
NA
\n",
"
0.0
\n",
"
5
\n",
"
Names
\n",
"
62.0
\n",
"
5
\n",
"
6
\n",
"
P
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
7
\n",
"
1080.0
\n",
"
AllPub
\n",
"
210.0
\n",
"
1960
\n",
"
1960
\n",
"
2010
\n",
"
215000.0
\n",
"
\n",
"
\n",
"
2
\n",
"
526350040
\n",
"
896.0
\n",
"
0.0
\n",
"
0.0
\n",
"
NA
\n",
"
2
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0
\n",
"
0
\n",
"
TA
\n",
"
270.0
\n",
"
468.0
\n",
"
144.0
\n",
"
Rec
\n",
"
LwQ
\n",
"
Y
\n",
"
Feedr
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
MnPrv
\n",
"
NA
\n",
"
0
\n",
"
CBlock
\n",
"
1
\n",
"
Typ
\n",
"
730.0
\n",
"
1
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
Attchd
\n",
"
896.0
\n",
"
0
\n",
"
GasA
\n",
"
TA
\n",
"
1Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
11622.0
\n",
"
Inside
\n",
"
Reg
\n",
"
0.0
\n",
"
020
\n",
"
RH
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
6
\n",
"
Names
\n",
"
0.0
\n",
"
6
\n",
"
5
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
120.0
\n",
"
Pave
\n",
"
5
\n",
"
882.0
\n",
"
AllPub
\n",
"
140.0
\n",
"
1961
\n",
"
1961
\n",
"
2010
\n",
"
105000.0
\n",
"
\n",
"
\n",
"
3
\n",
"
526351010
\n",
"
1329.0
\n",
"
0.0
\n",
"
0.0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0
\n",
"
0
\n",
"
TA
\n",
"
406.0
\n",
"
923.0
\n",
"
0.0
\n",
"
ALQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
Wd Sdng
\n",
"
Wd Sdng
\n",
"
NA
\n",
"
NA
\n",
"
0
\n",
"
CBlock
\n",
"
1
\n",
"
Typ
\n",
"
312.0
\n",
"
1
\n",
"
TA
\n",
"
Unf
\n",
"
TA
\n",
"
Attchd
\n",
"
1329.0
\n",
"
1
\n",
"
GasA
\n",
"
TA
\n",
"
1Story
\n",
"
1
\n",
"
Gd
\n",
"
Lvl
\n",
"
Gtl
\n",
"
14267.0
\n",
"
Corner
\n",
"
IR1
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
108.0
\n",
"
BrkFace
\n",
"
Gar2
\n",
"
12500.0
\n",
"
6
\n",
"
Names
\n",
"
36.0
\n",
"
6
\n",
"
6
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
6
\n",
"
1329.0
\n",
"
AllPub
\n",
"
393.0
\n",
"
1958
\n",
"
1958
\n",
"
2010
\n",
"
172000.0
\n",
"
\n",
"
\n",
"
4
\n",
"
526353030
\n",
"
2110.0
\n",
"
0.0
\n",
"
0.0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
1
\n",
"
0
\n",
"
TA
\n",
"
1045.0
\n",
"
1065.0
\n",
"
0.0
\n",
"
ALQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
Gd
\n",
"
BrkFace
\n",
"
BrkFace
\n",
"
NA
\n",
"
TA
\n",
"
2
\n",
"
CBlock
\n",
"
2
\n",
"
Typ
\n",
"
522.0
\n",
"
2
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
2110.0
\n",
"
1
\n",
"
GasA
\n",
"
Ex
\n",
"
1Story
\n",
"
1
\n",
"
Ex
\n",
"
Lvl
\n",
"
Gtl
\n",
"
11160.0
\n",
"
Corner
\n",
"
Reg
\n",
"
0.0
\n",
"
020
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
4
\n",
"
Names
\n",
"
0.0
\n",
"
5
\n",
"
7
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Hip
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
8
\n",
"
2110.0
\n",
"
AllPub
\n",
"
0.0
\n",
"
1968
\n",
"
1968
\n",
"
2010
\n",
"
244000.0
\n",
"
\n",
"
\n",
"
5
\n",
"
527105010
\n",
"
928.0
\n",
"
701.0
\n",
"
0.0
\n",
"
NA
\n",
"
3
\n",
"
1Fam
\n",
"
TA
\n",
"
No
\n",
"
0
\n",
"
0
\n",
"
Gd
\n",
"
137.0
\n",
"
791.0
\n",
"
0.0
\n",
"
GLQ
\n",
"
Unf
\n",
"
Y
\n",
"
Norm
\n",
"
Norm
\n",
"
SBrkr
\n",
"
0.0
\n",
"
TA
\n",
"
TA
\n",
"
VinylSd
\n",
"
VinylSd
\n",
"
MnPrv
\n",
"
TA
\n",
"
1
\n",
"
PConc
\n",
"
2
\n",
"
Typ
\n",
"
482.0
\n",
"
2
\n",
"
TA
\n",
"
Fin
\n",
"
TA
\n",
"
Attchd
\n",
"
1629.0
\n",
"
1
\n",
"
GasA
\n",
"
Gd
\n",
"
2Story
\n",
"
1
\n",
"
TA
\n",
"
Lvl
\n",
"
Gtl
\n",
"
13830.0
\n",
"
Inside
\n",
"
IR1
\n",
"
0.0
\n",
"
060
\n",
"
RL
\n",
"
0.0
\n",
"
None
\n",
"
NA
\n",
"
0.0
\n",
"
3
\n",
"
Gilbert
\n",
"
34.0
\n",
"
5
\n",
"
5
\n",
"
Y
\n",
"
0.0
\n",
"
NA
\n",
"
CompShg
\n",
"
Gable
\n",
"
Normal
\n",
"
WD
\n",
"
0.0
\n",
"
Pave
\n",
"
6
\n",
"
928.0
\n",
"
AllPub
\n",
"
212.0
\n",
"
1997
\n",
"
1998
\n",
"
2010
\n",
"
189900.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 1st Flr SF 2nd Flr SF 3Ssn Porch Alley Bedroom AbvGr \\\n",
"Order PID \n",
"1 526301100 1656.0 0.0 0.0 NA 3 \n",
"2 526350040 896.0 0.0 0.0 NA 2 \n",
"3 526351010 1329.0 0.0 0.0 NA 3 \n",
"4 526353030 2110.0 0.0 0.0 NA 3 \n",
"5 527105010 928.0 701.0 0.0 NA 3 \n",
"\n",
" Bldg Type Bsmt Cond Bsmt Exposure Bsmt Full Bath \\\n",
"Order PID \n",
"1 526301100 1Fam Gd Gd 1 \n",
"2 526350040 1Fam TA No 0 \n",
"3 526351010 1Fam TA No 0 \n",
"4 526353030 1Fam TA No 1 \n",
"5 527105010 1Fam TA No 0 \n",
"\n",
" Bsmt Half Bath Bsmt Qual Bsmt Unf SF BsmtFin SF 1 \\\n",
"Order PID \n",
"1 526301100 0 TA 441.0 639.0 \n",
"2 526350040 0 TA 270.0 468.0 \n",
"3 526351010 0 TA 406.0 923.0 \n",
"4 526353030 0 TA 1045.0 1065.0 \n",
"5 527105010 0 Gd 137.0 791.0 \n",
"\n",
" BsmtFin SF 2 BsmtFin Type 1 BsmtFin Type 2 Central Air \\\n",
"Order PID \n",
"1 526301100 0.0 BLQ Unf Y \n",
"2 526350040 144.0 Rec LwQ Y \n",
"3 526351010 0.0 ALQ Unf Y \n",
"4 526353030 0.0 ALQ Unf Y \n",
"5 527105010 0.0 GLQ Unf Y \n",
"\n",
" Condition 1 Condition 2 Electrical Enclosed Porch Exter Cond \\\n",
"Order PID \n",
"1 526301100 Norm Norm SBrkr 0.0 TA \n",
"2 526350040 Feedr Norm SBrkr 0.0 TA \n",
"3 526351010 Norm Norm SBrkr 0.0 TA \n",
"4 526353030 Norm Norm SBrkr 0.0 TA \n",
"5 527105010 Norm Norm SBrkr 0.0 TA \n",
"\n",
" Exter Qual Exterior 1st Exterior 2nd Fence Fireplace Qu \\\n",
"Order PID \n",
"1 526301100 TA BrkFace Plywood NA Gd \n",
"2 526350040 TA VinylSd VinylSd MnPrv NA \n",
"3 526351010 TA Wd Sdng Wd Sdng NA NA \n",
"4 526353030 Gd BrkFace BrkFace NA TA \n",
"5 527105010 TA VinylSd VinylSd MnPrv TA \n",
"\n",
" Fireplaces Foundation Full Bath Functional Garage Area \\\n",
"Order PID \n",
"1 526301100 2 CBlock 1 Typ 528.0 \n",
"2 526350040 0 CBlock 1 Typ 730.0 \n",
"3 526351010 0 CBlock 1 Typ 312.0 \n",
"4 526353030 2 CBlock 2 Typ 522.0 \n",
"5 527105010 1 PConc 2 Typ 482.0 \n",
"\n",
" Garage Cars Garage Cond Garage Finish Garage Qual \\\n",
"Order PID \n",
"1 526301100 2 TA Fin TA \n",
"2 526350040 1 TA Unf TA \n",
"3 526351010 1 TA Unf TA \n",
"4 526353030 2 TA Fin TA \n",
"5 527105010 2 TA Fin TA \n",
"\n",
" Garage Type Gr Liv Area Half Bath Heating Heating QC \\\n",
"Order PID \n",
"1 526301100 Attchd 1656.0 0 GasA Fa \n",
"2 526350040 Attchd 896.0 0 GasA TA \n",
"3 526351010 Attchd 1329.0 1 GasA TA \n",
"4 526353030 Attchd 2110.0 1 GasA Ex \n",
"5 527105010 Attchd 1629.0 1 GasA Gd \n",
"\n",
" House Style Kitchen AbvGr Kitchen Qual Land Contour \\\n",
"Order PID \n",
"1 526301100 1Story 1 TA Lvl \n",
"2 526350040 1Story 1 TA Lvl \n",
"3 526351010 1Story 1 Gd Lvl \n",
"4 526353030 1Story 1 Ex Lvl \n",
"5 527105010 2Story 1 TA Lvl \n",
"\n",
" Land Slope Lot Area Lot Config Lot Shape Low Qual Fin SF \\\n",
"Order PID \n",
"1 526301100 Gtl 31770.0 Corner IR1 0.0 \n",
"2 526350040 Gtl 11622.0 Inside Reg 0.0 \n",
"3 526351010 Gtl 14267.0 Corner IR1 0.0 \n",
"4 526353030 Gtl 11160.0 Corner Reg 0.0 \n",
"5 527105010 Gtl 13830.0 Inside IR1 0.0 \n",
"\n",
" MS SubClass MS Zoning Mas Vnr Area Mas Vnr Type Misc Feature \\\n",
"Order PID \n",
"1 526301100 020 RL 112.0 Stone NA \n",
"2 526350040 020 RH 0.0 None NA \n",
"3 526351010 020 RL 108.0 BrkFace Gar2 \n",
"4 526353030 020 RL 0.0 None NA \n",
"5 527105010 060 RL 0.0 None NA \n",
"\n",
" Misc Val Mo Sold Neighborhood Open Porch SF Overall Cond \\\n",
"Order PID \n",
"1 526301100 0.0 5 Names 62.0 5 \n",
"2 526350040 0.0 6 Names 0.0 6 \n",
"3 526351010 12500.0 6 Names 36.0 6 \n",
"4 526353030 0.0 4 Names 0.0 5 \n",
"5 527105010 0.0 3 Gilbert 34.0 5 \n",
"\n",
" Overall Qual Paved Drive Pool Area Pool QC Roof Matl \\\n",
"Order PID \n",
"1 526301100 6 P 0.0 NA CompShg \n",
"2 526350040 5 Y 0.0 NA CompShg \n",
"3 526351010 6 Y 0.0 NA CompShg \n",
"4 526353030 7 Y 0.0 NA CompShg \n",
"5 527105010 5 Y 0.0 NA CompShg \n",
"\n",
" Roof Style Sale Condition Sale Type Screen Porch Street \\\n",
"Order PID \n",
"1 526301100 Hip Normal WD 0.0 Pave \n",
"2 526350040 Gable Normal WD 120.0 Pave \n",
"3 526351010 Hip Normal WD 0.0 Pave \n",
"4 526353030 Hip Normal WD 0.0 Pave \n",
"5 527105010 Gable Normal WD 0.0 Pave \n",
"\n",
" TotRms AbvGrd Total Bsmt SF Utilities Wood Deck SF \\\n",
"Order PID \n",
"1 526301100 7 1080.0 AllPub 210.0 \n",
"2 526350040 5 882.0 AllPub 140.0 \n",
"3 526351010 6 1329.0 AllPub 393.0 \n",
"4 526353030 8 2110.0 AllPub 0.0 \n",
"5 527105010 6 928.0 AllPub 212.0 \n",
"\n",
" Year Built Year Remod/Add Yr Sold SalePrice \n",
"Order PID \n",
"1 526301100 1960 1960 2010 215000.0 \n",
"2 526350040 1961 1961 2010 105000.0 \n",
"3 526351010 1958 1958 2010 172000.0 \n",
"4 526353030 1968 1968 2010 244000.0 \n",
"5 527105010 1997 1998 2010 189900.0 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"df.to_csv(\"data/data_clean.csv\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ames-housing",
"language": "python",
"name": "ames-housing"
},
"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.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}