This repository has been archived on 2026-03-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
TP-ML/solutions/Lab7_sol.ipynb
2022-06-05 15:43:42 +02:00

1145 lines
112 KiB
Plaintext

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Lab7_sol",
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"**In this lab about linear regression, we'll be working with the library [StatsModel](https://www.statsmodels.org/stable/index.html), which provides numerous classes and functions for the estimation of statistical models.**\n",
"\n",
"**The dataset that we'll be considering is 'diamond.csv' [[1]](https://www.kaggle.com/datasets/shivam2503/diamonds), which contains several information about diverse diamonds, such as their dimensions, the quality of their cuts, their prices, etc... The goal of the lab will be to define linear regression models to best estimate diamonds prices using a bunch of predictor variables, and to understand the meaning of the obtained coefficients.**\n",
"\n",
"**Dataset's column information :**\n",
"\n",
"* 'price' : price in US dollars.\n",
"* 'carat' : weight of the diamond. \n",
"* 'cut' : quality of the cut (Fair, Good, Very Good, Premium, Ideal)\n",
"* 'color' : diamond's color's, from J (worst) to D (best).\n",
"* 'clarity' : how clear the diamond is (I1 (worst), SI2, SI1, VS2, VS1, VVS2, VVS1, IF (best))\n",
"* 'x' : length in mm.\n",
"* 'y' : width in mm. \n",
"* 'z' : height in mm.\n",
"* 'table' : width of top of the diamond relative to its widest point. \n",
"* 'depth' = 2z/(x+y) \n",
"\n"
],
"metadata": {
"id": "5FnAdl_9MJ7-",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**Import necessary libraries**"
],
"metadata": {
"id": "u6jRRhX7PZQD",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"id": "ujsqLRDOa1-s",
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import statsmodels.api as sm\n",
"import numpy as np\n",
"import pandas as pd \n",
"from patsy import dmatrices\n",
"import matplotlib.pyplot as plt "
]
},
{
"cell_type": "markdown",
"source": [
"**1) Load the dataset, take a look at its properties (shape, data type, etc...). Be careful to set the dataframe incides correctly. Check for missing values, and replace them appropriately if any are present.**"
],
"metadata": {
"id": "Nd9BGtrOPfq3",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"file = 'diamonds.csv'\n",
"df = pd.read_csv(file, index_col=0)\n",
"print(df.shape)\n",
"print(df.info())\n",
"print(df.head())\n",
"print(df.isna().sum())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "z0QYojPwf0-s",
"outputId": "361f8e75-f41e-44c4-defb-3628e888f261",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 16,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(53940, 10)\n",
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 53940 entries, 1 to 53940\n",
"Data columns (total 10 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 carat 53940 non-null float64\n",
" 1 cut 53940 non-null object \n",
" 2 color 53940 non-null object \n",
" 3 clarity 53940 non-null object \n",
" 4 depth 53940 non-null float64\n",
" 5 table 53940 non-null float64\n",
" 6 price 53940 non-null int64 \n",
" 7 x 53940 non-null float64\n",
" 8 y 53940 non-null float64\n",
" 9 z 53940 non-null float64\n",
"dtypes: float64(6), int64(1), object(3)\n",
"memory usage: 4.5+ MB\n",
"None\n",
" carat cut color clarity depth table price x y z\n",
"1 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43\n",
"2 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31\n",
"3 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31\n",
"4 0.29 Premium I VS2 62.4 58.0 334 4.20 4.23 2.63\n",
"5 0.31 Good J SI2 63.3 58.0 335 4.34 4.35 2.75\n",
"carat 0\n",
"cut 0\n",
"color 0\n",
"clarity 0\n",
"depth 0\n",
"table 0\n",
"price 0\n",
"x 0\n",
"y 0\n",
"z 0\n",
"dtype: int64\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"**2) Generate scatter plots of the variable 'price' against the variables 'x', 'y' and 'z'. Do you notice anything strange ? How would you handle such cases ?** "
],
"metadata": {
"id": "an3oV-dUZtP-",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"y = df.price.values \n",
"X = df.x.values \n",
"\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(X,y)\n",
"ax.set_xlabel('x')\n",
"ax.set_ylabel('price')\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
},
"id": "AE9Eo-7_Z_0G",
"outputId": "5e7cae5f-7855-4e5c-a2a4-63313ed506a5",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 11,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEGCAYAAACkQqisAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dfZRcdZ3n8fe3KxWpxtFONLJQEJNhYzgEJBl6ITPZmZH4EFwFetDlYUEZhwN6RtZB3cw0DmcAxSG7GQd1xmUOYFY8II8ybRhwIhJWz2YMQ8cEMEiGByWkiZAxaVTSgUr3d/+oW53q6nvrqevx3s/rnD5d9au6Vb+qdO73/p6+P3N3RERE6tHT7gqIiEj3UhAREZG6KYiIiEjdFERERKRuCiIiIlK3We2uQKu99a1v9QULFrS7GiIiXWXLli3/7u7zSssTF0QWLFjA8PBwu6shItJVzOz5sHJ1Z4mISN0UREREpG4KIiIiUjcFERERqZuCiIiI1C1xs7NEpPWGto6wdsMOXhwd46i+DKtXLWZgWbbqY6+5bzv79ucA6MukufrMJZPHV/PaM3l/Kc+SlsW3v7/fNcVXpHUuuOlHbHp275QyA5x8QDBjMkAUZNI9XHf2OwH47N2PMT7R2PNUqsc4/5Rj+KfHdjM6ln/vOb1pPvDOI6eVXXXGkooBpxCkRkbHSJkx7k42ZsHKzLa4e/+0cgUREZmpsCt9gNV3byM3Ud9r9gDpWT28drDOF2iQdMpY++GTIoPB0NYRrrj3CcZy49Mey6RTXHf2iQwsy3Z9a0hBJKAgIjLdTLubok6icZHty7BpcGXoYyvWbGRkdKzs8X2ZNK++fpDc+KHzbXGAqUa7g1BUENHAukjCFYLAyOgYDoyMjnHFvU8wtHWkquPXbtgR6wAC8GKZIFHusYLRsdyUAAIwlhtn7YYdVb3/TP+NmklBRCThwoJALSe4ak6i3a6vNx352FF9mbpft9rvbqb/Rs2kICKScFEnspHRMRYO3s+KNRvLXvHO5CTaLfbtz7Fg8H4WDN7PsVc8wJVDT0w+tnrVYtIpq+t1q/3uov6NOiGAK4iIJFy5E1k1XSeFQfSkGHfn1s07pwQS6hhazqRTVX93Uf9GnRDAFUREEq6aK+mx3DjX3LedFWs2TmudDCzL0peJ7u6Jq9sfeQHIdzXlqpiCnO4x5vSmMfID9bUMqq9etZhMOjWlrJYg1ExabFiFds+KEGmmgWVZPnfv49MGfkvt25+bXM9RaJ0Ujr/6zCWxn6FVajyY2VquS6lRa0YKx9VzHmr2+UtBpILS6Yul/3lE4mB/HYs5Cq2TwgnqzZk0h6V7GN2f46i+TMVpr90uZfnWW9RnLTctuB4Dy7I1n3Nacf5Sd1YFnTwrQqTd9u3PTU47HR3LcSA3wfXnLmXT4EqyHdBf30znn3oM0NldTa04fymIVNDJsyJEGqXSmEa1c4+KT1BhJ9e4uHD5fK4dOBHIX9Ffd/aJZPsydY13NFMrzl/qzqogqqnaCbMiRBrl6jOX8Jm7thE1Puzkr66rGfMoTA0+qi/D0XMO4+mXX21sZdvMYDKAFNTT1dQKrTh/Na0lYmbrzOxlM/tJUdmdZrYt+Pm5mW0LyheY2VjRY/9QdMzJZvaEmT1jZl81y3dEmtlcM3vQzJ4Ofs9pxufo5KaqSCMV+vjDFK6ui6+2y7VeClOD4xZAoLsuIFtx/mpmS+QbwN8D3ywUuPu5hdtm9iXglaLnP+vuS0Ne5wbgEuAR4AHgdOC7wCDwkLuvMbPB4P5fNPgzzGhWhEi3qDRN9bTj5k272r5y6Alu3byzFdXrGEZ3rYtpxfmraUHE3X9oZgvCHgtaE+cAZacumNmRwJvcfXNw/5vAAPkgchbwruCptwD/lyYEEejcpqpIo1TqI7//8d08/NSeKSeih5/a06LadQYDLlg+v6nngmZMx232+atdA+u/D7zk7k8XlS00s61m9gMz+/2gLAvsKnrOrqAM4Ah33x3c/gVwRNSbmdmlZjZsZsN79iTrD1+kGpW6aIpnYRWmicZ9Cm+pN2fS3LZ5Z8U0MPXq5CSL5bQriJwP3F50fzcw392XAZ8BvmVmb6r2xTyfzz6yLe7uN7p7v7v3z5s3r946i8RWrTOpkrSosGB0LDd5cr/8zm0sveZ7DT3Bd+tygpbPzjKzWcDZwMmFMnd/DXgtuL3FzJ4F3gGMAEcXHX50UAbwkpkd6e67g26vl1tRf5G4KO06+dDJWe5/fPe0XQYl3OhYrqEL97p1OUE7WiLvAZ5y98luKjObZ2ap4PZvA4uA54Luql+Z2fJgHOWjwHeCw9YDFwW3LyoqF5EKwrpOvr1lhKvOWMKFy+dXvS6kWMqMTDpZS8/K5RSrVScnWSynmVN8bwd+BCw2s11mdnHw0HlM7coC+APg8WDK7z3AJ9y9sCnznwI3A88Az5IfVAdYA7zXzJ4mH5jWNOuziMRNua6Th5/aU09SWibcOVDvXrhdLGy8qJ5A0q3LCbQ9rkgCLRy8PzRQFFogUWcFA3qCpIKlCmlOkjbgHqbevFmdnOw1antcrVgXSaBKK5nLJRSMWh9y2nH5SStJWzsSpt5xjG5cTpCsDkwRAcp3nVTqVolaH/LwU3tivXYk25fhy+curWrVfqePYzSSWiIiCVS42r3mvu2Ts7HeMKtnymNR3SrdOotopl597SDAlG6q0lTr0B3jGI2kICKSYMUD4aVTVgeWZSf76D995zbWbtjB6lWLy3aF7X/9YGynCIdN6VVaJA2siyTWijUby459RF1lf+jkLN/eMjKt/LqzT+Tq9dsZHYtnEClo9GZT3SJqYF1jIiIJValbKmoa8G2P7GQsNz6Z9bd4/4xXYh5AoLHddkNbRxqyxqSd1J0lkhCl00dnz+rhtYPT13X09eYHi6NOloXOi3H3yf7/QvdNX286tt1ZBY0aNI/L1ttqiYgkQNgK9bAAAoeCRDUny+LcTkNbR/jNgYONqnJHKh40n2kroltzZZVSS0QkAcJOWFEKXVKrVy3m8ju3VXz+yOhY5PhKXBhMGTSPakUMP793Wsr8qFZFVEuv8H12y0C9gohIAtTSj+/kB91Xr1pMXyZd1UB5nANI2EB65HjR5p2Tq/0rdU9FzXIzDn2f3dDFpe4skQSotR+/cPL64ElH1pWMMS6i1nxEjheV3C/XPRW2qNNqfI1OoCBShTjMoJBkq2fx21hunPsf380FdWb1jYPCrLNStQTlqIAzsCw7bd/6qAUXnbyQU0Gkgm7dbUyk2MCybGSKjnL27c/R//a5XB+k+0iS3nRPZBdSVCsiTLmAM7Asy6bBlfxszQfYNLgy8jvu5DQqCiIVxGUGhcjVZy6paffCgs/ctY1PBwPsc3prD0Tdavas6O8qrBVxwfL5M07l3o3p4DWwXkFS8wRJ/BSuqj9712OhqdyjTARPHRkdI92TnI6tV8Zy09bWnHbcvLKzr/rfPndGKVC6MY2K0p5UUCk1hEi3WTB4/4yOz6R7GEvA5lNmMKvHyI1HnyML6V46+STfKNpPpE6rVy1OfJZOiY+hrSOhM4BqkYQAAvlFl+UCCBzq2m5kEClu/fT1pnHPt4o6tVWiIFJBNzYvRUoVTkxxXs/RLo3OpVV80VqcQqZT14w0LYiY2Trgg8DL7n5CUHY1cAlQ2Lnmc+7+QPDYFcDFwDjwKXffEJSfDnwFSAE3u/uaoHwhcAfwFmAL8BF3f70Zn6UbdxsTKQjLxiuN08iZU5UyCzSj5TNTzZyd9Q3g9JDy6919afBTCCDHA+cBS4Jj/reZpcwsBXwNeD9wPHB+8FyA/xm81n8E9pEPQCJSZGjrCJ+96zEFkCbJpFOcdty8hq0jq6ZV02mTepoWRNz9h8DeKp9+FnCHu7/m7j8DngFOCX6ecffnglbGHcBZZmbASuCe4PhbgIGGfgCRLldogdQyE0uql+3LTO6t0qh1ZNW0ajptzUg71olcZmaPm9k6M5sTlGWBF4qesysoiyp/CzDq7gdLykOZ2aVmNmxmw3v2xHcPaJFitSRdLMikU1wYst5Bpts0uJKHn9rT0HVkYetEinXipJ5WB5EbgGOBpcBu4EuteFN3v9Hd+929f968ea14S5G2q7XbI2XGWG6ch5/aw4dOziZqYWGtjHxLr9HryEoXMc7pTdOXSU8uaOzE6cQtnZ3l7i8VbpvZTcA/BXdHgGOKnnp0UEZE+S+BPjObFbRGip8vIpTJEmvw5sPSvDKWo683zYHcOGO5iclur5HRMW7dvLPV1e0qTr6lV26/+Xp120SelrZEzOzIort/BPwkuL0eOM/M3hDMuloE/CvwKLDIzBaa2Wzyg+/rPb9C8mHgw8HxFwHfacVnEOkWUSk0rj9nKduueh/Xn7uUA7mJxKz7aLQXR8e6Mk1JozVziu/twLuAt5rZLuAq4F1mtpR8IP858HEAd99uZncBTwIHgU+6+3jwOpcBG8hP8V3n7tuDt/gL4A4zuxbYCny9WZ9FpBtVWuNUz5iJHHJUX0bryFDaE5HEWjh4/4xWridZuXQnpfm24hJUotKeKIuvSEJ12lTRTtaXSU/J2FsugCRt6wilPRFJqNWrFvPpO7epNVKFq89cUlVrotzWEXFojYRRS0QkoQaWZRO9a2Etqg0ASdw6QkFEJMGuHTiR689dqjUhZdSyI2RUF2Gcuw4VREQSbmBZlt7Z6tme05uedkJM9xhXn7mk6tdI4pRf/eWISKy7W6p1IDfOBPmV++PuZBOyM+FMKYiIJNzQ1hFmvFNVDBQWXY67T7Ye6jn5d9uK85lSd5ZIgg1tHWH13Y+RsOViFc0kiWLSKIiIJNjaDTvITSiChFEXX3XUnSWSMMUrqhU+osV5RlUjKYiIJIi2yq1OvTOq4prypBwFEZEEUdLFyub0prnqjEMr1KsNDKUBupDyBKpfrNiNNCYikiDq5y+vLzM9gFSbC6tcypM4UxARSRD185c3OpabEiRqCQxJTHkCCiIiiVJpD2/JB4lr7stvW1RLYEhiyhNQEKnK0NYRVqzZyMLB+1mxZmOs0zpLvBXv4S3R9u3PMbR1pKbAkMSUJ6AgUlES9weQeBtYlmXT4Mp2V6PjXXPf9poCQ3GArrTvSJxoZ8MKVqzZyEhI0zXbl9F/ROlKhdlGYX/XMtWXz10K1J4LK2xGVz2v00midjZs5h7r64APAi+7+wlB2VrgDOB14FngY+4+amYLgJ8ChdGqze7+ieCYk4FvABngAeDP3N3NbC5wJ7CA/H7t57j7vkZ/jqQOlkk8aZ1IbdZu2MGmwZU1nezDpvquvvsxMMiN+2RZXKb/NrM76xvA6SVlDwInuPs7gX8Drih67Fl3Xxr8fKKo/AbgEmBR8FN4zUHgIXdfBDwU3G+4pA6WSTxpnUht6rlYDPuOcxM+GUAK4jL9t2lBxN1/COwtKfueux8M7m4Gji73GmZ2JPAmd9/s+X63bwIDwcNnAbcEt28pKm+opA6WSTypBV2bei4Wa+kmjMO/RzsH1v8E+G7R/YVmttXMfmBmvx+UZYFdRc/ZFZQBHOHuu4PbvwCOiHojM7vUzIbNbHjPnj01VTKpg2UST2pBV6+ei8WhrSM1bTcch3+PtqQ9MbO/BA4CtwVFu4H57v7LYAxkyMyq3k4sGCOJnCHg7jcCN0J+YL3W+iZtfwCJr9WrFmtMpAops7ouFtdu2BGZ1DKdsildWnHp0Wh5S8TM/pj8gPsFQRcV7v6au/8yuL2F/KD7O4ARpnZ5HR2UAbwUdHcVur1ebskHEOlipetEemq5bE6QCfe6LhzLdU+t/fBJsezRaGlLxMxOB/4c+EN3319UPg/Y6+7jZvbb5AfQn3P3vWb2KzNbDjwCfBT4u+Cw9cBFwJrg93da+FFEulLp9F5tJRKu3m6mo/oykUsC4tqj0bSWiJndDvwIWGxmu8zsYuDvgd8CHjSzbWb2D8HT/wB43My2AfcAn3D3wqD8nwI3A8+Qb6EUxlHWAO81s6eB9wT3RSRC8cJZiTaTbqYkTsRpWkvE3c8PKf56xHO/DXw74rFh4ISQ8l8C755JHUWSRNN7q/M7899cd4uhcFw3LyqsldKeiCREHKaTtsLm58qvWa6US6+QVub6YLX7p+/cFuuce9qUSiQhovrrZarxkFRQxWNJBpMzsKJWnidpgyq1REQSQmngq5OyqVPWSseSSkNM2MrzJG1QpZaISEIUroAvv3Nbm2vS2c4/9Zgp96sZSyrtKkxSzj21REQSZGBZVmtDIvQYXLh8PtcOnDilvJoTf+mU4CTl3FMQEUmIwoCw1oaEe8OsFP1vnzutvNKJP2wKb5Km+iqIiCSA1ohUFjVmERYQCo25qJXnScq5pzERkQTQGpHqhHVd1bv2I64r1EspiIgkQBwHdJshquuqmoAQtpuhgoiIxILWiFQ2kzGL0N0M73mMq9dv55WxXKyDisZERBIgjgO6jTSnNz2jMYvQ3QzHndGxHM6hxYZxXLWuICKSAAPLsvRl0u2uRsc6kJtg+Pm9ZdOZlEt3Uk13YVwXGyqIiCTEB086st1V6FhjuXFu27yTkdGx0JZD8ey2sMerXf8Rx7Ep85A8MXHW39/vw8PD7a6GSMutWLNR4yJ1yPZl2P/6Qfbtz017LGXGhDtvzqR59fWDU3YujHqtTYMrm1XVpjKzLe7eX1qulohIQsTxKrgetS7YHxkdCw0gkE/W6MDoWA48P7Zi5H+nS1IDxHWxYdWzs8zs7cAid/++mWWAWe7+6+ZVTUQaKakztNIpA4dcsFS/WX0vuQmnd/Ystv7V+4DkTPmtKoiY2SXApcBc4Fjye53/A9oUSqRrnHbcPG7dvLPd1WipHoPDZ8/KtxRaoLi1l5TFhtV2Z30SWAH8CsDdnwbeVukgM1tnZi+b2U+Kyuaa2YNm9nTwe05Qbmb2VTN7xsweN7PfKTrmouD5T5vZRUXlJ5vZE8ExXzUzpZYTCXHl0BOJCyCQ30O+XACp5YTRl0lPpjEpTRdfEMcEi5VUG0Rec/fXC3fMbBbVtQq/AZxeUjYIPOTui4CHgvsA7wcWBT+XAjcE7zUXuAo4FTgFuKoQeILnXFJ0XOl7iSReUgNINZzqAkkmneLqM5ewaXAlP1vzAb50zkn5brIi6ZTFcsyjkmqDyA/M7HNAxszeC9wN3FfpIHf/IbC3pPgs4Jbg9i3AQFH5Nz1vM9BnZkcCq4AH3X2vu+8DHgRODx57k7tv9vwUs28WvZaIBG5/5IV2V6GjOflZU3CohTGnN01fJj0teWJhrcjld26bPhMrWRNdJ1U7sD4IXAw8AXwceAC4uc73PMLddwe3fwEcEdzOAsV/7buCsnLlu0LKRaRI2Havcki1025LU5uUyk04azfsSMQ4SLFqg0gGWOfuNwGYWSoo2z+TN3d3N7Om/4Wb2aXku8iYP39+s99OpGPEMc1GIxVPu600m6qeHQ6ToNrurIfIB42CDPD9Ot/zpaAriuD3y0H5CFC8L+XRQVm58qNDyqdx9xvdvd/d++fNm1dntUW6S+HKWcIZ8KGTs5PdVOVWpEN9OxwmQbVB5DB3/03hTnC7t873XA8UZlhdBHynqPyjwSyt5cArQbfXBuB9ZjYnGFB/H7AheOxXZrY8mJX10aLXEkk87SFSngMPP7UHCP+uSnNd1bPDYRJUG0ReLZlyezJQMSyb2e3Aj4DFZrbLzC4G1gDvNbOngfcE9yE/zvIc8AxwE/CnAO6+F/gC8Gjw8/mgjOA5NwfHPAt8t8rPIxJ7SexaqVXhO4r6rorL69nhMAmqHRO5HLjbzF4k/739B+DcSge5+/kRD01bpBjMsPpkxOusA9aFlA8DJ1Sqh0gSJXWFeqlMOsUbZvWErhcptC6ivqvi1ke9OxzGXVVBxN0fNbPjgEJbbYe7t2YJqIjUZfWqxay+57GKSQHjJt0Db3tTZsqJHpg2s6q4+2n1qsVlHy9Iyir0WpQNIma20t03mtnZJQ+9w8xw93ubWDcRmalkxQ8ADk7kg8LaDTsYGR3js3c9xrj7lEWFc3rTXHXGksmAoFZG/Sq1RP4Q2AicEfKYAwoiIh1q7YYdk0kHk6SvNz2lVVFYJ1P8TRzITUw7Tq2M+pQNIu5+lZn1AN9197taVCcRaYAkjoekU8bo/lzFBlhh5pWCxsxVHBNx9wkz+3NAQUSki6TMkrda3avvwSvMvEpKyvZmqXZ21vfN7H8AdwKvFgqLptqKSIdJWgBJmdXUfdfXm56WyqSwyBBQIKlStetEziW/JuMHwHDRj4h0qGyCVk+nU7W3un5z4CDX3Le94iJDKa/aIHI88DXgMWAb8HfAkmZVSkRmLlGrp4OtaWuRm/DIbW+1ULN61XZn3UJ+Q6qvBvf/W1B2TjMqJSJSi9yE08jeu7AUJxo7CVdtEDnB3Y8vuv+wmT3ZjAqJSGMkrUtmdCzH7JTxeg2LK3vTPewPme572nFTE7Vq7CRatUHkx2a2PNgsCjM7FY2JiHSU0ivlJE7xrSWAZNIpZs8KDyKFxIwF5RI0KohU52TgX8yssMfmfGCHmT1BPu3VO5tSOxGpStiVspHIBetVi8qnBdPHRKpJ0JhU1QYR7V0u0sHCrpQL+4crkISLCiCQn/67Ys3GyVZdX286dBA+ifuHlKo2AePzza6IiNQv6oq4sH94Eru26pVOGb85cHAyaIyMjtFj4c8tHTtJomqn+IpIB4u6Ik6Z8eLoGOmE/k83YNHbDq/6+dm+DIfPnjVt0WLUGsbSsZMkSuiflki8hG2YBPlV6w6EjB3HngG/d+xcdu07MK08TLYvw6bBlbxSppurlMZEFEREYmFgWZbrzj6x5gV3cZXty3D9uUv5+S/HIseKihXvHVLLOIfGRBRERGIlLMV5khjw5XOXsmlwJQPLshXHiozpW9uGterSKSNdMjCS1D3VS1U7O6thzGwx+USOBb8N/BXQB1wCFDoZP+fuDwTHXAFcDIwDn3L3DUH56cBXgBRws7uvQSShwmZoJY1zaPHf0NYReiIyGRe6rsJEbVAVVpb0NSIA5m3M9GlmKWAEOBX4GPAbd/+bkuccD9wOnAIcBXwfeEfw8L8B7wV2AY8C57t72ZX0/f39PjysdZISPwsH70/8dN5C+vtyU5sz6dSUlodUx8y2uHt/aXm7u7PeDTxbYQrxWcAd7v6au/8MeIZ8QDkFeMbdn3P314E7gueKJFKS+uejptyG7WJYLGWmANJg7Q4i55FvZRRcZmaPm9k6M5sTlGWBF4qesysoiyqfxswuNbNhMxves0dT8iSeVq9aTDoVNfcoXkqn3Kasus894T4lgAxtHWHFmo0sHLyfFWs2MrR1pJHVTIS2BREzmw2cCdwdFN0AHAssBXYDX2rUe7n7je7e7+798+ZpcZDE13gC91SH6jfgKm6tFVLFjIyO4RxKqqhAUpt2tkTeD/zY3V8CcPeX3H3c3SeAm8h3V0F+zOSYouOODsqiykUSae2GHZGL4iTv1dcOTgaJckkVpXotn51V5HyKurLM7Eh33x3c/SPgJ8Ht9cC3zOxvyQ+sLwL+lWAxqpktJB88ziO/z4lIImnhW2WjY7nJFO5KqtgYbQkiZnY4+VlVHy8q/l9mtpT8mNjPC4+5+3Yzuwt4EjgIfNLdx4PXuQzYQH6K7zp3396yDyHSZqWp36OSBMpUhdZGVLr8JE1QaIS2BBF3fxV4S0nZR8o8/4vAF0PKHwAeaHgFRTpcWOr3dI+R6rHEjovUYmR0jC+fu3TKdwj57g0lVaxNu2dniUgdwvrzcxPOhAJIVVJmDCzL8qGTs1NSoDjw7S0jGlyvQTvHRESkxNDWEa5ev31yr4s5vWmuOmPJtHUN5dJ5SGWF2VwPP7Vn2nemHQtroyAi0iGGto6w+u7HpqQh37c/x+p7HgOm7uWd1O1vGyUbjHvMZHC9dEwqqWlQ1J1VBS1IklZYu2HHtH0sAHLjPm3aaVTq96RKmTG7yoWW1WTsrTS4rjUmhyiIVKA/FmmVcle/pY8VUr8XMtFWu2I7rsbdeX08ujMvZVZ1xt5qsvNqjckh6s6qoNwfSxKbrtI85bqowq6MB5ZlJ/8Grxx6gls372xq/brZhDs/W/OBaeVRGXsr/d/WGpNDFEQq0B+LtMrqVYunjYlAfi+LSlfG2qa1vHLdU8XBuJbX0xqTPHVnVVBvn6lIrQaWZVn7X0+iL3Nod8I5vWnWfviksie5oa0jGmQvoxmbR9XbDRZHaolUsHrV4mkLkpL6xyLNV+tVcWHMTsKZ0ZTU7/V2g8WRgkgF+mORTlSYXqoWSHnXn7O0af9X6+kGiyMFkSroj0U6SWnKEwnXl0nr/20LKIiIdBntpT5dac6wTDrF1WcuAbQosNkURES6xAU3/YhNz+5tdzU60htSxpw3HTYtUIQlqiyMISmQNIaCiEgXUAApb39ugicHV04r1zqv5tMUX5EON7R1RAGkTlrn1XwKIiIdrJCUUcorXltTTOu8mk9BpApKwCjtEpWUUaYL+3+pRYHNpzGRCjQwJ+2ilehTpcwm9wEpNTqW47N3T0+Zr3VezWce8Y/S9Dc2+znwa2AcOOju/WY2F7gTWEB+n/Vz3H2fmRnwFeC/APuBP3b3HwevcxFwZfCy17r7LeXet7+/34eHh6uu54o1G0P/I2f7MmwKGcgTaQStBQmXSafKfieHz06x/fOnt7BGyWFmW9y9v7S83S2R09z934vuDwIPufsaMxsM7v8F8H5gUfBzKnADcGoQdK4C+slv6rbFzNa7+75GVTDqSlBXiNJIpWsZ9r9+UAGkRDZoRZRbqf/q6/rOWq3TxkTOAgotiVuAgaLyb3reZqDPzI4EVgEPuvveIHA8CDT0MiRqn4ak798gjRO2Z82+/bl2V6ujFMYxBpZl1QPQYdoZRBz4npltMbNLg7Ij3H13cPsXwBHB7SzwQtGxu4KyqPIpzOxSMxs2s+E9e2pLmR3VBxtVLlIrrUAPV7hMK91IqvixqGOkddrZnfWf3X3EzN4GPGhmTxU/6O5uZg05U7v7jcCNkB8TqeXYbMS+AVlNEZQGUdfodHN601x1xpLIAfALls8P3YTrguXzm101KUgnBUIAAAwbSURBVNG2loi7jwS/Xwb+ETgFeCnopiL4/XLw9BHgmKLDjw7KosobRlMEpZmGto7o6jlE7+xZZWdQXTtwIhcunz/ZrZwy48Ll87l24MRWVVECbWmJmNnhQI+7/zq4/T7g88B64CJgTfD7O8Eh64HLzOwO8gPrr7j7bjPbAPy1mc0Jnvc+4IpG1lVTBKWZrrlvO+oYna6aFeXXDpyooNEB2tWddQTwj/mZu8wCvuXu/2xmjwJ3mdnFwPPAOcHzHyA/vfcZ8lN8Pwbg7nvN7AvAo8HzPu/uDc8PoVTw0kjaC6QyrSjvHm0JIu7+HHBSSPkvgXeHlDvwyYjXWgesa3QdRZpB6z8qU3dxd+m0Kb4isaaZWJU1YztbaR4FEZEWUvbY8rJ9GQWQLqMgItJC6uuPpm6s7qQgItIEUZmfdZKczghfUCjdod25s0Rip1zmZ5lqTm+arX/1vnZXQ2ZAQUSkwaK2ZL3mvu385sDBNtWqM/3mwEGGto6oBdLF1J0l0mBRg+f79ue0wVSJ3ISzdsOOdldDZkBBRKTBNHheG81Y624KIiINtnrVYlI9yohVrb7e8P3RpTsoiIg02PDzexlXt1XVtKtCd1MQEWmw2x95ofKTZNLoWG7KNGjpLgoiIg2mDctqV5gGrUDSfRRERBos6Vsnp1P1ff6x3LhmanUhBRGRBjv/1GMqPynGDp89a3Lnz+J4evjsFJl0+VOOZmp1HwURkQYr7LqXVKNjOV597SDplE0ZNJ9wuO7sd5Y9VtOju4+CiEgTJH3HvdGxHLnxqWNDhe6qct19yi3WfRRERKRlXhwdi+zuW3HsXKU/6UIKIiJN0pfRIrpSR/VlJrv7Ci2SlBkXLp/PbZf8bptrJ/VoeQJGMzsG+Cb5fdYduNHdv2JmVwOXAHuCp37O3R8IjrkCuBgYBz7l7huC8tOBrwAp4GZ3X9PKzyJSSvunRyveL+TagRMT3+UXF+3I4nsQ+Ky7/9jMfgvYYmYPBo9d7+5/U/xkMzseOA9YAhwFfN/M3hE8/DXgvcAu4FEzW+/uT7bkU0gsFYLAi6NjHNWXmTzpFQJDyoxxd7LBY8XdL9o/fap0j/HGw2Yxuj83+V2quyp+Wh5E3H03sDu4/Wsz+ylQ7i/rLOAOd38N+JmZPQOcEjz2jLs/B2BmdwTPVRCRuoTtA3L5ndumPKewkHBkdIzV9zwGMHli1P7p+a6pCXcFjQRp634iZrYAWAY8AqwALjOzjwLD5Fsr+8gHmM1Fh+3iUNB5oaT81Ij3uRS4FGD+/OROvZTyag0CuXHn03dt49N3buOovkziu7Ay6ZR2J0ygtgURM3sj8G3gcnf/lZndAHyB/DjJF4AvAX/SiPdy9xuBGwH6+/trzklx5dAT3P7IC4y7kzLj/FOPUX9uDNWz0K2wDiLpASRlpgCSUG2ZnWVmafIB5DZ3vxfA3V9y93F3nwBu4lCX1QhQPCfw6KAsqryhrhx6gls375zsxhh359bNO7lySNudxo0WutUnk07xpXNOUgBJqJYHETMz4OvAT939b4vKjyx62h8BPwlurwfOM7M3mNlCYBHwr8CjwCIzW2hms8kPvq9vdH2jMrIqU2v8rF61mEw61e5qdJU5vWm1QBKuHd1ZK4CPAE+YWWHU8nPA+Wa2lHx31s+BjwO4+3Yzu4v8gPlB4JPuPg5gZpcBG8hP8V3n7tsbXdmojKzK1Bo/A8uy3D28k03P7m13VTrSorcdzv7XJ6bMXFPwkHbMzvp/QFjegwfKHPNF4Ish5Q+UO64RClM6w8olXoa2jvAvCiChVhw7V4sBJZRWrFcQlaIh6Zla42jthh2ofRlOAUSitHWKbzcozMLS7Kz4UxrycJXSt0uyKYhUQSkakkFrPcKN5SbaXQXpYLrEEAmsXrW47l354kzjf1KOgohIYPj5vdP2wEiKclObNRNRylEQEQEuuOlH3Lp5Z7ur0RaFtR7ZiMWWUeUioDEREa4ceiKRa0PCMhGXZiEuTt8uEkZBRBIjLM37wLJsIlsgKTM2Da6cUlacjVgLCqVa5gnr7+zv7/fh4eF2V0NaLGyvj1SPMT4R77//TLondHbVhcvna8ah1MTMtrh7f2m5WiKSCGFp3uMeQAy47ux3Mvz83prWOUW12ETCKIhIrBWyMCeNARcsn8/AsiwDy7JVtzrCNua64t58xmoFEgmj2VkSW0kLIIX1HNm+DNefu7Su7qqwFttYbpy1G3Y0pI4SP2qJSCwd95cPcCBBaz4aNcYRlfpFKWEkioKIxMYFN/0oMVN1jfyeCY3O5RaV+kUbdkkUBRGJhbgEkEVvO5xd+w5MW6vRqo2fVq9arLUiUhONiUgsdFsAmdObZsWxcyfHMVJmXLh8Pg9+5l2Tq8eN/PhGK3cOHFiWbev7S/dRS0SkhXrTPfz12e8se1IuzKhql3a/v3SXrg8iZnY68BXyW+Te7O5r2lwlkSm0sE/irKuDiJmlgK8B7wV2AY+a2Xp3f7K9NZNWW3Hs3I7p0kqnjLUfPklX85II3T4mcgrwjLs/5+6vA3cAZ7W5TtIGt13yuyx62+Ftee8Vx86dMoagACJJ0tUtESALvFB0fxdwaumTzOxS4FKA+fPnt6Zm0nIPfuZdkyk7Gr1DYVjGWxHp/iBSFXe/EbgR8gkY21wdaSINCou0Vrd3Z40AxxTdPzooExGRFuj2IPIosMjMFprZbOA8YH2b6yQikhhd3Z3l7gfN7DJgA/kpvuvcfXubqyUikhhdHUQA3P0B4IF210NEJIm6vTtLRETaKHHb45rZHuD5Og9/K/DvDaxOJ4r7Z4z75wN9xjjoxM/3dnefV1qYuCAyE2Y2HLbHcJzE/TPG/fOBPmMcdNPnU3eWiIjUTUFERETqpiBSmxvbXYEWiPtnjPvnA33GOOiaz6cxERERqZtaIiIiUjcFERERqZuCSJXM7HQz22Fmz5jZYLvr00hmdoyZPWxmT5rZdjP7s3bXqVnMLGVmW83sn9pdl2Ywsz4zu8fMnjKzn5rZ77a7To1kZp8O/kZ/Yma3m9lh7a7TTJnZOjN72cx+UlQ218weNLOng99z2lnHchREqlC0g+L7geOB883s+PbWqqEOAp919+OB5cAnY/b5iv0Z8NN2V6KJvgL8s7sfB5xEjD6rmWWBTwH97n4C+Xx557W3Vg3xDeD0krJB4CF3XwQ8FNzvSAoi1Yn1Doruvtvdfxzc/jX5E0/sNuUws6OBDwA3t7suzWBmbwb+APg6gLu/7u6j7a1Vw80CMmY2C+gFXmxzfWbM3X8IlO7tfBZwS3D7FmCgpZWqgYJIdcJ2UIzdSRbAzBYAy4BH2luTpvgy8OfARLsr0iQLgT3A/wm67G42s/bsGdwE7j4C/A2wE9gNvOLu32tvrZrmCHffHdz+BXBEOytTjoKITDKzNwLfBi5391+1uz6NZGYfBF529y3trksTzQJ+B7jB3ZcBr9LB3SC1CsYFziIfLI8CDjezC9tbq+bz/DqMjl2LoSBSndjvoGhmafIB5DZ3v7fd9WmCFcCZZvZz8t2RK83s1vZWqeF2AbvcvdCKvId8UImL9wA/c/c97p4D7gV+r811apaXzOxIgOD3y22uTyQFkerEegdFMzPy/eg/dfe/bXd9msHdr3D3o919Afl/v43uHqurWHf/BfCCmS0Oit4NPNnGKjXaTmC5mfUGf7PvJkYTB0qsBy4Kbl8EfKeNdSmr6zelaoUE7KC4AvgI8ISZbQvKPhds+CXd5b8DtwUXO88BH2tzfRrG3R8xs3uAH5OfUbiVLkoPEsXMbgfeBbzVzHYBVwFrgLvM7GLyW1ec074alqe0JyIiUjd1Z4mISN0UREREpG4KIiIiUjcFERERqZuCiIiI1E1BRERE6qYgIiIidVMQEWkzM/tPZva4mR1mZocH+2Wc0O56iVRDiw1FOoCZXQscBmTI57+6rs1VEqmKgohIBwjSlDwKHAB+z93H21wlkaqoO0ukM7wFeCPwW+RbJCJdQS0RkQ5gZuvJp6hfCBzp7pe1uUoiVVEWX5E2M7OPAjl3/5aZpYB/MbOV7r6x3XUTqUQtERERqZvGREREpG4KIiIiUjcFERERqZuCiIiI1E1BRERE6qYgIiIidVMQERGRuv1/KkEi7rDepVQAAAAASUVORK5CYII=\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"y = df.price.values \n",
"X = df.y.values \n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(X,y)\n",
"ax.set_xlabel('y')\n",
"ax.set_ylabel('price')\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
},
"id": "Okib0LkJaDtw",
"outputId": "5e9fb2eb-d550-4706-91af-ce7f60ef1918",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 10,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"y = df.price.values \n",
"X = df.z.values \n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(X,y)\n",
"ax.set_xlabel('z')\n",
"ax.set_ylabel('price')\n",
"plt.show()"
],
"metadata": {
"id": "F9bG8nfEaGFv",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
},
"outputId": "4053abbd-2b58-4e25-9262-843d4cd2678f",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 12,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"'''\n",
"The dimensional variables 'x', 'y' and 'z' take on the value 0, which is impossible.\n",
"Such outliers are likely to have resulted from an encoding error, and therefore, they\n",
"must be discarded. Also, some realizations take on very large values compared to the rest \n",
"of the distribution. However, we cannot guarantee that these values resulted from a mistake\n",
"in measurement or encoding, and a such, we cannot delete them. \n",
"'''\n",
"\n",
"#Remove impossible outliers\n",
"cols = ['x', 'y', 'z']\n",
"for col in cols:\n",
" df = df[df[col] != 0]"
],
"metadata": {
"id": "-XWKqWmJn-CV",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 17,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"**3) Select 'price' a the target variable and 'x' as the predictor. Fit a linear regression model to the data, and output the model's summary.**\n",
"\n",
"* **3.1) Is there evidence of a linear relationship between the target and the predictor variables ? What can you say regarding the statistical significance of the estimated coefficients ?**\n",
"\n",
"* **3.2) How do you interpret the value of the coefficients ?**\n",
"\n",
"* **3.3) What are the estimates' 95% confidence intervals, and how do you interpret them ?**"
],
"metadata": {
"id": "_s5Umk7Yh7YC",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"y, X = dmatrices('price ~ x', data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"\n",
"print(res.summary())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "R38E-trKm5SJ",
"outputId": "1d25a88d-d2df-458e-82c9-51a03395d713",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.787\n",
"Model: OLS Adj. R-squared: 0.787\n",
"Method: Least Squares F-statistic: 1.994e+05\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 13:13:01 Log-Likelihood: -4.8184e+05\n",
"No. Observations: 53920 AIC: 9.637e+05\n",
"Df Residuals: 53918 BIC: 9.637e+05\n",
"Df Model: 1 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"Intercept -1.418e+04 41.327 -343.177 0.000 -1.43e+04 -1.41e+04\n",
"x 3160.2360 7.077 446.578 0.000 3146.366 3174.106\n",
"==============================================================================\n",
"Omnibus: 12156.158 Durbin-Watson: 0.416\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 34567.308\n",
"Skew: 1.190 Prob(JB): 0.00\n",
"Kurtosis: 6.119 Cond. No. 31.3\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"* 3.1) The F-statistic and the R2 values all take on large values, indicating evidence of a linear relationship between 'price' and 'x'. All coefficients are statistically significant at the 5% level. \n",
"\n",
"* 3.2) \n",
" * A unit increase of 'x' results in an increase of the average price of the diamonds by 3160.24$.\n",
" * The intercept in this case does not mean anything by itself, as the variable 'x' cannot take on the value 0. Otherwise, it could have been interpreted as the mean price when the length of the diamonds is equal to 0. \n",
"\n",
"* 3.3) [-1.43e+04, -1.41e+0.4] and [3146.366, 3174.106]. This means that we know with 95% confidence that the true coefficient's estimates lie within these intervals. "
],
"metadata": {
"id": "djjiFHMmheXw",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**4) Add 'y' as another predictor variable, fit the model and output its summary.**\n",
"\n",
"* **4.1) Is there still evidence of a linear relationship between the target and predictor variables ?**\n",
"\n",
"* **4.2) How do you interpret the coefficients ?**\n",
"\n"
],
"metadata": {
"id": "839JBIPRjiAm",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"y, X = dmatrices('price ~ x + y', data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"\n",
"print(res.summary())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8MLESTI2nGCX",
"outputId": "a7d88494-182f-4efb-ccc7-7252545b084c",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.787\n",
"Model: OLS Adj. R-squared: 0.787\n",
"Method: Least Squares F-statistic: 9.981e+04\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 13:13:06 Log-Likelihood: -4.8182e+05\n",
"No. Observations: 53920 AIC: 9.636e+05\n",
"Df Residuals: 53917 BIC: 9.637e+05\n",
"Df Model: 2 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"Intercept -1.419e+04 41.333 -343.338 0.000 -1.43e+04 -1.41e+04\n",
"x 2957.9034 31.783 93.064 0.000 2895.608 3020.199\n",
"y 203.7694 31.206 6.530 0.000 142.605 264.934\n",
"==============================================================================\n",
"Omnibus: 12156.483 Durbin-Watson: 0.415\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 34658.814\n",
"Skew: 1.189 Prob(JB): 0.00\n",
"Kurtosis: 6.126 Cond. No. 47.3\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"* 4.1) Yes, but compared to the previous model only involving 'x' as a predictor variable, we cannot observe any major improvement, meaning that the introduction of the variable 'y' does not seem to add significant information. This is further corroborated by the value of the coefficient of 'y', which is one order of magnitude lower than the one of 'x', for equivalent scales (both variables measure a dimension in mm). \n",
"\n",
"* 4.2) \n",
"\n",
" * While keeping 'x' fixed, a unit increase in the variable 'y' leads to an increase of the average diamonds' price by 203.77 $. \n",
" \n",
" * While keeping 'y' fixed, a unit increase in the variable 'x' leads to an increase of the average diamonds' price by 2957.9 $. \n",
" * Here again, the intercept does not have interpretation. "
],
"metadata": {
"id": "O-uX3NkzMasn",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**5) Add an interaction term between 'x' and 'y', refit the model and output its summary.**\n",
"\n",
"* **5.1) Does the model seems to be a better fit compared to the one with only 'x' and 'y' ?** \n",
"\n",
"* **5.2) How do you interpret the coefficients ?**"
],
"metadata": {
"id": "L3KEoQ0dmJci",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"y, X = dmatrices('price ~ x*y', data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"\n",
"print(res.summary())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "f_RuymGVncgj",
"outputId": "c2d695eb-bf60-41f5-d92c-9584d954ffab",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.855\n",
"Model: OLS Adj. R-squared: 0.855\n",
"Method: Least Squares F-statistic: 1.064e+05\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 12:21:41 Log-Likelihood: -4.7141e+05\n",
"No. Observations: 53920 AIC: 9.428e+05\n",
"Df Residuals: 53916 BIC: 9.429e+05\n",
"Df Model: 3 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"Intercept 1.193e+04 167.407 71.257 0.000 1.16e+04 1.23e+04\n",
"x -500.3794 34.024 -14.707 0.000 -567.067 -433.692\n",
"y -5433.2565 43.740 -124.217 0.000 -5518.987 -5347.526\n",
"x:y 762.9945 4.788 159.364 0.000 753.610 772.378\n",
"==============================================================================\n",
"Omnibus: 20570.159 Durbin-Watson: 1.266\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 1646113.034\n",
"Skew: 0.947 Prob(JB): 0.00\n",
"Kurtosis: 30.002 Cond. No. 993.\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"* 5.1) Yes, compared to the model without an interaction, the model's statistics improved significantly (R2, AIC, BIC), indicating a strong interaction between the variables 'x' and 'y'. All coefficients are statistically significant at the 5% significance level. \n",
"\n",
"* 5.2) Interpreting coefficients when an interaction term is present makes the job trickier. When 'y' is fixed, a unit increase in 'x' leads to a variation of the average diamonds' price by -500.38 + 763*y $, which is positive if y > 0.65. The opposite interpretation can be directly done for 'x'. "
],
"metadata": {
"id": "7pOmjC3TOcuv",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**6) Generate dummy variables out of the variables 'cut', 'color' and 'clarity'. Make sure that for each of those variables, one level was selected as the reference level (and consequently, that this level is not represented by a dummy variable).**\n",
"\n",
"**Why do we need to have k-1 dummy variables, when k is the number of levels ?**"
],
"metadata": {
"id": "Js9HhxqHsCNs",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"cat_var = ['cut', 'color', 'clarity']\n",
"df_dummies = pd.get_dummies(df[cat_var], drop_first=True)\n",
"df_cont = df.drop(cat_var, axis=1)\n",
"df_cat = pd.concat([df_dummies, df_cont], axis=1)\n",
"\n",
"df_cat.rename(mapper={'cut_Very Good':'cut_Very_Good'}, axis=1, inplace=True)\n",
"\n",
"'''\n",
"If we create k dummy variables out of the k levels of a categorical variable, we make these variables collinear, meaning that \n",
"they are highly correlated. Indeed, if I want to generate k dummy variables out of the variable 'cut', I can exactly know the value of one dummy \n",
"by simply looking at the others. Let's imagine that the variable 'cut' can only take on three levels : Fair, Good, Very Good. If I generate three \n",
"dummy variables out of these levels, 'd_Fair', 'd_Good', 'd_VeryGood', I can say which value takes 'd_Fair' by simply looking at the realizations of 'd_Good'\n",
"and 'd_VeryGood', meaning that these three variables are highly correlated. This is known as the 'dummy trap'. However, if I define only 'd_Fair' and 'd_Good' \n",
"as dummy variables while keeping 'Very Good' as the reference level, my dummy variables are no longer correlated as it is impossible to know \n",
"which value takes 'd_Fair' by only looking at 'd_VeryGood'. \n",
"\n",
"The problem is that introducing highly correlated variables in a linear model makes the variance of the coefficient estimates blow up, \n",
"which is hardly a good thing. (you may try it yourself by removing 'drop_first=True' in the above cell and by fitting a linear model on the dummy's).\n",
"'''"
],
"metadata": {
"id": "bd9A56vMrfo5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
},
"outputId": "c34aaa93-decb-44f8-cdb3-ff2eebb62a28",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"\"\\nIf we create k dummy variables out of the k levels of a categorical variable, we make these variables collinear, meaning that \\nthey are highly correlated. Indeed, if I want to generate k dummy variables out of the variable 'cut', I can exactly know the value of one dummy \\nby simply looking at the others. Let's imagine that the variable 'cut' can only take on three levels : Fair, Good, Very Good. If I generate three \\ndummy variables out of these levels, 'd_Fair', 'd_Good', 'd_VeryGood', I can say which value takes 'd_Fair' by simply looking at the realizations of 'd_Good'\\nand 'd_VeryGood', meaning that these three variables are highly correlated. This is known as the 'dummy trap'. However, if I define only 'd_Fair' and 'd_Good' \\nas dummy variables while keeping 'Very Good' as the reference level, my dummy variables are no longer correlated as it is impossible to know \\nwhich value takes 'd_Fair' by only looking at 'd_VeryGood'. \\n\\nThe problem is that introducing highly correlated variables in a linear model makes the variance of the coefficient estimates blow up, \\nwhich is hardly a good thing. (you may try it yourself by removing 'drop_first=True' in the above cell and by fitting a linear model on the dummy's).\\n\""
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "string"
}
},
"metadata": {},
"execution_count": 18
}
]
},
{
"cell_type": "markdown",
"source": [
"**7) Refit the model using the dummy variables obtained from the variable 'color', and output its summary.**\n",
"\n",
"* **7.1) Does the model seem to be a good fit ?**\n",
"\n",
"* **7.2) Are all coefficients significant ? if not, what does it mean ?**\n",
"\n",
"* **7.3) How do you interpret the coefficients ?**\n"
],
"metadata": {
"id": "j16LXvghtAPt",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"y, X = dmatrices('price ~ color_E + color_F + color_G + color_H + color_I + color_J', data=df_cat, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"print(dir(res))\n",
"print(res.summary())\n",
"print(res.aic)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wC8JCYqMtYgS",
"outputId": "0f48db91-03e7-425d-e740-57f687a3127d",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"['HC0_se', 'HC1_se', 'HC2_se', 'HC3_se', '_HCCM', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_cache', '_data_attr', '_get_robustcov_results', '_is_nested', '_wexog_singular_values', 'aic', 'bic', 'bse', 'centered_tss', 'compare_f_test', 'compare_lm_test', 'compare_lr_test', 'condition_number', 'conf_int', 'conf_int_el', 'cov_HC0', 'cov_HC1', 'cov_HC2', 'cov_HC3', 'cov_kwds', 'cov_params', 'cov_type', 'df_model', 'df_resid', 'eigenvals', 'el_test', 'ess', 'f_pvalue', 'f_test', 'fittedvalues', 'fvalue', 'get_influence', 'get_prediction', 'get_robustcov_results', 'initialize', 'k_constant', 'llf', 'load', 'model', 'mse_model', 'mse_resid', 'mse_total', 'nobs', 'normalized_cov_params', 'outlier_test', 'params', 'predict', 'pvalues', 'remove_data', 'resid', 'resid_pearson', 'rsquared', 'rsquared_adj', 'save', 'scale', 'ssr', 'summary', 'summary2', 't_test', 't_test_pairwise', 'tvalues', 'uncentered_tss', 'use_t', 'wald_test', 'wald_test_terms', 'wresid']\n",
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.031\n",
"Model: OLS Adj. R-squared: 0.031\n",
"Method: Least Squares F-statistic: 289.8\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 16:32:40 Log-Likelihood: -5.2270e+05\n",
"No. Observations: 53920 AIC: 1.045e+06\n",
"Df Residuals: 53913 BIC: 1.045e+06\n",
"Df Model: 6 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"Intercept 3168.1064 47.685 66.438 0.000 3074.643 3261.570\n",
"color_E -91.3540 62.017 -1.473 0.141 -212.908 30.201\n",
"color_F 556.9738 62.361 8.931 0.000 434.746 679.201\n",
"color_G 828.7701 60.324 13.739 0.000 710.535 947.005\n",
"color_H 1312.8357 64.266 20.428 0.000 1186.873 1438.798\n",
"color_I 1921.8676 71.521 26.871 0.000 1781.685 2062.050\n",
"color_J 2155.7116 88.088 24.472 0.000 1983.059 2328.364\n",
"==============================================================================\n",
"Omnibus: 14688.045 Durbin-Watson: 0.058\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 33017.839\n",
"Skew: 1.575 Prob(JB): 0.00\n",
"Kurtosis: 5.185 Cond. No. 8.55\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
"1045406.5859328904\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"7.1) No, the very low R2 value compared to the previous models and the increase of the AIC and BIC tend to indicate that the variable 'color' is a poor predictor to explain the variable 'price'. Also, the F-statistic dropped. \n",
"\n",
"7.2) The coefficient of the dummy variable encoding the color E is not significant at the 5% significance level, meaning that, given the data, we do not have enough evidence that this coefficient is statistically different from 0. \n",
"\n",
"7.3) The average price for a diamond of color 'F' is 3168.1 + 556.97 = 3725.07 $, and the same reasoning can be applied to the other colors. In the case of dummy of dummy variables, the intercept has an important meaning, as it gives the average price of diamonds which have the reference level as color (in this case, the color 'D'). Thus, the average price of diamonds of color 'D' is 3168.1. "
],
"metadata": {
"id": "qg6abk-ddOrB",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**8) Refit the model using this time all predictor variables (at the exception of price, of course), and output its summary.**\n",
"\n",
"**What do you observe ? Does the model seem to be a better fit compared to the previous ones ? Are all coefficients still significant ?**"
],
"metadata": {
"id": "XjZ2AF9OdOg_",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"formula = 'price ~ '\n",
"columns = list(df.columns)\n",
"columns.remove('price')\n",
"for col in columns : formula += col + '+'\n",
"formula = formula.rstrip('+')\n",
"\n",
"y, X = dmatrices(formula, data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"print(res.summary())\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "fTr9nQ-8r4jI",
"outputId": "14cc1369-b113-4742-9b8f-0498aa4e0989",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.920\n",
"Model: OLS Adj. R-squared: 0.920\n",
"Method: Least Squares F-statistic: 2.699e+04\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 16:47:13 Log-Likelihood: -4.5542e+05\n",
"No. Observations: 53920 AIC: 9.109e+05\n",
"Df Residuals: 53896 BIC: 9.111e+05\n",
"Df Model: 23 \n",
"Covariance Type: nonrobust \n",
"====================================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------------\n",
"Intercept 2711.9832 413.798 6.554 0.000 1900.936 3523.030\n",
"cut[T.Good] 574.3906 33.526 17.132 0.000 508.678 640.103\n",
"cut[T.Ideal] 824.8785 33.339 24.742 0.000 759.534 890.223\n",
"cut[T.Premium] 753.0040 32.164 23.411 0.000 689.962 816.046\n",
"cut[T.Very Good] 717.3414 32.178 22.293 0.000 654.272 780.411\n",
"color[T.E] -208.9032 17.849 -11.704 0.000 -243.887 -173.919\n",
"color[T.F] -267.4026 18.052 -14.813 0.000 -302.784 -232.021\n",
"color[T.G] -477.1752 17.676 -26.996 0.000 -511.820 -442.531\n",
"color[T.H] -979.7585 18.792 -52.138 0.000 -1016.590 -942.927\n",
"color[T.I] -1470.2534 21.114 -69.635 0.000 -1511.636 -1428.871\n",
"color[T.J] -2376.0662 26.071 -91.138 0.000 -2427.166 -2324.967\n",
"clarity[T.IF] 5340.2771 50.968 104.777 0.000 5240.380 5440.174\n",
"clarity[T.SI1] 3677.7624 43.617 84.320 0.000 3592.273 3763.252\n",
"clarity[T.SI2] 2716.6898 43.801 62.023 0.000 2630.839 2802.541\n",
"clarity[T.VS1] 4587.0437 44.519 103.035 0.000 4499.785 4674.302\n",
"clarity[T.VS2] 4276.3465 43.831 97.563 0.000 4190.436 4362.257\n",
"clarity[T.VVS1] 5004.0100 47.120 106.198 0.000 4911.655 5096.365\n",
"clarity[T.VVS2] 4951.8223 45.819 108.073 0.000 4862.016 5041.628\n",
"carat 1.153e+04 51.630 223.235 0.000 1.14e+04 1.16e+04\n",
"depth -65.0768 4.639 -14.029 0.000 -74.169 -55.985\n",
"table -26.4441 2.905 -9.102 0.000 -32.139 -20.749\n",
"x -1100.6815 34.993 -31.455 0.000 -1169.267 -1032.096\n",
"y 25.9330 19.447 1.334 0.182 -12.183 64.049\n",
"z -114.9809 37.840 -3.039 0.002 -189.147 -40.815\n",
"==============================================================================\n",
"Omnibus: 14447.606 Durbin-Watson: 1.208\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 637923.673\n",
"Skew: 0.537 Prob(JB): 0.00\n",
"Kurtosis: 19.816 Cond. No. 7.26e+03\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
"[2] The condition number is large, 7.26e+03. This might indicate that there are\n",
"strong multicollinearity or other numerical problems.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"8) The R2 coefficent increased compared to previous models to a value of 0.92, but we must be careful as this behaviour is expected (increasing the number of predictors tends to increase the value of R2, whether they are meaningful or not). However, the AIC and BIC values, which account for the number of predictors in the model, also decreased, which tend to suggest a better fit. \n",
"\n",
"However, the coefficent of 'y' is not significant anymore, which would suggest that it needs to be removed from the model. Also, when estimating the p-values, we are conducting many hypothesis tests in parallel, which considerably increases the risk of Type 1 errors, and this should be appropriately accounted for (e.g. using a Bonferroni correction). "
],
"metadata": {
"id": "S62aaAjzhrzj",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**9) We will now select candidate features to fit our model using a forward selection strategy. To this end, we will define different entering criteria for our candidate features :**\n",
"* Does the introduction of the feature decreases the MSE ? \n",
"* Does the introduction of the feature decreases the AIC ? \n",
"* Does the introduction of the feature decreases the BIC ? \n",
" \n",
"**To this end, define two new functions : neg_AIC(y_true, y_pred, n, k) and neg_BIC(y_true, y_pred, n, k) that respectively compute the negative AIC and BIC given the ground truth y values (y_true), the predicted y values (y_pred), the number of samples (n) and the number of predictors (k). The AIC and BIC can be computed as such :**\n",
"\n",
"* AIC = 2*k + n*log(mse) \n",
"* BIC = n*log(mse) + k*log(n)"
],
"metadata": {
"id": "BJBVO1ojhWDy",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.model_selection import cross_val_score, cross_validate\n",
"from sklearn.metrics import make_scorer\n",
"from sklearn.metrics import mean_squared_error, r2_score\n",
"\n",
"\n",
"def forward_selection(df, model, target_column, columns, scoring_rule):\n",
" features_to_keep = []\n",
" features_to_try = [] \n",
" best_score = -np.inf\n",
" cond = True\n",
" y = df[target_column].values\n",
" while len(columns) != 0 and cond is True:\n",
" cond = False\n",
" best_feat = None \n",
" for col in columns: \n",
" features_to_try = features_to_keep + [col] \n",
" X = get_predictors(df, features_to_try)\n",
" n, k = X.shape[0], X.shape[1]\n",
" if scoring_rule == 'aic':\n",
" scorer = make_scorer(neg_AIC, n=n, k=k, greater_is_better=True)\n",
" elif scoring_rule == 'bic':\n",
" scorer = make_scorer(neg_BIC, n=n, k=k, greater_is_better=True)\n",
" else:\n",
" scorer = scoring_rule\n",
" cv_results = cross_validate(model, X, y, scoring=scorer, cv=10)\n",
" score = cv_results['test_score'].mean()\n",
" if score > best_score: \n",
" best_feat = col\n",
" cond = True\n",
" best_score = score\n",
" if best_feat != None:\n",
" columns.remove(best_feat)\n",
" features_to_keep.append(best_feat)\n",
" return features_to_keep, best_score \n",
"\n",
"def get_predictors(df, cols):\n",
" cat_pred = []\n",
" cont_pred = []\n",
" for col in cols:\n",
" if isinstance(df[col].values[0], str):\n",
" cat_pred.append(col)\n",
" else:\n",
" cont_pred.append(col)\n",
" if len(cat_pred) != 0:\n",
" df_dummies = pd.get_dummies(df[cat_pred], drop_first=True)\n",
" else:\n",
" df_dummies = pd.DataFrame() \n",
" df_cont = df[cont_pred] \n",
" df_cat = pd.concat([df_dummies, df_cont], axis=1)\n",
" \n",
" return df_cat.values \n",
"\n",
"\n",
"def neg_AIC(y_true, y_pred, n, k):\n",
" mse = mean_squared_error(y_true, y_pred)\n",
" return -(2*k + n*np.log(mse))\n",
"\n",
"def neg_BIC(y_true, y_pred, n, k):\n",
" mse = mean_squared_error(y_true, y_pred)\n",
" return -(n*np.log(mse) + k*np.log(n))\n"
],
"metadata": {
"id": "EyQkfpnZud5e",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 6,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"**10) Use the function forward_selection() and the functions neg_AIC() and neg_BIC() to perform a forward selection on the dataframe features (at the exception of carat) to see which subset of features is best to fit the target variable 'price'. Also, do a forward selection with an entering criterion defined as the MSE. When performing selection, do not consider the variable 'carat'.**\n",
"\n",
"**For each selection, report the best subset of features obtained, as well as the score obtained. What do you observe ?** "
],
"metadata": {
"id": "AS0VH-6mjFXV",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"columns = list(df.columns)\n",
"for x in ['price', 'carat'] : columns.remove(x)\n",
"model = LinearRegression(fit_intercept=True)\n",
"\n",
"features_MSE, score_MSE = forward_selection(df, model, 'price', columns.copy(), 'neg_mean_squared_error')\n",
"\n",
"print('Features kept using MSE : {}'.format(features_MSE))\n",
"print('Score : {}'.format(-score_MSE))\n",
"\n",
"model = LinearRegression(fit_intercept=True)\n",
"features_AIC, score_AIC = forward_selection(df, model, 'price', columns.copy(), 'aic')\n",
"\n",
"print('Features kept using AIC : {}'.format(features_AIC))\n",
"print('Score : {}'.format(-score_AIC))\n",
"\n",
"\n",
"model = LinearRegression(fit_intercept=True)\n",
"features_BIC, score_BIC = forward_selection(df, model, 'price', columns.copy(), 'bic')\n",
"\n",
"print('Features kept using BIC : {}'.format(features_BIC))\n",
"print('Score : {}'.format(-score_BIC))\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GNKAsJxVu8jO",
"outputId": "a8e4b6f9-2ae4-45a2-abea-f1126982dfcd",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Features kept using MSE : ['x', 'clarity', 'color', 'table', 'cut']\n",
"Score : 3690915.078216155\n",
"Features kept using AIC : ['y', 'clarity', 'color', 'table']\n",
"Score : 786903.289502688\n",
"Features kept using BIC : ['y', 'clarity', 'color', 'table']\n",
"Score : 787036.7239166384\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"10) The set of predictors obtained when defining the BIC or the AIC as the entering criterion is smaller than the one obtained with the MSE. This is expected, as the AIC and the BIC penalize the inclusion of a new predictor to the model, which is not the case of the MSE. As a general rule, using the BIC might result in a smaller set than when using the AIC, which might in turn results in a smaller set than when using the MSE. "
],
"metadata": {
"id": "swxJbt0Nj1WK",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "markdown",
"source": [
"**11) Looking at the scatter plot of the variable 'price' against the variable 'x', a linear model might not be the best fit to explain the relation between the two variables. Using a transformation of the variable 'x', try to obtain a better fit. Plot the linear regression line and the one obtained using the transformation of 'x'.**"
],
"metadata": {
"id": "ROq-BPSUkCJk",
"pycharm": {
"name": "#%% md\n"
}
}
},
{
"cell_type": "code",
"source": [
"'''\n",
"The scatter plot suggests that an higher order polynomial might be better suited than a linear term. This confirm this, \n",
"lets fit the model using the square of the variable 'x'. We observe that it endeed improves the results compared to \n",
"fitting the model only using 'x'. \n",
"'''\n",
"\n",
"df['x2'] = df['x']**2\n",
"\n",
"y, X = dmatrices('price ~ x2', data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"print(res.summary())\n",
"\n",
"p = res.params\n",
"fig, ax = plt.subplots()\n",
"ax.scatter(df['x'], df['price'])\n",
"xaxis = np.arange(3,11,1)\n",
"ax.plot(xaxis, p.Intercept + p.x2 * xaxis**2, color='red', label='Regression curve for x^2')\n",
"\n",
"y, X = dmatrices('price ~ x', data=df, return_type='dataframe')\n",
"\n",
"mod = sm.OLS(y, X)\n",
"\n",
"res = mod.fit()\n",
"p = res.params\n",
"ax.plot(xaxis, p.Intercept + p.x * xaxis, color='green', label='Regression line for x')\n",
"ax.set_xlabel('x')\n",
"ax.set_ylabel('price')\n",
"ax.legend()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 743
},
"id": "xMrxh-fuBh7Y",
"outputId": "1da51d01-697d-4316-bb80-3cda79a7c7cf",
"pycharm": {
"name": "#%%\n"
}
},
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.827\n",
"Model: OLS Adj. R-squared: 0.827\n",
"Method: Least Squares F-statistic: 2.586e+05\n",
"Date: Tue, 22 Mar 2022 Prob (F-statistic): 0.00\n",
"Time: 17:02:48 Log-Likelihood: -4.7618e+05\n",
"No. Observations: 53920 AIC: 9.524e+05\n",
"Df Residuals: 53918 BIC: 9.524e+05\n",
"Df Model: 1 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"Intercept -5301.4666 19.507 -271.777 0.000 -5339.700 -5263.233\n",
"x2 270.7099 0.532 508.511 0.000 269.666 271.753\n",
"==============================================================================\n",
"Omnibus: 12895.381 Durbin-Watson: 0.673\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 54771.774\n",
"Skew: 1.122 Prob(JB): 0.00\n",
"Kurtosis: 7.398 Cond. No. 100.\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f7c6b87cf50>"
]
},
"metadata": {},
"execution_count": 21
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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ax5++GFatWrFoUP/Fe5o27YtUVFRXL16lSFDhtCiRQvCw8P54osvsr12t27dSExMpHnz5qxcuZITJ07Qvn17mjRpQocOHTh16lTGe33sscdo2bIlzz77bKZrzJ49myFDhgBw4MABGjVqRFJSEpcvX6Zv374sWLCA1q1bM2vWLCpXrswrr7wCQNWqVWnWrBkAZcuWpX79+hk/X0+QMZKCYFuYuHQpHD0KAQFw//2WCfd77rHU48qF1povjn7BuM3jOHnppGR1iQJhNpvZtm0bQ4cOBWDEiBG8//771KlTh59//pknnniC7du3M3bsWMaOHUu/fv14//33M11j3759HDx4kNq1a7NgwQLKlSvHnj17uHbtGq1bt6ZTp06sW7eOzp078+KLL2I2m0lKSiImJobY2FgOHjwIkG0ILiUlhcGDB7Nt2zZuvfVWHnnkEebPn884a9CsVKkS+/bt47333uOtt97iww8/zPT8BQsWcOLECWJiYvD39yc+PvctJg4fPsyuXbsICgpi9uzZrFq1iilTpnDu3DnOnTtHREQEL7zwAu3bt2fRokUkJCTQokUL7r77bkrbDV+vX7+eMmXKEBMTA8D999/PoEGDGDRoEIsWLWLMmDFERkYClhTzH3/8EYMh835GY8eOpW3btnz++ee89tprfPDBBwQHBwPw/fffZzr3jTfecPh+Tpw4QXR0NC1bZtspJO9y6sYU5y+vD3+dP6/1/Plat25tGdoCre+6S+sPP9T64kW3LiVDXSVLYRj+8vPz002bNtWVKlXSbdq00WlpafrKlSs6MDBQN23aNOOrXr16WmutK1SokDE8c+nSpYzhsx07dui2bdtmXLd37966Tp06Gc+vVauW3rJli/7222/1zTffrCdNmqSjo6O11lrHx8frm266SY8ePVpv2rRJm81mrbXWgwYN0qtXr9YxMTG6TZs2Gdf+5ptvdM+ePbXWWtesWVOfOXNGa6317t27dYcOHbK9x169eumvv/462/GaNWvquLg4rbXWe/bs0XfddZfWWutJkybpyZMnZ5x35swZ3aBBA6211nPmzNEvvPCC1lrr5s2b64YNG2a8x+rVqzv8mdoPMVasWFGnpqZqrbVOTU3VFStWzHivixcvzvZcmz/++EOXLl1ajx8/3uk5zly5ckU3a9ZMr1271uk5eRn+kp6KJ6WkwFdfWXok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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}