{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "e137a255-49bf-837d-8511-a49e6c84aef7"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.6/site-packages/sklearn/cross_validation.py:43: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import xgboost\n",
    "import math\n",
    "from __future__ import division\n",
    "from scipy.stats import pearsonr\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn import cross_validation, tree, linear_model\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import explained_variance_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "fae38191-489d-ba9c-858c-f0b09d028f13"
   },
   "source": [
    "# 1. Exploratory Data Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "_cell_guid": "fe625774-6184-5cb2-819c-ff840e08e392"
   },
   "outputs": [],
   "source": [
    "# Read the data into a data frame\n",
    "data = pd.read_csv('../input/kc_house_data.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "_cell_guid": "f9afd217-a50b-9f37-755d-072af53522ca"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "21613\n",
      "21\n",
      "[dtype('int64') dtype('O') dtype('float64')]\n"
     ]
    }
   ],
   "source": [
    "# Check the number of data points in the data set\n",
    "print(len(data))\n",
    "# Check the number of features in the data set\n",
    "print(len(data.columns))\n",
    "# Check the data types\n",
    "print(data.dtypes.unique())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "c2021183-8a42-5787-bff7-da3181c08fb7"
   },
   "source": [
    "- Since there are Python objects in the data set, we may have some categorical features. Let's check them. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "_cell_guid": "608870cd-16d1-0f6f-9594-603c455da8a5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['date']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.select_dtypes(include=['O']).columns.tolist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "a8199e20-8553-da22-4b75-99f6fbc60523"
   },
   "source": [
    "- We only have the date column which is a timestamp that we will ignore."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "_cell_guid": "c9d01805-192d-06f0-5e0a-aff8f7bb75bf"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  /  21\n",
      "0  /  21613\n"
     ]
    }
   ],
   "source": [
    "# Check any number of columns with NaN\n",
    "print(data.isnull().any().sum(), ' / ', len(data.columns))\n",
    "# Check any number of data points with NaN\n",
    "print(data.isnull().any(axis=1).sum(), ' / ', len(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "619e716e-efcf-3c50-3b5c-5b8826967619"
   },
   "source": [
    "- The data set is pretty much structured and doesn't have any NaN values. So we can jump into finding correlations between the features and the target variable"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "c041ee9f-937b-5df2-100c-4ef6d4f39c3d"
   },
   "source": [
    "# 2. Correlations between features and target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "_cell_guid": "71b41bea-27dc-ff5f-d2ba-caa214ed661a"
   },
   "outputs": [],
   "source": [
    "features = data.iloc[:,3:].columns.tolist()\n",
    "target = data.iloc[:,2].name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "_cell_guid": "ccdb0159-6285-29e1-7ecc-fdd34442519c"
   },
   "outputs": [],
   "source": [
    "correlations = {}\n",
    "for f in features:\n",
    "    data_temp = data[[f,target]]\n",
    "    x1 = data_temp[f].values\n",
    "    x2 = data_temp[target].values\n",
    "    key = f + ' vs ' + target\n",
    "    correlations[key] = pearsonr(x1,x2)[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "_cell_guid": "a5861b15-d8b3-76bf-9903-31995a68cd41"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sqft_living vs price</th>\n",
       "      <td>0.702035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>grade vs price</th>\n",
       "      <td>0.667434</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sqft_above vs price</th>\n",
       "      <td>0.605567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sqft_living15 vs price</th>\n",
       "      <td>0.585379</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bathrooms vs price</th>\n",
       "      <td>0.525138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>view vs price</th>\n",
       "      <td>0.397293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sqft_basement vs price</th>\n",
       "      <td>0.323816</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bedrooms vs price</th>\n",
       "      <td>0.308350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>lat vs price</th>\n",
       "      <td>0.307003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>waterfront vs price</th>\n",
       "      <td>0.266369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>floors vs price</th>\n",
       "      <td>0.256794</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>yr_renovated vs price</th>\n",
       "      <td>0.126434</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sqft_lot vs price</th>\n",
       "      <td>0.089661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sqft_lot15 vs price</th>\n",
       "      <td>0.082447</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>yr_built vs price</th>\n",
       "      <td>0.054012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>zipcode vs price</th>\n",
       "      <td>-0.053203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>condition vs price</th>\n",
       "      <td>0.036362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>long vs price</th>\n",
       "      <td>0.021626</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           Value\n",
       "sqft_living vs price    0.702035\n",
       "grade vs price          0.667434\n",
       "sqft_above vs price     0.605567\n",
       "sqft_living15 vs price  0.585379\n",
       "bathrooms vs price      0.525138\n",
       "view vs price           0.397293\n",
       "sqft_basement vs price  0.323816\n",
       "bedrooms vs price       0.308350\n",
       "lat vs price            0.307003\n",
       "waterfront vs price     0.266369\n",
       "floors vs price         0.256794\n",
       "yr_renovated vs price   0.126434\n",
       "sqft_lot vs price       0.089661\n",
       "sqft_lot15 vs price     0.082447\n",
       "yr_built vs price       0.054012\n",
       "zipcode vs price       -0.053203\n",
       "condition vs price      0.036362\n",
       "long vs price           0.021626"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_correlations = pd.DataFrame(correlations, index=['Value']).T\n",
    "data_correlations.loc[data_correlations['Value'].abs().sort_values(ascending=False).index]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "df828a29-f738-a88c-996f-b14bfea07e3b"
   },
   "source": [
    "- We can see that the top 5 features are the most correlated features with the target \"price\"\n",
    "- Let's plot the best 2 regressors jointly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "_cell_guid": "6c128db4-0179-cce8-44ec-d2ad8b300e1a"
   },
   "outputs": [],
   "source": [
    "y = data.loc[:,['sqft_living','grade',target]].sort_values(target, ascending=True).values\n",
    "x = np.arange(y.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "_cell_guid": "d01ee728-764b-f67d-3293-73fbc673c159"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEICAYAAACXo2mmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8HNW1wPHfUbdluciy5W7Z4IILGFcwvdsGYkpCSyh5\nJMALJSQkwRCSkEIoL0AgtBAgGAiYTkgA44bBFNvI4N57tyXLtorVdd4fMyutVrvalbTa1Urn+/ns\nR7N32p3r9ZyZe+/cEVXFGGOMCYe4aGfAGGNM62FBxRhjTNhYUDHGGBM2FlSMMcaEjQUVY4wxYWNB\nxRhjTNhYUDExRUQyReQzESkQkYejsP97ReSVSO/XJw+ni8jOaOahIUSkn4gUikh8tPNimp8FFRNx\nInKyiHwpIodFJE9EvhCRcSGufgOQC3RU1Ttawknem4ikicgjIrJVRIpEZLuIvCUiE6Kdt3Bxg1qV\nGygKRGSdiPww0PKqul1VO6hqZSTzaaLDgoqJKBHpCPwX+BuQDvQGfg+UhriJ/sBqbYFP7YpIMjAP\nGAlcAHQEjgFmAJMDrJMQsQyG125V7YBzjHcC/xCRYb4LxfDxmUayoGIibTCAqr6mqpWqWqyqs1R1\nOYCIxIvIX0QkV0Q2i8jNIqIikiAiLwLXAr9yr5IvAO4GLne/L/O3QxGZJiKb3Kvq1SJysde860Tk\nc3efB0Vki4hM9po/QEQ+ddedDWTUc2xXA32Ai1R1pXt8Rar6lqre67VNdY9rA7DBTXtMRHaISL6I\nLBGRU7yWbyciL7r5Ww3UuqsTkV4i8raI5Lj5vy1AOUwQkb3e1VAicrGIeMp+vIhku3nYJyKP1HOs\nAKjjPeAgMExEstzju15EtgPzvNIS3P2ki8g/RWS3e0zveeXnAhFZKiKH3LvZY4PlwbQwqmof+0Ts\ng3NlewCYjnP13sVn/k3AWqAvzp3MJ4ACCe78F4E/eS1/L/BKkH1+D+iFcxF1OVAE9HTnXQeUAz8G\n4oH/BXYD4s7/CngESAZOBQoC7Q/njuTFEMpAgdnu8bVz034AdAUSgDuAvUCKO+8BYIG7fF9gJbDT\nnRcHLAF+CyQBA4HNwHkB9r0JOMfr+5vANK9jvdqd7gCcEGAbp/vs/2K3DIcAWe7xvQSkAu280jz/\nhh8ArwNdgETgNDf9eGA/MMH9t7gW2AokR/t3a5/QP1HPgH3a3genSuhFYCdQAbwPZLrz5gE3eS17\nblODip/9LwWmutPXARu95rV399cD6OfmL9Vr/qv1BJU5wANe30cBh4B8YJ1XugJnBsnjQeA4d3oz\nMMlr3g1eJ/UJwHafde8C/hlgu38CXnCn03ACbH/3+2c4VZEZQfJ2OlDlHlueW55XuPM8AWSg1/LV\nQQXo6a7bxc92nwb+6JO2zhN07BMbH6v+MhGnqmtU9TpV7QOMwLmL+Ks7uxeww2vxbU3dn4hc41Wl\ncsjdp3c11l6vvB1xJzu4eTmoqkUh5ucAzknTs62lqtoZuATnTseb9zEiIr8QkTVu54VDQCevPNZX\nJv2BXp5jc9e9G8gMkMdXgUvc9p9LgG9U1bO963GqJ9eKyNdu9WIgu1W1s6qmq+ooVZ1R3/F56Qvk\nqepBP/P6A3f4HEtfnOM3McKCiokqVV2Lc/cxwk3ag3Mi8egXbBP1zRSR/sA/gFuAru5JfiUgIWRv\nD9BFRFJDzM9c4Fyf5QOpzrfbfvIr4DKcK/jOwGGvPNZXJjuALe4J3vNJU9UpfnequhonKE0GrsIJ\nMp55G1T1SqA78CDwVojHUu/x+dgBpItI5wDz7vM5lvaq+loj82CiwIKKiSgRGSoid4hIH/d7X+BK\nYKG7yBvAbSLSR0S6ANOCbHIfkCUigX7LqTgnuBx3fz+kJoDVy72CzwZ+LyJJInIycGE9q7yEEwDe\nFZERbqeDFGBskF2l4VSz5QAJIvJbnLYnjzeAu0Ski1tut3rNWwwUiMidboN+vLvv+rpovwr8FKeN\n6E1Pooj8QES6qaqnagucqqqwUdU9wEfAU+7xJIrIqe7sfwA3uR0KRERSReR8EUkLZx5M87KgYiKt\nAKcdYJGIFOEEk5U4jdPgnFg+BpYB3wDvBNme56R4QES+8Z3pXpk/jNMIvQ+nu+8XDcjvVW5+84Df\n4QQOv1S1BDgDWI3TGJ2P0yYwDucuJJCPgZnAepy7iBJqVx/93k3fAswCXvbaZyVO9+VR7vxc4Dmc\n6rNAXgNOA+apaq5X+iRglYgUAo/htJMU17Odxroap2F/LU7D/O0AqpqN02HiCZw2pY04bV4mhnh6\nuBjTIolIFs7JMlFVK6KbG2NMMHanYowxJmwsqBhjjAkbq/4yxhgTNnanYowxJmza3GBvGRkZmpWV\nFe1sGGNMTFmyZEmuqnYLtlybCypZWVlkZ2dHOxvGGBNTRCSk0S2s+ssYY1qxD5bvoag0cr3xLagY\nY0wrtXLXYW5+9RvueW9lxPZpQcUYY1qpQvcOZdeh5hgYwT8LKsYYY8LGgooxxrR2EXwc0YKKMca0\nUqG83yHcLKgYY4wJGwsqxhjTyuUUljL8tzN5/evtzb4vCyrGGNNKiTgVYJVVSlFZJZVhfeWafxZU\njDGmlatyBw6WCDSyWFAxxphWzjMYfZwFFWOMMU3lecWJRKA/mAUVY4xp5TyPqVj1lzHGmCaraVOJ\n4TsVEXlBRPaLyEqvtHQRmS0iG9y/Xbzm3SUiG0VknYic55U+RkRWuPMeF7dURCRZRF530xeJSFZz\nHYsxxsQiTwypaiVtKi8Ck3zSpgFzVXUQMNf9jogMA64AhrvrPCUi8e46TwM/Bga5H882rwcOqurR\nwKPAg812JMYYE8O0NfT+UtXPgDyf5KnAdHd6OnCRV/oMVS1V1S3ARmC8iPQEOqrqQnVK5SWfdTzb\negs4SyJxb2eMMTGm5k4lhqu/AshU1T3u9F4g053uDezwWm6nm9bbnfZNr7WOqlYAh4Gu/nYqIjeI\nSLaIZOfk5ITjOIwxpsXzhJBW0aYSjHvnEZGxM1X1WVUdq6pju3UL+oplY4xpVaqqPF2Km1+kg8o+\nt0oL9+9+N30X0NdruT5u2i532je91joikgB0Ag40W86NMSZGaSuu/nofuNadvhb4t1f6FW6PrgE4\nDfKL3aqyfBE5wW0vucZnHc+2vgvMU09rlDHGGK/eX5FrqE9org2LyGvA6UCGiOwEfgc8ALwhItcD\n24DLAFR1lYi8AawGKoCbVbXS3dRPcHqStQM+cj8AzwMvi8hGnA4BVzTXsRhjTCyrcKu/ItGluNmC\niqpeGWDWWQGWvw+4z096NjDCT3oJ8L2m5NEYY9qC0grP8MQtpPpLROaGkmaMMablivqdioikAO1x\nqrC6UBPmOlLTtdcYY0wMiESX4mDVXzcCtwO9gCXUBJV84IlmzJcxxpgmqx1EyiPwlq5gQWW3qg4Q\nkdtU9fFmz40xxpgmKSmv5L/L9yDAHW8uqzUvEkElWJvKXe7f65o5H8YYE5Oenr+JH03/uln3kVtY\nyrq9BVSEEBQe+Ggtv3hzWZ2AEinB7lQOiMgsYICIvO87U1W/0zzZMsaY2PDgzLUNXmfj/kL6dGlH\nSmJ88IWBsX+aA8B3x/ThL987rt5l9xeUNDg/4RQsqJwPjAZeBh5u/uwYY0zrll9SztmPfMqFx/Xi\nb1ce36B131qyM2BQKSgpp6yiivoeAd+SW9Sg/TVGvUFFVcuAhSIyUVVtJEZjjGmikjLnue6Fmxs/\nqlRxWSWJ8UJCfE0LxsT751FQWsHkET0Crvf5hlxuP3two/cbilAffnxBRALGP6sGM8aYyDnmtzMZ\nn5XOgaJS/nTRSE48qisFpRUAfLRyb8D1IjGOVahBZTPQA3jF/X4lsA94rzkyZYwxxr9lOw4BsHir\n87qqK/+xkK0PnB/NLNUSalA5SVXHen3/j4hkq+rPmiNTxhjTWnnfLZRVVPH0/E3ceNrAkBvtpz75\nRZ20I2UVYcpd04U6SnGqiAz0fHFHEk5tniwZY0z0lFdWsWBD/U3Ii7fkMW/tvibv61+LtvHonPU8\nPX9Tk7Yz6vezQ1quJb1P5WfAfBGZLyLzgU+AnzZbrowxJkoenrWeq59fzNdbfd+GXuOyv3/F/7yY\n3ajte5/YP1nnBK/H5m4ga9oHrNx1mLV782sFme0HjgTdZlkEHmoMVb1BRUTGiUgPVZ2J846Td3GG\naJkFNK5Ene1uFZEVIrJURLLdtHQRmS0iG9y/XbyWv0tENorIOhE5zyt9jLudjSLyuL2j3pjmdfhI\nOVnTPuCtJTuDL9xIUx5bwM/fWNps21+wIYdF9fS82pxTCMCBwrKg2/rXom31zn9o5lou8qqumrVq\nL19sygWcF2d9sTG31vIX/O1zJv11QfWzL5tyCjn1/z4Jmo9QdUhptoHpqwW7U/k74CnZCcCdwHSc\nRvpnm7jvM1R1lFdbzTRgrqoOAua63xGRYTjvShkOTAKeEhFP5ePTwI9xAt4gd74xMWvXoWIOF5dH\nOxsB7TjoXDX/84stzbaP1XvyeeebXcEXdC3YkMOuQ8UhL3/184u5/NmFISwZvK/Ur99dWe/8p+Zv\nYqnbsA5ww8tL+NnrzpPuuYWlVFYF3sf+ghLOevjTEPIZun7p7cO6PX+CBZV4VfXcA14OPKuqb6vq\nb4Cjw5yXqTgBC/fvRV7pM1S1VFW3ABuB8e7riDuq6kL3jY8vea1jTEw66YF5YT+RNNXOg0fqtDHU\ncy6s9u32gyENKwLwzfaDPLdgc2Oyx9XPL+bcR5pWZos2HyC3sBQIz9sRn56/qbqXFsDavfl86XNX\nEsz4+8L/dpEu7ZPCvk1fQYOK+/53cF6uNc9rXlPuoxSYIyJLROQGNy3TfX0wwF4g053uDezwWnen\nm9bbnfZNr0NEbhCRbBHJzsmxZzhNy+Y5uTXU4eJyjvv9rHrbAhrjzIc/5ernFwM17zgP9ubuVbsP\nc/FTX/KXWev5dvvBoMtf8tSX/OmDNfUuc6CwNOAQJEVllX7TQ3X5swu59OkvAdie59z13PbaUnIL\nS9l9qJgZi7cze/U+xv5pDsUB9vXU/I1kTfuALblFPDhzba1eWpP+uoCrnlvUpDyGw7nDM4Mv1ETB\nAsNrwKcikgsUAwsARORo4HAT9nuyqu4Ske7AbBGpNXiOqmp9D1s2lKo+i1tdN3bsWHuPvQkLVaVK\nIT4Sbz7y8u32g8SJcFzfzrXSl+44xOHicr73zFecP7InT1x1fFjen1FWUXO3EedehqrC1c8v4sSj\nuvKT0+tWWuS67RHPfLqJZz7dxONXHs93jutVZ7ltB4r45xdbQ8rHGHf8q8Y8k/HWkp38wmeAxcPF\n5XRql+iVlyP8Z9lu1uzJB5zGb8+YW962HvA/1MlDM9cBTXtSvrkNzkxr9n3Ue6fivuL3Dpx3xJ+s\nNZcbccCtjd2pqu5y/+7HafwfD+xzq7Rw/+53F98F9PVavY+btsud9k03JiJuf30pR939od95haUV\nDLnnIz5Zt7/OPFXlh/9cXN0gHEhBSXl1t9W3l+zkoxXOjfzFT33p91kFbx+s2MOOvNDbGfzZmltU\nq32nvLIKcfsuVamyYENu9YnUo6S8kuP/MItrX1hcZ1u+7nlvBaf933xe/HJrwDyoKos2H+DlhTUN\n4j+a7r+P0P6CEsoqqnh10XY+XLGnVnWTb0ABePmruvu99bVvA+bF4/YZ9XciuOudFUG30ZoFrcJS\n1TotWqq6vrE7FJFUIE5VC9zpc4E/AO8D1wIPuH//7a7yPvCqiDyC87KwQcBiVa0UkXwROQFYBFwD\n/K2x+TLGn5+9vpS+6e35+Tm1x0vKLynn30t3B1xvw74CSiuq+OucDZwxpHuteY/P3cgn63L4ZN2n\nbH3gfKqqlLH3zeGRy2oPFPiz15cxZ80+Pr/zjOphzFf+/jxC9Xr2dpZsO8iMG06slV5WUcWEP89h\n2uShXD6uX3X6rkPF7MsvYXS/Lhwpq+D0v8yvtV55ZVV1e0NBSc3Ddvkl5XRMca74h/5mpt+8+Fbp\nvfzVVl5ZuL3Ocr/9d03D986DR/hsfS53v1v7JD1nzT6ypn3AucMy6dkppTp9/H1zmTKyBx+uqBmm\nZN4dpzGwWwe/eZrx9Q7+Mqvhp7J1+woavE5LkRCBu+rm719WVybwrntbngC8qqozReRr4A0RuR7Y\nBlwGoKqrROQNYDVQAdysqp5KzZ/g3EW1Az5yP6aNWLwlj4HdUlm8JY/j+namd+d2AZf9v4/Xcs6w\nHozyqTICmLlyLxOP7lp9YvT27rfOze/NZxxFcoLT6XD9vgLOffSzOsuqKjkFpXTvmMIVbu8i78Za\njyXbD1ZPj/rDLA4dce4Grvtn7XdyeO5kSsprqp9G/O7j6unSikqSE+KZ/uVWFmzIZXivjrXWf/IT\n51mHffklbM4pIi0lgR6dUqqrdO58ewUrd+Xzx4tGAE4nAYDNf57C2r11T5w7DxZXv+N8b35N28ax\n984CIKND4Ebgl77axh+mOvvJmvZBvct5nPxg/V1pZ62u+/Chd0ABuG3Gt6zcle93/Z0Hm3YnF4ta\nwuuEw05VNwN1xm5W1QM4nQH8rXMfcJ+f9GxgRLjzaJpmX34Jh4vL/dbfnvZ/n3DBsT355XlD68z7\neNVehmSmkZVRM1iD5+nmM4fWbWC87O9f0S+9PdvzjpDRIZlFd5+FAHF+rsae/GQTT36yqbo+fkfe\nEV5bvJ3vje3LTa8sAWrX1U95bAEDuqXW+j73jtMpLqv0G1AA3sjewZ1vr+C4Pp0o9WqHWLMnn7lr\n9nHLmYMA+Gx9TWcRT0DxtX5fQXWH1jsCPLMx5J6ZbH3gfH73/irAuYL3Z8Kfa3oRvXFj7buWlxdu\no0v7RH5+7pDqtAdnrmXJtoP4OvfRz3j/lpP87gNq2lECmfzYgur2ikgJFFBM84nGnYpp4XYePEJK\nYjwZHZJrpf/9003c/9FavrrrTHp2cu4KZq/eR05BKd8Z1YuEOCElMZ4T7p+Lau2TtPfV/ZOfbKoO\nKnlFZaSlJPDqou3VJ0fv9Qb92rn5fOX6CfTp0o4vNx3glEEZLN/p9BPZnuc8N5FbWMpRd39I5/aJ\nzP7ZaWR0SKK0ooqUxHiqvPq/rtx1mKyMVG58eQmr9+QzpEftwFdVpdz97gpW78lntdcJcFNOUcAr\n7MfnbuCS0b25822nmmbZztp9WCY/tgCAARkduPnVbwKUem3egct3e94Wb2lYT694P62oj8/bSB+v\n5xf+vXR3rTsRb995ov62nPpEOqCY2m47a1BE9iPBuvq1NmPHjtXs7EYPBhCTqqqU7G0H6d2lHckJ\ncXWChS/PyXPjfZN57vMtXDcxi4Q44Wj3BP/Qpcdy8eje1Sd8b099fzQ/+Zdz4nzmB2OY5L7b4a53\nVvDa4po69H/ffBJPzd/Ix6vqXl0/f+1Yrp+ezcvXj6/uyvqrSUPqNAqHokv7RJ68anTA7pwiVL/U\naMk9Z1f3MDKmtZn1s1Ob1PtLRJb4DCzsfzkLKrFjxc7DFJdXMn5AOuBc/U9+bAF/vXwUF7rdNT9c\nsYcnP9nIf289mT2HS1i24xCzVu+rbhuAmjuByipl96Fi3szeQcd2iazbW8D4Aen88q3lAPTslMKe\nwyXExwmd2iWSV+RUbzx46UhG9O7E+Y9/HjTPH952CtdP/5o9h6P7ilNj2rqmDo9vQSWAWAsqR8oq\nmL8uhykje1bfQfzyvCF0apfIPe/VHiJi6wPnc9TdH1JZpWy8b3L1nYU/H9x2ckhBwRgT+5b97txa\nz+Q0hgWVAKIRVPYcLqaiUunr1lvvzy9h3tr9THtnBb+aNITzR/akf9dUzn30U9bvK+T1G07grndX\nsDmnYe+T7tI+kYMBGn6NMW2TCGy5v+kv8bKgEkBzB5Vfv7uCfy1y2g5G9+tMpdZ0K33mB2OYuXIP\n7/l5vmFM/y5+e9wYY0xj/fO6cZw2uJvfHpENZUElgHAGlbyiMs555FMOuG0Nnu6txhgTLT8/ZzC3\nnnl02J9JCTWoWJfiRnho5lqe8vOmNgsoxphoi1TX4UAsqDRQfU8DG2NMpL30P+PJ6ppKj04pJCWE\n+jLf5mNBpQEsoBhjmovnuaysru3Z6vMK4cvH9uWPF41gxa5D/Gvhds4ZlsnkkT2jlNP6WVAJUUl5\n097XYIyJDbefPYi/ztkQ0rJpyQkUlFYEnD/rZ6eyYV8h5x/b0+9F6RfTzqwec23CgK5ccnxvbj97\nMP26tkdV+ceCzVw+th+d2jvdgcf0T2dM//RGHFXkWEN9iIb9diZHmvgiIGNi1R3nDObh2Y0enNyv\ndonxFIdwsXbp6D68/c1Ov/NuO/NoHp+3sU76/ZeMDDgE/ZlDuzNv7X7SUhIYmJFaaxicOT8/laO7\np/Ht9oNc/NSX9E1vx8PfG0Xn9okMzkxj0l8/Y+3egloPEj4yez3PL9jMS9dP4PnPN7Ni12EuG9OX\nW33aNu7/aA2j+nRm8sierNh5GBEY0btT0ONvKaz3VwCNDSpW9WXCaWTvTqzYVf977q45sX+tUXsB\n7r1wGB+t3MuiAGN+eZ/8/3zxyFrDxj946cjq8cl8l++b3o53f3ISby/Zyf0f1XpnHi9cN5Yzh2Zy\npKyC+z5Yw0/PGkR8nPDut7vI6JDM7a87A17O/8Xp9OiUwtYDRcSLcI47ftmHt53C4MwOTP9qG6cN\nzqBz+yQen7uBu6ccwxvZOxicmUZSQhzfbj/Ex6v28sepIziqWyovfrmVq0/sXz06tD9VVcori7Zx\n1jGZdOuQTFFpBanJCSQlxLFi52GG9EhjzZ58KlUZkplGSmI88XHCN9sPMqpP5+qutpVVyqacwoi8\nxCpWtZmgIiKTgMeAeOA5VX2gvuUjEVROHdyNZe5b+F65fgK7DxXz5aZcuqUl0y4xnpMHdeNXby2j\ne8eUWgMCvnnTiWw7cKT6hUI3nDqQZz+r/d7uOIHfTx1BRmoSCzcfYEiPjpw6OKPOMOGPXTGKs4/J\nZOmOQ2zOKeQ/y/aw2Oc1s1NG9uCuycfwysJtrNx9mC82Om+s+9HJA3ju8y3Vy505tDt/+d5xVFRW\n8cWmXE4+uhuVVcrSHQe56ZWaARJ/etYgrprQj/TUJHbkHUFEWLX7MLe8+i29O7fjinF9q094Xdon\n8ujlo+jfNZWS8koOFpVx1XOL+OlZg3hs7gZ+e8EwundMJjU5gZOPzmD17nxum/Et2w44IxJn33M2\n4Aw3v2p3PrNW7yOra3smj+hJYryQEB/HjrwjlFZUkRAndO+YzN7DJTwyez0b9xcyfkA6f5g6guyt\neWzJLeKYnh35/nOLKCqtoMIdgPJnZw9mxtfbmf4/48lMS6mugti4v4BVu/MZ3a8LAH3T21NcVsmt\nr33LnDX7GJ+Vzus3nsBNryzhl+cNYfehEipVGdazI2kpCbRPqql13nWomK6pSSQnxJFfXFG9D28H\ni8qIixOqqpQuqXWHlz9QWMquQ8UkxMUxzGf4e3AGCM0tLKs17P8GdxTk5jyJFpSUU1JeRbe0+sea\nM7GhTQQVEYkH1gPn4Lyj/mvgSlVdHWidxgaVA4WlzFy1l6+35PHe0t08/f3RnDu8B2v25DO8V0dE\nBFVl8ZY8xg9ID7mP+CsLt/H2Nzt5538n1lpHVRERnp6/ifeX7eY7x/Xif08/KmgeH/hoLfecP6zO\nyUlV+WDFHr7adIA7Jw/lja93cP3JA2rtc93eAgpLKxjTvwsl5ZUkxccFfWiqtKKShLi4gK/UrapS\nnvhkI9eemEWn9okUl1XSLinwlWcwnt9rc78XwlP+xhhHWwkqJwL3qup57ve7AFT1/kDrNPXhx6oq\npbSiqkknRmOMiTWhBpXod2pumt7ADq/vO920WkTkBhHJFpHsnJwc39kNEhcnFlCMMSaANtGlWFWf\nBZ4FEJEcEdkWZJVAMoDcsGWsdbGy8c/KJTArG/9aarn0D2WhWA8qu4C+Xt/7uGkBqWq3xu5MRLJD\nuf1ri6xs/LNyCczKxr9YL5dYr/76GhgkIgNEJAm4Ang/ynkyxpg2K6bvVFS1QkRuAT7G6VL8gqqu\ninK2jDGmzYrpoAKgqh8CH0Zod89GaD+xyMrGPyuXwKxs/IvpconpLsXGGGNallhvUzHGGNOCWFAx\nxhgTNhZUQiQik0RknYhsFJFp0c5PJIjIVhFZISJLRSTbTUsXkdkissH928Vr+bvc8lknIud5pY9x\nt7NRRB6XGBv/REReEJH9IrLSKy1s5SAiySLyupu+SESyInl8TRGgbO4VkV3u72apiEzxmtcmykZE\n+orIJyKyWkRWichP3fTW/7tRVfsE+eD0LNsEDASSgGXAsGjnKwLHvRXI8El7CJjmTk8DHnSnh7nl\nkgwMcMsr3p23GDgBEOAjYHK0j62B5XAqMBpY2RzlAPwEeMadvgJ4PdrH3MSyuRf4hZ9l20zZAD2B\n0e50Gs4YhcPawu/G7lRCMx7YqKqbVbUMmAFMjXKeomUqMN2dng5c5JU+Q1VLVXULsBEYLyI9gY6q\nulCdX/9LXuvEBFX9DPAdaz6c5eC9rbeAs2Llbi5A2QTSZspGVfeo6jfudAGwBmcIqVb/u7GgEpqQ\nxhhrhRSYIyJLROQGNy1TVfe403uBTHc6UBn1dqd902NdOMuheh1VrQAOA12bJ9sRc6uILHerxzxV\nPG2ybNxqqeOBRbSB340FFVOfk1V1FDAZuFlETvWe6V45tfk+6VYOdTyNU1U8CtgDPBzd7ESPiHQA\n3gZuV9V873mt9XfT5p5TycjI0KysrGhnwxhjYsqSJUtyNYSxE2P+ifqGysrKoinvUzHGmLYo1NHd\n21xQMcaY1m7bgSJe+HwLv7twOAPvrhnF6o5zBnPrWYOadd/WpmKMMa3MT/71DdO/2sbqPbWacXh4\n9vpm37cFFWOMaWWi2VRuQcUYY0zYWFAxxhgTNtZQb4wxYXbRk19w5fi+XD6uX5155ZVVnPfoZ9w1\n5RjOGZbpZ214Yt4G/jJrPcf368wbN57IuY9+xt1TjuG4Pp0Y/+e5dE9LZn9BadB8XPC3z5t8LA1l\ndyrGGBOsM/QUAAAgAElEQVRmS3cc4s63V/idd7CojM25Rdz1jv/5AH+Z5TSof7v9EAcKy9iSW8Sv\n313Bx6v3AYQUUKLFgooxxkRQzfBcobWmexZXiG4LfIgsqBhjTAR5gkRViPGhOgRpbIzpYkHFGGMi\nqCZINDCqxERIaYNjf40dO1ZtmBYTLpc+/SX7C0pY8Kszo52ViLv6+UWs2ZNP9j3ncNc7K3ht8Xa2\nPnB+rWWW7jjERU9+wX9uOZmRfTqFtN1zHvmU5MQ4/nvrKbXSDx0pY9QfZgPU2Y+qMuCuD7ntrEH8\n/JzBIe1n2tvLmfH1jlppr/5oAkVllfz4pdrniIuP782jl49i1qq93PDykprlfzyBq/6xqN79fH7n\nGZz84Cch5SkSfMsuVCKyRFXHBlvO7lSMaYIl2w6yI6842tmIigUbcsktLAPgtcXb/S4zd43TsPzJ\nuv0hb3fD/kJW7sqvk74970jQdR+fuyHk/fgGFID/LN/Dm9l109/9dhcAb2TvrL38sj11lvW1ctfh\nkPPU3GbccEKz7yMmgkpDX+dqjGkZWltFSJzPK7DiQzqDRv29WdWSE5r/lB8TQQV4EZjkkzYNmKuq\ng4C57ndjjGk2vu9VjAvhRYvRfxdjjaoIRPmYePhRVT9z357mbSpwujs9HZgP3BmxTJk6yiqqKC6v\npFO7xIju99CRMlKTE0is57KxoKScxPg4UhLjq9NyC0vJ6JBc/f1gURkd2yUS73U5mltYSrvEeOJE\naJcUTyAHCktJS0mkuKySTu2DH39uYSkpifHEi1BeVcW8Nfs5YWBXenRK8bv8jrwjpKcmkZqcwKEj\nZazanc+EAekkxMdRUl5JeWUVpRVVAMSLkJaSQEJ8HPkl5STFx1FUWkF6alJ1d9YtuUUUllQwsFsq\nInCkrJLkhDgKSyvomprMvvwS4uKErqlJ7DpUTEWl0i0tmfTUJNbtLSAxvnYZeZSUV5KSGE9uYSmH\ni8vZl18CwKEj5ZRVVLFxfyF909ux93AJW3KLOK5vZ1bvzqe0opJendvRp0v7WsecnBhH97QUtuQW\nsXZPQfW8zTmF5BSUkpgQR5f2SSzfeajWPIDlOw/Tv2t7th4oIqNDMtvzjvDNtkNMHtEjYDnPX7e/\nOs++Zizezser9tVKe+mr4KPBP/XJxqDLREqoPc6aImYa6t2g8l9VHeF+P6Sqnd1pAQ56vtfHGuqb\nzw+eW8TnG3Mb3RDYWFnTPuD8Y3vy5FWj612mX3p7PvvVGQB8vGovN768hFd/NIGJR2dQVFrB8N99\nzLUn9uf3U0cAsHznIb7zxBcApCTGsfaPk/1u12NYz46s3pMf9Pj/u3w3t7z6LQDpqUnkFZVVz/O3\n7v6CEsbfN7d6vmefSfFxrL9vMic/OI+dB2u36/zghH786aKRZE37gLSUBApKKrhz0lD+9/Sj2Li/\ngLMf+azePAby4KUjAz7UB9A3vR1/vngkVz+/uM6804d0Y/66nAbv84FLRjKtngcFTejm3XEaA7t1\naNS6baqhPthrOUXkBhHJFpHsnJyG/6hNaD7fmBu1fX+wPHiDqXdDb/bWPABW7nYaUYtKKwD4cOXe\n6mXW7q25Mi4prwq6fd9hxgNZuPlA9bR3QAH/3UxzAjw9XVbp5Mk3oEDt8igocY5t3lrnKntrbvAG\n70Bm+Vyp+9qRV8zS7Yf8zmtMQAH4YEXwf1sTmsYGlIaI5aCyT0R6Arh/A3YvUdVnVXWsqo7t1i3o\n2zBNG+CpBhC3EdXvFUkUbuL9VU+EUm/fkG3HNeF/fShFEu5ii0Q7gAmfiAcVERksInM9PblE5FgR\nuacRm3ofuNadvhb4d7jyaFo/z3nK93wdiTbV+s6R/k6g4Wro9Wy7KUEqlDXDHQOqgt8kmhYk4m0q\nIvIp8Evg76p6vJu20tNWEmCd13Aa5TOAfcDvgPeAN4B+wDbgMlXNC7b/ltqmsmzHIYb0SKvVkByK\nF7/Ywqh+XcgvLmf8gPRa66sq2dsO0i+9PQs25PLdMX0AWLs3n56d2tVqUK+orGL5rsP07tyOdXsL\n6NgukQ7J8Szaksf+/FJ+ds5gZizezjnDMlmy7SADMlIZlJlWKy+euv4t90+pbhBetuMQR3XvwKuL\ntiEIA7ulcqDQaRDfe7iYY3p25JheHfliQy4zV+1l+c7D3H72INJSEpixeAc/P3cw6/YW8O32QxzV\nLZUTBnZl9pp99O7cjqfnb+KUQRn8Y8EWAP739KN4ev4m2ifFc6SskqtP6M/cNfvok96exVucn8ZJ\nR3fl5jOOrvXA2vcn9GP+uhx2HXKqkUb27sTEo7vy32V7qtMARvTuyFHdOnDa4G58uekAFx/fm+8/\n5//Bt/TUJK45sT8b9xfyX6+qqPNH9qy3Omdgt1Q25xQBMLxXR1btrl2ldlzfzizbUVO9dPYxmcxZ\n479K6qyh3Zm7tvYN/N1ThvLnD9cG3L9p3ZrS3hlqm0o0gsrXqjpORL71CipLVXVUJPbfEoPK3sMl\nnHD/3OqndkP19pKd3PHmsurvl4zuzSOX1az/xtc7+NXby6u/v3L9BE4elEHWtA84pmdHPvppzRPL\nD81cy1PzNwXcl78nh71/oJ+tz+GaF5zG2ceuGMXUUb3ZfaiYiQ/MC/l4jDHNKxJBJRptKrkichRu\n1auIfBdo0y1xhaXlALW6RYZio9t10sP3yd2tB4pqfd/tddW9xqdR2fe7rx1Bnmbec7hm255lPQ3E\nxpi2IxrPqdwMPAsMFZFdwBbgB1HIR4tRU7/fsLruYEvH+zz+25QGz2CrSgt6atgYEz0RDyqquhk4\nW0RSgThVLQi2TmvnOV839LQc7Ole3+9NefAp2Lr+4mFLepLYGBMZEWtTEZGf1zdfVR+JRD6a2qay\nI+8IT8zbyGXj+nLrq9/QuX0SG/YX8MJ146of+Pr1lGO478M1AKQlJ1DgPs3cLjG+VsMvQFJCHGUV\ntbu3dG6fyKEjTpVYl/aJHHSnjTGmKSLRphLJOxVPV6EhwDicLsEAFwJ1H79toU55yBnC+nV3JNPd\nh50hHbyfIPYEFIAC96E634fcPHwDClAdUAALKMaYmBKxoKKqvwcQkc+A0Z5qLxG5F/ignlWNMcYE\n4d0dHWoP6RPJoZOi0fsrE/C+bC9z04wxxsS4aPT+eglYLCLvut8vwhll2BhjTCO1lH4x0ej9dZ+I\nzAROdpN+qKrfRjofDVVeWcWQez6KdjaMMcavhj6S0FyiMqCkqi4BXgPeBQ6ISL9o5KMh/rt8d0Te\nRWCMMaE4+5ju3H/JyOrvj1x2XPX0ryYNAeDHpwzg3guHRTRfEb9TEZHvAA8DvXBGFu4HrAWGRzov\nDVFeaRHFtHyThvdg5qq9wReMEZ4GZu/31vzi3MH8Zdb6Wsv9+JQB1WPA+Vp411mccL/zPpp/33wS\nU5903pFzyxlH84TXC7Tqa8wed9+cgK8g8B4e6f4P1/D3zzYH3N5PZ3zLv5fu9rvPBRty/L6Hxnc5\nT1k8d+04AK4c38/vcgC/Pj+yAQWic6fyR+AEYL2qDgDOBhZGIR/GtDqVbWCY+Eo/oxbXV4ugXoPx\nV3gtqA0YpL/c30797ivI/Nb/zxOVoFKuqgeAOBGJU9VPgKAP1ERdG/gxmNhX1QbqaP0NN1RZz3F7\nz6pvufpU1FNT4T1yRbCHydvCu2Gi0fvrkIh0AD4D/iUi+4GiIOtE3Y6DjX9bnjGR0iZOWnF1G6T9\npXl4z/E+6Sc04G1lifGhbT8hvv5tJiUEnh/fQhramyoaQWUqUAz8DPg+0An4QxTy0SB/m7cx+ELG\nRNF9F4+o87rfG08bSLvEeDI6JHPPeysbve3EeKG8Uvnr5aO4/fWl3HDqQJ512w6gZjghkZoqngEZ\nqWzJLWJgRiqpyQkcKi5jR14xN546kMT4OK6a0I/7P1rLxv2F1aNkP3TpsXTtkERGh2SWeY3aPWFA\nOlWqXDm+H5NG9OBwcTlDe3bkzreXU1ml/HLSEJ773GlTOX1IN4ZkpvHp+hy+O6YPPTulMLRHGpeP\n68u4rHTAea/OjacN5LG5G5z9fvfYeo//zZtOZPbq/Tw403kXzZSRPfho5V5Ua49xd8sZR/PFxlwu\nG9vX73Z+c/4wunVI5pRB3WqN7A1wwsCuDO2RxhXj+nJs385c8tSXDMlM44rxtbf1uwuHVR9HSxTR\n96mISDwwR1XPiNhOfTR27C/vhsJYcny/zpw5pDsPz14ffOEwOG94Jr+eMoxT/+8T+nRp5/f96eA0\nKP51znr+OmdDvdvr2SmFr+46i6G/+ajWe+LvOf8YfnTKQAAenb2++uQAcO6wTL7cdIDC0pqh96dN\nHsoDH63lxlMHcteUYwB4eeE2fuOeaG8782ge97pwiBPYfH/dhtZLn/6SJdsO8uZNJ1b/x/b9bUwa\n3oNnrh5T/d0z/+HvHccdby7j/GN78j8nDeDSp79kVN/OvHfzSfWWQUNc/fwiFmzIZfr/jOe0wYFf\nne3J058vHsnd767gyvF9uf+SY2vNO294Jh+v2sfT3x/N5JE962xj6pNfVL8wzNNAfM0Li/lsfQ7/\n/OE4zhjSPWzHFYrGPD3e0HW8l39t8XbuemcFV4zrywOX1h+UWoOWOPYXqlopIlUi0klVDwdfIzQi\nshUoACqBilAOvC2J9F21Z3/Brlcacj1T37J+R0gOYZu1lgkywrNHhdtgW191SyDVtS1aU7ffmO3U\np+aVwQ1b3l+JBXudQaWf9/x6LlJbR0VO/Txl10pqrcImGtVfhcAKEZmNV1uKqt7WxO2eoaq5TdxG\nqxTJh6IE8Qoq9UeNUO6SPTmvN6iEcAoLtivfk3BcgLOyp2t5YpC6c//7cLapaHVQ8X3nTVNVbzfE\nf3NPsTQmG+UVgQu1pTyI15xqflOt/1gbIhq9v94BfoPTUJ/tfpZEIR9tQmZaCp3bJwZfMETtk+Lr\nnd+jU0p1Y2TPzu3qXbZz+6Sg++sVYBveQaJLau3jy0hLpneX2ut5yqBLas0+O7arWS89tXZe+nbx\nv9/uHZMBSE2uuR5L9ml8zUjzf1ye/XVNTSY50S2jTil+l22s7mnO9tonh3a92DHFWa5rh+Q687ql\n1T1Wb70618179TpBfifNJS0lctfJnn/PjA7Bf8dtScT+BURkKtBHVZ90vy8GuuFcLN3ZxM0rMEdE\nKoG/q+qzPvu+AbgBoF+/lvHw/kWjevGe10NQ4PxH/MEJ/asfnnrhurHkFJRy59srqpe5bmIWpw/p\nxpw1+/hq0wEAtuQWcd/FI7nrnZrlHvrusRSXVXLx6N6kJiVw/4drKSyt4PazB7Focx5fbXbWvffC\nYTz08TqevGo0mR1T+Gb7QX7775VccGwvdh48wjfbnTrzmbefwpacIsZkdeHLjQfYm1/CCQO78uIX\nW/jlpKGc9MA8hvZI4zcXDCM+Tvjblccz8aiufLIuh1+8uQyAm047imc+3UR398RzzYn9aZcUT7/0\n9uwvKKFfens6JCdy4ROf8+kvTyd760EmHtUVqP+Zgu9P6M8XG3OZNvkYvt6ax4XH9qKgtJzsrQfJ\n6JBMWkoCgzOdNy98d0yf6vUuGNmTxVsOcMGxvRiXlU5ZRRUdUxLp2C6B0f26+N3XXy8fxafrcxiQ\nkVqdNufnp/Het7vYlFPIxKMzuPDYXn7XPW1QNx669FguPK4XKYlx/OV7xzF5RI+Ax9UY9108gtMG\nd2NU3871LnfP+ceQmpzAhcf2oriskktG15TL+7ecREWVckyPjozs3YlTBmX43cYzV4/h2hcW8/er\na2qb/zB1BBOPymBMf//l15yev3YsQ3qkBV/Qy/xfnF7ntdv1efcnE6vvLi8Y2ZMjpRW1ys5E9iVd\nXwBXqOoO9/tS4EygA/BPVT2rCdvuraq7RKQ7MBu4VVU/87dsOBvqvRtkn1uwmT99sIYfnpTFOcdk\nctVzi6qXe+r7o5kysicFJeWMvHcWqUnxrPrDpDrbDdRYOOjXH1ZXuwRaZubKvdz0inPDd/3JA/jN\nBfU/SRtqA2VTh86evXofP34pm7OP6c53x/Thple+4bzhmbVORKE46u4Paz1jcPeUodxw6lGNylOk\necpwy/1T2kS1kGmdQm2oj2T1V5InoLg+V9U8Vd0OpAZaKRSqusv9ux9nPLHxTdleUwhS55q6qXE7\nlOe1ItmLryG8G4I9x9GY99m31ONrCAsopi2IZFCpdT+sqrd4fQ3c9zEIEUkVkTTPNHAu0PgO+WEQ\n7vNfKA+0tdRTrifr3s8vNOCZs5rtBNiuMaZliWRQWSQiP/ZNFJEbadrrhDOBz0VkmbudD1R1ZhO2\nF7LBXvW3fdPbAzCgWypdfRruMt3GXU+PodENrG8e7z4PMS4r8HreJ1nv+v5o8xz70B5p1Y3cQzI7\nNng74/rXftjLU96x4Lgg7RvGtCaRbFPpDrwHlALfuMljgGTgIlXdF2jdcGpsm8pjczbw6JyaBwiv\nPbE/v71weK0uoYu35DEuqwsiwpJtBxneqyMrdx1mrNfTryt3HSYrI5UObo+arblFfLBiDxcf3ztg\nT6ei0gr+u3w35x/bq3o9X/9ZtptbX/uW7mnJLLr7rKBVLaG2lWzNLSIlMZ4eTeillL01j1F9O5MQ\nH0f21jyO79elwV1pC0rK2Z53hI4piSzZdpCpo3rFTHVSfkk5O/OKGdar4cHUmJaixT386LZ3TBSR\nM6kZ5v4DVZ0XqTw0Rbsk5y4jKSGOsooqfnr24DonxvEDaoKHp/fLWJ/hFEb07lTre1ZGKjefcXS9\n+05NTuDycfX3WvNUkY0fkB7Wk21WGO56vMvAtzxClZaSyPBeTtnF0l0KQMeURIb1Cl+3bmNasmi8\n+XEeEBOBxFt120D195ZZqR/oSXBjjImEqLz5MZZVPy0e3WzU0dDhOYwxpjlYUGkgT3fYlnajMqi7\n02lg4lH+H1Tz56SjuzZXdowxbVQ0xv6KSRcf35sTBnblhy9+TXF5ZYPeGhcJI3p34utfnx3ykBHL\nfnsuKUl2TWGMCS8LKiHq3jGF7h1TWnSbhWfcpVB0CuN4YMYY42GXqsYYY8LGgkpjtazaL2OMaREs\nqDRQS+39ZYwxLYEFlQYK5aVRxhjTVllQaaCaOxWLKsYY48uCSgO11OdUjDGmJbCg0kAtuEexMcZE\nnQWVBvrj1BH079qeDD/v9DbGmLbOHn5soLOHZXL2sMxoZ8MYY1oku1MxxhgTNhF7SVdLISI5wLZG\nrp4B5IYxO62JlY1/Vi6BWdn411LLpb+qBn31e5sLKk0hItmhvPmsLbKy8c/KJTArG/9ivVys+ssY\nY0zYtMmgIiIviMh+EVkZwrKPishSEVkKjBCRQxHIojHGxKS22vvrReAJ4KVgC6rqzzzTIvIaUNx8\n2Yppz0Y7Ay2UlUtgVjb+xXS5tNk2FRHJAv6rqiPc70cBTwLdgCPAj1V1rc86XwK/U9XZkc2tMcbE\nhrZ6p+LPs8BNqrpBRCYATwFnemaKSH9gADAvSvkzxpgWz4IKICIdgInAm1IzDovvI/NXAG+pamUk\n82aMMbGkTTbU+xEHHFLVUV6fY3yW+THwHRHZKCLTopDHiBORrSKywu2okO2mpYvIbBHZ4P7t4rX8\nXW75rBOR87zSx7jb2Sgij4vE1ghq/jp2hLMcRCRZRF530xe5VbMxIUDZ3CsiuzwdXERkite8NlE2\nItJXRD4RkdUiskpEfuqmt/7fjaq2yQ+QBaz0+v4l8D13WoDjvOYNA8qBgUASsAwYFu1jiEAZbQUy\nfNIeAqa509OAB73KaBnOHd4AYBMQ785bDJzglutHwORoH1sDy+FUYLTP7yVs5QD8BHjGnb4CeD3a\nx9zEsrkX+IWfZdtM2QA9gdHudBqw3j3+Vv+7aZN3Km4vrq+AISKyU0SuB74PXC8iy4BVwFSvVX4O\n7FDVzapaBszwmd+WTAWmu9PTgYu80meoaqmqbgE2AuNFpCfQUVUXqvPrf8lrnZigqp8BeT7J4SwH\n7229BZwVK3dzAcomkDZTNqq6R1W/cacLgDVAb9rA76ZNtqmo6pUBZk0KkD7T5/tOYEL4ctRiKTBH\nRCqBv6vqs0Cmqu5x5+8FPKNr9gYWeq27000rd6d902NdOMuhN7ADQFUrROQw0JWWOVRHqG4VkWuA\nbOAOVT1IGy0bt1rqeGARbeB30ybvVEzITlbVUcBk4GYROdV7pnvl1Db7pHuxcqjjaZyq4lHAHuDh\n6GYnetxOQG8Dt6tqvve81vq7aXPPqWRkZGhWVla0s2GMMTFlyZIluRrCgJJtrvorKyuL7OzsaGfD\nGGNiioiENLq7VX8ZY0xrt3ev8y70Z55p9l1ZUDHGmNYugs0cFlSMMaa18wSVCPQ4tqBijDFthQUV\nY4wxTWbVX8YYY8LGqr+MMcaEnQUVY4wxTWbVX8YYY8LGqr+MMcaEjQUVY4wxYWdBxRhjTJNZm4ox\nxpiwseovY4wxYWdBxRhjTJNZ9ZcxxpiwseovY4wxYWNBxRhjTNhYUHGIyCQRWSciG0Vkmp/5p4vI\nYRFZ6n5+G418GmNMi1ZV5fyNj2/2XbXYd9SLSDzwJHAOsBP4WkTeV9XVPosuUNULIp5BY4yJFZ6g\nEtf89xERvVMRkfYNWHw8sFFVN6tqGTADmNo8OTPGmFastQUVEZkoIquBte7340TkqSCr9QZ2eH3f\n6ab5migiy0XkIxEZHmD/N4hItohk5+TkNOYQjDEmdlVWOn9bS1ABHgXOAw4AqOoy4NQwbPcboJ+q\nHgv8DXjP30Kq+qyqjlXVsd26dQvDbo0xJoZEsE0lYtVfqrrDJ6kyyCq7gL5e3/u4ad7bzFfVQnf6\nQyBRRDKamldjjGlVWlv1F7BDRCYCKiKJIvILYE2Qdb4GBonIABFJAq4A3vdeQER6iDh95ERkPM7x\nHAh/9o0xJoZFMKhEqvfXTcBjOG0iu4BZwM31raCqFSJyC/AxEA+8oKqrROQmd/4zwHeB/xWRCqAY\nuEI1guMRGGNMLIhgm0pEgoqq5gLfb8R6HwIf+qQ94zX9BPBEkzNojDGtWXm58zcxsdl3FaneX9NF\npLPX9y4i8kIk9m2MMW1eRYXzt7UEFeBYVT3k+aKqB4HjI7RvY4xp2zx3KgnNXzkVqaASJyJdPF9E\nJJ0W/DS/Mca0KhG8U4nUif1h4CsReRMQnAb2+yK0b2OMadsieKcSqYb6l0QkGzjTTbrEzxhexhhj\nmkNxsfM3KanZd9WsQUVEOqpqvlvdtRd41WteuqrmNef+jTHGAAcPOn8jMKJIc9+pvApcACwBvJ8f\nEff7wGbevzHGmPx852/Hjs2+q2YNKqp6gfvE+2mqur0592WMMSaAAweccb/atWv2XTV77y/3CfcP\nmns/xhhjAtizB3r0aFVvfvxGRMZFaF/GGGO8bd4MffsGXy4MIhVUJgALRWST++6TFSKyPEL7NsaY\ntm35chgXmev6SD2ncl6E9mOMMcbb/v1QUABZWRHZXXN3KU7BGaH4aGAF8LyqVjTnPo0xxnhZsMD5\nO3FiRHbX3NVf04GxOAFlMs6T9cYYYyJl3jxITYUxYyKyu+au/hqmqiMBROR5YHEz788YY4xHSQnM\nmAHnnBORcb+g+e9Uyj0TVu1ljDER9txzkJcHN90UsV02953KcSLiPsqJAO3c74LzCEvzP95pjDFt\n1fTpMHIknBe5vlLN/UR9fHNu3xhjTACPPQbZ2fDHP0Z0t/ZOE2OMaU1U4eWX4fbbYfJkuPPOiO4+\nUg8/GmOMaW579sA118C118JJJ8Ebb0Ssgd7DgooxxsS60lJ44gkYOtTp7TVtGsyeDR06RDwrVv1l\njDGxqKICvv0W3nwTXnoJ9u2Dk092enwNGRK1bFlQMcaYWKAKq1fDp586DzTOn18zpP3kyXDzzTBp\nUrRzaUHFGGNapLw8WLHCuRtZtAjmzIHcXGder15w/vlw7rnOJwJvdAyVBRVjjImUyko4dMj55OQ4\nVVb798OOHc7f/fth+3bYvRv27nXuTgD69HGeij/rLOfTv39E3o3SGBZUjDHGH1UoL3eGOiktheJi\nKCqCwkI4csQZ+Tc/3/kUFjofz/zCQic9L69muYMHnWDiT1wcdO3q3HH07QujRjmBY8IEGD4ceveO\n7LE3gQUVY0zLVVHhnNQrKpwTu+dTXg5lZXXTPCf/I0ecv57vnsBQVlbz3Xs5T9qRI05gKCpygkFV\nVcPy27690+MqNRXS0iA93QkOaWnQpYvzPT3dme7a1XkbY7du0LNnxLv+NhcLKsa0Jp6r6/Jy50Ts\n+es97ZlfXu5Ux1RW1k4rK6u9ju/2Kivrbs93We9t+a7vObl7z/N8904vKXH2FQ7x8ZCcDElJznva\nU1KcT2qq871TJ8jMdKZTU53A4AkOycnOssnJNent2zuBomNH5+NJi7dBRCyomNhTVeWcoKqqaqYD\nfTwnTc+071/vbdS3nPf2fPfhOWF69uW7z2Aff/n03o/vybuqqu6J2jsPkRYX51xlJyQ4f70/SUk1\n0wkJzvekJOeEnJxcO83z8SzrOfl7lvNMJyfXbNvz3TstNdU5wXuWb9fOWd9ERIsuaRGZBDwGxAPP\nqeoDPvPFnT8FOAJcp6rfRDyjjaVa+yox0EnL30nS34kv2EnN+3soJ9JAJ0vvbfieAIOdQH1P4g09\nAUfjpBmK+Pjan4QE/2lxcc7HM997Oe9pz1VxQkLNydoz7TmJ+57IPSdo3zTvbfiuEx/vbM9zMvc+\nqfsGCc93T149aXH2DLWp0WKDiojEA08C5wA7ga9F5H1VXe212GRgkPuZADzt/m0e+flO977du53h\nEPbtg8OHnUY5Tx2tpzGvuNh/FYBvdUJL5Dm5eU4avidHzycurvYJ0d+yiYnOFaO/dYKdhAN9PMt6\nTtC+J0/fvPiewL3n+R5DoOW8T6b+9tNCe+IYE2ktNqgA44GNqroZQERmAFMB76AyFXhJVRVYKCKd\nRTsR50kAAAS1SURBVKSnqu4Je27+8Q+47TYneHgkJUHnzs7tdkqKc8vdvr3TCNerV+1b//o+3ld9\n3ifzQCfJ+q5wA6X5fvdcLfueQO2q0xjTBC05qPQGdnh930nduxB/y/QGagUVEbkBuAGgX79+jcvN\n8OFwySXOYG39+jm9Njp3titUY4zx0pKDStio6rPAswBjx47VRm1k4kTnY4wxJqCWXNexC+jr9b2P\nm9bQZYwxxkSIqDbuwr25iUgCsB44CydQfA1cpaqrvJY5H7gFp/fXBOBxVR0fZLs5wLZGZisDyG3k\nuq2dlY1/Vi6BWdn411LLpb+qBh1krMVWf6lqhYjcAnyM06X4BVVdJSI3ufOfAT7ECSgbcboU/zCE\n7TZ65DURyVbVsY1dvzWzsvHPyiUwKxv/Yr1cWmxQAVDVD3ECh3faM17TCtwc6XwZY4zxryW3qRhj\njIkxFlQa5tloZ6AFs7Lxz8olMCsb/2K6XFpsQ70xxpjYY3cqxhhjwsaCijHGmLCxoBIiEZkkIutE\nZKOITIt2fiJBRLaKyAoRWSoi2W5auojMFpEN7t8uXsvf5ZbPOhE5zyt9jLudjSLyuDu6dMwQkRdE\nZL+IrPRKC1s5iEiyiLzupi8SkaxIHl9TBCibe0Vkl/u7WSoiU7zmtYmyEZG+IvKJiKwWkVUi8lM3\nvfX/blTVPkE+OM/JbAIGAknAMmBYtPMVgePeCmT4pD0ETHOnpwEPutPD3HJJBga45RXvzlsMnAAI\n8BEwOdrH1sByOBUYDaxsjnIAfgI8405fAbwe7WNuYtncC/zCz7JtpmyAnsBodzoN50HuYW3hd2N3\nKqGpHjFZVcsAz4jJbdFUYLo7PR24yCt9hqqWquoWnAdSx4tIT6Cjqi5U59f/ktc6MUFVPwPyfJLD\nWQ7e23oLOCtW7uYClE0gbaZsVHWPuu92UtUCYA3OYLet/ndjQSU0gUZDbu0UmCMiS9yRngEytebV\nAnuBTHc6UBn1dqd902NdOMuheh1VrQAOA12bJ9sRc6uILHerxzxVPG2ybNxqqeOBRbSB340FFVOf\nk1V1FM7L0G4WkVO9Z7pXTm2+T7qVQx1P41QVj8J5DcXD0c1O9IhIB+Bt4HZVzfee11p/NxZUQtMm\nR0NW1V3u3/3AuzjVgPvcW3Lcv/vdxQOV0S532jc91oWzHKrXcQdS7QQcaLacNzNV3aeqlapaBfwD\n53cDbaxsRCQRJ6D8S1XfcZNb/e/GgkpovgYGicgAEUnCaRR7P8p5alYikioiaZ5p4FxgJc5xX+su\ndi3wb3f6feAKt0fKAJxXPC92b/XzReQEt773Gq91Ylk4y8F7W98F5rlXsTHJc9J0XYzzu4E2VDbu\ncTwPrFHVR7xmtf7fTbR7CsTKB2c05PU4vTJ+He38ROB4B+L0RlkGrPIcM06d7VxgAzAHSPda59du\n+azDq4cXMBbnxLIJeAJ3JIdY+QCv4VTjlOPUaV8fznIAUoA3cRpnFwMDo33MTSybl4EVwHKcE1/P\ntlY2wMk4VVvLgaXuZ0pb+N3YMC3GGGPCxqq/jDHGhI0FFWOMMWFjQcUYY0zYWFAxxhgTNhZUjDHG\nhI0FFWOMMWFjQcUYY0zY/D+c8tuW179VHwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fd7504d4b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plt.subplot(3,1,1)\n",
    "plt.plot(x,y[:,0])\n",
    "plt.title('Sqft and Grade vs Price')\n",
    "plt.ylabel('Sqft')\n",
    "\n",
    "plt.subplot(3,1,2)\n",
    "plt.plot(x,y[:,1])\n",
    "plt.ylabel('Grade')\n",
    "\n",
    "plt.subplot(3,1,3)\n",
    "plt.plot(x,y[:,2],'r')\n",
    "plt.ylabel(\"Price\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "bb08193b-d54e-a4b6-00f9-ccd1b618b7af"
   },
   "source": [
    "# 3. Predicting House Sales Prices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "_cell_guid": "6b5f6b66-bb8c-1142-84dc-a5b5542f6f6f"
   },
   "outputs": [],
   "source": [
    "# Train a simple linear regression model\n",
    "regr = linear_model.LinearRegression()\n",
    "new_data = data[['sqft_living','grade', 'sqft_above', 'sqft_living15','bathrooms','view','sqft_basement','lat','waterfront','yr_built','bedrooms']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "_cell_guid": "b696daf9-ce83-a581-c98f-13631b496108"
   },
   "outputs": [],
   "source": [
    "X = new_data.values\n",
    "y = data.price.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "_cell_guid": "29fca21d-880e-6eb3-557d-b45035c32d26"
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y ,test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "_cell_guid": "51cc9733-ce21-0a71-2bb4-531fb4f79213"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  841418.12898114   631054.99036266   238748.92158542 ...,\n",
      "  1152295.02572439   357086.73965818   451499.07818777]\n"
     ]
    }
   ],
   "source": [
    "regr.fit(X_train, y_train)\n",
    "print(regr.predict(X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "_cell_guid": "8281a2cd-9c2b-27aa-554d-9a65f057bcd5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.70137060012474084"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regr.score(X_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "8a1302a7-def8-1c23-fbcb-cda1bfd61dac"
   },
   "source": [
    "- Prediction score is about 70 which is not really optimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "_cell_guid": "e0e7cbaf-13a0-7d88-519d-a7857f2c4f36"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE: 193615.08\n"
     ]
    }
   ],
   "source": [
    "# Calculate the Root Mean Squared Error\n",
    "print(\"RMSE: %.2f\"\n",
    "      % math.sqrt(np.mean((regr.predict(X_test) - y_test) ** 2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "_cell_guid": "22c9f865-513a-3a37-9d62-bbd2c120d323"
   },
   "outputs": [],
   "source": [
    "# Let's try XGboost algorithm to see if we can get better results\n",
    "xgb = xgboost.XGBRegressor(n_estimators=100, learning_rate=0.08, gamma=0, subsample=0.75,\n",
    "                           colsample_bytree=1, max_depth=7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "_cell_guid": "2a5002e9-d390-333e-bb38-0effd4972e20"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XGBRegressor(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0,\n",
       "       learning_rate=0.08, max_delta_step=0, max_depth=7,\n",
       "       min_child_weight=1, missing=None, n_estimators=100, nthread=-1,\n",
       "       objective='reg:linear', reg_alpha=0, reg_lambda=1,\n",
       "       scale_pos_weight=1, seed=0, silent=True, subsample=0.75)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "traindf, testdf = train_test_split(X_train, test_size = 0.3)\n",
    "xgb.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "_cell_guid": "96662a3d-4751-82dc-ba4a-05862a9f03e6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.813721038305\n"
     ]
    }
   ],
   "source": [
    "predictions = xgb.predict(X_test)\n",
    "print(explained_variance_score(predictions,y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "8865579e-b2e5-edef-5354-1613a414f7ec"
   },
   "source": [
    "- Our accuracy is changing between 79%-84%. I think it is close to an optimal solution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "_cell_guid": "54f7eb10-c65a-17b4-7a13-d65d78907ed4"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "_change_revision": 2,
  "_is_fork": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
