{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# EndTailImputer\n", "\n", "The EndTailImputer() replaces missing data by a value at either tail of the distribution. It automatically determines the value to be used in the imputation using the mean plus or minus a factor of the standard deviation, or using the inter-quartile range proximity rule. Alternatively, it can use a factor of the maximum value.\n", "\n", "The EndTailImputer() is in essence, very similar to the ArbitraryNumberImputer, but it selects the value to use fr the imputation automatically, instead of having the user pre-define them.\n", "\n", "It works only with numerical variables.\n", "\n", "**For this demonstration, we use the Ames House Prices dataset produced by Professor Dean De Cock:**\n", "\n", "[Dean De Cock (2011) Ames, Iowa: Alternative to the Boston Housing\n", "Data as an End of Semester Regression Project, Journal of Statistics Education, Vol.19, No. 3](http://jse.amstat.org/v19n3/decock.pdf)\n", "\n", "The version of the dataset used in this notebook can be obtained from [Kaggle](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Version" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.2.0'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make sure you are using this \n", "# Feature-engine version.\n", "\n", "import feature_engine\n", "\n", "feature_engine.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.model_selection import train_test_split\n", "\n", "from feature_engine.imputation import EndTailImputer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load data" ] }, { "cell_type": "code", "execution_count": 3, "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", "
IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilities...PoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPub...0NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPub...0NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPub...0NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPub...0NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPub...0NaNNaNNaN0122008WDNormal250000
\n", "

5 rows × 81 columns

\n", "
" ], "text/plain": [ " Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \\\n", "0 1 60 RL 65.0 8450 Pave NaN Reg \n", "1 2 20 RL 80.0 9600 Pave NaN Reg \n", "2 3 60 RL 68.0 11250 Pave NaN IR1 \n", "3 4 70 RL 60.0 9550 Pave NaN IR1 \n", "4 5 60 RL 84.0 14260 Pave NaN IR1 \n", "\n", " LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold \\\n", "0 Lvl AllPub ... 0 NaN NaN NaN 0 2 \n", "1 Lvl AllPub ... 0 NaN NaN NaN 0 5 \n", "2 Lvl AllPub ... 0 NaN NaN NaN 0 9 \n", "3 Lvl AllPub ... 0 NaN NaN NaN 0 2 \n", "4 Lvl AllPub ... 0 NaN NaN NaN 0 12 \n", "\n", " YrSold SaleType SaleCondition SalePrice \n", "0 2008 WD Normal 208500 \n", "1 2007 WD Normal 181500 \n", "2 2008 WD Normal 223500 \n", "3 2006 WD Abnorml 140000 \n", "4 2008 WD Normal 250000 \n", "\n", "[5 rows x 81 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Download the data from Kaggle and store it\n", "# in the same folder as this notebook.\n", "\n", "data = pd.read_csv('houseprice.csv')\n", "\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1022, 79), (438, 79))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Separate the data into train and test sets.\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " data.drop(['Id', 'SalePrice'], axis=1),\n", " data['SalePrice'],\n", " test_size=0.3,\n", " random_state=0,\n", ")\n", "\n", "X_train.shape, X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check missing data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LotFrontage 0.184932\n", "MasVnrArea 0.004892\n", "dtype: float64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# numerical variables with missing data\n", "\n", "X_train[['LotFrontage', 'MasVnrArea']].isnull().mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The EndTailImputer can replace NA with a value at the left or right end of the distribution.\n", "\n", "In addition, it uses 3 different methods to identify the imputation values.\n", "\n", "In the following cells, we show how to use each method.\n", "\n", "## Gaussian, right tail\n", "\n", "Let's begin by finding the values automatically at the right tail, by using the mean and the standard deviation." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "imputer = EndTailImputer(\n", " \n", " # uses mean and standard deviation to determine the value\n", " imputation_method='gaussian',\n", " \n", " # value at right tail of distribution\n", " tail='right',\n", " \n", " # multiply the std by 3\n", " fold=3,\n", " \n", " # the variables to impute\n", " variables=['LotFrontage', 'MasVnrArea'],\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "EndTailImputer(variables=['LotFrontage', 'MasVnrArea'])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# find the imputation values\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'LotFrontage': 138.9022201686726, 'MasVnrArea': 648.3947111415165}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The values for the imputation\n", "\n", "imputer.imputer_dict_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we use different values for different variables." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# impute the data\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check we no longer have NA\n", "\n", "train_t['LotFrontage'].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# The variable distribution changed slightly with\n", "# more values accumulating towards the right tail\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n", "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n", "lines, labels = ax.get_legend_handles_labels()\n", "ax.legend(lines, labels, loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IQR, left tail\n", "\n", "Now, we will impute variables with values at the left tail. The values are identified using the inter-quartile range proximity rule. \n", "\n", "The IQR rule is better suited for skewed variables." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "imputer = EndTailImputer(\n", " \n", " # uses the inter-quartile range proximity rule\n", " imputation_method='iqr',\n", " \n", " # determines values at the left tail of the distribution\n", " tail='left',\n", " \n", " # multiplies the IQR by 3\n", " fold=3,\n", " \n", " # the variables to impute\n", " variables=['LotFrontage', 'MasVnrArea'],\n", ")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "EndTailImputer(imputation_method='iqr', tail='left',\n", " variables=['LotFrontage', 'MasVnrArea'])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# finds the imputation values\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'LotFrontage': -8.0, 'MasVnrArea': -510.0}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# imputation values per variable\n", "\n", "imputer.imputer_dict_" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# transform the data\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LotFrontage 0\n", "MasVnrArea 0\n", "dtype: int64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check we have no NA after the transformation\n", "\n", "train_t[['LotFrontage', 'MasVnrArea']].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# The variable distribution changed with the\n", "# transformation, with more values\n", "# accumulating towards the left tail.\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n", "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n", "lines, labels = ax.get_legend_handles_labels()\n", "ax.legend(lines, labels, loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Impute with the maximum value\n", "\n", "We can find imputation values with a factor of the maximum variable value." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "imputer = EndTailImputer(\n", " \n", " # imputes beyond the maximum value\n", " imputation_method='max',\n", " \n", " # multiplies the maximum value by 3\n", " fold=3,\n", " \n", " # the variables to impute\n", " variables=['LotFrontage', 'MasVnrArea'],\n", ")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "EndTailImputer(imputation_method='max', variables=['LotFrontage', 'MasVnrArea'])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# find imputation values\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'LotFrontage': 939.0, 'MasVnrArea': 4800.0}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The imputation values.\n", "\n", "imputer.imputer_dict_" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LotFrontage 313.0\n", "MasVnrArea 1600.0\n", "dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the maximum values of the variables,\n", "# note how the imputer multiplied them by 3\n", "# to determine the imputation values.\n", "\n", "X_train[imputer.variables_].max()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# impute the data\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LotFrontage 0\n", "MasVnrArea 0\n", "dtype: int64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check we have no NA in the imputed data\n", "\n", "train_t[['LotFrontage', 'MasVnrArea']].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# The variable distribution changed with the\n", "# transformation, with now more values\n", "# beyond the maximum.\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n", "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n", "lines, labels = ax.get_legend_handles_labels()\n", "ax.legend(lines, labels, loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Automatically impute all variables\n", "\n", "As with all Feature-engine transformers, the EndTailImputer can also find and impute all numerical variables in the data." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# Start the imputer\n", "\n", "imputer = EndTailImputer()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'gaussian'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check the default parameters\n", "\n", "# how to find the imputation value\n", "imputer.imputation_method" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'right'" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# which tail to use\n", "\n", "imputer.tail" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# how far out\n", "imputer.fold" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "EndTailImputer()" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Find variables and imputation values\n", "\n", "imputer.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['MSSubClass',\n", " 'LotFrontage',\n", " 'LotArea',\n", " 'OverallQual',\n", " 'OverallCond',\n", " 'YearBuilt',\n", " 'YearRemodAdd',\n", " 'MasVnrArea',\n", " 'BsmtFinSF1',\n", " 'BsmtFinSF2',\n", " 'BsmtUnfSF',\n", " 'TotalBsmtSF',\n", " '1stFlrSF',\n", " '2ndFlrSF',\n", " 'LowQualFinSF',\n", " 'GrLivArea',\n", " 'BsmtFullBath',\n", " 'BsmtHalfBath',\n", " 'FullBath',\n", " 'HalfBath',\n", " 'BedroomAbvGr',\n", " 'KitchenAbvGr',\n", " 'TotRmsAbvGrd',\n", " 'Fireplaces',\n", " 'GarageYrBlt',\n", " 'GarageCars',\n", " 'GarageArea',\n", " 'WoodDeckSF',\n", " 'OpenPorchSF',\n", " 'EnclosedPorch',\n", " '3SsnPorch',\n", " 'ScreenPorch',\n", " 'PoolArea',\n", " 'MiscVal',\n", " 'MoSold',\n", " 'YrSold']" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The variables to impute\n", "\n", "imputer.variables_" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'MSSubClass': 183.0960051903714,\n", " 'LotFrontage': 138.9022201686726,\n", " 'LotArea': 41441.796589850215,\n", " 'OverallQual': 10.152919665538322,\n", " 'OverallCond': 8.918356149675976,\n", " 'YearBuilt': 2061.66731604675,\n", " 'YearRemodAdd': 2046.2161089423614,\n", " 'MasVnrArea': 648.3947111415165,\n", " 'BsmtFinSF1': 1732.0016007094835,\n", " 'BsmtFinSF2': 520.9882766560984,\n", " 'BsmtUnfSF': 1865.113698435333,\n", " 'TotalBsmtSF': 2286.0497168767233,\n", " '1stFlrSF': 2283.6805173062803,\n", " '2ndFlrSF': 1677.2392305771546,\n", " 'LowQualFinSF': 149.0787736885176,\n", " 'GrLivArea': 3075.569310556133,\n", " 'BsmtFullBath': 1.9636856192070633,\n", " 'BsmtHalfBath': 0.7637721815299992,\n", " 'FullBath': 3.2012740993879882,\n", " 'HalfBath': 1.877166869732324,\n", " 'BedroomAbvGr': 5.303758597292265,\n", " 'KitchenAbvGr': 1.7084277213255645,\n", " 'TotRmsAbvGrd': 11.395793721778118,\n", " 'Fireplaces': 2.519529226227064,\n", " 'GarageYrBlt': 2052.9707419772235,\n", " 'GarageCars': 3.966386813249906,\n", " 'GarageArea': 1095.8302008827814,\n", " 'WoodDeckSF': 480.04361090824267,\n", " 'OpenPorchSF': 250.26561495660084,\n", " 'EnclosedPorch': 216.43485488519244,\n", " '3SsnPorch': 89.5229867716376,\n", " 'ScreenPorch': 184.35773738383577,\n", " 'PoolArea': 101.82445982535369,\n", " 'MiscVal': 1817.7712851835915,\n", " 'MoSold': 14.42955308807171,\n", " 'YrSold': 2011.8643245428148}" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The imputation values\n", "\n", "imputer.imputer_dict_" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# impute the data\n", "\n", "train_t = imputer.transform(X_train)\n", "test_t = imputer.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Sanity check:\n", "\n", "# No numerical variable with NA is left in the\n", "# transformed data.\n", "\n", "[v for v in train_t.columns if train_t[v].dtypes !=\n", " 'O' and train_t[v].isnull().sum() > 1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "fenotebook", "language": "python", "name": "fenotebook" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }