diff --git "a/HuggingFace/h8dsft_P1G1_KeziaIntan.ipynb" "b/HuggingFace/h8dsft_P1G1_KeziaIntan.ipynb" new file mode 100644--- /dev/null +++ "b/HuggingFace/h8dsft_P1G1_KeziaIntan.ipynb" @@ -0,0 +1,2577 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GRADED CHALLENGE 1" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "### Identity\n", + "```txt\n", + "\n", + "KEZIA INTAN NATALIE\n", + "Batch 003" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Problem Statement\n", + "- Mampu memahami konsep regression dengan Linear Regression.\n", + "- Mampu mempersiapkan data untuk digunakan dalam model Linear Regression.\n", + "- Mampu mengimplementasikan Linear Regression untuk membuat prediksi." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Objective Statement\n", + "Buatlah model Regression menggunakan Linear Regression untuk memprediksi harga perjalanan platform ride-hailing dengan dataset yang disediakan." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Import Library" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "first of all import the library that we use" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "ename": "ImportError", + "evalue": "cannot import name '_check_y' from 'sklearn.utils.validation' (c:\\Users\\LENOVO\\anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py)", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel_selection\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtrain_test_split\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mfeature_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moutliers\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mWinsorizer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 8\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpreprocessing\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mStandardScaler\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mMinMaxScaler\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mOneHotEncoder\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mOrdinalEncoder\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlinear_model\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLinearRegression\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mLasso\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mRidge\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mc:\\Users\\LENOVO\\anaconda3\\lib\\site-packages\\feature_engine\\outliers\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 3\u001b[0m \"\"\"\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0martbitrary\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mArbitraryOutlierCapper\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mtrimmer\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mOutlierTrimmer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mwinsorizer\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mWinsorizer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mc:\\Users\\LENOVO\\anaconda3\\lib\\site-packages\\feature_engine\\outliers\\artbitrary.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0m_find_or_check_numerical_variables\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 25\u001b[0m )\n\u001b[1;32m---> 26\u001b[1;33m from feature_engine.dataframe_checks import (\n\u001b[0m\u001b[0;32m 27\u001b[0m \u001b[0m_check_contains_inf\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0m_check_contains_na\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mc:\\Users\\LENOVO\\anaconda3\\lib\\site-packages\\feature_engine\\dataframe_checks.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mscipy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msparse\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0missparse\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 10\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalidation\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0m_check_y\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcheck_consistent_length\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 11\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mImportError\u001b[0m: cannot import name '_check_y' from 'sklearn.utils.validation' (c:\\Users\\LENOVO\\anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py)" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from feature_engine.outliers import Winsorizer\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, OrdinalEncoder\n", + "from sklearn.linear_model import LinearRegression, Lasso, Ridge\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "\n", + "import joblib\n", + "\n", + "import warnings\n", + "warnings.filterwarnings(action='ignore')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading Data" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#import dataset\n", + "df = pd.read_csv('rideshare_kaggle.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#making dataframe showing all columns\n", + "pd.set_option('display.max_columns', None)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtimestamphourdaymonthdatetimetimezonesourcedestinationcab_typeproduct_idnamepricedistancesurge_multiplierlatitudelongitudetemperatureapparentTemperatureshort_summarylong_summaryprecipIntensityprecipProbabilityhumiditywindSpeedwindGustwindGustTimevisibilitytemperatureHightemperatureHighTimetemperatureLowtemperatureLowTimeapparentTemperatureHighapparentTemperatureHighTimeapparentTemperatureLowapparentTemperatureLowTimeicondewPointpressurewindBearingcloudCoveruvIndexvisibility.1ozonesunriseTimesunsetTimemoonPhaseprecipIntensityMaxuvIndexTimetemperatureMintemperatureMinTimetemperatureMaxtemperatureMaxTimeapparentTemperatureMinapparentTemperatureMinTimeapparentTemperatureMaxapparentTemperatureMaxTime
0424553bb-7174-41ea-aeb4-fe06d4f4b9d71.544953e+09916122018-12-16 09:30:07America/New_YorkHaymarket SquareNorth StationLyftlyft_lineShared5.00.441.042.2148-71.03342.3437.12Mostly CloudyRain throughout the day.0.00000.00.688.669.17154501560010.00043.68154496880034.19154504800037.95154496880027.391545044400partly-cloudy-night32.701021.98570.72010.000303.8154496208415449948640.300.1276154497960039.89154501200043.68154496880033.73154501200038.071544958000
14bd23055-6827-41c6-b23b-3c491f24e74d1.543284e+09227112018-11-27 02:00:23America/New_YorkHaymarket SquareNorth StationLyftlyft_premierLux11.00.441.042.2148-71.03343.5837.35RainRain until morning, starting again in the eve...0.12991.00.9411.9811.9815432912004.78647.30154325160042.10154329840043.92154325160036.201543291200rain41.831003.97901.0004.786291.1154323296915432669920.640.1300154325160040.49154323360047.30154325160036.20154329120043.921543251600
2981a3613-77af-4620-a42a-0c0866077d1e1.543367e+09128112018-11-28 01:00:22America/New_YorkHaymarket SquareNorth StationLyftlyftLyft7.00.441.042.2148-71.03338.3332.93ClearLight rain in the morning.0.00000.00.757.337.33154333440010.00047.55154332000033.10154340280044.12154332000029.111543392000clear-night31.10992.282400.03010.000315.7154331943715433533640.680.1064154333800035.36154337760047.55154332000031.04154337760044.121543320000
3c2d88af2-d278-4bfd-a8d0-29ca77cc55121.543554e+09430112018-11-30 04:53:02America/New_YorkHaymarket SquareNorth StationLyftlyft_luxsuvLux Black XL26.00.441.042.2148-71.03334.3829.63ClearPartly cloudy throughout the day.0.00000.00.735.285.28154351440010.00045.03154351080028.90154357920038.53154351080026.201543575600clear-night26.641013.733100.00010.000291.1154349237015435261140.750.0000154350720034.67154355040045.03154351080030.30154355040038.531543510800
4e0126e1f-8ca9-4f2e-82b3-50505a09db9a1.543463e+09329112018-11-29 03:49:20America/New_YorkHaymarket SquareNorth StationLyftlyft_plusLyft XL9.00.441.042.2148-71.03337.4430.88Partly CloudyMostly cloudy throughout the day.0.00000.00.709.149.14154344600010.00042.18154342080036.71154347840035.75154342080030.291543460400partly-cloudy-night28.61998.363030.44010.000347.7154340590415434397380.720.0001154342080033.10154340280042.18154342080029.11154339200035.751543420800
\n", + "
" + ], + "text/plain": [ + " id timestamp hour day month \\\n", + "0 424553bb-7174-41ea-aeb4-fe06d4f4b9d7 1.544953e+09 9 16 12 \n", + "1 4bd23055-6827-41c6-b23b-3c491f24e74d 1.543284e+09 2 27 11 \n", + "2 981a3613-77af-4620-a42a-0c0866077d1e 1.543367e+09 1 28 11 \n", + "3 c2d88af2-d278-4bfd-a8d0-29ca77cc5512 1.543554e+09 4 30 11 \n", + "4 e0126e1f-8ca9-4f2e-82b3-50505a09db9a 1.543463e+09 3 29 11 \n", + "\n", + " datetime timezone source destination \\\n", + "0 2018-12-16 09:30:07 America/New_York Haymarket Square North Station \n", + "1 2018-11-27 02:00:23 America/New_York Haymarket Square North Station \n", + "2 2018-11-28 01:00:22 America/New_York Haymarket Square North Station \n", + "3 2018-11-30 04:53:02 America/New_York Haymarket Square North Station \n", + "4 2018-11-29 03:49:20 America/New_York Haymarket Square North Station \n", + "\n", + " cab_type product_id name price distance surge_multiplier \\\n", + "0 Lyft lyft_line Shared 5.0 0.44 1.0 \n", + "1 Lyft lyft_premier Lux 11.0 0.44 1.0 \n", + "2 Lyft lyft Lyft 7.0 0.44 1.0 \n", + "3 Lyft lyft_luxsuv Lux Black XL 26.0 0.44 1.0 \n", + "4 Lyft lyft_plus Lyft XL 9.0 0.44 1.0 \n", + "\n", + " latitude longitude temperature apparentTemperature short_summary \\\n", + "0 42.2148 -71.033 42.34 37.12 Mostly Cloudy \n", + "1 42.2148 -71.033 43.58 37.35 Rain \n", + "2 42.2148 -71.033 38.33 32.93 Clear \n", + "3 42.2148 -71.033 34.38 29.63 Clear \n", + "4 42.2148 -71.033 37.44 30.88 Partly Cloudy \n", + "\n", + " long_summary precipIntensity \\\n", + "0 Rain throughout the day. 0.0000 \n", + "1 Rain until morning, starting again in the eve... 0.1299 \n", + "2 Light rain in the morning. 0.0000 \n", + "3 Partly cloudy throughout the day. 0.0000 \n", + "4 Mostly cloudy throughout the day. 0.0000 \n", + "\n", + " precipProbability humidity windSpeed windGust windGustTime visibility \\\n", + "0 0.0 0.68 8.66 9.17 1545015600 10.000 \n", + "1 1.0 0.94 11.98 11.98 1543291200 4.786 \n", + "2 0.0 0.75 7.33 7.33 1543334400 10.000 \n", + "3 0.0 0.73 5.28 5.28 1543514400 10.000 \n", + "4 0.0 0.70 9.14 9.14 1543446000 10.000 \n", + "\n", + " temperatureHigh temperatureHighTime temperatureLow temperatureLowTime \\\n", + "0 43.68 1544968800 34.19 1545048000 \n", + "1 47.30 1543251600 42.10 1543298400 \n", + "2 47.55 1543320000 33.10 1543402800 \n", + "3 45.03 1543510800 28.90 1543579200 \n", + "4 42.18 1543420800 36.71 1543478400 \n", + "\n", + " apparentTemperatureHigh apparentTemperatureHighTime \\\n", + "0 37.95 1544968800 \n", + "1 43.92 1543251600 \n", + "2 44.12 1543320000 \n", + "3 38.53 1543510800 \n", + "4 35.75 1543420800 \n", + "\n", + " apparentTemperatureLow apparentTemperatureLowTime icon \\\n", + "0 27.39 1545044400 partly-cloudy-night \n", + "1 36.20 1543291200 rain \n", + "2 29.11 1543392000 clear-night \n", + "3 26.20 1543575600 clear-night \n", + "4 30.29 1543460400 partly-cloudy-night \n", + "\n", + " dewPoint pressure windBearing cloudCover uvIndex visibility.1 ozone \\\n", + "0 32.70 1021.98 57 0.72 0 10.000 303.8 \n", + "1 41.83 1003.97 90 1.00 0 4.786 291.1 \n", + "2 31.10 992.28 240 0.03 0 10.000 315.7 \n", + "3 26.64 1013.73 310 0.00 0 10.000 291.1 \n", + "4 28.61 998.36 303 0.44 0 10.000 347.7 \n", + "\n", + " sunriseTime sunsetTime moonPhase precipIntensityMax uvIndexTime \\\n", + "0 1544962084 1544994864 0.30 0.1276 1544979600 \n", + "1 1543232969 1543266992 0.64 0.1300 1543251600 \n", + "2 1543319437 1543353364 0.68 0.1064 1543338000 \n", + "3 1543492370 1543526114 0.75 0.0000 1543507200 \n", + "4 1543405904 1543439738 0.72 0.0001 1543420800 \n", + "\n", + " temperatureMin temperatureMinTime temperatureMax temperatureMaxTime \\\n", + "0 39.89 1545012000 43.68 1544968800 \n", + "1 40.49 1543233600 47.30 1543251600 \n", + "2 35.36 1543377600 47.55 1543320000 \n", + "3 34.67 1543550400 45.03 1543510800 \n", + "4 33.10 1543402800 42.18 1543420800 \n", + "\n", + " apparentTemperatureMin apparentTemperatureMinTime apparentTemperatureMax \\\n", + "0 33.73 1545012000 38.07 \n", + "1 36.20 1543291200 43.92 \n", + "2 31.04 1543377600 44.12 \n", + "3 30.30 1543550400 38.53 \n", + "4 29.11 1543392000 35.75 \n", + "\n", + " apparentTemperatureMaxTime \n", + "0 1544958000 \n", + "1 1543251600 \n", + "2 1543320000 \n", + "3 1543510800 \n", + "4 1543420800 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#showing dataset\n", + "df.head()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "checking the missing value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "id 0\n", + "timestamp 0\n", + "hour 0\n", + "day 0\n", + "month 0\n", + "datetime 0\n", + "timezone 0\n", + "source 0\n", + "destination 0\n", + "cab_type 0\n", + "product_id 0\n", + "name 0\n", + "price 55095\n", + "distance 0\n", + "surge_multiplier 0\n", + "latitude 0\n", + "longitude 0\n", + "temperature 0\n", + "apparentTemperature 0\n", + "short_summary 0\n", + "long_summary 0\n", + "precipIntensity 0\n", + "precipProbability 0\n", + "humidity 0\n", + "windSpeed 0\n", + "windGust 0\n", + "windGustTime 0\n", + "visibility 0\n", + "temperatureHigh 0\n", + "temperatureHighTime 0\n", + "temperatureLow 0\n", + "temperatureLowTime 0\n", + "apparentTemperatureHigh 0\n", + "apparentTemperatureHighTime 0\n", + "apparentTemperatureLow 0\n", + "apparentTemperatureLowTime 0\n", + "icon 0\n", + "dewPoint 0\n", + "pressure 0\n", + "windBearing 0\n", + "cloudCover 0\n", + "uvIndex 0\n", + "visibility.1 0\n", + "ozone 0\n", + "sunriseTime 0\n", + "sunsetTime 0\n", + "moonPhase 0\n", + "precipIntensityMax 0\n", + "uvIndexTime 0\n", + "temperatureMin 0\n", + "temperatureMinTime 0\n", + "temperatureMax 0\n", + "temperatureMaxTime 0\n", + "apparentTemperatureMin 0\n", + "apparentTemperatureMinTime 0\n", + "apparentTemperatureMax 0\n", + "apparentTemperatureMaxTime 0\n", + "dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#count the missing value\n", + "df.isnull().sum()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now drop the missing value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#drop missing value\n", + "df = df.dropna()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now check how many unique value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "id 637976\n", + "timestamp 35796\n", + "hour 24\n", + "day 17\n", + "month 2\n", + "datetime 31350\n", + "timezone 1\n", + "source 12\n", + "destination 12\n", + "cab_type 2\n", + "product_id 12\n", + "name 12\n", + "price 147\n", + "distance 549\n", + "surge_multiplier 7\n", + "latitude 11\n", + "longitude 12\n", + "temperature 308\n", + "apparentTemperature 319\n", + "short_summary 9\n", + "long_summary 11\n", + "precipIntensity 63\n", + "precipProbability 29\n", + "humidity 51\n", + "windSpeed 291\n", + "windGust 286\n", + "windGustTime 25\n", + "visibility 227\n", + "temperatureHigh 129\n", + "temperatureHighTime 23\n", + "temperatureLow 133\n", + "temperatureLowTime 31\n", + "apparentTemperatureHigh 124\n", + "apparentTemperatureHighTime 27\n", + "apparentTemperatureLow 136\n", + "apparentTemperatureLowTime 32\n", + "icon 7\n", + "dewPoint 313\n", + "pressure 316\n", + "windBearing 195\n", + "cloudCover 83\n", + "uvIndex 3\n", + "visibility.1 227\n", + "ozone 274\n", + "sunriseTime 110\n", + "sunsetTime 114\n", + "moonPhase 18\n", + "precipIntensityMax 65\n", + "uvIndexTime 20\n", + "temperatureMin 131\n", + "temperatureMinTime 25\n", + "temperatureMax 128\n", + "temperatureMaxTime 23\n", + "apparentTemperatureMin 137\n", + "apparentTemperatureMinTime 29\n", + "apparentTemperatureMax 125\n", + "apparentTemperatureMaxTime 27\n", + "dtype: int64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#check unique value\n", + "df.nunique()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and check is there any duplicate data or not" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#check data duplicate\n", + "df.duplicated().sum()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spliting Numberical and Categorical Columns" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now split the numberical and categorical columns" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "here we only choose the distance column for numerical column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "num_col= ['distance']" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now we choose the icon, name, cab_type columns for categorical column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cat_col= ['icon', 'name', 'cab_type']" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now describe the numerical and categorical columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "
distance
count637976.000000
mean2.189261
std1.135413
min0.020000
25%1.270000
50%2.160000
75%2.930000
max7.860000
\n", + "
" + ], + "text/plain": [ + " distance\n", + "count 637976.000000\n", + "mean 2.189261\n", + "std 1.135413\n", + "min 0.020000\n", + "25% 1.270000\n", + "50% 2.160000\n", + "75% 2.930000\n", + "max 7.860000" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#describe the numerical column\n", + "df[num_col].describe()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "as we can see the mean of distance are around 2.1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "
iconnamecab_type
count637976637976637976
unique7122
topcloudyUberXLUber
freq20142955096330568
\n", + "
" + ], + "text/plain": [ + " icon name cab_type\n", + "count 637976 637976 637976\n", + "unique 7 12 2\n", + "top cloudy UberXL Uber\n", + "freq 201429 55096 330568" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#describe the categorical column\n", + "df[cat_col].describe()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "there are 7 unique label in icon, 12 unique label in name, 2 unique label in cab_type" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exploratory Data Analysis (EDA)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "copy our dataset, so if there is any mistake in our worksheet we can use the copied of the data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#copy the dataset\n", + "df_copy = df.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtimestamphourdaymonthdatetimetimezonesourcedestinationcab_typeproduct_idnamepricedistancesurge_multiplierlatitudelongitudetemperatureapparentTemperatureshort_summarylong_summaryprecipIntensityprecipProbabilityhumiditywindSpeedwindGustwindGustTimevisibilitytemperatureHightemperatureHighTimetemperatureLowtemperatureLowTimeapparentTemperatureHighapparentTemperatureHighTimeapparentTemperatureLowapparentTemperatureLowTimeicondewPointpressurewindBearingcloudCoveruvIndexvisibility.1ozonesunriseTimesunsetTimemoonPhaseprecipIntensityMaxuvIndexTimetemperatureMintemperatureMinTimetemperatureMaxtemperatureMaxTimeapparentTemperatureMinapparentTemperatureMinTimeapparentTemperatureMaxapparentTemperatureMaxTime
0424553bb-7174-41ea-aeb4-fe06d4f4b9d71.544953e+09916122018-12-16 09:30:07America/New_YorkHaymarket SquareNorth StationLyftlyft_lineShared5.00.441.042.2148-71.03342.3437.12Mostly CloudyRain throughout the day.0.00000.00.688.669.17154501560010.00043.68154496880034.19154504800037.95154496880027.391545044400partly-cloudy-night32.701021.98570.72010.000303.8154496208415449948640.300.1276154497960039.89154501200043.68154496880033.73154501200038.071544958000
14bd23055-6827-41c6-b23b-3c491f24e74d1.543284e+09227112018-11-27 02:00:23America/New_YorkHaymarket SquareNorth StationLyftlyft_premierLux11.00.441.042.2148-71.03343.5837.35RainRain until morning, starting again in the eve...0.12991.00.9411.9811.9815432912004.78647.30154325160042.10154329840043.92154325160036.201543291200rain41.831003.97901.0004.786291.1154323296915432669920.640.1300154325160040.49154323360047.30154325160036.20154329120043.921543251600
2981a3613-77af-4620-a42a-0c0866077d1e1.543367e+09128112018-11-28 01:00:22America/New_YorkHaymarket SquareNorth StationLyftlyftLyft7.00.441.042.2148-71.03338.3332.93ClearLight rain in the morning.0.00000.00.757.337.33154333440010.00047.55154332000033.10154340280044.12154332000029.111543392000clear-night31.10992.282400.03010.000315.7154331943715433533640.680.1064154333800035.36154337760047.55154332000031.04154337760044.121543320000
3c2d88af2-d278-4bfd-a8d0-29ca77cc55121.543554e+09430112018-11-30 04:53:02America/New_YorkHaymarket SquareNorth StationLyftlyft_luxsuvLux Black XL26.00.441.042.2148-71.03334.3829.63ClearPartly cloudy throughout the day.0.00000.00.735.285.28154351440010.00045.03154351080028.90154357920038.53154351080026.201543575600clear-night26.641013.733100.00010.000291.1154349237015435261140.750.0000154350720034.67154355040045.03154351080030.30154355040038.531543510800
4e0126e1f-8ca9-4f2e-82b3-50505a09db9a1.543463e+09329112018-11-29 03:49:20America/New_YorkHaymarket SquareNorth StationLyftlyft_plusLyft XL9.00.441.042.2148-71.03337.4430.88Partly CloudyMostly cloudy throughout the day.0.00000.00.709.149.14154344600010.00042.18154342080036.71154347840035.75154342080030.291543460400partly-cloudy-night28.61998.363030.44010.000347.7154340590415434397380.720.0001154342080033.10154340280042.18154342080029.11154339200035.751543420800
\n", + "
" + ], + "text/plain": [ + " id timestamp hour day month \\\n", + "0 424553bb-7174-41ea-aeb4-fe06d4f4b9d7 1.544953e+09 9 16 12 \n", + "1 4bd23055-6827-41c6-b23b-3c491f24e74d 1.543284e+09 2 27 11 \n", + "2 981a3613-77af-4620-a42a-0c0866077d1e 1.543367e+09 1 28 11 \n", + "3 c2d88af2-d278-4bfd-a8d0-29ca77cc5512 1.543554e+09 4 30 11 \n", + "4 e0126e1f-8ca9-4f2e-82b3-50505a09db9a 1.543463e+09 3 29 11 \n", + "\n", + " datetime timezone source destination \\\n", + "0 2018-12-16 09:30:07 America/New_York Haymarket Square North Station \n", + "1 2018-11-27 02:00:23 America/New_York Haymarket Square North Station \n", + "2 2018-11-28 01:00:22 America/New_York Haymarket Square North Station \n", + "3 2018-11-30 04:53:02 America/New_York Haymarket Square North Station \n", + "4 2018-11-29 03:49:20 America/New_York Haymarket Square North Station \n", + "\n", + " cab_type product_id name price distance surge_multiplier \\\n", + "0 Lyft lyft_line Shared 5.0 0.44 1.0 \n", + "1 Lyft lyft_premier Lux 11.0 0.44 1.0 \n", + "2 Lyft lyft Lyft 7.0 0.44 1.0 \n", + "3 Lyft lyft_luxsuv Lux Black XL 26.0 0.44 1.0 \n", + "4 Lyft lyft_plus Lyft XL 9.0 0.44 1.0 \n", + "\n", + " latitude longitude temperature apparentTemperature short_summary \\\n", + "0 42.2148 -71.033 42.34 37.12 Mostly Cloudy \n", + "1 42.2148 -71.033 43.58 37.35 Rain \n", + "2 42.2148 -71.033 38.33 32.93 Clear \n", + "3 42.2148 -71.033 34.38 29.63 Clear \n", + "4 42.2148 -71.033 37.44 30.88 Partly Cloudy \n", + "\n", + " long_summary precipIntensity \\\n", + "0 Rain throughout the day. 0.0000 \n", + "1 Rain until morning, starting again in the eve... 0.1299 \n", + "2 Light rain in the morning. 0.0000 \n", + "3 Partly cloudy throughout the day. 0.0000 \n", + "4 Mostly cloudy throughout the day. 0.0000 \n", + "\n", + " precipProbability humidity windSpeed windGust windGustTime visibility \\\n", + "0 0.0 0.68 8.66 9.17 1545015600 10.000 \n", + "1 1.0 0.94 11.98 11.98 1543291200 4.786 \n", + "2 0.0 0.75 7.33 7.33 1543334400 10.000 \n", + "3 0.0 0.73 5.28 5.28 1543514400 10.000 \n", + "4 0.0 0.70 9.14 9.14 1543446000 10.000 \n", + "\n", + " temperatureHigh temperatureHighTime temperatureLow temperatureLowTime \\\n", + "0 43.68 1544968800 34.19 1545048000 \n", + "1 47.30 1543251600 42.10 1543298400 \n", + "2 47.55 1543320000 33.10 1543402800 \n", + "3 45.03 1543510800 28.90 1543579200 \n", + "4 42.18 1543420800 36.71 1543478400 \n", + "\n", + " apparentTemperatureHigh apparentTemperatureHighTime \\\n", + "0 37.95 1544968800 \n", + "1 43.92 1543251600 \n", + "2 44.12 1543320000 \n", + "3 38.53 1543510800 \n", + "4 35.75 1543420800 \n", + "\n", + " apparentTemperatureLow apparentTemperatureLowTime icon \\\n", + "0 27.39 1545044400 partly-cloudy-night \n", + "1 36.20 1543291200 rain \n", + "2 29.11 1543392000 clear-night \n", + "3 26.20 1543575600 clear-night \n", + "4 30.29 1543460400 partly-cloudy-night \n", + "\n", + " dewPoint pressure windBearing cloudCover uvIndex visibility.1 ozone \\\n", + "0 32.70 1021.98 57 0.72 0 10.000 303.8 \n", + "1 41.83 1003.97 90 1.00 0 4.786 291.1 \n", + "2 31.10 992.28 240 0.03 0 10.000 315.7 \n", + "3 26.64 1013.73 310 0.00 0 10.000 291.1 \n", + "4 28.61 998.36 303 0.44 0 10.000 347.7 \n", + "\n", + " sunriseTime sunsetTime moonPhase precipIntensityMax uvIndexTime \\\n", + "0 1544962084 1544994864 0.30 0.1276 1544979600 \n", + "1 1543232969 1543266992 0.64 0.1300 1543251600 \n", + "2 1543319437 1543353364 0.68 0.1064 1543338000 \n", + "3 1543492370 1543526114 0.75 0.0000 1543507200 \n", + "4 1543405904 1543439738 0.72 0.0001 1543420800 \n", + "\n", + " temperatureMin temperatureMinTime temperatureMax temperatureMaxTime \\\n", + "0 39.89 1545012000 43.68 1544968800 \n", + "1 40.49 1543233600 47.30 1543251600 \n", + "2 35.36 1543377600 47.55 1543320000 \n", + "3 34.67 1543550400 45.03 1543510800 \n", + "4 33.10 1543402800 42.18 1543420800 \n", + "\n", + " apparentTemperatureMin apparentTemperatureMinTime apparentTemperatureMax \\\n", + "0 33.73 1545012000 38.07 \n", + "1 36.20 1543291200 43.92 \n", + "2 31.04 1543377600 44.12 \n", + "3 30.30 1543550400 38.53 \n", + "4 29.11 1543392000 35.75 \n", + "\n", + " apparentTemperatureMaxTime \n", + "0 1544958000 \n", + "1 1543251600 \n", + "2 1543320000 \n", + "3 1543510800 \n", + "4 1543420800 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_copy.head()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "grouping the column name by price" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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55yOckWelnPkyJEaPny4fH3d/85LSkpSz5499cEHHziU7G/FixfXd999p1KlSrmtnz9/vmJiYpSSkuJQsvMyMjLUpk0bHTt2TF999ZVWr16tFi1a6OWXX1b//v0dzXax5cuXKz4+XvPnz1euXLnUtm1bdenSRQ888IDT0a7KiX83OerMx/Tp011L0aJF9eSTT2rPnj1asGCBFixYoN27d6tt27YqVKiQozlDQ0OveXFScnKykpKSXE8qTE5Odi3Hjx/XokWLMhUS2wIDA9WxY0clJCRo+/btatu2rd555x1FRUWpefPmHlHeJCk4OFiVK1fWO++847b+2LFjatu2rdq3b69+/fo5lA63ytSpU/XQQw9p9+7drnUJCQmqVKmSdu3a5WCyv3Xt2lUNGzbUwYMHXevmzp2rmJgYxcfHOxfs//j6+mrOnDnKnTu3oqOj1aJFC8XFxXlU8ZCk+vXra8aMGTpw4IBee+01bd26VTVr1lSVKlWcjuaRctSZj4sVLlxY3333ncqVK+e2ftu2bfqf//kfHT161KFk3sPX11c+Pj6X3e7j46PY2FgNHTrUYqqrM8Zo/vz56tGjhxITEz3mr+Bp06Zp4MCBqlmzpv7zn/9o/fr16tWrl+644w7Fx8frnnvucSzbwIEDr7j9yJEjmj17tsd8LS/H0858HD9+XD169NDixYv1+uuva/v27ZowYYKef/55xcbGKleuW/KEi+vWt29fLV++XCtXrtTixYvVtWtXzZw5U61bt3Ykz5YtWzKtO3HihNq1a6fmzZurV69ervWVK1e2Ge2a7N69W9OmTdPbb7+t5ORkpaenO5rn008/veL2PXv2aODAgVb/3eTY8pE/f37Fx8frsccec1v/ySefqGPHjjp+/LhDybJ25MgRbdu2TZJUrlw5FS5c2OFE0ooVK2SMUXR0tObPn68CBQq4tvn7+6tkyZKKiIhwMGFmCQkJmj59utupz8mTJzsdy2Xv3r2KiYnRunXrlJGRoaFDh+rFF1+Un5+fo7nq169/TfstX778Fie5OZ5WPi548cUXNWbMGOXKlUtffvmlGjRo4HSkTNq3b6/169frjz/+0OzZszP97LTpwh8+F/96uvj1hf/28fHxmO/16dOn9dFHH2natGmuS8CdOnVSx44dHb8EfOllv6zY/lp6Ru2+BTp16qQuXbpo165dql69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wIBMd2F48pmPL7/80lStWtV89tln5s8//3QNhnZ6UPT+/ftN48aNTVhYmJk+fboxxpjNmzebKlWqmBIlSpglS5Y4li0r//3vf03dunVN3rx5TUBAgBk1apRH3cV2Ne+//75p0aKF0zGMMcbcfffdZtKkSZnWT5w40VSoUMGBRO4yMjLMoEGDTJ48eVxnjAIDA01sbKzT0a5q27ZtJn/+/E7HMBkZGWb06NEmICDAdOzY0Rw/fty8+eabJl++fObxxx935G7GHFs+nnzySdOtWzdjzPnysXv3bnPixAkTHR1tOnbs6HA6dzt37jR9+vQxDRo0MA0aNDD9+vUzO3fudDpWJunp6Wb+/Pnm0UcfNblz5zZ33323ef311x27Dff77783Xbt2NcHBwaZ69epm0qRJ5siRIx5dPi69jfHC4vRtjWFhYaZJkyZm3759buvT0tLM0KFDTe7cuR299ftSX331lbnjjjtMiRIljL+/v3n55Zcve8eTJ9q1a5cJCgpyOoYx5vxdI3nz5jXDhw83CQkJJiEhwQwbNswEBgaaKVOmOB3P5cSJE2bdunVm69at5syZM07HuSZbtmwxRYsWdTqGqV69uilWrFimS0C7du0ytWvXNoUKFTJz5syxminHlo+9e/eaihUrmgoVKphcuXKZmjVrmoIFC5py5cqZQ4cOOR3PZfHixcbf399Ur17dDBgwwAwYMMBUr17dBAQEeMxgpUudOXPGjB071gQEBBgfHx8TEBBgnn76afPnn386kufEiRNm6tSp5sEHHzS5c+c2vr6+Zvz48SY5OdmRPFdy4Yf75RanvP3221fcvm7dOlOxYkVLaS7P0+dLuRanTp0y/fv3N2XLlnU6istbb71lihcv7irGpUqVMjNmzHA6ltfr37+/adKkidMxzFNPPWWOHj2a5baMjAwzduxY62U4x06vLp2/1Xbu3Ln68ccfdfLkSd13330eNZZCku699141adJEY8aMcVs/ePBgff3119q0aZNDyTLbsGGDpk2bpjlz5igoKEgdOnRQly5dtH//fsXGxio5OVnr1q2zlmfPnj2Zxk5s27ZNU6dO1cyZM5WYmKhGjRpd9bkGuDZpaWmZxlDZVqpUKQUHBys+Pt7ttuXExET16dNH8+fP18iRI/XCCy84mPJv+fPnd5vB1vzfQxoDAwM1a9YsR2YPvZIjR44o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DQ3VXXfdpeeee06NGjVyIJm7qlWrasKECXr99df16aefKj4+Xg899JDuuusude7cWU8//bRH3IbrifOleKNL/5/0tF/ww4cPd/38TktL0yuvvOKaut7pJ9perGvXrmrYsKFWrVrlKnRz585V586dFR8f72y4i3Tr1k3PPPOM0tPTFR0dLUlaunSpBg0apGeffdZqlhx72SUoKEhbt25l5Ds8wowZM7Jcn5iYqI0bN2ru3LmaN2+eHn30UcvJriw1NVVvvfWWhgwZorS0NPn7++vJJ5/Uq6++6ugD/DxxvhRv4+vrq2bNmrke5/DZZ58pOjradek3NTVVixcvduzsa7169a6pDHnKH3B9+/bV8uXLtXLlSi1evFhdu3bVzJkz1bp1a6ejuRhjNHjwYE2cONH1yJE8efLohRde0PDhw61mybHlo1WrVmrbtq2efPJJp6NcFdNEY+zYsZo3b55Wr17tdBRJ0oYNGzRt2jTNmTNHQUFB6tChg7p06aL9+/crNjZWycnJWrdunWP5QkNDM82XIkmLFi1Su3btlJSU5FAy73GtY5G86bKh09q3b6/169frjz/+0OzZs/XYY485HSlLJ0+e1K+//qq8efOqbNmyjjxPLEeVj08//dT130eOHNGoUaPUqVMnVapUKdNp2BYtWtiOl6WLp4meOXOmfvnlF5UuXVpvvPGGFi1axDTRt4nt27erZs2ajs9oO3bsWE2fPl3btm3Tww8/rK5du+rhhx92m3V3//79ioqK0tmzZx3LWaRIEa1YsUIVKlRwW//rr7+qTp06OnLkiEPJcLu4+PfNBenp6RowYIAaN27s9jvGU37feJIcVT4u/gF5JZ40kJNpoiFJW7duVaNGjRz/fpctW1adO3dWx44d3S6r7N+/X6NGjdKUKVOUlpamDz74QB06dHAs56hRo/Tbb79p+vTprr/aUlNT1aVLF5UtW1YjRoxwLBtuD974+0Y6f1bzck97X7BggbUcOWrA6aW303oDpomGJE2dOlVVq1Z1OoZr9shLHT16VFOnTtWUKVPk7+/vSPG4dGbiJUuW6I477lCVKlUkST/++KPS0tLUoEED69lw+/HG3zdz5sxRTEyMmjRpoq+//lqNGzfW9u3bdejQIT3++ONWs+So8iGdH3R29OhRPfLII6517733nkaMGKGUlBS1bNlSkyZNcuQaV1aY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_copy.groupby('name')[['price']].mean().sort_values('price').plot(kind='bar')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "as we can see the `Lux Black XL` is the most expensive prices" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now grouping icon by price" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAIvCAYAAADUJ7l8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBKklEQVR4nO3de3zOhf//8ee1M2ubQ8amYTQ5zTEUpZEPjRzq81FyWoYSJYd8tEpaykQhKjpoDt8SFT76VOKDiEQzQ32cDSOHSrY2mR3evz/6uH52IOPa+31d1x732+263bre13vX+7mr2p57H15vm2EYhgAAAEziYXUAAABQtlA+AACAqSgfAADAVJQPAABgKsoHAAAwFeUDAACYivIBAABMRfkAAACm8rI6QGH5+fn66aefFBAQIJvNZnUcAABwFQzD0O+//67Q0FB5eFx534bTlY+ffvpJYWFhVscAAADXIC0tTTfddNMV13G68hEQECDpz/CBgYEWpwEAAFcjIyNDYWFh9t/jV+J05ePioZbAwEDKBwAALuZqTpnghFMAAGAqygcAADAV5QMAAJiK8gEAAExF+QAAAKaifAAAAFNRPgAAgKkoHwAAwFSUDwAAYCrKBwAAMBXlAwAAmIryAQAATEX5AAAApqJ8AAAAU3lZHQAA4L5qPf251REKODy5q9UR7MryZ0P5AApxph8IzvSDUuKzuRI+G+DquXX5cKYfBpJz/UBwps/GmT4XAEDp45wPAABgKsoHAAAwFeUDAACYivIBAABMRfkAAACmKnH52LBhg7p166bQ0FDZbDYtX768yDq7d+9W9+7dFRQUJH9/f7Vs2VJHjx51RF4AAODiSlw+srKy1KRJE7355pvFvn7w4EHdcccdqlevnr7++mvt3LlT48ePl5+f33WHBQAArq/Ecz6io6MVHR192defffZZdenSRVOmTLEvq1OnzrWlAwAAbseh53zk5+fr888/V926ddW5c2cFBwerdevWxR6aAQAAZZNDy8fp06eVmZmpyZMn65577tGqVat033336f7779f69euL/Zrs7GxlZGQUeAAAAPfl0PHq+fn5kqQePXpo1KhRkqSmTZvq22+/1Zw5c3TXXXcV+ZqEhATFx8c7MgYAAHBiDt3zceONN8rLy0sNGjQosLx+/fqXvdolLi5O6enp9kdaWpojIwEAACfj0D0f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PvTnX/RXa8KECaWYxLn5+/tr9+7dqlGjhkJCQvT555+refPmOnTokJo1a6b09HSrI1qmSpUq2rhxY5GTBffu3as2bdro119/tSgZnJWfn59++OGHIjNQ9u/fr8jISJ0/f96iZNa79I+bihUrauPGjWrYsKF27NihHj16uM4UTwcJDw+/qvVsNpvLXJHJYReV7UJREjfddJNOnDihGjVqqE6dOlq1apWaN2+u77//Xr6+vlbHs1Rubq727NlTpHzs2bOnTF4KeKmsrCytX7++2GP3rvJXWmm4+eabtWTJEj3zzDMFli9evFgREREWpXIO/v7+9v9WQkJCdPDgQTVs2FDSn5fYljXuuBeM8oGrdt9992nNmjVq3bq1nnjiCfXr109z587V0aNHy/TxaenPybiDBg3SwYMH1apVK0nSli1bNHnyZA0cONDidNbZvn27unTponPnzikrK0uVKlXSL7/8ovLlyys4OLhMl4/4+Hg9+OCD2rBhg/2cj02bNmnNmjVasmSJxemsddttt2njxo2qX7++unTpojFjxmjXrl1aunSpbrvtNqvjwQE47FJIxYoVi73c7dLbXD/88MNl+hfKRZs3b9bmzZsVERGhbt26WR3HUvn5+Xr11Vf1+uuv68SJE5L+/IvtySef1JgxY1xr7LEDRUVFqW7dupozZ46CgoK0Y8cOeXt7q1+/fnryySfL3Mm4hW3btk3Tp0/X7t27JUn169fXmDFj1KxZM4uTWevQoUPKzMxU48aNlZWVpTFjxujbb79VRESEpk2bVqbnw1y8CWphl/6O6tGjh9NftUn5KGT69Ol6+eWXFR0dbf8LduvWrVq5cqVGjRql1NRULVy4ULNmzdKQIUMsTgtnlJGRIUncH0h/zs3ZsmWLbrnlFlWoUEGbN29W/fr1tWXLFsXExGjPnj1WRzTV6NGjNXHiRPn7+2vDhg1q06aNvLzYAY2r1759eyUnJysvL89+mHffvn3y9PRUvXr1tHfvXtlsNm3cuFENGjSwOO3lUT4K+fvf/66//e1vRS5jevvtt7Vq1Sp9+umnmjVrlt555x3t2rXLopTm+as5DZcq6zMbUFSVKlXsf7HWrVtXs2bNUufOnbVnzx61aNFCWVlZVkc0lbe3t44dO6aqVavK09NTJ06cUHBwsNWx4EJmzJihb775RomJifY/cNLT0zV48GDd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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_copy.groupby('icon')[['price']].mean().sort_values('price').plot(kind='bar')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preprocessing" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train-Test Split / Split Dataset" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "split the dataset between feature and target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define feature and target\n", + "x = df_copy.drop('price', axis=1)\n", + "y = df_copy['price']\n", + "\n", + "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "split train set and test set based on column types" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train_num = x_train[num_col]\n", + "x_train_cat = x_train[cat_col]\n", + "\n", + "x_test_num = x_test[num_col]\n", + "x_test_cat = x_test[cat_col]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## EDA For Modeling" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical Feature" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "define the numerical column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "
distance
1956830.74
116123.40
4056873.05
273594.48
4677810.61
......
3906820.55
1654071.50
1281322.58
4733232.82
3319410.57
\n", + "

