model-registry/notebooks/wip/Linear_Probability_and_logistic_Regression_holdout.ipynb

3290 lines
180 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"id": "xwFyEsosINqT"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"id": "pKewSQysItJ-"
},
"outputs": [],
"source": [
"# https://www.statsmodels.org/stable/index.html\n",
"import statsmodels.api as sm"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"id": "Lz-DyAtNWsJR"
},
"outputs": [],
"source": [
"# Download Dataset from https://www.dropbox.com/scl/fi/32vgpt3jvtztu86avdnwg/Mortgage.xlsx?rlkey=qx1d46hzgn4h67zrcyajdyl3e&dl=1\n",
"# and add it to colab"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"id": "0zM8FGMJXJ70"
},
"outputs": [],
"source": [
"# mortgageDf = pd.read_excel(\"./Mortgage.xlsx\")\n",
"mortgageDf = pd.read_excel(\"https://www.dropbox.com/scl/fi/32vgpt3jvtztu86avdnwg/Mortgage.xlsx?rlkey=qx1d46hzgn4h67zrcyajdyl3e&dl=1\")"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 990
},
"id": "t0LUca0Myqw5",
"outputId": "527eb991-fb2c-420a-e8fe-9b983e793560"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>34.43</td>\n",
" <td>56.16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>39.19</td>\n",
" <td>36.89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>23.58</td>\n",
" <td>56.88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>29.92</td>\n",
" <td>27.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>25.26</td>\n",
" <td>44.38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>11.70</td>\n",
" <td>55.55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>32.21</td>\n",
" <td>31.28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>10.39</td>\n",
" <td>29.47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>21.46</td>\n",
" <td>29.34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.56</td>\n",
" <td>40.37</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1</td>\n",
" <td>37.91</td>\n",
" <td>22.92</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1</td>\n",
" <td>38.40</td>\n",
" <td>47.85</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0</td>\n",
" <td>26.62</td>\n",
" <td>25.50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0</td>\n",
" <td>14.36</td>\n",
" <td>21.87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>1</td>\n",
" <td>22.22</td>\n",
" <td>20.79</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>1</td>\n",
" <td>32.10</td>\n",
" <td>51.56</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>12.58</td>\n",
" <td>33.27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>27.53</td>\n",
" <td>25.63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>1</td>\n",
" <td>36.71</td>\n",
" <td>37.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>0</td>\n",
" <td>17.85</td>\n",
" <td>26.86</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2\n",
"0 1 16.35 49.94\n",
"1 1 34.43 56.16\n",
"2 1 39.19 36.89\n",
"3 1 23.58 56.88\n",
"4 0 29.92 27.05\n",
"5 1 25.26 44.38\n",
"6 1 36.51 48.98\n",
"7 1 11.70 55.55\n",
"8 0 32.21 31.28\n",
"9 1 28.74 35.63\n",
"10 1 18.28 39.50\n",
"11 0 10.12 31.39\n",
"12 0 10.39 29.47\n",
"13 0 21.46 29.34\n",
"14 1 33.56 40.37\n",
"15 1 37.91 22.92\n",
"16 1 31.81 47.56\n",
"17 0 25.88 44.58\n",
"18 1 38.40 47.85\n",
"19 0 26.62 25.50\n",
"20 0 14.36 21.87\n",
"21 1 22.22 20.79\n",
"22 1 32.10 51.56\n",
"23 0 11.75 32.96\n",
"24 1 10.32 48.59\n",
"25 0 11.43 34.78\n",
"26 0 12.58 33.27\n",
"27 0 27.53 25.63\n",
"28 1 36.71 37.05\n",
"29 0 17.85 26.86"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GQRNPIeyy6ub",
"outputId": "af3a1828-5bfb-4458-ee99-ecebf88ab76e"
},
"outputs": [
{
"data": {
"text/plain": [
"90"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf.size"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "yumMybniy85d",
"outputId": "e85c111d-108b-4a30-e3f1-cbcb8b515223"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>30.000000</td>\n",
" <td>30.000000</td>\n",
" <td>30.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.566667</td>\n",
" <td>24.305667</td>\n",
" <td>37.819333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.504007</td>\n",
" <td>9.842847</td>\n",
" <td>10.942216</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000000</td>\n",
" <td>10.120000</td>\n",
" <td>20.790000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.000000</td>\n",
" <td>14.857500</td>\n",
" <td>29.372500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>1.000000</td>\n",
" <td>25.570000</td>\n",
" <td>36.260000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.000000</td>\n",
" <td>32.182500</td>\n",
" <td>47.777500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>1.000000</td>\n",
" <td>39.190000</td>\n",
" <td>56.880000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2\n",
"count 30.000000 30.000000 30.000000\n",
"mean 0.566667 24.305667 37.819333\n",
"std 0.504007 9.842847 10.942216\n",
"min 0.000000 10.120000 20.790000\n",
"25% 0.000000 14.857500 29.372500\n",
"50% 1.000000 25.570000 36.260000\n",
"75% 1.000000 32.182500 47.777500\n",
"max 1.000000 39.190000 56.880000"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf.describe()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "aspq6hoPy_xZ",
"outputId": "6fa553af-188e-40f6-bf37-3a61224c5b0c"
},
"outputs": [
{
"data": {
"text/plain": [
"(30, 3)"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf.shape"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"id": "z_hVTvPrzYJr"
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "pIniVuaIzaaZ",
"outputId": "34e78f06-e2c7-4701-c78f-5aae99a9deb0"
},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 800x800 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting\n",
"fig1 = plt.figure(\n",
" figsize=(8, 8)\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 449
},
"id": "VHdpDE7o42Pf",
"outputId": "e2532b62-f91f-4497-e2da-540c54f34f2f"
},
"outputs": [
{
"data": {
"image/png": "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JP3zn//UzTffrISEBKWmpmrSpEk6ceKEf3833HCDsrOzNWvWLLVr104jR45s0LHXxXa5mTJlit58883GmAsAoIEqK6UHH5TKy6WkJCkmRoqK8r1PSvItnzu38R+iutBNN92k/v376+WXX/Yvi4qK0hNPPKH3339fzzzzjN544w3df//9kqRrrrlGy5YtU1JSko4cOaIjR47ovvvuk+T7O0QPPfSQ/vGPf2jdunXav3+/pk6dantOLVq0UEVFhaqqqnTrrbfqiy++0JYtW5SXl6dPP/1U48ePr3P7zZs3a+/evdq8ebOeeeYZrV692l/enn32WXXq1Ek/+9nP/POXpJkzZ6q8vFxvvvmmdu3apZ///OdKSEiwPfdq586d07hx43T99dfrvffeU2Fhoe666y5/mdqwYYNuu+02jR49Wu+++67y8/M1ePBg//Z1ZZmRkaE//vGPkqQ9e/boyJEjWr58uZYvX66srCz/lbAjR44oIyNDJ0+e1E033aQrr7xS77zzjjZt2qTi4mJ95zvfqTHnZ555RrGxsXrrrbe0cuXKkI+9PrZfobikpETDhg1T586dNW3aNE2ZMkXp6emNMTcAgE3btkl790rx8dJXXzLE5fIt/+QT33rXXNN08+rVq5fee+89/8cX3rORmZmphx9+WDNmzNBTTz2l2NhYtWrVSi6XS2lpaTXG+f73v+//d9euXfXEE0/o6quv9v/Jg/pUVlbq+eef13vvvae77rpL+fn52rVrl/bt26eMjAxJ0v/+7//qa1/7mt5++21dffXVAcdJTk7Wk08+KbfbrV69eumWW25Rfn6+fvCDHyg5OVlut9t/RaTagQMHdMcdd6hv377++TdEaWmpSkpKNGbMGHXr1k2SdMUVV/g//8gjj+i73/2uFi1a5F/Wv39//7/ry7JNmzaSpPbt29e4/yk2NtZ/Jazak08+qSuvvFKPPvqof9mqVauUkZGhjz76SD169JAkXX755XrssccadNzBsH3lZt26dTp06JDuvvturV27VpmZmbr55pv10ksv+S/JAQCcceyY76qM2x3482637/NBPJITVpZl1XiBtr/+9a8aOnSo0tPTlZiYqEmTJunzzz9XWVlZnePs2LFDY8eO1WWXXabExERdf/31knzFoS5PPfWUEhIS1KJFC02fPl2zZ8/W3Xffrd27dysjI8NfbCSpd+/eat26tXbv3n3R8b72ta/JfUHIHTp0qPfhsf/6r//Sww8/rGuvvVYLFiyoUfa+6tFHH1VCQoL/LdDxtWnTRlOnTtXIkSM1duxYLV++3H+VSJKKioo0dOjQi+4j1CwD+cc//qHNmzfXmHOvXr0kSXv37vWvN3DgQNtjhyKke25SUlKUk5Ojf/zjH9q2bZu6d++uSZMmqWPHjpo9e7Y+/vjjcM8TABCE9u3PF5hAqotP+/ZNO6/du3erS5cuknz3c4wZM0b9+vXTH//4R+3YsUMrVqyQVPdNpmfOnNHIkSOVlJSk5557Tm+//bZeeeWVereTpIkTJ6qoqEj79u3TmTNntHTp0gb97aev/t0jl8tV7zPCfvjDH+rTTz/VpEmTtGvXLg0aNEi//vWvA647Y8YMFRUV+d86duwYcL3f//73Kiws1DXXXKO1a9eqR48e+vvf/y7J99DbxTQky0BOnz6tsWPH1phzUVGRPv74Y1133XX+9Vq2bGl77FA06IbiI0eOKC8vT3l5eXK73Ro9erR27dql3r1761e/+lW45ggACNKQIVK3blJZmWRZNT9nWb7l3bv71msqb7zxhnbt2qU77rhDku+KQVVVlX75y1/q61//unr06KHDhw/X2CY2NrbW3xf68MMP9fnnn2vJkiX65je/qV69egV1M7EktWrVSt27d1d6enqNUnPFFVfo4MGDOnjwoH/ZBx98oJMnT6p3796hHnLA+Uu+e1lmzJihl19+WT/+8Y/19NNPB9y+TZs26t69u/8tOvrid5FceeWVys3N1datW9WnTx+tWbNGktSvX7+LPoU9mCwv9neeAh3bVVddpffff1+ZmZk15t29e/cmKzQXsl1uvF6v/vjHP2rMmDHq3LmzXnzxRc2aNUuHDx/WM888o7/+9a/6wx/+oJ/97GeNMV8AQB3cbumRR3zPjiotlbxeqarK97601Lf84Ycv/rBVQ5WXl+vo0aM6dOiQdu7cqUcffVS33nqrxowZo8mTJ0uSunfvLq/Xq1//+tf69NNP9eyzz9a6uTQzM1OnT59Wfn6+Tpw4obKyMl122WWKjY31b/enP/1JDz30UIPmO2zYMPXt21cTJ07Uzp07tX37dk2ePFnXX3+9Bg0aFPK4nTt31ptvvqlDhw75nzE0a9Ysvfbaa9q3b5927typzZs317hHxq59+/YpNzdXhYWF+uyzz/T666/r448/9o+5YMECPf/881qwYIF2797tv4lZUlBZdu7cWS6XS6+++qqOHz/ufzZbZmamtm3bpv379+vEiROqqqrSzJkz9cUXX+jOO+/U22+/rb179+q1117TtGnTGvxHMENhu9x06NBB06dPV+fOnbV9+3a98847mjFjhpKSkvzr3HjjjWF78SUAgD2jR0v/7/9JPXr4nh116pTvfc+evuWjRzfevjdt2qQOHTooMzNTo0aN0ubNm/XEE09o/fr1/ntU+vfvr6VLl+rnP/+5+vTpo+eee06LFy+uMc4111yjGTNmaPz48UpJSdFjjz2mlJQUrV69Wi+++KJ69+6tJUuW6PHHH2/QfF0ul9avX6/k5GRdd911GjZsmLp27aq1a9c2aNxFixZp//796tatm1JSUiT5roDMnDlTV1xxhUaNGqUePXrYejHBr4qPj9eHH36oO+64Qz169NBdd92lmTNn6j//8z8l+Z56/eKLL+pPf/qTBgwYoJtuuknbt2+XpKCyTE9P16JFizRnzhylpqYqOztbku9FDd1ut3r37q2UlBQdOHBAHTt21FtvvaXKykqNGDFCffv21axZs9S6desGPfwXKpdlffXCZd2effZZffvb31ZcXFxjzalRlZaWqlWrViopKalRyBrC6/Vq48aNGj16dK3HYXFx5GYfmYWmueV29uxZ7du3T126dGnQz9rKSt+zoo4d891jM2RI8FdsqqqqVFpaqqSkJEd+OTVX5GbfhZlVVFRc9Ny38/vb9lPBJ02aZHcTAIAD3O6mfbo3ECmolQAAwCiUGwAAYBTKDQAAMArlBgAilM3newDNXrjOeds3FAMAGldMTIxcLpeOHz+ulJSUGn+2oKlUVVWpoqJCZ8+e5Vk/NpCbfdWZffnll/r888/lcrka/KxGyg0ARBi3261OnTrpX//6l/bv3+/IHCzL0pdffqkWLVo4Uq6aK3Kz78LMoqKi1KlTpxp/tysUlBsAiEAJCQm6/PLLHfuDxF6vV2+++aauu+66ZvHaQJGC3Oyrzuz6669XixYtGlxsJMoNAEQst9sdlh/0oe773LlziouL45e0DeRmX3VmHo8nbOc7DwgCAACjUG4AAIBRKDcAAMAolBsAAGAUyg0AADAK5QYAABiFcgMAAIxCuQEAAEah3AAAAKNQbgAAgFEoNwAAwCiU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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(\n",
" mortgageDf[\"x1\"],\n",
" mortgageDf[\"y\"],\n",
" color='blue',\n",
" alpha=0.9,\n",
" label='Data Points - scatter',\n",
")\n",
"\n",
"plt.xlabel('x1')\n",
"plt.ylabel('y')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ean6vMxkWfHF"
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 449
},
"id": "knAa4W9R47rZ",
"outputId": "cb8121da-a185-417f-fa26-a0e9ad2b8faa"
},
"outputs": [
{
"data": {
"image/png": "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XE2ZMkXt2rVTZGSk74yI16FDh3TXXXepT58+vvrro6ioSIWFhbrtttt0ySWXSJIuu+wy3/1PPfWU/u3f/k1z5871TevXr5/v+qd77rnH9w3F/vZlu3btJEkdOnSocP1TdHS070yY1wsvvKArrrhCTz/9tG/akiVLlJqaqr1796p79+6SpEsvvVTPPvtsvfoORNBnblatWqUjR47ovvvu04oVK5SWlqZbbrlFb775pu+UHAAgNI4ft8/KREb6vz8y0r4/gHdyGpRlWRW+oO3999/XTTfdpJSUFLVq1Urjx4/XP/7xDxUXF9e4nm3btmnUqFG66KKL1KpVK11//fWS7OBQk5deeknx8fFq2bKlpkyZopkzZ2rq1Knau3evUlNTfcFGknr16qU2bdpo9+7d1a7v8ssvV2S5ndyxY8da3x772c9+pieffFLXXHONsrOzK4S9yp5++mnFx8f7fvz1165dO02aNEkjRozQqFGjtGjRIt9ZIknauXOnbrrppmq3Udd96c8nn3yi9evXV6i5Z8+ekqT9+/f75hswYEDQ666LOl1z0759e2VmZuqTTz7R5s2b1a1bN40fP16dOnXSzJkz9dVXXzV0nQCAAHTo8H2A8ccbfDp0aNq6du/erYsvvliSfT3Hbbfdpr59++pPf/qTtm3bphdffFFSzReZnj17ViNGjFBCQoJeeeUVffzxx3rrrbdqXU6Sxo0bp507d+rAgQM6e/asFixYUK+/q1T57x65XK5aPxH205/+VF9//bXGjx+vXbt2aeDAgXr++ef9zjt16lTt3LnT99OpUye/8/3+97/Xpk2bdPXVV2vFihXq3r27/va3v0my33qrztmzZ3XLLbfUaV/6c+bMGY0aNapCzTt37tRXX32l6667zjffBRdcEPS666JeFxTn5+crJydHOTk5ioyM1MiRI7Vr1y716tVLv/71rxuqRgBAgAYPli65RCouliyr4n2WZU/v1s2er6l88MEH2rVrl+666y5J9hkDj8ejX/3qV/qXf/kXde/eXUePHq2wTHR0dJW/L7Rnzx794x//0Pz583XttdeqZ8+eAV1MLEmtW7dWt27dlJKSUiHUdO/eXYcPH9bhw4d907744gudOnVKvXr1qmvLfuuX7GtZpk6dqpUrV+rnP/+5Xn75Zb/Lt2vXTt26dfP9tGhR/VUkV1xxhbKysrRx40b17t1by5cvlyT17du32o+wf/XVV7Xuy+r+zpO/3q688kp9/vnnSktLq1B3t27dmizQlBd0uHG73frTn/6k2267TV26dNEbb7yhGTNm6OjRo1q2bJnef/99vf7663r88ccbo14AQA0iI6WnnrI/HVVUJLndksdj/y4qsqc/+WT1b1vVV0lJiY4dO6YjR45o+/btevrpp3X77bfrtttu04QJEyRJ3bp1k9vt1vPPP6+vv/5af/jDH6pcXJqWlqYzZ84oNzdXJ0+eVHFxsS666CJFR0f7lvvzn/+sJ554ol71DhkyRH369NG4ceO0fft2bdmyRRMmTND111+vgQMH1nm9aWlp+vDDD3XkyBHfJ4ZmzJihd999VwcOHND27du1fv36CtfIBOvAgQPKysrSpk2b9M033+i9997TV1995Vtndna2Xn31VWVnZ2v37t2+i5glqXPnzrXuyy5dusjlcuntt9/WiRMnfJ9mS0tL0+bNm3Xw4EGdPHlSHo9H06ZN07fffqu7775bH3/8sfbv3693331XkydPrvcfwayLoMNNx44dNWXKFHXp0kVbtmzR1q1bNXXqVCUkJPjmueGGGxrsy5cAAMEZOVL64x+l7t3tT0edPm3/7tHDnj5yZONte926derYsaPS0tJ08803a/369Xruuee0evVq3zUq/fr104IFC/TMM8+od+/eeuWVVzRv3rwK67n66qs1depUjRkzRu3bt9ezzz6r9u3ba+nSpXrjjTfUq1cvzZ8/X7/85S/rVa/L5dJbb72ltm3b6rrrrtPQoUPVtWtXrVixol7rffzxx3Xw4EFdcsklat++vST7DMi0adN02WWX6eabb1b37t2D+jLByuLi4rRnzx7ddddd6t69u+69915NmzZN//Ef/yHJDm5vvPGG/vznP6t///668cYbtWXLFklSYmKilixZUuO+TElJ0dy5czVr1iwlJSUpIyNDkv2lhpGRkerVq5fat2+vQ4cOqVOnTvroo49UVlam4cOHq0+fPpoxY4batGlTr7f/6splWZVPXNbsD3/4g370ox8pNja2sWpqVEVFRWrdurUKCwsrBLKauN1urV27ViNHjqzyPqvJnNq35Nzendq3FF69nzt3TgcOHNDFF19cr+fasjL7U1HHj9vX2AweXPWMjcfjUVFRkRISEkLyIhRKTu09nPuu6dgP5vU7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586dU3x8vN566y316tVLO3fuNH68q+tdMne8Jem1117T9u3b9fHHH1e5z+THeU19S+aO+eDBg7V06VL16NFD+fn5mjt3rq699lp99tlnRo+3VHPvrVq1MnbMJcKNX9OmTdNnn31W5b1JJ6iu93vvvdf37z59+qhjx4666aabtH//fl1yySVNXWaD6dGjh3bu3KnCwkK9+eabmjhxojZs2BDqsppEdb336tXL2PE+fPiwpk+frpycHMXGxoa6nCYTSN+mjvktt9zi+3ffvn01ePBgdenSRa+//rpatmwZwsoaX029/+QnPzF2zCUuKK4iIyNDb7/9ttavX6/OnTv7picnJ6u0tFSnTp2qMH9BQYGSk5ObuMrGUV3v/gwePFiStG/fvqYordFER0erW7duGjBggObNm6d+/fpp0aJFjhjv6nr3x5Tx3rZtm44fP64rr7xSLVq0UIsWLbRhwwY999xzatGihZKSkowc99r6Lisrq7KMKWNeWZs2bdS9e3ft27fPEY/z8sr37o9JY064+X+WZSkjI0NvvfWWPvjgA1188cUV7h8wYICioqKUm5vrm/bll1/q0KFDFa5TaI5q692fnTt3SpI6duzYyNU1LY/Ho5KSEqPHuzre3v0xZbxvuukm7dq1Szt37vT9DBw4UOPGjfP928Rxr63vyMjIKsuYMuaVnTlzRvv371fHjh0d9zgv37s/Ro15qK9oDhf33Xef1bp1aysvL8/Kz8/3/RQXF/vmmTp1qnXRRRdZH3zwgbV161YrPT3dSk9PD2HVDaO23vft22c9/vjj1tatW60DBw5Yq1evtrp27Wpdd911Ia68fmbNmmVt2LDBOnDggPXpp59as2bNslwul/Xee+9ZlmXueFtWzb2bOt7VqfyJEZPHvbzyfZs85j//+c+tvLw868CBA9ZHH31kDR061EpMTLSOHz9uWZbZ411T7yaPuWVZFuHm/0ny+/P73//eN893331n3X///Vbbtm2tuLg464477rDy8/NDV3QDqa33Q4cOWdddd53Vrl07KyYmxurWrZv14IMPWoWFhaEtvJ7uueceq0uXLlZ0dLTVvn1766abbvIFG8syd7wtq+beTR3v6lQONyaPe3nl+zZ5zMeMGWN17NjRio6OtlJSUqwxY8ZY+/bt891v8njX1LvJY25ZluWyLMsKzTkjAACAhsc1NwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAEZZuXKlhg0bpvbt2yshIUHp6el69913Q10WgCZEuAFglA8//FDDhg3T2rVrtW3bNt1www0aNWqUduzYEerSADQR/rYUgGblxIkT6tOnj372s5/p4YcfliRt3LhRQ4YM0TvvvKObbrqpyjKXX365xowZo9mzZzd1uQBCoEWoCwCAYLRv315LlizR6NGjNXz4cPXo0UPjx49XRkaG32Dj8Xh0+vRptWvXLgTVAggFztwAaJamTZum999/XwMHDtSuXbv08ccfKyYmpsp8zz77rObPn689e/aoQ4cOIagUQFMj3ABolr777jv17t1bhw8f1rZt29SnT58q8yxfvlxTpkzR6tWrNXTo0BBUCSAUuKAYQLO0f/9+HT16VB6PRwcPHqxy/2uvvaaf/vSnev311wk2gMNw5gZAs1NaWqpBgwapf//+6tGjhxYuXKhdu3b53nZ69dVXdc899+i1117T7bffHuJqATQ1wg2AZufBBx/Um2++qU8++UTx8fG6/vrr1bp1a7399ttavny5Jk6cqEWLFunOO+/0LdOyZUu1bt06hFUDaCqEGwDNSl5enoYNG6b169frBz/4gSTp4MGD6tevn+bPn68VK1Zow4YNVZabOHGili5d2sTVAggFwg0AADAKFxQDAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCj/B/nRRD470HEeAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(\n",
" mortgageDf[\"x2\"],\n",
" mortgageDf[\"y\"],\n",
" color='blue',\n",
" alpha=0.9,\n",
" label='Data Points - scatter',\n",
")\n",
"\n",
"plt.xlabel('x2')\n",
"plt.ylabel('y')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "alIhUPPUzvli",
"outputId": "8f9061b4-09dd-4525-f39e-797b603cfd53"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y R-squared: 0.506\n",
"Model: OLS Adj. R-squared: 0.469\n",
"Method: Least Squares F-statistic: 13.82\n",
"Date: Sun, 09 Jun 2024 Prob (F-statistic): 7.37e-05\n",
"Time: 15:09:54 Log-Likelihood: -10.931\n",
"No. Observations: 30 AIC: 27.86\n",
"Df Residuals: 27 BIC: 32.07\n",
"Df Model: 2 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -0.8682 0.281 -3.089 0.005 -1.445 -0.291\n",
"x1 0.0188 0.007 2.694 0.012 0.004 0.033\n",
"x2 0.0258 0.006 4.107 0.000 0.013 0.039\n",
"==============================================================================\n",
"Omnibus: 1.526 Durbin-Watson: 2.217\n",
"Prob(Omnibus): 0.466 Jarque-Bera (JB): 0.712\n",
"Skew: 0.357 Prob(JB): 0.700\n",
"Kurtosis: 3.247 Cond. No. 194.\n",
"==============================================================================\n",
"\n",
"Notes:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
}
],
"source": [
"model1 = sm.OLS(\n",
" mortgageDf[\"y\"],\n",
" sm.add_constant(mortgageDf[[\"x1\", \"x2\"]])\n",
")\n",
"model1Fit = model1.fit()\n",
"print(model1Fit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 990
},
"id": "S-AyfiLN0Due",
"outputId": "827d6090-8431-46a4-fb36-c6e884539662"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" <td>0.729871</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>34.43</td>\n",
" <td>56.16</td>\n",
" <td>1.231162</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>39.19</td>\n",
" <td>36.89</td>\n",
" <td>0.823078</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>23.58</td>\n",
" <td>56.88</td>\n",
" <td>1.045349</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>29.92</td>\n",
" <td>27.05</td>\n",
" <td>0.394258</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>25.26</td>\n",
" <td>44.38</td>\n",
" <td>0.754114</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" <td>1.084883</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>11.70</td>\n",
" <td>55.55</td>\n",
" <td>0.787177</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>32.21</td>\n",
" <td>31.28</td>\n",
" <td>0.546666</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" <td>0.133337</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>10.39</td>\n",
" <td>29.47</td>\n",
" <td>0.088829</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>21.46</td>\n",
" <td>29.34</td>\n",
" <td>0.294027</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.56</td>\n",
" <td>40.37</td>\n",
" <td>0.806902</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1</td>\n",
" <td>37.91</td>\n",
" <td>22.92</td>\n",
" <td>0.438106</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" <td>0.770960</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1</td>\n",
" <td>38.40</td>\n",
" <td>47.85</td>\n",
" <td>1.091301</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0</td>\n",
" <td>26.62</td>\n",
" <td>25.50</td>\n",
" <td>0.292049</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0</td>\n",
" <td>14.36</td>\n",
" <td>21.87</td>\n",
" <td>-0.032692</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>1</td>\n",
" <td>22.22</td>\n",
" <td>20.79</td>\n",
" <td>0.087491</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>1</td>\n",
" <td>32.10</td>\n",
" <td>51.56</td>\n",
" <td>1.068443</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" <td>0.581396</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>12.58</td>\n",
" <td>33.27</td>\n",
" <td>0.228245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>27.53</td>\n",
" <td>25.63</td>\n",
" <td>0.312551</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>1</td>\n",
" <td>36.71</td>\n",
" <td>37.05</td>\n",
" <td>0.780489</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>0</td>\n",
" <td>17.85</td>\n",
" <td>26.86</td>\n",
" <td>0.161955</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1\n",
"0 1 16.35 49.94 0.729871\n",
"1 1 34.43 56.16 1.231162\n",
"2 1 39.19 36.89 0.823078\n",
"3 1 23.58 56.88 1.045349\n",
"4 0 29.92 27.05 0.394258\n",
"5 1 25.26 44.38 0.754114\n",
"6 1 36.51 48.98 1.084883\n",
"7 1 11.70 55.55 0.787177\n",
"8 0 32.21 31.28 0.546666\n",
"9 1 28.74 35.63 0.593656\n",
"10 1 18.28 39.50 0.496558\n",
"11 0 10.12 31.39 0.133337\n",
"12 0 10.39 29.47 0.088829\n",
"13 0 21.46 29.34 0.294027\n",
"14 1 33.56 40.37 0.806902\n",
"15 1 37.91 22.92 0.438106\n",
"16 1 31.81 47.56 0.959656\n",
"17 0 25.88 44.58 0.770960\n",
"18 1 38.40 47.85 1.091301\n",
"19 0 26.62 25.50 0.292049\n",
"20 0 14.36 21.87 -0.032692\n",
"21 1 22.22 20.79 0.087491\n",
"22 1 32.10 51.56 1.068443\n",
"23 0 11.75 32.96 0.204600\n",
"24 1 10.32 48.59 0.581396\n",
"25 0 11.43 34.78 0.245584\n",
"26 0 12.58 33.27 0.228245\n",
"27 0 27.53 25.63 0.312551\n",
"28 1 36.71 37.05 0.780489\n",
"29 0 17.85 26.86 0.161955"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict1 = model1Fit.predict(sm.add_constant(mortgageDf[[\"x1\", \"x2\"]]))\n",
"mortgageDf['predict1'] = predict1\n",
"mortgageDf"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9ouX-mzz4sl-",
"outputId": "6f95fccb-ab1c-4fef-a53f-d744ad00a45b"
},
"outputs": [
{
"data": {
"text/plain": [
"array([0.28356899])"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model1Fit.predict([[1, 20, 30]])"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ujSQIAwa8DRG",
"outputId": "ff3d1a58-32f5-4bef-cb57-97ab79bbdd53"
},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.10389379])"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model1Fit.predict([[1, 20, 15]])"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yQ8XuYfr8Fs6",
"outputId": "06169e06-16e7-44be-c599-ba17fceb48ca"
},
"outputs": [
{
"data": {
"text/plain": [
"array([1.17698081])"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model1Fit.predict([[1, 40, 50]])"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "l_wGiUmL9Xta",
"outputId": "9beb1054-bd82-4438-b3f7-d115d51a8b88"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.363910\n",
" Iterations 7\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 30\n",
"Model: Logit Df Residuals: 27\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.4681\n",
"Time: 15:09:54 Log-Likelihood: -10.917\n",
"converged: True LL-Null: -20.527\n",
"Covariance Type: nonrobust LLR p-value: 6.708e-05\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -9.3671 3.196 -2.931 0.003 -15.631 -3.103\n",
"x1 0.1349 0.064 2.107 0.035 0.009 0.260\n",
"x2 0.1782 0.065 2.758 0.006 0.052 0.305\n",
"==============================================================================\n"
]
}
],
"source": [
"model2 = sm.Logit(\n",
" mortgageDf[\"y\"],\n",
" sm.add_constant(mortgageDf[[\"x1\", \"x2\"]])\n",
")\n",
"model2Fit = model2.fit()\n",
"print(model2Fit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 990
},
"id": "hICJCcTx9gKy",
"outputId": "6d072132-6408-4df8-ac73-75bb7a7bd6b2"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" <td>0.729871</td>\n",
" <td>0.850564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>34.43</td>\n",
" <td>56.16</td>\n",
" <td>1.231162</td>\n",
" <td>0.994966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>39.19</td>\n",
" <td>36.89</td>\n",
" <td>0.823078</td>\n",
" <td>0.923739</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>23.58</td>\n",
" <td>56.88</td>\n",
" <td>1.045349</td>\n",
" <td>0.981132</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>29.92</td>\n",
" <td>27.05</td>\n",
" <td>0.394258</td>\n",
" <td>0.375201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>25.26</td>\n",
" <td>44.38</td>\n",
" <td>0.754114</td>\n",
" <td>0.875451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" <td>1.084883</td>\n",
" <td>0.986447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>11.70</td>\n",
" <td>55.55</td>\n",
" <td>0.787177</td>\n",
" <td>0.892025</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>32.21</td>\n",
" <td>31.28</td>\n",
" <td>0.546666</td>\n",
" <td>0.634794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" <td>0.702665</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" <td>0.534624</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" <td>0.133337</td>\n",
" <td>0.082606</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>10.39</td>\n",
" <td>29.47</td>\n",
" <td>0.088829</td>\n",
" <td>0.062198</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>21.46</td>\n",
" <td>29.34</td>\n",
" <td>0.294027</td>\n",
" <td>0.223902</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.56</td>\n",
" <td>40.37</td>\n",
" <td>0.806902</td>\n",
" <td>0.913332</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1</td>\n",
" <td>37.91</td>\n",
" <td>22.92</td>\n",
" <td>0.438106</td>\n",
" <td>0.458048</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" <td>0.967716</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" <td>0.770960</td>\n",
" <td>0.887885</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1</td>\n",
" <td>38.40</td>\n",
" <td>47.85</td>\n",
" <td>1.091301</td>\n",
" <td>0.987144</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0</td>\n",
" <td>26.62</td>\n",
" <td>25.50</td>\n",
" <td>0.292049</td>\n",
" <td>0.225940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0</td>\n",
" <td>14.36</td>\n",
" <td>21.87</td>\n",
" <td>-0.032692</td>\n",
" <td>0.028410</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>1</td>\n",
" <td>22.22</td>\n",
" <td>20.79</td>\n",
" <td>0.087491</td>\n",
" <td>0.065109</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>1</td>\n",
" <td>32.10</td>\n",
" <td>51.56</td>\n",
" <td>1.068443</td>\n",
" <td>0.984517</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" <td>0.129233</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" <td>0.581396</td>\n",
" <td>0.664852</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" <td>0.164303</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>12.58</td>\n",
" <td>33.27</td>\n",
" <td>0.228245</td>\n",
" <td>0.149244</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>27.53</td>\n",
" <td>25.63</td>\n",
" <td>0.312551</td>\n",
" <td>0.252476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>1</td>\n",
" <td>36.71</td>\n",
" <td>37.05</td>\n",
" <td>0.780489</td>\n",
" <td>0.899188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>0</td>\n",
" <td>17.85</td>\n",
" <td>26.86</td>\n",
" <td>0.161955</td>\n",
" <td>0.102289</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2\n",
"0 1 16.35 49.94 0.729871 0.850564\n",
"1 1 34.43 56.16 1.231162 0.994966\n",
"2 1 39.19 36.89 0.823078 0.923739\n",
"3 1 23.58 56.88 1.045349 0.981132\n",
"4 0 29.92 27.05 0.394258 0.375201\n",
"5 1 25.26 44.38 0.754114 0.875451\n",
"6 1 36.51 48.98 1.084883 0.986447\n",
"7 1 11.70 55.55 0.787177 0.892025\n",
"8 0 32.21 31.28 0.546666 0.634794\n",
"9 1 28.74 35.63 0.593656 0.702665\n",
"10 1 18.28 39.50 0.496558 0.534624\n",
"11 0 10.12 31.39 0.133337 0.082606\n",
"12 0 10.39 29.47 0.088829 0.062198\n",
"13 0 21.46 29.34 0.294027 0.223902\n",
"14 1 33.56 40.37 0.806902 0.913332\n",
"15 1 37.91 22.92 0.438106 0.458048\n",
"16 1 31.81 47.56 0.959656 0.967716\n",
"17 0 25.88 44.58 0.770960 0.887885\n",
"18 1 38.40 47.85 1.091301 0.987144\n",
"19 0 26.62 25.50 0.292049 0.225940\n",
"20 0 14.36 21.87 -0.032692 0.028410\n",
"21 1 22.22 20.79 0.087491 0.065109\n",
"22 1 32.10 51.56 1.068443 0.984517\n",
"23 0 11.75 32.96 0.204600 0.129233\n",
"24 1 10.32 48.59 0.581396 0.664852\n",
"25 0 11.43 34.78 0.245584 0.164303\n",
"26 0 12.58 33.27 0.228245 0.149244\n",
"27 0 27.53 25.63 0.312551 0.252476\n",
"28 1 36.71 37.05 0.780489 0.899188\n",
"29 0 17.85 26.86 0.161955 0.102289"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predict2 = model2Fit.predict(sm.add_constant(mortgageDf[[\"x1\", \"x2\"]]))\n",
"mortgageDf['predict2'] = predict2\n",
"mortgageDf"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tBfMgF0Y9usy",
"outputId": "29db0b46-acbc-42c5-ab11-4490a2eecc47"
},
"outputs": [
{
"data": {
"text/plain": [
"(array([0.21042055]), array([0.01806123]), array([0.99289663]))"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model2Fit.predict([[1, 20, 30]]), model2Fit.predict([[1, 20, 15]]), model2Fit.predict([[1, 40, 50]])"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "iLB_t1-lWjAn",
"outputId": "77dc990d-db61-4e4a-e26e-0593cadeb631"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y R-squared: 0.197\n",
"Model: OLS Adj. R-squared: 0.168\n",
"Method: Least Squares F-statistic: 6.875\n",
"Date: Sun, 09 Jun 2024 Prob (F-statistic): 0.0140\n",
"Time: 15:09:54 Log-Likelihood: -18.211\n",
"No. Observations: 30 AIC: 40.42\n",
"Df Residuals: 28 BIC: 43.23\n",
"Df Model: 1 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const 0.0141 0.227 0.062 0.951 -0.451 0.479\n",
"x1 0.0227 0.009 2.622 0.014 0.005 0.040\n",
"==============================================================================\n",
"Omnibus: 5.223 Durbin-Watson: 2.358\n",
"Prob(Omnibus): 0.073 Jarque-Bera (JB): 1.806\n",
"Skew: -0.084 Prob(JB): 0.405\n",
"Kurtosis: 1.810 Cond. No. 70.8\n",
"==============================================================================\n",
"\n",
"Notes:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
]
}
],
"source": [
"model3 = sm.OLS(\n",
" mortgageDf[\"y\"],\n",
" sm.add_constant(mortgageDf[[\"x1\"]])\n",
")\n",
"model3Fit = model3.fit()\n",
"print(model3Fit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "PuixWL0hWw1e",
"outputId": "237434c6-c5eb-4ccd-a39e-d73fb6f1d215"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.579907\n",
" Iterations 5\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 30\n",
"Model: Logit Df Residuals: 28\n",
"Method: MLE Df Model: 1\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.1525\n",
"Time: 15:09:54 Log-Likelihood: -17.397\n",
"converged: True LL-Null: -20.527\n",
"Covariance Type: nonrobust LLR p-value: 0.01235\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -2.2077 1.140 -1.936 0.053 -4.442 0.027\n",
"x1 0.1043 0.046 2.282 0.022 0.015 0.194\n",
"==============================================================================\n"
]
}
],
"source": [
"model4 = sm.Logit(\n",
" mortgageDf[\"y\"],\n",
" sm.add_constant(mortgageDf[[\"x1\"]])\n",
")\n",
"model4Fit = model4.fit()\n",
"print(model4Fit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "YLIrig6rXKhw",
"outputId": "211239e6-b133-460b-fa77-c68169153bfa"
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"min = 0\n",
"min"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "w5OmNUfaXNsk",
"outputId": "14e9ae85-7cd1-47fd-a370-6904d3b170d5"
},
"outputs": [
{
"data": {
"text/plain": [
"(49.19, 30)"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max = mortgageDf[\"x1\"].max() + 10\n",
"max, len(mortgageDf[\"x1\"])"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"id": "sBBshZgnXQzO"
},
"outputs": [],
"source": [
"x = np.linspace(min - 5, max + 5, 500)\n",
"# x"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"id": "2zxAZeT5XwgE"
},
"outputs": [],
"source": [
"import math"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"id": "X2BmYiiDXgbw"
},
"outputs": [],
"source": [
"lREq = 0.0141 + x * 0.0227\n",
"logREq = pow(math.e, (-2.2077 + 0.1043 * x))/ (1+ pow(math.e, (-2.2077 + 0.1043 * x)))"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "C_8MU1W7YgR8",
"outputId": "33939ed7-8fc1-4813-bb7c-06c6f792c694"
},
"outputs": [
{
"data": {
"text/plain": [
"500"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(lREq)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 449
},
"id": "VZ6BxMqpXCOH",
"outputId": "b11dad1f-c306-46d0-fe8b-afc16e3f91f2"
},
"outputs": [
{
"data": {
"image/png": "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bkLJTV7680/zCag//jCnIX7hBXjxRXM6YhEREckR+lbNK998A4MHQ2IilCxpTqdw111WRyUiIuJ2lNzktkuXYPhw+OILc/n222H6dAgJsTYuERERN6XkJjcdOADPPQf795vNUIMGwYABNzYVsIiIiGSJkpvcMn8+vPKKeeemTBmzGer2262OSkRExO0puclpFy+aSc2CBebyXXfBtGlQurS1cYmIiBQSSm5y0t69ZjPUoUPg4WF2IO7Xz/xdRERE8oSSm5yyYoWZ2CQnQ2ioOXZNkyZWRyUiIlLoKLnJKbVqgZ+f2a9m6lQoUcLqiERERAolJTc5pXx5WLwYIiLUDCUiImIhJTc5qVIlqyMQEREp9HSLQURERNyKkhsRERFxK0puRERExK0ouRERERG3ouRGRERE3IqSGxEREXErSm5ERETErSi5EREREbei5EZERETcipIbERERcStKbkRERMStKLkRERERt6LkRkRERNxKoZsV3DAMAOLi4iyOJO/Y7XYSExOJi4vD29vb6nDyPdWXa1RfrlF9uU515hp3ra+07+207/FrKXTJTXx8PADh4eEWRyIiIiKuio+Pp3jx4tcsYzOykgK5EafTycmTJylWrBg2m83qcPJEXFwc4eHhHD9+nMDAQKvDyfdUX65RfblG9eU61Zlr3LW+DMMgPj6esmXL4uFx7V41he7OjYeHB+XLl7c6DEsEBga61Rs9t6m+XKP6co3qy3WqM9e4Y31d745NGnUoFhEREbei5EZERETcipKbQsDX15eRI0fi6+trdSgFgurLNaov16i+XKc6c43qqxB2KBYRERH3pjs3IiIi4laU3IiIiIhbUXIjIiIibkXJjYiIiLgVJTdubsaMGURERODn50eTJk3YunWr1SHlGz/99BNt27albNmy2Gw2Fi5cmGG7YRiMGDGCsLAwihQpQosWLTh48KA1weYDY8eO5dZbb6VYsWKUKVOGhx9+mP3792cok5SURN++fSlZsiQBAQE89thjxMbGWhSxtWbNmkWdOnXSB1KLjIxk6dKl6dtVV9c2btw4bDYbAwYMSF+nOvvHqFGjsNlsGX5q1KiRvr2w15WSGzc2f/58Bg0axMiRI9mxYwd169aldevWnDp1yurQ8oWLFy9St25dZsyYken28ePHM3XqVGbPns2WLVsoWrQorVu3JikpKY8jzR/W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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"plt.scatter(\n",
" mortgageDf[\"x1\"],\n",
" mortgageDf[\"y\"],\n",
" color='blue',\n",
" alpha=0.9,\n",
" label='Data Points - scatter',\n",
")\n",
"\n",
"plt.plot(\n",
" x,\n",
" lREq,\n",
" color='red',\n",
" alpha=0.9,\n",
" label='lREq',\n",
")\n",
"\n",
"plt.plot(\n",
" x,\n",
" logREq,\n",
" color='green',\n",
" alpha=0.9,\n",
" label='logREq',\n",
")\n",
"\n",
"plt.xlabel('x1')\n",
"plt.ylabel('y')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 990
},
"id": "NqT4-52vZyo-",
"outputId": "96763409-58d1-4435-bc54-afcf8fc9d05f"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" <td>0.729871</td>\n",
" <td>0.850564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>34.43</td>\n",
" <td>56.16</td>\n",
" <td>1.231162</td>\n",
" <td>0.994966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>39.19</td>\n",
" <td>36.89</td>\n",
" <td>0.823078</td>\n",
" <td>0.923739</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>23.58</td>\n",
" <td>56.88</td>\n",
" <td>1.045349</td>\n",
" <td>0.981132</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>29.92</td>\n",
" <td>27.05</td>\n",
" <td>0.394258</td>\n",
" <td>0.375201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>25.26</td>\n",
" <td>44.38</td>\n",
" <td>0.754114</td>\n",
" <td>0.875451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" <td>1.084883</td>\n",
" <td>0.986447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>11.70</td>\n",
" <td>55.55</td>\n",
" <td>0.787177</td>\n",
" <td>0.892025</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>32.21</td>\n",
" <td>31.28</td>\n",
" <td>0.546666</td>\n",
" <td>0.634794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" <td>0.702665</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" <td>0.534624</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" <td>0.133337</td>\n",
" <td>0.082606</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>10.39</td>\n",
" <td>29.47</td>\n",
" <td>0.088829</td>\n",
" <td>0.062198</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>21.46</td>\n",
" <td>29.34</td>\n",
" <td>0.294027</td>\n",
" <td>0.223902</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.56</td>\n",
" <td>40.37</td>\n",
" <td>0.806902</td>\n",
" <td>0.913332</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1</td>\n",
" <td>37.91</td>\n",
" <td>22.92</td>\n",
" <td>0.438106</td>\n",
" <td>0.458048</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" <td>0.967716</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" <td>0.770960</td>\n",
" <td>0.887885</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1</td>\n",
" <td>38.40</td>\n",
" <td>47.85</td>\n",
" <td>1.091301</td>\n",
" <td>0.987144</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0</td>\n",
" <td>26.62</td>\n",
" <td>25.50</td>\n",
" <td>0.292049</td>\n",
" <td>0.225940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0</td>\n",
" <td>14.36</td>\n",
" <td>21.87</td>\n",
" <td>-0.032692</td>\n",
" <td>0.028410</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>1</td>\n",
" <td>22.22</td>\n",
" <td>20.79</td>\n",
" <td>0.087491</td>\n",
" <td>0.065109</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>1</td>\n",
" <td>32.10</td>\n",
" <td>51.56</td>\n",
" <td>1.068443</td>\n",
" <td>0.984517</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" <td>0.129233</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" <td>0.581396</td>\n",
" <td>0.664852</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" <td>0.164303</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>12.58</td>\n",
" <td>33.27</td>\n",
" <td>0.228245</td>\n",
" <td>0.149244</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>27.53</td>\n",
" <td>25.63</td>\n",
" <td>0.312551</td>\n",
" <td>0.252476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>1</td>\n",
" <td>36.71</td>\n",
" <td>37.05</td>\n",
" <td>0.780489</td>\n",
" <td>0.899188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>0</td>\n",
" <td>17.85</td>\n",
" <td>26.86</td>\n",
" <td>0.161955</td>\n",
" <td>0.102289</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2\n",
"0 1 16.35 49.94 0.729871 0.850564\n",
"1 1 34.43 56.16 1.231162 0.994966\n",
"2 1 39.19 36.89 0.823078 0.923739\n",
"3 1 23.58 56.88 1.045349 0.981132\n",
"4 0 29.92 27.05 0.394258 0.375201\n",
"5 1 25.26 44.38 0.754114 0.875451\n",
"6 1 36.51 48.98 1.084883 0.986447\n",
"7 1 11.70 55.55 0.787177 0.892025\n",
"8 0 32.21 31.28 0.546666 0.634794\n",
"9 1 28.74 35.63 0.593656 0.702665\n",
"10 1 18.28 39.50 0.496558 0.534624\n",
"11 0 10.12 31.39 0.133337 0.082606\n",
"12 0 10.39 29.47 0.088829 0.062198\n",
"13 0 21.46 29.34 0.294027 0.223902\n",
"14 1 33.56 40.37 0.806902 0.913332\n",
"15 1 37.91 22.92 0.438106 0.458048\n",
"16 1 31.81 47.56 0.959656 0.967716\n",
"17 0 25.88 44.58 0.770960 0.887885\n",
"18 1 38.40 47.85 1.091301 0.987144\n",
"19 0 26.62 25.50 0.292049 0.225940\n",
"20 0 14.36 21.87 -0.032692 0.028410\n",
"21 1 22.22 20.79 0.087491 0.065109\n",
"22 1 32.10 51.56 1.068443 0.984517\n",
"23 0 11.75 32.96 0.204600 0.129233\n",
"24 1 10.32 48.59 0.581396 0.664852\n",
"25 0 11.43 34.78 0.245584 0.164303\n",
"26 0 12.58 33.27 0.228245 0.149244\n",
"27 0 27.53 25.63 0.312551 0.252476\n",
"28 1 36.71 37.05 0.780489 0.899188\n",
"29 0 17.85 26.86 0.161955 0.102289"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 990
},
"id": "jLJD6VGqY1Xc",
"outputId": "dacd3002-ceb1-4b40-e315-9adba673b28b"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" <th>yHat2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" <td>0.729871</td>\n",
" <td>0.850564</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>34.43</td>\n",
" <td>56.16</td>\n",
" <td>1.231162</td>\n",
" <td>0.994966</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>39.19</td>\n",
" <td>36.89</td>\n",
" <td>0.823078</td>\n",
" <td>0.923739</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>23.58</td>\n",
" <td>56.88</td>\n",
" <td>1.045349</td>\n",
" <td>0.981132</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>29.92</td>\n",
" <td>27.05</td>\n",
" <td>0.394258</td>\n",
" <td>0.375201</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>25.26</td>\n",
" <td>44.38</td>\n",
" <td>0.754114</td>\n",
" <td>0.875451</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" <td>1.084883</td>\n",
" <td>0.986447</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>11.70</td>\n",
" <td>55.55</td>\n",
" <td>0.787177</td>\n",
" <td>0.892025</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>32.21</td>\n",
" <td>31.28</td>\n",
" <td>0.546666</td>\n",
" <td>0.634794</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" <td>0.702665</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" <td>0.534624</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" <td>0.133337</td>\n",
" <td>0.082606</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>10.39</td>\n",
" <td>29.47</td>\n",
" <td>0.088829</td>\n",
" <td>0.062198</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>21.46</td>\n",
" <td>29.34</td>\n",
" <td>0.294027</td>\n",
" <td>0.223902</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.56</td>\n",
" <td>40.37</td>\n",
" <td>0.806902</td>\n",
" <td>0.913332</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1</td>\n",
" <td>37.91</td>\n",
" <td>22.92</td>\n",
" <td>0.438106</td>\n",
" <td>0.458048</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" <td>0.967716</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" <td>0.770960</td>\n",
" <td>0.887885</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1</td>\n",
" <td>38.40</td>\n",
" <td>47.85</td>\n",
" <td>1.091301</td>\n",
" <td>0.987144</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0</td>\n",
" <td>26.62</td>\n",
" <td>25.50</td>\n",
" <td>0.292049</td>\n",
" <td>0.225940</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0</td>\n",
" <td>14.36</td>\n",
" <td>21.87</td>\n",
" <td>-0.032692</td>\n",
" <td>0.028410</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>1</td>\n",
" <td>22.22</td>\n",
" <td>20.79</td>\n",
" <td>0.087491</td>\n",
" <td>0.065109</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>1</td>\n",
" <td>32.10</td>\n",
" <td>51.56</td>\n",
" <td>1.068443</td>\n",
" <td>0.984517</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" <td>0.129233</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" <td>0.581396</td>\n",
" <td>0.664852</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" <td>0.164303</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0</td>\n",
" <td>12.58</td>\n",
" <td>33.27</td>\n",
" <td>0.228245</td>\n",
" <td>0.149244</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0</td>\n",
" <td>27.53</td>\n",
" <td>25.63</td>\n",
" <td>0.312551</td>\n",
" <td>0.252476</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>1</td>\n",
" <td>36.71</td>\n",
" <td>37.05</td>\n",
" <td>0.780489</td>\n",
" <td>0.899188</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>0</td>\n",
" <td>17.85</td>\n",
" <td>26.86</td>\n",
" <td>0.161955</td>\n",
" <td>0.102289</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2 yHat2\n",
"0 1 16.35 49.94 0.729871 0.850564 1\n",
"1 1 34.43 56.16 1.231162 0.994966 1\n",
"2 1 39.19 36.89 0.823078 0.923739 1\n",
"3 1 23.58 56.88 1.045349 0.981132 1\n",
"4 0 29.92 27.05 0.394258 0.375201 0\n",
"5 1 25.26 44.38 0.754114 0.875451 1\n",
"6 1 36.51 48.98 1.084883 0.986447 1\n",
"7 1 11.70 55.55 0.787177 0.892025 1\n",
"8 0 32.21 31.28 0.546666 0.634794 1\n",
"9 1 28.74 35.63 0.593656 0.702665 1\n",
"10 1 18.28 39.50 0.496558 0.534624 1\n",
"11 0 10.12 31.39 0.133337 0.082606 0\n",
"12 0 10.39 29.47 0.088829 0.062198 0\n",
"13 0 21.46 29.34 0.294027 0.223902 0\n",
"14 1 33.56 40.37 0.806902 0.913332 1\n",
"15 1 37.91 22.92 0.438106 0.458048 0\n",
"16 1 31.81 47.56 0.959656 0.967716 1\n",
"17 0 25.88 44.58 0.770960 0.887885 1\n",
"18 1 38.40 47.85 1.091301 0.987144 1\n",
"19 0 26.62 25.50 0.292049 0.225940 0\n",
"20 0 14.36 21.87 -0.032692 0.028410 0\n",
"21 1 22.22 20.79 0.087491 0.065109 0\n",
"22 1 32.10 51.56 1.068443 0.984517 1\n",
"23 0 11.75 32.96 0.204600 0.129233 0\n",
"24 1 10.32 48.59 0.581396 0.664852 1\n",
"25 0 11.43 34.78 0.245584 0.164303 0\n",
"26 0 12.58 33.27 0.228245 0.149244 0\n",
"27 0 27.53 25.63 0.312551 0.252476 0\n",
"28 1 36.71 37.05 0.780489 0.899188 1\n",
"29 0 17.85 26.86 0.161955 0.102289 0"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf['yHat2'] = mortgageDf['predict2'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"mortgageDf"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HR8tECzUY1NR"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "FRq8XsHGYvyA"
},
"source": [
"Hold-out"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "ugSmcm30aIO2",
"outputId": "d71903ab-b450-476a-b05f-9f5230920e9e"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" <th>yHat2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>16.35</td>\n",
" <td>49.94</td>\n",
" <td>0.729871</td>\n",
" <td>0.850564</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>10.12</td>\n",
" <td>31.39</td>\n",
" <td>0.133337</td>\n",
" <td>0.082606</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1</td>\n",
" <td>36.51</td>\n",
" <td>48.98</td>\n",
" <td>1.084883</td>\n",
" <td>0.986447</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>1</td>\n",
" <td>10.32</td>\n",
" <td>48.59</td>\n",
" <td>0.581396</td>\n",
" <td>0.664852</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>25.88</td>\n",
" <td>44.58</td>\n",
" <td>0.770960</td>\n",
" <td>0.887885</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2 yHat2\n",
"0 1 16.35 49.94 0.729871 0.850564 1\n",
"11 0 10.12 31.39 0.133337 0.082606 0\n",
"6 1 36.51 48.98 1.084883 0.986447 1\n",
"24 1 10.32 48.59 0.581396 0.664852 1\n",
"17 0 25.88 44.58 0.770960 0.887885 1"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"# Split the data into train and test sets\n",
"# trainSet, testSet = train_test_split(wagesDf, test_size=0.15, random_state=55)\n",
"trainSet, testSet = train_test_split(mortgageDf, test_size=0.15)\n",
"\n",
"trainSet.head()"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8gQc9YQqaQ0G",
"outputId": "6a67b0ce-9f65-4711-8b45-d27929aad16b"
},
"outputs": [
{
"data": {
"text/plain": [
"((30, 6), (25, 6), (5, 6))"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mortgageDf.shape, trainSet.shape, testSet.shape"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4Lz67KCiaQtC",
"outputId": "4dbed20d-28d4-470a-d898-df6f4cd557d7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.379717\n",
" Iterations 7\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 25\n",
"Model: Logit Df Residuals: 22\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.4464\n",
"Time: 15:09:54 Log-Likelihood: -9.4929\n",
"converged: True LL-Null: -17.148\n",
"Covariance Type: nonrobust LLR p-value: 0.0004735\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -8.5488 3.211 -2.662 0.008 -14.843 -2.254\n",
"x1 0.1183 0.066 1.783 0.075 -0.012 0.248\n",
"x2 0.1613 0.061 2.642 0.008 0.042 0.281\n",
"==============================================================================\n"
]
}
],
"source": [
"modelHoldOut = sm.Logit(\n",
" trainSet[\"y\"],\n",
" sm.add_constant(trainSet[[\"x1\", \"x2\"]])\n",
")\n",
"modelHoldOutFit = modelHoldOut.fit()\n",
"print(modelHoldOutFit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 30\n",
"Model: Logit Df Residuals: 28\n",
"Method: MLE Df Model: 1\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.1525\n",
"Time: 15:09:54 Log-Likelihood: -17.397\n",
"converged: True LL-Null: -20.527\n",
"Covariance Type: nonrobust LLR p-value: 0.01235\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -2.2077 1.140 -1.936 0.053 -4.442 0.027\n",
"x1 0.1043 0.046 2.282 0.022 0.015 0.194\n",
"==============================================================================\n"
]
}
],
"source": [
"print(model4Fit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "nRTs2yv9alHP",
"outputId": "f0305ea5-32c2-45b5-e09e-73dc9b467c1c"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" <th>yHat2</th>\n",
" <th>predictHoldOut</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" <td>0.129233</td>\n",
" <td>0</td>\n",
" <td>0.136728</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" <td>0.534624</td>\n",
" <td>1</td>\n",
" <td>0.496200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" <td>0.164303</td>\n",
" <td>0</td>\n",
" <td>0.169793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" <td>0.967716</td>\n",
" <td>1</td>\n",
" <td>0.947146</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" <td>0.702665</td>\n",
" <td>1</td>\n",
" <td>0.645341</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2 yHat2 predictHoldOut\n",
"23 0 11.75 32.96 0.204600 0.129233 0 0.136728\n",
"10 1 18.28 39.50 0.496558 0.534624 1 0.496200\n",
"25 0 11.43 34.78 0.245584 0.164303 0 0.169793\n",
"16 1 31.81 47.56 0.959656 0.967716 1 0.947146\n",
"9 1 28.74 35.63 0.593656 0.702665 1 0.645341"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictHoldOut = modelHoldOutFit.predict(sm.add_constant(testSet[[\"x1\", \"x2\"]]))\n",
"testSet['predictHoldOut'] = predictHoldOut\n",
"testSet"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "1SXIG-xRbFc-",
"outputId": "011931e1-25e3-4261-9103-5aad2b1371ab"
},
"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>y</th>\n",
" <th>x1</th>\n",
" <th>x2</th>\n",
" <th>predict1</th>\n",
" <th>predict2</th>\n",
" <th>yHat2</th>\n",
" <th>predictHoldOut</th>\n",
" <th>yHatHoldOut</th>\n",
" <th>isHoldOutCorrect</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0</td>\n",
" <td>11.75</td>\n",
" <td>32.96</td>\n",
" <td>0.204600</td>\n",
" <td>0.129233</td>\n",
" <td>0</td>\n",
" <td>0.136728</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>18.28</td>\n",
" <td>39.50</td>\n",
" <td>0.496558</td>\n",
" <td>0.534624</td>\n",
" <td>1</td>\n",
" <td>0.496200</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0</td>\n",
" <td>11.43</td>\n",
" <td>34.78</td>\n",
" <td>0.245584</td>\n",
" <td>0.164303</td>\n",
" <td>0</td>\n",
" <td>0.169793</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1</td>\n",
" <td>31.81</td>\n",
" <td>47.56</td>\n",
" <td>0.959656</td>\n",
" <td>0.967716</td>\n",
" <td>1</td>\n",
" <td>0.947146</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>28.74</td>\n",
" <td>35.63</td>\n",
" <td>0.593656</td>\n",
" <td>0.702665</td>\n",
" <td>1</td>\n",
" <td>0.645341</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" y x1 x2 predict1 predict2 yHat2 predictHoldOut yHatHoldOut \\\n",
"23 0 11.75 32.96 0.204600 0.129233 0 0.136728 0 \n",
"10 1 18.28 39.50 0.496558 0.534624 1 0.496200 0 \n",
"25 0 11.43 34.78 0.245584 0.164303 0 0.169793 0 \n",
"16 1 31.81 47.56 0.959656 0.967716 1 0.947146 1 \n",
"9 1 28.74 35.63 0.593656 0.702665 1 0.645341 1 \n",
"\n",
" isHoldOutCorrect \n",
"23 1 \n",
"10 0 \n",
"25 1 \n",
"16 1 \n",
"9 1 "
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"testSet['yHatHoldOut'] = testSet['predictHoldOut'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"testSet['isHoldOutCorrect'] = testSet.apply(lambda row: 1 if row['y'] == row['yHatHoldOut'] else 0, axis=1)\n",
"testSet"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bntHtTtwbMYi",
"outputId": "1bfe2cc6-2034-4f1f-864b-630b19fcc96d"
},
"outputs": [
{
"data": {
"text/plain": [
"80.0"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuracy = (np.sum(testSet['isHoldOutCorrect']) / len(testSet['yHatHoldOut'])) * 100\n",
"accuracy"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "z7KjTxz4caDz"
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "OVzr96gecftN"
},
"source": [
"K-Fold Cross validation"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"id": "x56ASbXkciNv"
},
"outputs": [],
"source": [
"from sklearn.model_selection import KFold"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"id": "tjliLeknckTS"
},
"outputs": [],
"source": [
"# Initialize KFold\n",
"kf = KFold(n_splits=5, shuffle=True, random_state=55)\n"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "2Inr3vF2cn14",
"outputId": "a2ac2909-88e6-49a9-8d44-c1c50a44bf0e"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.385918\n",
" Iterations 7\n",
"expr=1\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 24\n",
"Model: Logit Df Residuals: 21\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.4318\n",
"Time: 15:09:54 Log-Likelihood: -9.2620\n",
"converged: True LL-Null: -16.301\n",
"Covariance Type: nonrobust LLR p-value: 0.0008773\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -8.3046 3.201 -2.595 0.009 -14.578 -2.031\n",
"x1 0.1361 0.068 2.014 0.044 0.004 0.269\n",
"x2 0.1491 0.062 2.397 0.017 0.027 0.271\n",
"==============================================================================\n",
"Optimization terminated successfully.\n",
" Current function value: 0.330523\n",
" Iterations 8\n",
"expr=2\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 24\n",
"Model: Logit Df Residuals: 21\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.5208\n",
"Time: 15:09:54 Log-Likelihood: -7.9326\n",
"converged: True LL-Null: -16.552\n",
"Covariance Type: nonrobust LLR p-value: 0.0001805\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -10.9794 4.293 -2.557 0.011 -19.394 -2.565\n",
"x1 0.1529 0.080 1.912 0.056 -0.004 0.310\n",
"x2 0.2185 0.092 2.384 0.017 0.039 0.398\n",
"==============================================================================\n",
"Optimization terminated successfully.\n",
" Current function value: 0.222706\n",
" Iterations 8\n",
"expr=3\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 24\n",
"Model: Logit Df Residuals: 21\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.6771\n",
"Time: 15:09:54 Log-Likelihood: -5.3449\n",
"converged: True LL-Null: -16.552\n",
"Covariance Type: nonrobust LLR p-value: 1.358e-05\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -15.7518 6.276 -2.510 0.012 -28.052 -3.451\n",
"x1 0.1539 0.101 1.524 0.127 -0.044 0.352\n",
"x2 0.3209 0.139 2.316 0.021 0.049 0.592\n",
"==============================================================================\n",
"Optimization terminated successfully.\n",
" Current function value: 0.433994\n",
" Iterations 7\n",
"expr=4\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 24\n",
"Model: Logit Df Residuals: 21\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.3707\n",
"Time: 15:09:54 Log-Likelihood: -10.416\n",
"converged: True LL-Null: -16.552\n",
"Covariance Type: nonrobust LLR p-value: 0.002163\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -8.1881 3.232 -2.533 0.011 -14.523 -1.853\n",
"x1 0.1129 0.064 1.752 0.080 -0.013 0.239\n",
"x2 0.1604 0.065 2.453 0.014 0.032 0.289\n",
"==============================================================================\n",
"Optimization terminated successfully.\n",
" Current function value: 0.368962\n",
" Iterations 7\n",
"expr=5\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y No. Observations: 24\n",
"Model: Logit Df Residuals: 21\n",
"Method: MLE Df Model: 2\n",
"Date: Sun, 09 Jun 2024 Pseudo R-squ.: 0.4423\n",
"Time: 15:09:54 Log-Likelihood: -8.8551\n",
"converged: True LL-Null: -15.878\n",
"Covariance Type: nonrobust LLR p-value: 0.0008917\n",
"==============================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const -8.1001 3.273 -2.475 0.013 -14.516 -1.685\n",
"x1 0.1358 0.070 1.952 0.051 -0.001 0.272\n",
"x2 0.1503 0.067 2.229 0.026 0.018 0.282\n",
"==============================================================================\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['val_predictions'] = val_predictions\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:24: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['val_predictions'] = val_predictions\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:24: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['val_predictions'] = val_predictions\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:24: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['val_predictions'] = val_predictions\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:24: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:22: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['val_predictions'] = val_predictions\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:23: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
"/var/folders/v4/9b_k_xyj56ggnxlhf09pt8y40000gn/T/ipykernel_36878/46880013.py:24: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n"
]
}
],
"source": [
"check = kf.split(mortgageDf)\n",
"check\n",
"experiment = 1\n",
"# Loop through each fold\n",
"# Initialize variables to store results\n",
"accuracies = []\n",
"\n",
"for train_index, val_index in check:\n",
" # Split the data\n",
" trainSet, valSet = mortgageDf.iloc[train_index], mortgageDf.iloc[val_index]\n",
"\n",
" # Fit the model\n",
"\n",
" trainModel = sm.Logit(\n",
" trainSet[\"y\"],\n",
" sm.add_constant(trainSet[[\"x1\", \"x2\"]])\n",
" )\n",
" trainModelFit = trainModel.fit()\n",
"\n",
" # Predict on the validation set\n",
" val_predictions = trainModelFit.predict(sm.add_constant(valSet[[\"x1\", \"x2\"]]))\n",
" valSet['val_predictions'] = val_predictions\n",
" valSet['yHatCross'] = valSet['val_predictions'].apply(lambda x: 1 if x > 0.5 else 0)\n",
" valSet['isCrossCorrect'] = valSet.apply(lambda row: 1 if row['y'] == row['yHatCross'] else 0, axis=1)\n",
" accuracy = (np.sum(valSet['isCrossCorrect']) / len(valSet['yHatCross'])) * 100\n",
" accuracies.append(accuracy)\n",
"\n",
"\n",
" # Print summary for each fold (optional)\n",
" print(f'expr={experiment}')\n",
" experiment = experiment +1\n",
" print(trainModelFit.summary())"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZrdsnnRhfE9w",
"outputId": "78aaab6b-1f66-43cf-c2a7-c18f84430a8e"
},
"outputs": [
{
"data": {
"text/plain": [
"[100.0, 83.33333333333334, 66.66666666666666, 100.0, 83.33333333333334]"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuracies"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZPFkA9gAfLyJ",
"outputId": "f90e1a89-2679-4daf-98db-349e5f8ed1db"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average accuracies across all folds: 86.66666666666667\n"
]
}
],
"source": [
"print(f\"Average accuracies across all folds: {sum(accuracies) /len(accuracies)}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"provenance": []
},
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}