{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "af3aad53-34f4-44ff-95aa-173ec916783b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Order</th>\n",
       "      <th>PID</th>\n",
       "      <th>MS SubClass</th>\n",
       "      <th>MS Zoning</th>\n",
       "      <th>Lot Frontage</th>\n",
       "      <th>Lot Area</th>\n",
       "      <th>Street</th>\n",
       "      <th>Alley</th>\n",
       "      <th>Lot Shape</th>\n",
       "      <th>Land Contour</th>\n",
       "      <th>...</th>\n",
       "      <th>Pool Area</th>\n",
       "      <th>Pool QC</th>\n",
       "      <th>Fence</th>\n",
       "      <th>Misc Feature</th>\n",
       "      <th>Misc Val</th>\n",
       "      <th>Mo Sold</th>\n",
       "      <th>Yr Sold</th>\n",
       "      <th>Sale Type</th>\n",
       "      <th>Sale Condition</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>526301100</td>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>141.0</td>\n",
       "      <td>31770</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2010</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>215000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>526350040</td>\n",
       "      <td>20</td>\n",
       "      <td>RH</td>\n",
       "      <td>80.0</td>\n",
       "      <td>11622</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>MnPrv</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>2010</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>105000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>526351010</td>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>81.0</td>\n",
       "      <td>14267</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Gar2</td>\n",
       "      <td>12500</td>\n",
       "      <td>6</td>\n",
       "      <td>2010</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>172000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 82 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Order        PID  MS SubClass MS Zoning  Lot Frontage  Lot Area Street  \\\n",
       "0      1  526301100           20        RL         141.0     31770   Pave   \n",
       "1      2  526350040           20        RH          80.0     11622   Pave   \n",
       "2      3  526351010           20        RL          81.0     14267   Pave   \n",
       "\n",
       "  Alley Lot Shape Land Contour  ... Pool Area Pool QC  Fence Misc Feature  \\\n",
       "0   NaN       IR1          Lvl  ...         0     NaN    NaN          NaN   \n",
       "1   NaN       Reg          Lvl  ...         0     NaN  MnPrv          NaN   \n",
       "2   NaN       IR1          Lvl  ...         0     NaN    NaN         Gar2   \n",
       "\n",
       "  Misc Val Mo Sold Yr Sold Sale Type  Sale Condition  SalePrice  \n",
       "0        0       5    2010       WD           Normal     215000  \n",
       "1        0       6    2010       WD           Normal     105000  \n",
       "2    12500       6    2010       WD           Normal     172000  \n",
       "\n",
       "[3 rows x 82 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from matplotlib.pyplot import subplots\n",
    "\n",
    "house = pd.read_csv('house.csv')\n",
    "house.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5a57462e-a2d4-46c6-a624-0bcea044517b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SalePrice</th>\n",
       "      <th>1st Flr SF</th>\n",
       "      <th>2nd Flr SF</th>\n",
       "      <th>Total Bsmt SF</th>\n",
       "      <th>Garage Area</th>\n",
       "      <th>Wood Deck SF</th>\n",
       "      <th>Open Porch SF</th>\n",
       "      <th>Lot Area</th>\n",
       "      <th>Year Built</th>\n",
       "      <th>Yr Sold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>215000</td>\n",
       "      <td>1656</td>\n",
       "      <td>0</td>\n",
       "      <td>1080.0</td>\n",
       "      <td>528.0</td>\n",
       "      <td>210</td>\n",
       "      <td>62</td>\n",
       "      <td>31770</td>\n",
       "      <td>1960</td>\n",
       "      <td>2010</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>105000</td>\n",
       "      <td>896</td>\n",
       "      <td>0</td>\n",
       "      <td>882.0</td>\n",
       "      <td>730.0</td>\n",
       "      <td>140</td>\n",
       "      <td>0</td>\n",
       "      <td>11622</td>\n",
       "      <td>1961</td>\n",
       "      <td>2010</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>172000</td>\n",
       "      <td>1329</td>\n",
       "      <td>0</td>\n",
       "      <td>1329.0</td>\n",
       "      <td>312.0</td>\n",
       "      <td>393</td>\n",
       "      <td>36</td>\n",
       "      <td>14267</td>\n",
       "      <td>1958</td>\n",
       "      <td>2010</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SalePrice  1st Flr SF  2nd Flr SF  Total Bsmt SF  Garage Area  \\\n",
       "0     215000        1656           0         1080.0        528.0   \n",
       "1     105000         896           0          882.0        730.0   \n",
       "2     172000        1329           0         1329.0        312.0   \n",
       "\n",
       "   Wood Deck SF  Open Porch SF  Lot Area  Year Built  Yr Sold  \n",
       "0           210             62     31770        1960     2010  \n",
       "1           140              0     11622        1961     2010  \n",
       "2           393             36     14267        1958     2010  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "house = house[house['Bldg Type'] == '1Fam']\n",
    "house = house[house['Sale Condition'] == 'Normal']\n",
    "sales = house[['SalePrice', '1st Flr SF', '2nd Flr SF', 'Total Bsmt SF', \n",
    "               'Garage Area', 'Wood Deck SF', 'Open Porch SF', 'Lot Area', \n",
    "               'Year Built', 'Yr Sold']]\n",
    "sales.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "dc99c17d-d999-4bbb-af21-5ac1f91ea888",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.000e+00, 1.656e+03, 0.000e+00],\n",
       "       [1.000e+00, 8.960e+02, 0.000e+00],\n",
       "       [1.000e+00, 1.329e+03, 0.000e+00],\n",
       "       ...,\n",
       "       [1.000e+00, 9.700e+02, 0.000e+00],\n",
       "       [1.000e+00, 1.389e+03, 0.000e+00],\n",
       "       [1.000e+00, 9.960e+02, 1.004e+03]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n = sales.shape[0] # Number of observations\n",
    "X = np.ones((n, 1))\n",
    "X = np.insert(X, 1, sales['1st Flr SF'], axis=1)\n",
    "X = np.insert(X, 2, sales['2nd Flr SF'], axis=1)\n",
    "y = sales['SalePrice'].reset_index(drop=True)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e3e94320-676a-49aa-aaa1-c635fb82ef7e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE =  1705349005.3197255\n",
      "Theta =  [-29985.3612312     155.19406373     91.35680257]\n"
     ]
    }
   ],
   "source": [
    "Z = np.matmul(X.T, X)\n",
    "t = np.linalg.inv(Z)@X.T@y\n",
    "MSE = (1/n) * np.linalg.norm(y - X@t)**2\n",
    "print('MSE = ', MSE)\n",
    "print('Theta = ', t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9a3d9c66-62ba-45d9-b880-1cab30593a19",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE, Theta: 37417784909.067505 [1.07477231e-04 1.33284713e-01 4.37624711e-02]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[1.000e+00, 1.656e+03, 0.000e+00],\n",
       "       [1.000e+00, 8.960e+02, 0.000e+00],\n",
       "       [1.000e+00, 1.329e+03, 0.000e+00],\n",
       "       ...,\n",
       "       [1.000e+00, 9.700e+02, 0.000e+00],\n",
       "       [1.000e+00, 1.389e+03, 0.000e+00],\n",
       "       [1.000e+00, 9.960e+02, 1.004e+03]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "learning_rate = 0.0000000001\n",
    "t = np.zeros(3).T\n",
    "for i in range(3):\n",
    "    t = t + (2*learning_rate/n) * (X.T @ (y - X@t))\n",
    "    loss = (1/n) * np.linalg.norm(y - X@t)**2\n",
    "\n",
    "MSE = (1/n) * np.linalg.norm(y - X@t)**2\n",
    "print('MSE, Theta:', MSE, t)\n",
    "\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "278ae7ed-ad33-4497-b7cb-e722260e5241",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE =  1705349005.3197255\n",
      "Theta =  [179184.62687313  56135.61010536  39157.22624338]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Scale the features\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit_transform(X)\n",
    "X_scaled[:, 0] = np.ones(sales.shape[0])\n",
    "\n",
    "Z = np.matmul(X_scaled.T, X_scaled)\n",
    "t = np.linalg.inv(Z)@X_scaled.T@y\n",
    "MSE = (1/n) * np.linalg.norm(y - X_scaled@t)**2\n",
    "print('MSE = ', MSE)\n",
    "print('Theta = ', t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "8626e088-be46-4f84-b869-0faade136a01",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE, Theta: 1705349005.3197255 [179184.62687313  56135.61010536  39157.22624338]\n"
     ]
    }
   ],
   "source": [
    "learning_rate = 0.01\n",
    "t = np.zeros(3).T\n",
    "for i in range(2000):\n",
    "    t = t + (2*learning_rate/n) * (X_scaled.T @ (y - X_scaled@t))\n",
    "    #MSE = (1/n) * np.linalg.norm(y - X_scaled@t)**2\n",
    "    #print('RMSE, Theta:', MSE, t)\n",
    "\n",
    "MSE = (1/n) * np.linalg.norm(y - X_scaled@t)**2\n",
    "print('RMSE, Theta:', MSE, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a94812fa-0837-4cd1-a571-cdbfe8764724",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE, Theta: 1766798902.7592735 [174477.21671957  49694.33814832  37747.92307174]\n"
     ]
    }
   ],
   "source": [
    "# This is stochastic gradient descent\n",
    "learning_rate = 0.01\n",
    "t = np.zeros(3)\n",
    "n = sales.shape[0]\n",
    "for i in range(1200):\n",
    "    for j in range(n):\n",
    "        t = t + (2*learning_rate) * (y[j] - X_scaled[j, :]@t) * X_scaled[j, :]\n",
    "        \n",
    "MSE = (1/n) * np.linalg.norm(y - X_scaled@t)**2\n",
    "print('RMSE, Theta:', MSE, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "b3610460-6519-4075-bf65-0e325bc80f32",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE, Theta: 1705564912.1929908 [178949.12523594  55787.08837227  39290.02664459]\n"
     ]
    }
   ],
   "source": [
    "# This is batch gradient descent\n",
    "learning_rate = 0.01\n",
    "t = np.zeros(3)\n",
    "n = sales.shape[0]\n",
    "m=100\n",
    "for i in range(100):\n",
    "    for j in range(n//m):\n",
    "        t = t + (2*learning_rate/m) * X_scaled[j*m:(j+1)*m, :].T @ (y[j*m:(j+1)*m] - X_scaled[j*m:(j+1)*m, :]@t)\n",
    "        \n",
    "MSE = (1/n) * np.linalg.norm(y - X_scaled@t)**2\n",
    "print('RMSE, Theta:', MSE, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9ac7b373-7e89-4d38-9b9f-3b84b77af34f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SalePrice</th>\n",
       "      <th>1st Flr SF</th>\n",
       "      <th>2nd Flr SF</th>\n",
       "      <th>Total Bsmt SF</th>\n",
       "      <th>Garage Area</th>\n",
       "      <th>Wood Deck SF</th>\n",
       "      <th>Open Porch SF</th>\n",
       "      <th>Lot Area</th>\n",
       "      <th>Year Built</th>\n",
       "      <th>Yr Sold</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>SalePrice</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.642466</td>\n",
       "      <td>0.357522</td>\n",
       "      <td>0.652979</td>\n",
       "      <td>0.638594</td>\n",
       "      <td>0.352699</td>\n",
       "      <td>0.336909</td>\n",
       "      <td>0.290823</td>\n",
       "      <td>0.565165</td>\n",
       "      <td>0.025949</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1st Flr SF</th>\n",
       "      <td>0.642466</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.230561</td>\n",
       "      <td>0.765052</td>\n",
       "      <td>0.464566</td>\n",
       "      <td>0.247685</td>\n",
       "      <td>0.220888</td>\n",
       "      <td>0.303834</td>\n",
       "      <td>0.316339</td>\n",
       "      <td>0.026647</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2nd Flr SF</th>\n",
       "      <td>0.357522</td>\n",
       "      <td>-0.230561</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.182213</td>\n",
       "      <td>0.172852</td>\n",
       "      <td>0.097926</td>\n",
       "      <td>0.227684</td>\n",
       "      <td>0.025948</td>\n",
       "      <td>0.079553</td>\n",
       "      <td>-0.020525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Total Bsmt SF</th>\n",
       "      <td>0.652979</td>\n",
       "      <td>0.765052</td>\n",
       "      <td>-0.182213</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.456592</td>\n",
       "      <td>0.237535</td>\n",
       "      <td>0.204110</td>\n",
       "      <td>0.208933</td>\n",
       "      <td>0.425617</td>\n",
       "      <td>0.047675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Garage Area</th>\n",
       "      <td>0.638594</td>\n",
       "      <td>0.464566</td>\n",
       "      <td>0.172852</td>\n",
       "      <td>0.456592</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.237945</td>\n",
       "      <td>0.240943</td>\n",
       "      <td>0.183717</td>\n",
       "      <td>0.487135</td>\n",
       "      <td>0.029293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Wood Deck SF</th>\n",
       "      <td>0.352699</td>\n",
       "      <td>0.247685</td>\n",
       "      <td>0.097926</td>\n",
       "      <td>0.237535</td>\n",
       "      <td>0.237945</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.055236</td>\n",
       "      <td>0.127837</td>\n",
       "      <td>0.254986</td>\n",
       "      <td>0.019196</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Open Porch SF</th>\n",
       "      <td>0.336909</td>\n",
       "      <td>0.220888</td>\n",
       "      <td>0.227684</td>\n",
       "      <td>0.204110</td>\n",
       "      <td>0.240943</td>\n",
       "      <td>0.055236</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.095189</td>\n",
       "      <td>0.190891</td>\n",
       "      <td>-0.031687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Lot Area</th>\n",
       "      <td>0.290823</td>\n",
       "      <td>0.303834</td>\n",
       "      <td>0.025948</td>\n",
       "      <td>0.208933</td>\n",
       "      <td>0.183717</td>\n",
       "      <td>0.127837</td>\n",
       "      <td>0.095189</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.083281</td>\n",
       "      <td>-0.008188</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Year Built</th>\n",
       "      <td>0.565165</td>\n",
       "      <td>0.316339</td>\n",
       "      <td>0.079553</td>\n",
       "      <td>0.425617</td>\n",
       "      <td>0.487135</td>\n",
       "      <td>0.254986</td>\n",
       "      <td>0.190891</td>\n",
       "      <td>0.083281</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.046000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Yr Sold</th>\n",
       "      <td>0.025949</td>\n",
       "      <td>0.026647</td>\n",
       "      <td>-0.020525</td>\n",
       "      <td>0.047675</td>\n",
       "      <td>0.029293</td>\n",
       "      <td>0.019196</td>\n",
       "      <td>-0.031687</td>\n",
       "      <td>-0.008188</td>\n",
       "      <td>0.046000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               SalePrice  1st Flr SF  2nd Flr SF  Total Bsmt SF  Garage Area  \\\n",
       "SalePrice       1.000000    0.642466    0.357522       0.652979     0.638594   \n",
       "1st Flr SF      0.642466    1.000000   -0.230561       0.765052     0.464566   \n",
       "2nd Flr SF      0.357522   -0.230561    1.000000      -0.182213     0.172852   \n",
       "Total Bsmt SF   0.652979    0.765052   -0.182213       1.000000     0.456592   \n",
       "Garage Area     0.638594    0.464566    0.172852       0.456592     1.000000   \n",
       "Wood Deck SF    0.352699    0.247685    0.097926       0.237535     0.237945   \n",
       "Open Porch SF   0.336909    0.220888    0.227684       0.204110     0.240943   \n",
       "Lot Area        0.290823    0.303834    0.025948       0.208933     0.183717   \n",
       "Year Built      0.565165    0.316339    0.079553       0.425617     0.487135   \n",
       "Yr Sold         0.025949    0.026647   -0.020525       0.047675     0.029293   \n",
       "\n",
       "               Wood Deck SF  Open Porch SF  Lot Area  Year Built   Yr Sold  \n",
       "SalePrice          0.352699       0.336909  0.290823    0.565165  0.025949  \n",
       "1st Flr SF         0.247685       0.220888  0.303834    0.316339  0.026647  \n",
       "2nd Flr SF         0.097926       0.227684  0.025948    0.079553 -0.020525  \n",
       "Total Bsmt SF      0.237535       0.204110  0.208933    0.425617  0.047675  \n",
       "Garage Area        0.237945       0.240943  0.183717    0.487135  0.029293  \n",
       "Wood Deck SF       1.000000       0.055236  0.127837    0.254986  0.019196  \n",
       "Open Porch SF      0.055236       1.000000  0.095189    0.190891 -0.031687  \n",
       "Lot Area           0.127837       0.095189  1.000000    0.083281 -0.008188  \n",
       "Year Built         0.254986       0.190891  0.083281    1.000000  0.046000  \n",
       "Yr Sold            0.019196      -0.031687 -0.008188    0.046000  1.000000  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sales.corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "79f238b7-34e2-4fb1-888e-cdedc3aeeda8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One feature: 0.41276288766116953\n",
      "Two features: 0.6827991925732996\n",
      "Three features: 0.7726766859516288\n",
      "Four features: 0.7880072396536026\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(sales[['1st Flr SF']], sales['SalePrice'])\n",
    "r_sq = model.score(sales[['1st Flr SF']], sales['SalePrice'])\n",
    "print('One feature:', r_sq)\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(sales[['1st Flr SF', '2nd Flr SF']], sales['SalePrice'])\n",
    "r_sq = model.score(sales[['1st Flr SF', '2nd Flr SF']], sales['SalePrice'])\n",
    "print('Two features:', r_sq)\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(sales[['1st Flr SF', '2nd Flr SF', 'Year Built']], sales['SalePrice'])\n",
    "r_sq = model.score(sales[['1st Flr SF', '2nd Flr SF', 'Year Built']], sales['SalePrice'])\n",
    "print('Three features:', r_sq)\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(sales[['1st Flr SF', '2nd Flr SF', 'Year Built', 'Garage Area']], sales['SalePrice'])\n",
    "r_sq = model.score(sales[['1st Flr SF', '2nd Flr SF', 'Year Built', 'Garage Area']], sales['SalePrice'])\n",
    "print('Four features:', r_sq)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c833bbda-470e-43aa-9511-71c180ff5208",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