446583 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " distance\n", + "195683 0.74\n", + "11612 3.40\n", + "405687 3.05\n", + "27359 4.48\n", + "467781 0.61\n", + "... ...\n", + "390682 0.55\n", + "165407 1.50\n", + "128132 2.58\n", + "473323 2.82\n", + "331941 0.57\n", + "\n", + "[446583 rows x 1 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train_t = x_train[num_col]\n", + "x_train_t" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Handling Outlier" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now see if there is outlier or not" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def diagnostic_plots(x_train, variable):\n", + " # Define figure size\n", + " plt.figure(figsize=(16, 4))\n", + "\n", + " # Histogram\n", + " plt.subplot(1, 2, 1)\n", + " sns.histplot(x_train[variable], bins=30)\n", + " plt.title('Histogram')\n", + "\n", + " # Boxplot\n", + " plt.subplot(1, 2, 2)\n", + " sns.boxplot(y=x_train[variable])\n", + " plt.title('Boxplot')\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABTUAAAGJCAYAAABbzteIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABc3ElEQVR4nO3deVyVZf7/8fcBZXEBV7YEIUtxwwUTaXG0TCJzWhynTAuXrAw0palkKrcWXFKxJLFym5+5tFlN5oKUOiWWYpS7VhpWgGLJUUTW8/vDL2c8I5qy3efA6/l4nEec67ru67y5HeWeD9d9XyaLxWIRAAAAAAAAADgIJ6MDAAAAAAAAAMDVoKgJAAAAAAAAwKFQ1AQAAAAAAADgUChqAgAAAAAAAHAoFDUBAAAAAAAAOBSKmgAAAAAAAAAcCkVNAAAAAAAAAA6FoiYAAAAAAAAAh0JREwAAAAAAAIBDoagJABUQGBio4cOHGx0DAAAAsGsmk0lTpkwxOgaAWoiiJgBIWrp0qUwmk3bu3Fluf58+fdSpU6dKfcZnn33GBR0AAACqTNk17IUvLy8v9e3bV+vWrTM6XqXs27dPU6ZM0dGjR42OAsBO1TM6AAA4ooMHD8rJ6ep+L/TZZ58pMTGRwiYAAACq1LRp0xQUFCSLxaLs7GwtXbpUd955p/7973/rrrvuMjpehezbt09Tp05Vnz59FBgYaHQcAHaIoiYAVICrq6vREa5aXl6eGjZsaHQMAAAAVLHIyEj16NHD+n7UqFHy9vbWypUrHbaoCQB/htvPAaAC/veZmkVFRZo6daquv/56ubm5qXnz5rr55puVnJwsSRo+fLgSExMlyeb2oDJ5eXl66qmn5O/vL1dXV7Vr106vvvqqLBaLzefm5+dr3LhxatGihRo3bqy//vWv+vXXXy96VtGUKVNkMpm0b98+Pfjgg2ratKluvvlmSdL333+v4cOH69prr5Wbm5t8fHw0cuRInTx50uazyuY4dOiQhg0bJk9PT7Vs2VIvvPCCLBaLjh07prvvvlseHh7y8fHR7Nmzq/IUAwAAoIKaNGkid3d31av333VMf3a9mZ+fr+DgYAUHBys/P9963O+//y5fX1/deOONKikpkXT+2rZRo0b66aefFBERoYYNG8rPz0/Tpk276Pq1PN9++60iIyPl4eGhRo0a6bbbbtP27dut/UuXLtXgwYMlSX379rVeO2/evLkqTg+AWoKVmgBwgdzcXOXk5FzUXlRUdNnjpkyZovj4eD3yyCPq2bOnzGazdu7cqV27dun222/XY489pt9++03Jycn6f//v/9kca7FY9Ne//lVffPGFRo0apa5du2rDhg16+umn9euvv2ru3LnWscOHD9e7776rhx56SL169dKWLVs0YMCAS+YaPHiwrr/+er3yyivWC8zk5GT99NNPGjFihHx8fLR37169+eab2rt3r7Zv325TbJWk+++/X+3bt9f06dO1du1avfTSS2rWrJkWLlyoW2+9VTNmzNA777yjf/zjH7rhhhvUu3fvPz3PAAAAqDpl17AWi0XHjx/X66+/rjNnzmjYsGGSrux6093dXcuWLdNNN92k5557TnPmzJEkRUdHKzc3V0uXLpWzs7P1M0tKSnTHHXeoV69emjlzptavX6/JkyeruLhY06ZNu2TWvXv36pZbbpGHh4eeeeYZ1a9fXwsXLlSfPn20ZcsWhYWFqXfv3ho3bpxee+01/fOf/1T79u0lyfpfAJAkWQAAliVLllgkXfbVsWNH6/jWrVtboqKirO+7dOliGTBgwGU/Izo62lLeP7sfffSRRZLlpZdesmn/29/+ZjGZTJYffvjBYrFYLGlpaRZJlvHjx9uMGz58uEWSZfLkyda2yZMnWyRZhgwZctHnnT179qK2lStXWiRZtm7detEcjz76qLWtuLjY0qpVK4vJZLJMnz7d2v7HH39Y3N3dbc4JAAAAqtelrmFdXV0tS5cutY670utNi8ViiYuLszg5OVm2bt1qee+99yySLAkJCTbHRUVFWSRZxo4da20rLS21DBgwwOLi4mI5ceKEtf1/r1Pvuecei4uLi+XHH3+0tv3222+Wxo0bW3r37m1tK/vsL774osLnB0Dtxu3nAHCBxMREJScnX/QKCQm57HFNmjTR3r17dfjw4av+zM8++0zOzs4aN26cTftTTz0li8Vi3bly/fr1kqQnnnjCZtzYsWMvOffjjz9+UZu7u7v163PnziknJ0e9evWSJO3ateui8Y888oj1a2dnZ/Xo0UMWi0WjRo2ytjdp0kTt2rXTTz/9dMksAAAAqB4XXsMuX75cffv21SOPPKIPP/xQ0pVfb0rn70Dq2LGjoqKi9MQTT+gvf/nLRceViYmJsX5tMpkUExOjwsJCbdq0qdzxJSUl2rhxo+655x5de+211nZfX189+OCD+vLLL2U2myt8HgDULdx+DgAX6Nmzp81D1ss0bdq03NvSy0ybNk1333232rZtq06dOumOO+7QQw899KfFUEn6+eef5efnp8aNG9u0l91e8/PPP1v/6+TkpKCgIJtx11133SXn/t+x0vnnIk2dOlWrVq3S8ePHbfpyc3MvGh8QEGDz3tPTU25ubmrRosVF7f/7XE4AAABUv/+9hh0yZIi6deummJgY3XXXXVd8vSlJLi4uWrx4sW644Qa5ublpyZIlFz2eSJKcnJxsCpOS1LZtW0nS0aNHy8154sQJnT17Vu3atbuor3379iotLdWxY8fUsWPHK/vGAdRprNQEgCrQu3dv/fjjj1q8eLE6deqkt99+W927d9fbb79taK4LV2WW+fvf/6633npLjz/+uD788ENt3LjRugq0tLT0ovEXPjvpcm2SrujB8AAAAKheTk5O6tu3rzIzMyt0J9GGDRsknb+rpyLHA0BNoKgJAFWkWbNmGjFihFauXKljx44pJCTEZkfy8n7DLUmtW7fWb7/9ptOnT9u0HzhwwNpf9t/S0lIdOXLEZtwPP/xwxRn/+OMPpaSkaOLEiZo6daruvfde3X777Rf9lh0AAACOrbi4WJJ05syZK77elKTvv/9e06ZN04gRI9StWzc98sgj5d7NU1paetGjhw4dOiRJCgwMLDdTy5Yt1aBBAx08ePCivgMHDsjJyUn+/v6SLn3tDABlKGoCQBX439uuGzVqpOuuu04FBQXWtoYNG0qSTp06ZTP2zjvvVElJiebPn2/TPnfuXJlMJkVGRkqSIiIiJElvvPGGzbjXX3/9inOWrbD83xWVCQkJVzwHAAAA7FtRUZE2btwoFxcXtW/f/oqvN4uKijR8+HD5+flp3rx5Wrp0qbKzszVhwoRyP+fC+SwWi+bPn6/69evrtttuK3e8s7Oz+vfvr48//tjmFvXs7GytWLFCN998szw8PCRd+toZAMrwTE0AqAIdOnRQnz59FBoaqmbNmmnnzp16//33bR6eHhoaKkkaN26cIiIi5OzsrAceeEADBw5U37599dxzz+no0aPq0qWLNm7cqI8//ljjx49XmzZtrMcPGjRICQkJOnnypHr16qUtW7ZYfyN+Jb/N9vDwUO/evTVz5kwVFRXpmmuu0caNGy9a/QkA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kZGRoQEDBqhBgwby8vLS008/reLiYpsxmzdvVvfu3eXq6qrrrrtOS5cuvShLYmKiAgMD5ebmprCwMH3zzTfV8j0DAACgdrn55puVnp6u4uJide7cWRs3bpSXl5dSU1MVGhpqdDwAAIBaydCVmq1atdL06dN1/fXXy2KxaNmyZbr77rv17bffqmPHjpowYYLWrl2r9957T56enoqJidF9992nr776SpJUUlKiAQMGyMfHR9u2bVNmZqYefvhh1a9fX6+88ook6ciRIxowYIAef/xxvfPOO0pJSdEjjzwiX19fRURESJJWr16t2NhYJSUlKSwsTAkJCYqIiNDBgwfLfT4SAAAAcKE2bdrorbfeMjoGAABAnVGhlZrXXnutTp48eVH7qVOndO21117xPAMHDtSdd96p66+/Xm3bttXLL7+sRo0aafv27crNzdWiRYs0Z84c3XrrrQoNDdWSJUu0bds2bd++XZK0ceNG7du3T8uXL1fXrl0VGRmpF198UYmJiSosLJQkJSUlKSgoSLNnz1b79u0VExOjv/3tb5o7d641x5w5czR69GiNGDFCHTp0UFJSkho0aKDFixdX5PQAAACgDvnss8+0YcOGi9o3bNhgcxcSAAAAqk6FVmoePXpUJSUlF7UXFBTo119/rVCQkpISvffee8rLy1N4eLjS0tJUVFSkfv36WccEBwcrICBAqamp6tWrl1JTU9W5c2d5e3tbx0RERGjMmDHau3evunXrptTUVJs5ysaMHz9eklRYWKi0tDTFxcVZ+52cnNSvXz+lpqZeMm9BQYEKCgqs781mc4W+b0eWkZGhnJycSs3RokULBQQEVFEiAACAmjdx4kRNnz79onaLxaKJEycqMjLSgFQAAAC121UVNT/55BPr1xs2bJCnp6f1fUlJiVJSUhQYGHhVAXbv3q3w8HCdO3dOjRo10po1a9ShQwelp6fLxcVFTZo0sRnv7e2trKwsSVJWVpZNQbOsv6zvcmPMZrPy8/P1xx9/qKSkpNwxBw4cuGTu+Ph4TZ069aq+19okIyNDwcHtlZ9/tlLzuLs30IED+ylsAgAAh3X48GF16NDhovbg4GD98MMPBiQCAACo/a6qqHnPPfdIkkwmk6Kiomz66tevr8DAQM2ePfuqArRr107p6enKzc3V+++/r6ioKIfYJTIuLk6xsbHW92azWf7+/gYmqlk5OTnKzz+rsJGT5eEbWKE5zJlH9fXiqcrJyaGoCQAAHJanp6d++umni365/8MPP6hhw4bGhAIAAKjlrqqoWVpaKkkKCgrSjh071KJFi0oHcHFx0XXXXSdJCg0N1Y4dOzRv3jzdf//9Kiws1KlTp2xWa2ZnZ8vHx0eS5OPjc9Eu5WW7o1845n93TM/OzpaHh4fc3d3l7OwsZ2fncseUzVEeV1dXubq6VuybrkU8fAPVLKCd0TEAAAAMc/fdd2v8+PFas2aN2rRpI+l8QfOpp57SX//6V4PTAQAA1E4V2ijoyJEjVVLQLE9paakKCgoUGhqq+vXrKyUlxdp38OBBZWRkKDw8XJIUHh6u3bt36/jx49YxycnJ8vDwsN4CFB4ebjNH2ZiyOVxcXBQaGmozprS0VCkpKdYxAAAAwKXMnDlTDRs2VHBwsIKCghQUFKT27durefPmevXVV42OBwAAUCtVaKMgSUpJSVFKSoqOHz9uXcFZ5kp3DY+Li1NkZKQCAgJ0+vRprVixQps3b7Y+r3PUqFGKjY1Vs2bN5OHhobFjxyo8PFy9evWSJPXv318dOnTQQw89pJkzZyorK0vPP/+8oqOjrasoH3/8cc2fP1/PPPOMRo4cqc8//1zvvvuu1q5da80RGxurqKgo9ejRQz179lRCQoLy8vI0YsSIip4eAHZm//79lTqeTa0AAJfi6empbdu2KTk5Wd99953c3d0VEhKi3r17Gx0NAACg1qpQUXPq1KmaNm2aevToIV9fX5lMpgp9+PHjx/Xwww8rMzNTnp6eCgkJ0YYNG3T77bdLkubOnSsnJycNGjRIBQUFioiI0BtvvGE93tnZWZ9++qnGjBmj8PBwNWzYUFFRUZo2bZp1TFBQkNauXasJEyZo3rx5atWqld5++21FRERYx9x///06ceKEJk2apKysLHXt2lXr16+/aPMgAI4nP/ekJJOGDRtWqXnY1AoAcDkmk0n9+/dX//79jY4CAABQJ1SoqJmUlKSlS5fqoYceqtSHL1q06LL9bm5uSkxMVGJi4iXHtG7dWp999tll5+nTp4++/fbby46JiYlRTEzMZccAcDxFZ09Lsqjrg8+qZVBwheZgUysAwJ+piruYAAAAcOUqVNQsLCzUjTfeWNVZAKDaNPIKYFMrAEC1qKq7mAAAAHDlKlTUfOSRR7RixQq98MILVZ0HAAAAcChVdRcTAAAArlyFiprnzp3Tm2++qU2bNikkJET169e36Z8zZ06VhAMAAADsHXcxAQAA1Dynihz0/fffq2vXrnJyctKePXv07bffWl/p6elVHBEAAACwX2V3MVW16dOny2Qyafz48VU+NwAAgKOr0ErNL774oqpzAAAAAA6pOu5i2rFjhxYuXKiQkJCqigkAAFCrVKioCQAAAOC8sruYJGnPnj02fRXZNOjMmTMaOnSo3nrrLb300ktVEREAAKDWqVBRs2/fvpe9QPv8888rHAgAAABwJFV9F1N0dLQGDBigfv36/WlRs6CgQAUFBdb3ZrO5SrMAAADYqwoVNct+E12mqKhI6enp2rNnj6KioqoiFwAAAFDnrFq1Srt27dKOHTuuaHx8fLymTp1azakAAADsT4WKmnPnzi23fcqUKTpz5kylAgGObP/+/ZU6vkWLFgoICKiiNAAAoKbs3LlT7777rjIyMlRYWGjT9+GHH17RHMeOHdOTTz6p5ORkubm5XdExcXFxio2Ntb43m83y9/e/8uAAAAAOqkqfqTls2DD17NlTr776alVOC9i9/NyTkkwaNmxYpeZxd2+gAwf2U9gEAMCBrFq1Sg8//LAiIiK0ceNG9e/fX4cOHVJ2drbuvffeK54nLS1Nx48fV/fu3a1tJSUl2rp1q+bPn6+CggI5OzvbHOPq6ipXV9cq+14AAAAcRZUWNVNTU6/4t8pAbVJ09rQki7o++KxaBgVXaA5z5lF9vXiqcnJyKGoCAOBAXnnlFc2dO1fR0dFq3Lix5s2bp6CgID322GPy9fW94nluu+027d6926ZtxIgRCg4O1rPPPntRQRMAAKAuq1BR87777rN5b7FYlJmZqZ07d+qFF16okmCAI2rkFaBmAe2MjgEAAGrQjz/+qAEDBkiSXFxclJeXJ5PJpAkTJujWW2+94mdeNm7cWJ06dbJpa9iwoZo3b35ROwAAQF1XoaKmp6enzXsnJye1a9dO06ZNU//+/askGAAAAOAImjZtqtOnT0uSrrnmGu3Zs0edO3fWqVOndPbsWYPTAQAA1E4VKmouWbKkqnMAAAAADql3795KTk5W586dNXjwYD355JP6/PPPlZycrNtuu61Sc2/evLlqQgIAANQylXqmZlpamnW3544dO6pbt25VEgp1S2V2DK/sbuMAAACVNX/+fJ07d06S9Nxzz6l+/fratm2bBg0apOeff97gdAAAALVThYqax48f1wMPPKDNmzerSZMmkqRTp06pb9++WrVqlVq2bFmVGVFLVdWO4ZJUVFBY+UAAAAAV0KxZM+vXTk5OmjhxooFpAAAA6oYKFTXHjh2r06dPa+/evWrfvr0kad++fYqKitK4ceO0cuXKKg2J2qkqdgzP3J2qPZ+8qeLi4qoNBwAAcIWcnZ2VmZkpLy8vm/aTJ0/Ky8tLJSUlBiUDAACovSpU1Fy/fr02bdpkLWhKUocOHZSYmMhGQbhqldkx3Jx5tGrDAAAAXCWLxVJue0FBgVxcXGo4DQAAQN1QoaJmaWmp6tevf1F7/fr1VVpaWulQAAAAgL177bXXJEkmk0lvv/22GjVqZO0rKSnR1q1bFRxcsbtRAAAAcHkVKmreeuutevLJJ7Vy5Ur5+flJkn799VdNmDCh0js8AgAAAI5g7ty5ks6v1ExKSpKzs7O1z8XFRYGBgUpKSjIqHgAAQK1WoaLm/Pnz9de//lWBgYHy9/eXJB07dkydOnXS8uXLqzQgAAAAYI+OHDkiSerbt68+/PBDNW3a1OBEAAAAdUeFipr+/v7atWuXNm3apAMHDkiS2rdvr379+lVpOAAAAMDeffHFFzbvS0pKtHv3brVu3ZpCJwAAQDVxuprBn3/+uTp06CCz2SyTyaTbb79dY8eO1dixY3XDDTeoY8eO+s9//lNdWQEAAAC7M378eC1atEjS+YJm79691b17d/n7+2vz5s3GhgMAAKilrqqomZCQoNGjR8vDw+OiPk9PTz322GOaM2dOlYUDAAAA7N17772nLl26SJL+/e9/6+jRozpw4IAmTJig5557zuB0AAAAtdNVFTW/++473XHHHZfs79+/v9LS0iodCgAAAHAUJ0+elI+PjyTps88+0+DBg9W2bVuNHDlSu3fvNjgdAABA7XRVRc3s7GzVr1//kv316tXTiRMnKh0KAAAAcBTe3t7at2+fSkpKtH79et1+++2SpLNnz9rsiA4AAICqc1VFzWuuuUZ79uy5ZP/3338vX1/fSocCAAAAHMWIESP097//XZ06dZLJZLJunvn1118rODjY4HQAAAC101Xtfn7nnXfqhRde0B133CE3Nzebvvz8fE2ePFl33XVXlQYEAAAA7NmUKVPUqVMnHTt2TIMHD5arq6skydnZWRMnTjQ4HQAAQO10VUXN559/Xh9++KHatm2rmJgYtWvXTpJ04MABJSYmqqSkhIehAwAAoM7529/+dlFbVFSUAUkAAADqhqsqanp7e2vbtm0aM2aM4uLiZLFYJEkmk0kRERFKTEyUt7d3tQQFAAAA7MVrr72mRx99VG5ubnrttdcuO3bcuHE1lAoAAKDuuKqipiS1bt1an332mf744w/98MMPslgsuv7669W0adPqyAcAAADYnblz52ro0KFyc3PT3LlzLznOZDJR1AQAAKgGV13ULNO0aVPdcMMNVZkFAAAAcAhHjhwp92sAAADUjAoXNQEAAIC6KjY29orGmUwmzZ49u5rTAAAA1D0UNQEAAICr9O2339q837Vrl4qLi60baR46dEjOzs4KDQ01Ih4AAECtR1ETAAAAuEpffPGF9es5c+aocePGWrZsmfU583/88YdGjBihW265xaiIAAAAtZqT0QEAAAAARzZ79mzFx8fbbJzZtGlTvfTSS9x6DgAAUE0oagIAAACVYDabdeLEiYvaT5w4odOnTxuQCAAAoPajqAkAAABUwr333qsRI0boww8/1C+//KJffvlFH3zwgUaNGqX77rvP6HgAAAC1EkVNAAAAoBKSkpIUGRmpBx98UK1bt1br1q314IMP6o477tAbb7xxxfMsWLBAISEh8vDwkIeHh8LDw7Vu3bpqTA4AAOC42CgIAAAAqIQGDRrojTfe0KxZs/Tjjz9Kktq0aaOGDRte1TytWrXS9OnTdf3118tisWjZsmW6++679e2336pjx47VER0AAMBhUdQEAAAAqkDDhg0VEhJS4eMHDhxo8/7ll1/WggULtH37doqaAAAA/4OiJgAAAGBnSkpK9N577ykvL0/h4eGXHFdQUKCCggLre7PZXBPxAAAADMczNQEAAAA7sXv3bjVq1Eiurq56/PHHtWbNGnXo0OGS4+Pj4+Xp6Wl9+fv712BaAAAA47BSEwAAALAT7dq1U3p6unJzc/X+++8rKipKW7ZsuWRhMy4uTrGxsdb3ZrO51hY2LRaLzp07Z3QMoM668O8ffxcB47m5uclkMhkdw1AUNQEAAAA74eLiouuuu06SFBoaqh07dmjevHlauHBhueNdXV3l6upakxENc+7cOUVGRhodA4Cke++91+gIQJ23bt06ubu7Gx3DUNx+DgAAANip0tJSm2dmAgAA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amV0nBrn4uKi6667TpIUGhqqHTt2aN68eVq4cKHByWpGWlqajh8/ru7du1vbSkpKtHXrVs2fP18FBQVydnY2MKExmjRporZt2+qHH34wOkqN8fX1vaiY3759e33wwQcGJTLWzz//rE2bNunDDz80OkqNe/rppzVx4kQ98MADkqTOnTvr559/Vnx8PEVNAAAA1Fo8U9POubi4KDQ0VCkpKda20tJSpaSk1MnnCNZlFotFMTExWrNmjT7//HMFBQUZHckulJaWqqCgwOgYNea2227T7t27lZ6ebn316NFDQ4cOVXp6ep0saErnN0768ccf5evra3SUGnPTTTfp4MGDNm2HDh1S69atDUpkrCVLlsjLy0sDBgwwOkqNO3v2rJycbC/pnJ2dVVpaalAiAAAAoPqxUtMBxMbGKioqSj169FDPnj2VkJCgvLw8jRgxwuhoNebMmTM2K7COHDmi9PR0NWvWTAEBAQYmqznR0dFasWKFPv74YzVu3FhZWVmSJE9PT7m7uxucrmbExcUpMjJSAQEBOn36tFasWKHNmzdrw4YNRkerMY0bN77oOaoNGzZU8+bN69TzVf/xj39o4MCBat26tX777TdNnjxZzs7OGjJkiNHRasyECRN044036pVXXtHf//53ffPNN3rzzTf15ptvGh2txpWWlmrJkiWKiopSvXp179Jm4MCBevnllxUQEKCOHTvq22+/1Zw5czRy5EijowEAAADVxmSxWCxGh8Cfmz9/vmbNmqWsrCx17dpVr732msLCwoyOVWM2b96svn37XtQeFRWlpUuX1nwgA1xqJ98lS5bUmU0xRo0apZSUFGVmZsrT01MhISF69tlndfvttxsdzVB9+vRR165dlZCQYHSUGvPAAw9o69atOnnypFq2bKmbb75ZL7/8stq0aWN0tBr16aefKi4uTocPH1ZQUJBiY2M1evRoo2PVuI0bNyoiIkIHDx5U27ZtjY5T406fPq0XXnhBa9as0fHjx+Xn56chQ4Zo0qRJcnFxMToeAAAAUC0oagIAAAAAAABwKDxTEwAAAAAAAIBDoagJAAAAAAAAwKFQ1AQAAAAAAADgUChqAgAAAAAAAHAoFDUBAAAAAAAAOBSKmgAAAAAAAAAcCkVNAAAAAAAAAA6FoiYAAAAAAAAAh0JREwCqWJ8+fTR+/HhJUmBgoBISEgzNAwAAAABAbUNREwCq0Y4dO/Too49e0VgKoAAAAAAAXJl6RgcAgNqsZcuWRkcAAAAAAKDWYaUmAFRCXl6eHn74YTVq1Ei+vr6aPXu2Tf+Fqy8tFoumTJmigIAAubq6ys/PT+PGjZN0/pb1n3/+WRMmTJDJZJLJZJIknTx5UkOGDNE111yjBg0aqHPnzlq5cqXNZ/Tp00fjxo3TM888o2bNmsnHx0dTpkyxGXPq1Ck99thj8vb2lpubmzp16qRPP/3U2v/ll1/qlltukbu7u/z9/TVu3Djl5eVV8dkCAAAAAKBqUNQEgEp4+umntWXLFn388cfauHGjNm/erF27dpU79oMPPtDcuXO1cOFCHT58WB999JE6d+4sSfrwww/VqlUrTZs2TZmZmcrMzJQknTt3TqGhoVq7dq327NmjRx99VA899JC++eYbm7mXLVumhg0b6uuvv9bMmTM1bdo0JScnS5JKS0sVGRmpr776SsuXL9e+ffs0ffp0OTs7S5J+/PFH3XHHHRo0aJC+//57rV69Wl9++aViYmKq67QBAAAAAFApJovFYjE6BAA4ojNnzqh58+Zavny5Bg8eLEn6/fff1apVKz366KNKSEhQYGCgxo8fr/Hjx2vOnDlauHCh9uzZo/r1618034VjL+euu+5ScHCwXn31VUnnV2qWlJToP//5j3VMz549deutt2r69OnauHGjIiMjtX//frVt2/ai+R555BE5Oztr4cKF1rYvv/xSf/nLX5SXlyc3N7eKnB4AAAAAAKoNKzUBoIJ+/PFHFRYWKiwszNrWrFkztWvXrtzxgwcPVn5+vq699lqNHj1aa9asUXFx8WU/o6SkRC+++KI6d+6sZs2aqVGjRtqwYYMyMjJsxoWEhNi89/X11fHjxyVJ6enpatWqVbkFTUn67rvvtHTpUjVq1Mj6ioiIUGlpqY4cOfKn5wEAAAAAgJrGRkEAUEP8/f118OBBbdq0ScnJyXriiSc0a9YsbdmypdyVm5I0a9YszZs3TwkJCercubMaNmyo8ePHq7Cw0Gbc/x5vMplUWloqSXJ3d79srjNnzuixxx6zPt/zQgEBAVfzLQIAAAAAUCMoagJABbVp00b169fX119/bS3+/fHHHzp06JD+8pe/lHuMu7u7Bg4cqIEDByo6OlrBwcHavXu3unfvLhcXF5WUlNiM/+qrr3T33Xdr2LBhks4/H/PQoUPq0KHDFecMCQnRL7/8okOHDpW7WrN79+7at2+frrvuuiueEwAAAAAAI3H7OQBUUKNGjTRq1Cg9/fTT+vzzz7Vnzx4NHz5cTk7l/9O6dOlSLVq0SHv27NFPP/2k5cuXy93dXa1bt5Z0/pmaW7du1a+//qqcnBxJ0vXXX6/k5GRt27ZN+/fv12OPPabs7OyryvmXv/xFvXv31qBBg5ScnKwjR45o3bp1Wr9+vSTp2Wef1bZt2xQTE6P09HQdPnxYH3/8MRsFAQAAAADsFkVNAKiEWbNm6ZZbbtHAgQPVr18/3XzzzQoNDS13bJMmTfTWW2/ppptuUkhIiDZt2qR///vfat68uSRp2rRpOnr0qNq0aaOWLVtKkp5//nl1795dERER6tOnj3x8fHTPPfdcdc4PPvhAN9xwg4YMGaIOHTromWeesa4KDQkJ0ZYtW3To0CHdcsst6tatmyZNmiQ/P7+KnRQAAAAAAKoZu58DAAAAAAAAcCis1AQAAAAAAADgUChqAgAAAAAAAHAoFDUBAAAAAAAAOBSKmgAAAAAAAAAcCkVNAAAAAAAAAA6FoiYAAAAAAAAAh0JREwAAAAAAAIBDoagJAAAAAAAAwKFQ1AQAAAAAAADgUChqAgAAAAAAAHAoFDUBAAAAAAAAOJT/D8D8C7+Z62XlAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "diagnostic_plots(x_train, 'distance')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "there is outlier in `distance` column" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "capping the outliers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "windsoriser = Winsorizer(capping_method='iqr', # choose iqr for IQR rule boundaries or gaussian for mean and std\n", + " tail='both', # cap left, right or both tails \n", + " fold=1.5,\n", + " variables=['distance'])\n", + "\n", + "windsoriser.fit(x_train_t)\n", + "\n", + "x_train_cap = windsoriser.transform(x_train_t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Left Tail Caps : {'distance': -1.195}\n", + "Right Tail Caps : {'distance': 5.405}\n" + ] + } + ], + "source": [ + "# Inspect the minimum caps for each variable\n", + "print('Left Tail Caps : ', windsoriser.left_tail_caps_)\n", + "\n", + "# Iinspect the maximum caps for each variable\n", + "print('Right Tail Caps : ', windsoriser.right_tail_caps_)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now see the different between before and after capping" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before Capping\n", + " distance\n", + "count 446583.00000\n", + "mean 2.19019\n", + "std 1.13540\n", + "min 0.02000\n", + "25% 1.28000\n", + "50% 2.16000\n", + "75% 2.93000\n", + "max 7.86000\n", + "\n", + "After Capping\n", + " distance\n", + "count 446583.000000\n", + "mean 2.181211\n", + "std 1.103221\n", + "min 0.020000\n", + "25% 1.280000\n", + "50% 2.160000\n", + "75% 2.930000\n", + "max 5.405000\n" + ] + } + ], + "source": [ + "print('Before Capping')\n", + "print(x_train_t.describe())\n", + "print('')\n", + "print('After Capping')\n", + "print(x_train_cap.describe())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "there is no more outliers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABTUAAAGJCAYAAABbzteIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABbxElEQVR4nO3de1xVdaL///cG5eIFFJHbCEJa4g1NTKSL44UkMifL8ZRmkZpWA5Yy44UyFeuMjuWt0aSmjM6vSGtOWpOKIqbmiKYYeUNL08ESUCxBEbnu3x992ccdagrI2htez8djP2Kv9Vmf/d7LGte8WReT2Ww2CwAAAAAAAADshIPRAQAAAAAAAADgRlBqAgAAAAAAALArlJoAAAAAAAAA7AqlJgAAAAAAAAC7QqkJAAAAAAAAwK5QagIAAAAAAACwK5SaAAAAAAAAAOwKpSYAAAAAAAAAu0KpCQAAAAAAAMCuUGoCQA0EBgbqySefNDoGAAAAYNNMJpNmz55tdAwADRClJgBISkpKkslk0p49e664vn///urWrVutPmPdunUc0AEAAKDOVB3DXv7y8vLSgAEDtH79eqPj1cqhQ4c0e/ZsnThxwugoAGxUE6MDAIA9OnLkiBwcbuz3QuvWrdOyZcsoNgEAAFCn5syZo6CgIJnNZuXl5SkpKUn333+//vWvf+mBBx4wOl6NHDp0SAkJCerfv78CAwONjgPABlFqAkANODs7Gx3hhhUVFal58+ZGxwAAAEAdi4qKUu/evS3vx40bJ29vb3344Yd2W2oCwG/h8nMAqIFf31OzrKxMCQkJuvXWW+Xi4qI2bdro7rvvVmpqqiTpySef1LJlyyTJ6vKgKkVFRfrzn/8sf39/OTs7q1OnTnrttddkNputPre4uFjPPfecPD091bJlS/3hD3/Qjz/+WO1eRbNnz5bJZNKhQ4c0atQotW7dWnfffbckad++fXryySd1yy23yMXFRT4+Pho7dqzOnj1r9VlVc3z77bcaPXq03N3d1bZtW7300ksym806efKkHnzwQbm5ucnHx0cLFiyoy10MAACAGmrVqpVcXV3VpMn/ncf0W8ebxcXFCg4OVnBwsIqLiy3b/fTTT/L19dWdd96piooKSb8c27Zo0ULff/+9IiMj1bx5c/n5+WnOnDnVjl+v5Ouvv1ZUVJTc3NzUokULDRo0SDt37rSsT0pK0ogRIyRJAwYMsBw7b9mypS52D4AGgjM1AeAyBQUFys/Pr7a8rKzsmtvNnj1bc+fO1VNPPaU+ffqosLBQe/bs0d69e3Xvvffq6aef1qlTp5Samqr/7//7/6y2NZvN+sMf/qAvvvhC48aNU8+ePbVhwwZNmTJFP/74oxYtWmQZ++STT+qjjz7S448/rr59+2rr1q0aMmTIVXONGDFCt956q/76179aDjBTU1P1/fffa8yYMfLx8dHBgwf11ltv6eDBg9q5c6dV2SpJjzzyiDp37qx58+Zp7dq1euWVV+Th4aE333xTAwcO1N/+9jd98MEH+stf/qI77rhD/fr1+839DAAAgLpTdQxrNpt1+vRp/f3vf9eFCxc0evRoSdd3vOnq6qr33ntPd911l1588UUtXLhQkhQTE6OCggIlJSXJ0dHR8pkVFRW677771LdvX82fP18pKSmaNWuWysvLNWfOnKtmPXjwoO655x65ublp6tSpatq0qd588031799fW7duVVhYmPr166fnnntOr7/+ul544QV17txZkiz/BABJkhkAYH733XfNkq756tq1q2V8+/btzdHR0Zb3PXr0MA8ZMuSanxETE2O+0v/srlmzxizJ/Morr1gt/+Mf/2g2mUzmo0ePms1mszkjI8MsyTxp0iSrcU8++aRZknnWrFmWZbNmzTJLMo8cObLa5128eLHasg8//NAsybxt27Zqc0yYMMGyrLy83NyuXTuzyWQyz5s3z7L8559/Nru6ulrtEwAAANxcVzuGdXZ2NiclJVnGXe/xptlsNsfHx5sdHBzM27ZtM3/88cdmSebFixdbbRcdHW2WZJ44caJlWWVlpXnIkCFmJycn85kzZyzLf32cOmzYMLOTk5P52LFjlmWnTp0yt2zZ0tyvXz/LsqrP/uKLL2q8fwA0bFx+DgCXWbZsmVJTU6u9QkJCrrldq1atdPDgQX333Xc3/Jnr1q2To6OjnnvuOavlf/7zn2U2my1PrkxJSZEk/elPf7IaN3HixKvO/cwzz1Rb5urqavn50qVLys/PV9++fSVJe/furTb+qaeesvzs6Oio3r17y2w2a9y4cZblrVq1UqdOnfT9999fNQsAAABujsuPYd9//30NGDBATz31lD755BNJ13+8Kf1yBVLXrl0VHR2tP/3pT/r9739fbbsqsbGxlp9NJpNiY2NVWlqqTZs2XXF8RUWFNm7cqGHDhumWW26xLPf19dWoUaO0fft2FRYW1ng/AGhcuPwcAC7Tp08fq5usV2nduvUVL0uvMmfOHD344IO67bbb1K1bN9133316/PHHf7MMlaT//Oc/8vPzU8uWLa2WV11e85///MfyTwcHBwUFBVmN69ix41Xn/vVY6Zf7IiUkJGjlypU6ffq01bqCgoJq4wMCAqzeu7u7y8XFRZ6entWW//q+nAAAALj5fn0MO3LkSN1+++2KjY3VAw88cN3Hm5Lk5OSkFStW6I477pCLi4vefffdarcnkiQHBwerYlKSbrvtNknSiRMnrpjzzJkzunjxojp16lRtXefOnVVZWamTJ0+qa9eu1/fFATRqnKkJAHWgX79+OnbsmFasWKFu3brp7bffVq9evfT2228bmuvyszKr/Nd//Zf+8Y9/6JlnntEnn3yijRs3Ws4CraysrDb+8nsnXWuZpOu6MTwAAABuLgcHBw0YMEA5OTk1upJow4YNkn65qqcm2wNAfaDUBIA64uHhoTFjxujDDz/UyZMnFRISYvVE8iv9hluS2rdvr1OnTun8+fNWyw8fPmxZX/XPyspKHT9+3Grc0aNHrzvjzz//rLS0NE2fPl0JCQl66KGHdO+991b7LTsAAADsW3l5uSTpwoUL1328KUn79u3TnDlzNGbMGN1+++166qmnrng1T2VlZbVbD3377beSpMDAwCtmatu2rZo1a6YjR45UW3f48GE5ODjI399f0tWPnQGgCqUmANSBX1923aJFC3Xs2FElJSWWZc2bN5cknTt3zmrs/fffr4qKCi1dutRq+aJFi2QymRQVFSVJioyMlCS98cYbVuP+/ve/X3fOqjMsf31G5eLFi697DgAAANi2srIybdy4UU5OTurcufN1H2+WlZXpySeflJ+fn5YsWaKkpCTl5eVp8uTJV/ycy+czm81aunSpmjZtqkGDBl1xvKOjowYPHqxPP/3U6hL1vLw8JScn6+6775abm5ukqx87A0AV7qkJAHWgS5cu6t+/v0JDQ+Xh4aE9e/bon//8p9XN00NDQyVJzz33nCIjI+Xo6KhHH31UQ4cO1YABA/Tiiy/qxIkT6tGjhzZu3KhPP/1UkyZNUocOHSzbDx8+XIsXL9bZs2fVt29fbd261fIb8ev5bbabm5v69eun+fPnq6ysTL/73e+0cePGamd/AgAAwH6sX7/ectbl6dOnlZycrO+++07Tp0+Xm5vbdR9vvvLKK8rMzFRaWppatmypkJAQzZw5UzNmzNAf//hH3X///ZbPdHFxUUpKiqKjoxUWFqb169dr7dq1euGFF9S2bdurZn3llVeUmpqqu+++W3/605/UpEkTvfnmmyopKdH8+fMt43r27ClHR0f97W9/U0FBgZydnTVw4EB5eXndpL0IwN5QagJAHXjuuef02WefaePGjSopKVH79u31yiuvaMqUKZYxDz/8sCZOnKiVK1fq/fffl9ls1qOPPioHBwd99tlnmjlzplatWqV3331XgYGBevXVV/XnP//Z6nP+53/+Rz4+Pvrwww+1evVqRUREaNWqVerUqZNcXFyuK2tycrImTpyoZcuWyWw2a/DgwVq/fr38/PzqdJ8AAACgfsycOdPys4uLi4KDg7V8+XI9/fTTknRdx5t79+7VX//6V8XGxmrAgAGW+aZPn65PP/1U48eP18GDB9WqVStJv5x1mZKSomeffVZTpkxRy5YtNWvWLKssV9K1a1d9+eWXio+P19y5c1VZWamwsDC9//77CgsLs4zz8fFRYmKi5s6dq3HjxqmiokJffPEFpSYAC5OZpzoAgF3LzMzU7bffrvfff1+PPfaY0XEAAADQwD355JP65z//qQsXLhgdBUAjxj01AcCOFBcXV1u2ePFiOTg4qF+/fgYkAgAAAACg/nH5OQDYkfnz5ysjI0MDBgxQkyZNtH79eq1fv14TJkywPCkSAAAAAICGjlITAOzInXfeqdTUVL388su6cOGCAgICNHv2bL344otGRwMAAAAAoN5wT00AAAAAAAAAdsXQe2ouX75cISEhcnNzk5ubm8LDw7V+/XrL+v79+8tkMlm9nnnmGas5srOzNWTIEDVr1kxeXl6aMmWKysvLrcZs2bJFvXr1krOzszp27KikpKRqWZYtW6bAwEC5uLgoLCxMX3311U35zgAAAAAAAABqx9BSs127dpo3b54yMjK0Z88eDRw4UA8++KAOHjxoGTN+/Hjl5ORYXvPnz7esq6io0JAhQ1RaWqodO3bovffeU1JSkmbOnGkZc/z4cQ0ZMkQDBgxQZmamJk2apKeeekobNmywjFm1apXi4uI0a9Ys7d27Vz169FBkZKROnz5dPzsCAAAAAAAAwHWzucvPPTw89Oqr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05w5c5STk6OcnBxJ0qVLlxQaGqq1a9fqwIEDmjBhgh5//HF99dVXVnO/9957at68uXbt2qX58+drzpw5Sk1NlSRVVlYqKipK//73v/X+++/r0KFDmjdvnhwdHSVJx44d03333afhw4dr3759WrVqlbZv367Y2NibtdsAAAAAAKgVk9lsNhsdAgDs0YULF9SmTRu9//77GjFihCTpp59+Urt27TRhwgQtXrxYgYGBmjRpkiZNmqSFCxfqzTff1IEDB9S0adNq810+9loeeOABBQcH67XXXpP0y5maFRUV+vLLLy1j+vTpo4EDB2revHnauHGjoqKilJWVpdtuu63afE899ZQcHR315ptvWpZt375dv//971VUVCQXF5ea7B4AAAAAAG4aztQEgBo6duyYSktLFRYWZlnm4eGhTp06XXH8iBEjVFxcrFtuuUXjx4/X6tWrVV5efs3PqKio0Msvv6zu3bvLw8NDLVq00IYNG5SdnW01LiQkxOq9r6+vTp8+LUnKzMxUu3btrlhoStI333yjpKQktWjRwvKKjIxUZWWljh8//pv7AQAAAACA+saDggCgnvj7++vIkSPatGmTUlNT9ac//Umvvvqqtm7desUzNyXp1Vdf1ZIlS7R48WJ1795dzZs316RJk1RaWmo17tfbm0wmVVZWSpJcXV2vmevChQt6+umnLff3vFxAQMCNfEUAAAAAAOoFpSYA1FCHDh3UtGlT7dq1y1L+/fzzz/r222/1+9///orbuLq6aujQoRo6dKhiYmIUHBys/fv3q1evXnJyclJFRYXV+H//+9968MEHNXr0aEm/3B/z22+/VZcuXa47Z0hIiH744Qd9++23Vzxbs1evXjp06JA6dux43XMCAAAAAGAkLj8HgBpq0aKFxo0bpylTpmjz5s06cOCAnnzySTk4XPl/WpOSkvTOO+/owIED+v777/X+++/L1dVV7du3l/TLPTW3bdumH3/8Ufn5+ZKkW2+9VampqdqxY4eysrL09NNPKy8v74Zy/v73v1e/fv00fPhwpaam6vjx41q/fr1SUlIkSdOmTdOOHTsUGxurzMxMfffdd/r00095UBAAAAAAwGZRagJALbz66qu65557NHToUEVEROjuu+9WaGjoFce2atVK//jHP3TXXXcpJCREmzZt0r/+9S+1adNGkjRnzhydOHFCHTp0UNu2bSVJM2bMUK9evRQZGan+/fvLx8dHw4YNu+Gc//u//6s77rhDI0eOVJcuXTR16lTLWaEhISHaunWrvv32W91zzz26/fbbNXPmTPn5+dVspwAAAAAAcJPx9HMAAAAAAAAAdoUzNQEAAAAAAADYFUpNAAAAAAAAAHaFUhMAAAAAAACAXaHUBAAAAAAAAGBXKDUBAAAAAAAA2BVKTQAAAAAAAAB2hVITAAAAAAAAgF2h1AQAAAAAAABgVyg1AQAAAAAAANgVSk0AAAAAAAAAdoVSEwAAAAAAAIBd+f8BRFeLxDqjNqQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "diagnostic_plots(x_train_cap, 'distance')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Feature Encoding" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now encode the categorical column using ordinal encoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[2., 2., 0.],\n", + " [4., 3., 0.],\n", + " [6., 2., 0.],\n", + " ...,\n", + " [2., 3., 0.],\n", + " [6., 6., 0.],\n", + " [5., 7., 0.]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#encoding\n", + "encoder = OrdinalEncoder()\n", + "encoder.fit(x_train_cat)\n", + "\n", + "x_train_cat_enc = encoder.transform(x_train_cat)\n", + "x_test_cat_enc = encoder.transform(x_test_cat)\n", + "\n", + "x_train_cat_enc" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Feature Scaling" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and scale the numerical column using minmaxscaler because the data is abnormal distribution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.09183673],\n", + " [0.43112245],\n", + " [0.38647959],\n", + " ...,\n", + " [0.32653061],\n", + " [0.35714286],\n", + " [0.07015306]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#scaling\n", + "scale = MinMaxScaler()\n", + "scale.fit(x_train_num)\n", + "\n", + "x_train_num_scale = scale.transform(x_train_num)\n", + "x_test_num_scale = scale.transform(x_test_num)\n", + "\n", + "x_train_num_scale" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Concat Feature Numberic and Categorial Columns" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "now concate the the train and test data that we had scale and encode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train_final = np.concatenate([x_train_num_scale, x_train_cat_enc], axis=1)\n", + "x_test_final = np.concatenate([x_test_num_scale, x_test_cat_enc], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "
distanceiconnamecab_type
00.0918372.02.00.0
10.4311224.03.00.0
20.3864806.02.00.0
30.5688781.011.01.0
40.0752551.011.01.0
...............
4465780.0676022.00.01.0
4465790.1887766.011.01.0
4465800.3265312.03.00.0
4465810.3571436.06.00.0
4465820.0701535.07.00.0
\n", + "

