diff --git a/Solutions.ipynb b/Solutions.ipynb index 4c0e1c9..c3b01ba 100644 --- a/Solutions.ipynb +++ b/Solutions.ipynb @@ -16,6 +16,443 @@ "For this lab, we will be using the same dataset we used in the previous labs. We recommend using the same notebook since you will be reusing the same variables you previous created and used in labs." ] }, + { + "cell_type": "code", + "execution_count": 1, + "id": "68d5e0bc", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.neighbors import KNeighborsRegressor\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.neural_network import MLPRegressor\n", + "from sklearn.datasets import make_regression\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1be0d8bf", + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv(r'C:\\Users\\claud\\lab-cleaning-numerical-data\\files_for_lab\\we_fn_use_c_marketing_customer_value_analysis.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b82b3e7f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['customer', 'state', 'customer_lifetime_value', 'response', 'coverage',\n", + " 'education', 'effective_to_date', 'employmentstatus', 'gender',\n", + " 'income', 'location_code', 'marital_status', 'monthly_premium_auto',\n", + " 'months_since_last_claim', 'months_since_policy_inception',\n", + " 'number_of_open_complaints', 'number_of_policies', 'policy_type',\n", + " 'policy', 'renew_offer_type', 'sales_channel', 'total_claim_amount',\n", + " 'vehicle_class', 'vehicle_size'],\n", + " dtype='object')" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.columns = [x.lower().replace(\" \", \"_\") for x in data.columns]\n", + "data.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "5128b3f3", + "metadata": {}, + "outputs": [], + "source": [ + "data = data.set_index('customer')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0bdfa37d", + "metadata": {}, + "outputs": [], + "source": [ + "data['effective_to_date'] = pd.to_datetime(data['effective_to_date'])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "30349842", + "metadata": {}, + "outputs": [], + "source": [ + "data['day'] = data['effective_to_date'].dt.day\n", + "data['week'] = data['effective_to_date'].dt.week\n", + "data['month'] = data['effective_to_date'].dt.month" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "05dd9182", + "metadata": {}, + "outputs": [], + "source": [ + "data['day'] = pd.to_numeric(data['day'], errors='coerce')\n", + "data['week'] = pd.to_numeric(data['week'], errors='coerce')\n", + "data['month'] = pd.to_numeric(data['month'], errors='coerce')" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4de5c7df", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
statecustomer_lifetime_valueresponsecoverageeducationemploymentstatusgenderincomelocation_codemarital_status...policy_typepolicyrenew_offer_typesales_channeltotal_claim_amountvehicle_classvehicle_sizedayweekmonth
customer
BU79786Washington2763.519279NoBasicBachelorEmployedF56274SuburbanMarried...Corporate AutoCorporate L3Offer1Agent384.811147Two-Door CarMedsize2482
QZ44356Arizona6979.535903NoExtendedBachelorUnemployedF0SuburbanSingle...Personal AutoPersonal L3Offer3Agent1131.464935Four-Door CarMedsize3151
AI49188Nevada12887.431650NoPremiumBachelorEmployedF48767SuburbanMarried...Personal AutoPersonal L3Offer1Agent566.472247Two-Door CarMedsize1972
WW63253California7645.861827NoBasicBachelorUnemployedM0SuburbanMarried...Corporate AutoCorporate L2Offer1Call Center529.881344SUVMedsize2031
HB64268Washington2813.692575NoBasicBachelorEmployedM43836RuralSingle...Personal AutoPersonal L1Offer1Agent138.130879Four-Door CarMedsize352
\n", + "

5 rows × 25 columns

\n", + "
" + ], + "text/plain": [ + " state customer_lifetime_value response coverage education \\\n", + "customer \n", + "BU79786 Washington 2763.519279 No Basic Bachelor \n", + "QZ44356 Arizona 6979.535903 No Extended Bachelor \n", + "AI49188 Nevada 12887.431650 No Premium Bachelor \n", + "WW63253 California 7645.861827 No Basic Bachelor \n", + "HB64268 Washington 2813.692575 No Basic Bachelor \n", + "\n", + " employmentstatus gender income location_code marital_status ... \\\n", + "customer ... \n", + "BU79786 Employed F 56274 Suburban Married ... \n", + "QZ44356 Unemployed F 0 Suburban Single ... \n", + "AI49188 Employed F 48767 Suburban Married ... \n", + "WW63253 Unemployed M 0 Suburban Married ... \n", + "HB64268 Employed M 43836 Rural Single ... \n", + "\n", + " policy_type policy renew_offer_type sales_channel \\\n", + "customer \n", + "BU79786 Corporate Auto Corporate L3 Offer1 Agent \n", + "QZ44356 Personal Auto Personal L3 Offer3 Agent \n", + "AI49188 Personal Auto Personal L3 Offer1 Agent \n", + "WW63253 Corporate Auto Corporate L2 Offer1 Call Center \n", + "HB64268 Personal Auto Personal L1 Offer1 Agent \n", + "\n", + " total_claim_amount vehicle_class vehicle_size day week month \n", + "customer \n", + "BU79786 384.811147 Two-Door Car Medsize 24 8 2 \n", + "QZ44356 1131.464935 Four-Door Car Medsize 31 5 1 \n", + "AI49188 566.472247 Two-Door Car Medsize 19 7 2 \n", + "WW63253 529.881344 SUV Medsize 20 3 1 \n", + "HB64268 138.130879 Four-Door Car Medsize 3 5 2 \n", + "\n", + "[5 rows x 25 columns]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data.drop(['effective_to_date'], axis=1)\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "bdb84a68", + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.get_dummies(data, drop_first=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "094f2e49", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "customer_lifetime_value float64\n", + "income int64\n", + "monthly_premium_auto int64\n", + "months_since_last_claim int64\n", + "months_since_policy_inception int64\n", + "number_of_open_complaints int64\n", + "number_of_policies int64\n", + "total_claim_amount float64\n", + "day int64\n", + "week int64\n", + "month int64\n", + "state_California uint8\n", + "state_Nevada uint8\n", + "state_Oregon uint8\n", + "state_Washington uint8\n", + "response_Yes uint8\n", + "coverage_Extended uint8\n", + "coverage_Premium uint8\n", + "education_College uint8\n", + "education_Doctor uint8\n", + "education_High School or Below uint8\n", + "education_Master uint8\n", + "employmentstatus_Employed uint8\n", + "employmentstatus_Medical Leave uint8\n", + "employmentstatus_Retired uint8\n", + "employmentstatus_Unemployed uint8\n", + "gender_M uint8\n", + "location_code_Suburban uint8\n", + "location_code_Urban uint8\n", + "marital_status_Married uint8\n", + "marital_status_Single uint8\n", + "policy_type_Personal Auto uint8\n", + "policy_type_Special Auto uint8\n", + "policy_Corporate L2 uint8\n", + "policy_Corporate L3 uint8\n", + "policy_Personal L1 uint8\n", + "policy_Personal L2 uint8\n", + "policy_Personal L3 uint8\n", + "policy_Special L1 uint8\n", + "policy_Special L2 uint8\n", + "policy_Special L3 uint8\n", + "renew_offer_type_Offer2 uint8\n", + "renew_offer_type_Offer3 uint8\n", + "renew_offer_type_Offer4 uint8\n", + "sales_channel_Branch uint8\n", + "sales_channel_Call Center uint8\n", + "sales_channel_Web uint8\n", + "vehicle_class_Luxury Car uint8\n", + "vehicle_class_Luxury SUV uint8\n", + "vehicle_class_SUV uint8\n", + "vehicle_class_Sports Car uint8\n", + "vehicle_class_Two-Door Car uint8\n", + "vehicle_size_Medsize uint8\n", + "vehicle_size_Small uint8\n", + "dtype: object" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.dtypes" + ] + }, { "cell_type": "markdown", "id": "2f38d5b3", @@ -26,11 +463,50 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "68d5e0bc", + "execution_count": 31, + "id": "e42f6530", + "metadata": {}, + "outputs": [], + "source": [ + "y = data['total_claim_amount']\n", + "X = data.drop(['total_claim_amount'],axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "78099df1", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "transformer = StandardScaler().fit(data)\n", + "\n", + "x_standardized = transformer.transform(data)\n", + "x_standardized = pd.DataFrame(x_standardized, index = data.index)#, columns = ['customer_lifetime_value', 'income', 'monthly_premium_auto',\n", + " #'months_since_last_claim', 'months_since_policy_inception',\n", + " #'number_of_open_complaints', 'number_of_policies',\n", + " #'total_claim_amount'])" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "071a37c0", + "metadata": {}, + "outputs": [], + "source": [ + "X = x_standardized" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "09485eea", + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)" + ] }, { "cell_type": "markdown", @@ -42,11 +518,56 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "947a8b4b", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LinearRegression()" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LinearRegression()\n", + "model.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "88be841d", + "metadata": {}, "outputs": [], - "source": [] + "source": [ + "predictions = model.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "a59a3dab", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1.0, 2.94915010568832e-13, 3.843506696994419e-13)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r2_score(y_test, predictions), mean_absolute_error(y_test, predictions), mean_squared_error(y_test, predictions, squared=False)" + ] }, { "cell_type": "markdown", @@ -58,11 +579,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "id": "b095dbc8", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "def models(model_name, X, y, KNN_range = range(2,10)):\n", + " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n", + "\n", + " if model_name == 'LinearRegression':\n", + " model = LinearRegression()\n", + " model.fit(X_train, y_train) \n", + " predictions = model.predict(X_test)\n", + " print('R2 score =', r2_score(y_test, predictions))\n", + "\n", + " if model_name == 'KNN':\n", + " scores = []\n", + " for i in KNN_range:\n", + " model = KNeighborsRegressor(n_neighbors=i)\n", + " model.fit(X_train, y_train)\n", + " scores.append(model.score(X_test, y_test))\n", + " print(scores)\n", + "\n", + " plt.figure(figsize=(10,6))\n", + " plt.plot(KNN_range,scores,color = 'darkslategrey', linestyle='dashdot',\n", + " marker='o', markerfacecolor='darkcyan', markersize=10)\n", + " plt.title('accuracy scores vs. K Value')\n", + " plt.xlabel('K')\n", + " plt.ylabel('Accuracy')\n", + " \n", + " if model_name == 'MLP':\n", + " model = MLPRegressor()\n", + " model.fit(X_train, y_train)\n", + "\n", + " expected_y = y_test\n", + " predicted_y = model.predict(X_test)\n", + " print('R2 score =',r2_score(expected_y, predicted_y))" + ] }, { "cell_type": "markdown", @@ -74,11 +627,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "id": "cfb65b4b", "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "R2 score = 1.0\n" + ] + } + ], + "source": [ + "models('LinearRegression', X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "1ec7290e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.696016943990347, 0.7302882705107913, 0.7461926073178331, 0.7509089120711043, 0.7548339068787251, 0.7603485434445362, 0.7585738788178724, 0.7527295679482957]\n" + ] + }, + { + "data": { + "image/png": "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VVVfOv4tLz+fb0yezOq+feud+j1h/XpmTZ+uPWjNLJBy1txUzkREol9JaSm5y5bx98WLWfr++1RWVtLz6KMZO2oUY0eObPB4sNZox65d5G3dun+PW829b9u2b2fHrl0kJyXx9jPPYGb87P77WfPxx8z6/e8BuPInP+HVwkI+7dmz3tfosWkT3xs0iNuvvrq53pZQfznTtTVFRKRZfJyXx8PPP8+id96hpLSUozp14rILLmDsqFH069XrgKfqWotOHTrQqUOHeu8vr6hg565d+z+/M045hd41Vi/457p1FJx0UoOvsW+hXpWz6KByJiIiEVFdXc3KtWtJb9uWPj17UllZyZIVKzh/1CjGjhrFKQMG6OzFwyApMZHONa6SMGbkyC/d71VVTVqot6ToK6tVSUD0/woRETls3J3PCwsBqKyq4gd33cUTL7wAwHHHHMNrjz7Kz667jqyBA1XMmklqWhpJpaUNjkkqKyO1TRtKSkt58/33qapxooI0P/0/Q0REDtmm/HwefOYZvnHjjVx12224O0mJifzfL3/JLeGpMjMjMTEx4KStT052NpkFBQ2O6VxQQE52Nq+/8w7X3XEHH6xbB0BFZWVzRJRaNK0pIiIHpWDnTl5eupS/L17MqvXrARhywgmMGTmSqupqEuLjGXTccQGnlEnjxjF30SJ2dOjQ6EK9mUceSVpKCif16wfAfY88wofr1zPurLMYM2IEHep4vBx+OltTRESabE9REa+9/TZ/X7yYZR9+SHV1NccfeyxjR41izIgRXzr2SaLHvnXOGlqot651zma/8gpPvfgi//rPf0hISODMoUMZd9ZZnH7KKSQmaP/OodJSGiIiclBKy8oor6ggvW1b3nz/fa674w66d+4cKmQjR9Kre/fGn0QCdygL9X60cSPzFi1iweLFfL57Nx3bt2fsqFGMHz16/5UR5MCpnImIyAErLSvjvP/6L77+ta9x06RJVFZVsfbjjxnYt6+WvmiFKiorefO993jh9dfJXb6cyspKbpo0iau+/vWgo7VIWudMREQa5O58sG4df1+8mB27dnHvj39MSnIyV3/rW5zQty+AjiNr5RITEsgeNozsYcPYVVjIwiVLGDZoEADLV61i5pw53P6972l6+xCpnImItHIbPvmEBYsXs/Af/2DLZ5+RnJTEmcOG7b8M0BXjxwcdUaJQh/R0Ljn/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0FFEREQkyqicBSAuLo4RQ4YEHUNERESikKY1m9lP77+fGbNnBx1DREREopTKWTP6OC+P+YsWUVpWFnQUERERiVIqZ81o5pw5pCQlcfH55wcdRURERKKUylkz+WznTl7MzeXCc87hiPT0oOOIiIhIlFI5ayZ/nTeP6upqJo4fH3QUERERiWIqZ81gb3Exz7/0EuecdhrdOncOOo6IiIhEMZWzZjDr5ZfZW1zMtydMCDqKiIiIRDmVswirqKjgyXnzGDpoECf06RN0HBEREYlyKmcR9vY//8lnO3ZwpfaaiYiISBPoCgERNjIri6enT+f4Y48NOoqIiIi0ANpzFkHV1dUA9OvVCzMLOI2IiIi0BCpnEXTjr3/N/z75ZNAxREREpAVROYuQispKumZmcmSHDkFHERERkRZEx5xFSGJCArd/73tBxxAREZEWRnvOIiC/oID3Vq/G3YOOIiIiIi2MylkEzJg9m2t+8Qs+37076CgiIiLSwkS0nJnZGDNbZ2YbzOzWOu6famYrw1+rzKzKzDo25bHR6vPCQua++io52dl01PFmIiIicoAiVs7MLB74IzAWGABcamYDao5x93vdfbC7DwZuA3LdfWdTHhutnlmwgNLyciZddFHQUURERKQFiuSes2HABnff6O7lwNPAhQ2MvxR46iAfGxVKysp4ZsECRmVl0at796DjiIiISAsUyXLWFcircXtzeNtXmFkaMAaYdaCPjSYvvPYanxcW6lJNIiIictAiWc7qWhK/vtMXxwFL3X3ngT7WzK4xs+VmtrygoOAgYh4eVVVVPD53LoOOO46TB7SIGVgRERGJQpEsZ5uBmnN73YAt9Yy9hC+mNA/ose7+oLtnuXtWRkbGIcQ9NK+9/Tabt23jygkTdKkmEREROWiRLGfLgL5mdqyZJREqYC/UHmRm7YFsYO6BPjZauDuPzZlD9y5dOHPYsKDjiIiISAsWsSsEuHulmd0AvATEA4+4+2ozuzZ8/wPhoROAl929qLHHRirroaqsqmJUVhbdOncmPj4+6DgiIiLSglksrWKflZXly5cvDzqGiIiISKPMbIW7Z9XerisEHKL/fPopLy9dSlVVVdBRREREJAaonB2iv73yCj///e/ZU1TU+GARERGRRkTsmLPW4qaJE8k580w6pKcHHUVERERigPacHYLq6mri4+M57phjgo4iIiIi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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "models('KNN', X, y)" + ] }, { "cell_type": "markdown", @@ -90,11 +683,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "id": "3283e967", "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "R2 score = 0.9959792628123999\n" + ] + } + ], + "source": [ + "models('MLP',X,y)" + ] }, { "cell_type": "markdown", @@ -105,12 +708,16 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "b83c06cd", + "cell_type": "markdown", + "id": "1402fd6e", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "All models seems overfitted:\n", + "\n", + "- The Linear Regression is overfitted, therefore we got r2 score = 1\n", + "- KNN presented best performance when k = 7 (score = 0.76)\n", + "- MLP Regressor also seems overfitted with r2 score = 0.99" + ] } ], "metadata": { @@ -129,7 +736,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.8" } }, "nbformat": 4,