446583 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " distance icon name cab_type\n", + "0 0.091837 2.0 2.0 0.0\n", + "1 0.431122 4.0 3.0 0.0\n", + "2 0.386480 6.0 2.0 0.0\n", + "3 0.568878 1.0 11.0 1.0\n", + "4 0.075255 1.0 11.0 1.0\n", + "... ... ... ... ...\n", + "446578 0.067602 2.0 0.0 1.0\n", + "446579 0.188776 6.0 11.0 1.0\n", + "446580 0.326531 2.0 3.0 0.0\n", + "446581 0.357143 6.0 6.0 0.0\n", + "446582 0.070153 5.0 7.0 0.0\n", + "\n", + "[446583 rows x 4 columns]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train_final_concat = pd.DataFrame(x_train_final, columns=[num_col+cat_col])\n", + "x_train_final_concat" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Definition" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "for define the model we use linear regression because there are correlation between feature and target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#linear regression\n", + "linreg = LinearRegression()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "LinearRegression()" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#fit the model\n", + "linreg.fit(x_train_final, y_train)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([26.97765839, 5.89859759, 15.46590186, ..., 20.8248816 ,\n", + " 13.62962365, 24.47149278])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_train = linreg.predict(x_train_final)\n", + "y_pred_test = linreg.predict(x_test_final)\n", + "\n", + "y_pred_test" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "count the r^2 score and the mean absolute error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "r2 score = 0.4702994909626852\n", + "r2 score = 0.47295163874958046\n", + "MAE = 5.301177482449108\n", + "MAE = 5.288114092458786\n" + ] + } + ], + "source": [ + "print('r2 score = ', r2_score(y_train, y_pred_train))\n", + "print('r2 score = ', r2_score(y_test, y_pred_test))\n", + "print('MAE = ', mean_absolute_error(y_train, y_pred_train))\n", + "print('MAE = ', mean_absolute_error(y_test, y_pred_test))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "for the `r2 score` getting closer to 1 is the better of our data and for for `mae` the farther away from 1 the worse is our data " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Saving" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "last save the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#save model\n", + "\n", + "with open('model_lin_reg.pkl', 'wb') as file_1:\n", + " joblib.dump(linreg, file_1)\n", + "\n", + "with open('model_scaler.pkl', 'wb') as file_2:\n", + " joblib.dump(scale, file_2)\n", + "\n", + "with open('model_encoder.pkl', 'wb') as file_3:\n", + " joblib.dump(encoder, file_3)\n", + "\n", + "with open('list_num_cols.txt', 'wb') as file_4:\n", + " joblib.dump(num_col, file_4)\n", + "\n", + "with open('list_cat_cols.txt', 'wb') as file_5:\n", + " joblib.dump(cat_col, file_5)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conceptual Problems" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Sebutkan dan jelaskan asumsi yang dipakai oleh Linear Regression !\n", + "2. Tunjukkan dan tafsirkan arti dari coefficient dan slope yang didapat dari model yang telah Anda bangun !" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. I use the linear regression because there are correlation between the independent variables which is the feature and dependent variables which us the target\n", + "2. slope is the gradien of a line that linking the x and y" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "the data is not to good for modeling because of the r2 score is 0.4 and the mae is 5.3 that means we got many error. but the inference that we got from random generate sample is quite good beacuse the the result of the target after predicted is around the target from our raw dataset." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "7679c2132d3f6ce38c9df14d554b39c06862b36a4e6689c81f9ae15bd0911d7d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}