├── Multiple Linear Regression in Python ├── init └── Housing+Case+Study+using+RFE (2).ipynb ├── Industry Relevance of Linear Regression └── init ├── Simple Linear Regression in Python └── init └── README.md /Multiple Linear Regression in Python/init: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Industry Relevance of Linear Regression/init: -------------------------------------------------------------------------------- 1 | Initialise 2 | -------------------------------------------------------------------------------- /Simple Linear Regression in Python/init: -------------------------------------------------------------------------------- 1 | initialising folder 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to Linear Regression Module 2 | 3 | ## TOC: 4 | - How to download files? 5 | - What is where? 6 | 7 | ### How to download files? 8 | ![Screenshot (390)](https://user-images.githubusercontent.com/82654736/141263640-9c257566-a78d-421d-972f-c6990e7b1269.png) 9 | 10 | Click on Code button and then click on Download ZIP 11 | OR 12 | Use `git clone https://github.com/ContentUpgrad/Linear-Regression.git` command on your terminal if git is installed in your machine. 13 | 14 | 15 | ### What is where? 16 | The folder structure is given below: 17 | 18 | ![Screenshot (392)](https://user-images.githubusercontent.com/82654736/141263874-50c65df3-0f97-417d-a6d9-57c0157c138a.png) 19 | 20 | 21 | As you can see there are three main folders when you log in: 22 | 23 | 1. **Industry Relevance of Linear Regression** This is where all the code files regarding Industry Relevance of Linear Regression sessions are kept 24 | 2. **Multiple Linear Regression in Python** This is where all the code files regarding Multiple Linear Regression in Python session are kept 25 | 3. **Simple Linear Regression in Python**This is where all the code files regarding Simple Linear Regression in Python session are kept 26 | 27 | When you click on any folder you will find the code and data folders as shown below: 28 | ![Screenshot (394)](https://user-images.githubusercontent.com/82654736/141264101-99f161db-9d64-492d-acde-13770881c108.png) 29 | 30 | You will find all the code files of the session in code folder and data folder will be empty. Please note that you need to follow the instructions given in the segment for downloading data files and keep it in the data folder manually. 31 | 32 | #### Industry Relevance of Linear Regression 33 | You will find the following files in the code folder of Industry Relevance of Linear Regression 34 | ![Screenshot (394)](https://user-images.githubusercontent.com/82654736/141264294-44581d9d-fdfd-41b9-a95b-ebff540c2b1f.png) 35 | 36 | 37 | #### Multiple Linear Regression in Python 38 | You will find the following files in the code folder of Multiple Linear Regression in Python 39 | ![Screenshot (397)](https://user-images.githubusercontent.com/82654736/141264551-e250616e-c4e2-419e-8357-9abc2ec42372.png) 40 | 41 | 42 | #### Simple Linear Regression in Python 43 | You will find the following files in the code folder of Simple Linear Regression in Python 44 | ![Screenshot (398)](https://user-images.githubusercontent.com/82654736/141264584-dd3831db-b4d4-4207-ae8f-103a64f9b27c.png) 45 | 46 | -------------------------------------------------------------------------------- /Multiple Linear Regression in Python/Housing+Case+Study+using+RFE (2).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Model Selection using RFE (Housing Case Study)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### Importing and Understanding Data" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# Supress Warnings\n", 24 | "\n", 25 | "import warnings\n", 26 | "warnings.filterwarnings('ignore')" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "\n", 36 | "# # Recommended versions\n", 37 | "# numpy \t1.26.4\n", 38 | "# pandas\t2.2.2\n", 39 | "# matplotlib\t3.7.1\n", 40 | "# seaborn\t0.10.0\n", 41 | "# statsmodels\t0.14.4\n", 42 | "# sklearn\t1.5.2" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "import pandas as pd\n", 52 | "import numpy as np" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 3, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "# Importing Housing.csv\n", 62 | "housing = pd.read_csv('Housing.csv')" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 4, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/html": [ 73 | "
\n", 74 | "\n", 87 | "\n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | "
priceareabedroomsbathroomsstoriesmainroadguestroombasementhotwaterheatingairconditioningparkingprefareafurnishingstatus
0133000007420423yesnononoyes2yesfurnished
1122500008960444yesnononoyes3nofurnished
2122500009960322yesnoyesnono2yessemi-furnished
3122150007500422yesnoyesnoyes3yesfurnished
4114100007420412yesyesyesnoyes2nofurnished
\n", 189 | "
" 190 | ], 191 | "text/plain": [ 192 | " price area bedrooms bathrooms stories mainroad guestroom basement \\\n", 193 | "0 13300000 7420 4 2 3 yes no no \n", 194 | "1 12250000 8960 4 4 4 yes no no \n", 195 | "2 12250000 9960 3 2 2 yes no yes \n", 196 | "3 12215000 7500 4 2 2 yes no yes \n", 197 | "4 11410000 7420 4 1 2 yes yes yes \n", 198 | "\n", 199 | " hotwaterheating airconditioning parking prefarea furnishingstatus \n", 200 | "0 no yes 2 yes furnished \n", 201 | "1 no yes 3 no furnished \n", 202 | "2 no no 2 yes semi-furnished \n", 203 | "3 no yes 3 yes furnished \n", 204 | "4 no yes 2 no furnished " 205 | ] 206 | }, 207 | "execution_count": 4, 208 | "metadata": {}, 209 | "output_type": "execute_result" 210 | } 211 | ], 212 | "source": [ 213 | "# Looking at the first five rows\n", 214 | "housing.head()" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | "### Data Preparation" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 5, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "# List of variables to map\n", 231 | "\n", 232 | "varlist = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning', 'prefarea']\n", 233 | "\n", 234 | "# Defining the map function\n", 235 | "def binary_map(x):\n", 236 | " return x.map({'yes': 1, \"no\": 0})\n", 237 | "\n", 238 | "# Applying the function to the housing list\n", 239 | "housing[varlist] = housing[varlist].apply(binary_map)" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 6, 245 | "metadata": { 246 | "scrolled": false 247 | }, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/html": [ 252 | "
\n", 253 | "\n", 266 | "\n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | "
priceareabedroomsbathroomsstoriesmainroadguestroombasementhotwaterheatingairconditioningparkingprefareafurnishingstatus
01330000074204231000121furnished
11225000089604441000130furnished
21225000099603221010021semi-furnished
31221500075004221010131furnished
41141000074204121110120furnished
\n", 368 | "
" 369 | ], 370 | "text/plain": [ 371 | " price area bedrooms bathrooms stories mainroad guestroom \\\n", 372 | "0 13300000 7420 4 2 3 1 0 \n", 373 | "1 12250000 8960 4 4 4 1 0 \n", 374 | "2 12250000 9960 3 2 2 1 0 \n", 375 | "3 12215000 7500 4 2 2 1 0 \n", 376 | "4 11410000 7420 4 1 2 1 1 \n", 377 | "\n", 378 | " basement hotwaterheating airconditioning parking prefarea \\\n", 379 | "0 0 0 1 2 1 \n", 380 | "1 0 0 1 3 0 \n", 381 | "2 1 0 0 2 1 \n", 382 | "3 1 0 1 3 1 \n", 383 | "4 1 0 1 2 0 \n", 384 | "\n", 385 | " furnishingstatus \n", 386 | "0 furnished \n", 387 | "1 furnished \n", 388 | "2 semi-furnished \n", 389 | "3 furnished \n", 390 | "4 furnished " 391 | ] 392 | }, 393 | "execution_count": 6, 394 | "metadata": {}, 395 | "output_type": "execute_result" 396 | } 397 | ], 398 | "source": [ 399 | "# Check the housing dataframe now\n", 400 | "\n", 401 | "housing.head()" 402 | ] 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "metadata": {}, 407 | "source": [ 408 | "### Dummy Variables" 409 | ] 410 | }, 411 | { 412 | "cell_type": "markdown", 413 | "metadata": {}, 414 | "source": [ 415 | "The variable `furnishingstatus` has three levels. We need to convert these levels into integer as well. For this, we will use something called `dummy variables`." 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 7, 421 | "metadata": {}, 422 | "outputs": [ 423 | { 424 | "data": { 425 | "text/html": [ 426 | "
\n", 427 | "\n", 440 | "\n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | "
furnishedsemi-furnishedunfurnished
0100
1100
2010
3100
4100
\n", 482 | "
" 483 | ], 484 | "text/plain": [ 485 | " furnished semi-furnished unfurnished\n", 486 | "0 1 0 0\n", 487 | "1 1 0 0\n", 488 | "2 0 1 0\n", 489 | "3 1 0 0\n", 490 | "4 1 0 0" 491 | ] 492 | }, 493 | "execution_count": 7, 494 | "metadata": {}, 495 | "output_type": "execute_result" 496 | } 497 | ], 498 | "source": [ 499 | "# Get the dummy variables for the feature 'furnishingstatus' and store it in a new variable - 'status'\n", 500 | "\n", 501 | "status = pd.get_dummies(housing['furnishingstatus'])\n", 502 | "\n", 503 | "# Check what the dataset 'status' looks like\n", 504 | "status.head()" 505 | ] 506 | }, 507 | { 508 | "cell_type": "markdown", 509 | "metadata": {}, 510 | "source": [ 511 | "Now, you don't need three columns. You can drop the `furnished` column, as the type of furnishing can be identified with just the last two columns where — \n", 512 | "- `00` will correspond to `furnished`\n", 513 | "- `01` will correspond to `unfurnished`\n", 514 | "- `10` will correspond to `semi-furnished`" 515 | ] 516 | }, 517 | { 518 | "cell_type": "code", 519 | "execution_count": 8, 520 | "metadata": {}, 521 | "outputs": [ 522 | { 523 | "data": { 524 | "text/html": [ 525 | "
\n", 526 | "\n", 539 | "\n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | "
priceareabedroomsbathroomsstoriesmainroadguestroombasementhotwaterheatingairconditioningparkingprefareafurnishingstatussemi-furnishedunfurnished
01330000074204231000121furnished00
11225000089604441000130furnished00
21225000099603221010021semi-furnished10
31221500075004221010131furnished00
41141000074204121110120furnished00
\n", 653 | "
" 654 | ], 655 | "text/plain": [ 656 | " price area bedrooms bathrooms stories mainroad guestroom \\\n", 657 | "0 13300000 7420 4 2 3 1 0 \n", 658 | "1 12250000 8960 4 4 4 1 0 \n", 659 | "2 12250000 9960 3 2 2 1 0 \n", 660 | "3 12215000 7500 4 2 2 1 0 \n", 661 | "4 11410000 7420 4 1 2 1 1 \n", 662 | "\n", 663 | " basement hotwaterheating airconditioning parking prefarea \\\n", 664 | "0 0 0 1 2 1 \n", 665 | "1 0 0 1 3 0 \n", 666 | "2 1 0 0 2 1 \n", 667 | "3 1 0 1 3 1 \n", 668 | "4 1 0 1 2 0 \n", 669 | "\n", 670 | " furnishingstatus semi-furnished unfurnished \n", 671 | "0 furnished 0 0 \n", 672 | "1 furnished 0 0 \n", 673 | "2 semi-furnished 1 0 \n", 674 | "3 furnished 0 0 \n", 675 | "4 furnished 0 0 " 676 | ] 677 | }, 678 | "execution_count": 8, 679 | "metadata": {}, 680 | "output_type": "execute_result" 681 | } 682 | ], 683 | "source": [ 684 | "# Let's drop the first column from status df using 'drop_first = True'\n", 685 | "status = pd.get_dummies(housing['furnishingstatus'], drop_first = True)\n", 686 | "\n", 687 | "# Add the results to the original housing dataframe\n", 688 | "housing = pd.concat([housing, status], axis = 1)\n", 689 | "\n", 690 | "# Now let's see the head of our dataframe.\n", 691 | "housing.head()" 692 | ] 693 | }, 694 | { 695 | "cell_type": "code", 696 | "execution_count": 9, 697 | "metadata": {}, 698 | "outputs": [ 699 | { 700 | "data": { 701 | "text/html": [ 702 | "
\n", 703 | "\n", 716 | "\n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | "
priceareabedroomsbathroomsstoriesmainroadguestroombasementhotwaterheatingairconditioningparkingprefareasemi-furnishedunfurnished
0133000007420423100012100
1122500008960444100013000
2122500009960322101002110
3122150007500422101013100
4114100007420412111012000
\n", 824 | "
" 825 | ], 826 | "text/plain": [ 827 | " price area bedrooms bathrooms stories mainroad guestroom \\\n", 828 | "0 13300000 7420 4 2 3 1 0 \n", 829 | "1 12250000 8960 4 4 4 1 0 \n", 830 | "2 12250000 9960 3 2 2 1 0 \n", 831 | "3 12215000 7500 4 2 2 1 0 \n", 832 | "4 11410000 7420 4 1 2 1 1 \n", 833 | "\n", 834 | " basement hotwaterheating airconditioning parking prefarea \\\n", 835 | "0 0 0 1 2 1 \n", 836 | "1 0 0 1 3 0 \n", 837 | "2 1 0 0 2 1 \n", 838 | "3 1 0 1 3 1 \n", 839 | "4 1 0 1 2 0 \n", 840 | "\n", 841 | " semi-furnished unfurnished \n", 842 | "0 0 0 \n", 843 | "1 0 0 \n", 844 | "2 1 0 \n", 845 | "3 0 0 \n", 846 | "4 0 0 " 847 | ] 848 | }, 849 | "execution_count": 9, 850 | "metadata": {}, 851 | "output_type": "execute_result" 852 | } 853 | ], 854 | "source": [ 855 | "# Drop 'furnishingstatus' as we have created the dummies for it\n", 856 | "housing.drop(['furnishingstatus'], axis = 1, inplace = True)\n", 857 | "\n", 858 | "housing.head()" 859 | ] 860 | }, 861 | { 862 | "cell_type": "markdown", 863 | "metadata": {}, 864 | "source": [ 865 | "## Splitting the Data into Training and Testing Sets" 866 | ] 867 | }, 868 | { 869 | "cell_type": "code", 870 | "execution_count": 10, 871 | "metadata": {}, 872 | "outputs": [], 873 | "source": [ 874 | "from sklearn.model_selection import train_test_split\n", 875 | "\n", 876 | "# We specify this so that the train and test data set always have the same rows, respectively\n", 877 | "\n", 878 | "df_train, df_test = train_test_split(housing, train_size = 0.7, test_size = 0.3, random_state = 100)" 879 | ] 880 | }, 881 | { 882 | "cell_type": "markdown", 883 | "metadata": {}, 884 | "source": [ 885 | "### Rescaling the Features \n", 886 | "\n", 887 | "We will use MinMax scaling." 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 11, 893 | "metadata": {}, 894 | "outputs": [], 895 | "source": [ 896 | "from sklearn.preprocessing import MinMaxScaler\n", 897 | "scaler = MinMaxScaler()" 898 | ] 899 | }, 900 | { 901 | "cell_type": "code", 902 | "execution_count": 12, 903 | "metadata": {}, 904 | "outputs": [ 905 | { 906 | "data": { 907 | "text/html": [ 908 | "
\n", 909 | "\n", 922 | "\n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | "
priceareabedroomsbathroomsstoriesmainroadguestroombasementhotwaterheatingairconditioningparkingprefareasemi-furnishedunfurnished
3590.1696970.1552270.40.00.000000100000.333333001
190.6151520.4033790.40.50.333333100010.333333110
1590.3212120.1156280.40.50.000000111010.000000000
350.5481330.4544170.40.51.000000100010.666667000
280.5757580.5380150.80.50.333333101100.666667001
\n", 1030 | "
" 1031 | ], 1032 | "text/plain": [ 1033 | " price area bedrooms bathrooms stories mainroad guestroom \\\n", 1034 | "359 0.169697 0.155227 0.4 0.0 0.000000 1 0 \n", 1035 | "19 0.615152 0.403379 0.4 0.5 0.333333 1 0 \n", 1036 | "159 0.321212 0.115628 0.4 0.5 0.000000 1 1 \n", 1037 | "35 0.548133 0.454417 0.4 0.5 1.000000 1 0 \n", 1038 | "28 0.575758 0.538015 0.8 0.5 0.333333 1 0 \n", 1039 | "\n", 1040 | " basement hotwaterheating airconditioning parking prefarea \\\n", 1041 | "359 0 0 0 0.333333 0 \n", 1042 | "19 0 0 1 0.333333 1 \n", 1043 | "159 1 0 1 0.000000 0 \n", 1044 | "35 0 0 1 0.666667 0 \n", 1045 | "28 1 1 0 0.666667 0 \n", 1046 | "\n", 1047 | " semi-furnished unfurnished \n", 1048 | "359 0 1 \n", 1049 | "19 1 0 \n", 1050 | "159 0 0 \n", 1051 | "35 0 0 \n", 1052 | "28 0 1 " 1053 | ] 1054 | }, 1055 | "execution_count": 12, 1056 | "metadata": {}, 1057 | "output_type": "execute_result" 1058 | } 1059 | ], 1060 | "source": [ 1061 | "# Apply scaler() to all the columns except the 'yes-no' and 'dummy' variables\n", 1062 | "num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking','price']\n", 1063 | "\n", 1064 | "df_train[num_vars] = scaler.fit_transform(df_train[num_vars])\n", 1065 | "\n", 1066 | "df_train.head()" 1067 | ] 1068 | }, 1069 | { 1070 | "cell_type": "markdown", 1071 | "metadata": {}, 1072 | "source": [ 1073 | "### Dividing into X and Y sets for the model building" 1074 | ] 1075 | }, 1076 | { 1077 | "cell_type": "code", 1078 | "execution_count": 13, 1079 | "metadata": {}, 1080 | "outputs": [], 1081 | "source": [ 1082 | "y_train = df_train.pop('price')\n", 1083 | "X_train = df_train" 1084 | ] 1085 | }, 1086 | { 1087 | "cell_type": "markdown", 1088 | "metadata": {}, 1089 | "source": [ 1090 | "## Building our model\n", 1091 | "\n", 1092 | "This time, we will be using the **LinearRegression function from SciKit Learn** for its compatibility with RFE (which is a utility from sklearn)" 1093 | ] 1094 | }, 1095 | { 1096 | "cell_type": "markdown", 1097 | "metadata": {}, 1098 | "source": [ 1099 | "### RFE\n", 1100 | "Recursive feature elimination" 1101 | ] 1102 | }, 1103 | { 1104 | "cell_type": "code", 1105 | "execution_count": 14, 1106 | "metadata": {}, 1107 | "outputs": [], 1108 | "source": [ 1109 | "# Importing RFE and LinearRegression\n", 1110 | "from sklearn.feature_selection import RFE\n", 1111 | "from sklearn.linear_model import LinearRegression" 1112 | ] 1113 | }, 1114 | { 1115 | "cell_type": "code", 1116 | "execution_count": 15, 1117 | "metadata": {}, 1118 | "outputs": [], 1119 | "source": [ 1120 | "# Running RFE with the output number of the variable equal to 10\n", 1121 | "lm = LinearRegression()\n", 1122 | "lm.fit(X_train, y_train)\n", 1123 | "\n", 1124 | "rfe = RFE(lm, 10) # running RFE\n", 1125 | "rfe = rfe.fit(X_train, y_train)" 1126 | ] 1127 | }, 1128 | { 1129 | "cell_type": "code", 1130 | "execution_count": 16, 1131 | "metadata": {}, 1132 | "outputs": [ 1133 | { 1134 | "data": { 1135 | "text/plain": [ 1136 | "[('area', True, 1),\n", 1137 | " ('bedrooms', True, 1),\n", 1138 | " ('bathrooms', True, 1),\n", 1139 | " ('stories', True, 1),\n", 1140 | " ('mainroad', True, 1),\n", 1141 | " ('guestroom', True, 1),\n", 1142 | " ('basement', False, 3),\n", 1143 | " ('hotwaterheating', True, 1),\n", 1144 | " ('airconditioning', True, 1),\n", 1145 | " ('parking', True, 1),\n", 1146 | " ('prefarea', True, 1),\n", 1147 | " ('semi-furnished', False, 4),\n", 1148 | " ('unfurnished', False, 2)]" 1149 | ] 1150 | }, 1151 | "execution_count": 16, 1152 | "metadata": {}, 1153 | "output_type": "execute_result" 1154 | } 1155 | ], 1156 | "source": [ 1157 | "list(zip(X_train.columns,rfe.support_,rfe.ranking_))" 1158 | ] 1159 | }, 1160 | { 1161 | "cell_type": "code", 1162 | "execution_count": 17, 1163 | "metadata": { 1164 | "scrolled": false 1165 | }, 1166 | "outputs": [ 1167 | { 1168 | "data": { 1169 | "text/plain": [ 1170 | "Index(['area', 'bedrooms', 'bathrooms', 'stories', 'mainroad', 'guestroom',\n", 1171 | " 'hotwaterheating', 'airconditioning', 'parking', 'prefarea'],\n", 1172 | " dtype='object')" 1173 | ] 1174 | }, 1175 | "execution_count": 17, 1176 | "metadata": {}, 1177 | "output_type": "execute_result" 1178 | } 1179 | ], 1180 | "source": [ 1181 | "col = X_train.columns[rfe.support_]\n", 1182 | "col" 1183 | ] 1184 | }, 1185 | { 1186 | "cell_type": "code", 1187 | "execution_count": 18, 1188 | "metadata": {}, 1189 | "outputs": [ 1190 | { 1191 | "data": { 1192 | "text/plain": [ 1193 | "Index(['basement', 'semi-furnished', 'unfurnished'], dtype='object')" 1194 | ] 1195 | }, 1196 | "execution_count": 18, 1197 | "metadata": {}, 1198 | "output_type": "execute_result" 1199 | } 1200 | ], 1201 | "source": [ 1202 | "X_train.columns[~rfe.support_]" 1203 | ] 1204 | }, 1205 | { 1206 | "cell_type": "markdown", 1207 | "metadata": {}, 1208 | "source": [ 1209 | "### Building model using statsmodel, for the detailed statistics" 1210 | ] 1211 | }, 1212 | { 1213 | "cell_type": "code", 1214 | "execution_count": 19, 1215 | "metadata": {}, 1216 | "outputs": [], 1217 | "source": [ 1218 | "# Creating X_test dataframe with RFE selected variables\n", 1219 | "X_train_rfe = X_train[col]" 1220 | ] 1221 | }, 1222 | { 1223 | "cell_type": "code", 1224 | "execution_count": 20, 1225 | "metadata": {}, 1226 | "outputs": [], 1227 | "source": [ 1228 | "# Adding a constant variable \n", 1229 | "import statsmodels.api as sm \n", 1230 | "X_train_rfe = sm.add_constant(X_train_rfe)" 1231 | ] 1232 | }, 1233 | { 1234 | "cell_type": "code", 1235 | "execution_count": 21, 1236 | "metadata": {}, 1237 | "outputs": [], 1238 | "source": [ 1239 | "lm = sm.OLS(y_train,X_train_rfe).fit() # Running the linear model" 1240 | ] 1241 | }, 1242 | { 1243 | "cell_type": "code", 1244 | "execution_count": 22, 1245 | "metadata": {}, 1246 | "outputs": [ 1247 | { 1248 | "name": "stdout", 1249 | "output_type": "stream", 1250 | "text": [ 1251 | " OLS Regression Results \n", 1252 | "==============================================================================\n", 1253 | "Dep. Variable: price R-squared: 0.669\n", 1254 | "Model: OLS Adj. R-squared: 0.660\n", 1255 | "Method: Least Squares F-statistic: 74.89\n", 1256 | "Date: Tue, 09 Oct 2018 Prob (F-statistic): 1.28e-82\n", 1257 | "Time: 13:15:31 Log-Likelihood: 374.65\n", 1258 | "No. Observations: 381 AIC: -727.3\n", 1259 | "Df Residuals: 370 BIC: -683.9\n", 1260 | "Df Model: 10 \n", 1261 | "Covariance Type: nonrobust \n", 1262 | "===================================================================================\n", 1263 | " coef std err t P>|t| [0.025 0.975]\n", 1264 | "-----------------------------------------------------------------------------------\n", 1265 | "const 0.0027 0.018 0.151 0.880 -0.033 0.038\n", 1266 | "area 0.2363 0.030 7.787 0.000 0.177 0.296\n", 1267 | "bedrooms 0.0661 0.037 1.794 0.074 -0.006 0.139\n", 1268 | "bathrooms 0.1982 0.022 8.927 0.000 0.155 0.242\n", 1269 | "stories 0.0977 0.019 5.251 0.000 0.061 0.134\n", 1270 | "mainroad 0.0556 0.014 3.848 0.000 0.027 0.084\n", 1271 | "guestroom 0.0381 0.013 2.934 0.004 0.013 0.064\n", 1272 | "hotwaterheating 0.0897 0.022 4.104 0.000 0.047 0.133\n", 1273 | "airconditioning 0.0711 0.011 6.235 0.000 0.049 0.093\n", 1274 | "parking 0.0637 0.018 3.488 0.001 0.028 0.100\n", 1275 | "prefarea 0.0643 0.012 5.445 0.000 0.041 0.088\n", 1276 | "==============================================================================\n", 1277 | "Omnibus: 86.105 Durbin-Watson: 2.098\n", 1278 | "Prob(Omnibus): 0.000 Jarque-Bera (JB): 286.069\n", 1279 | "Skew: 0.992 Prob(JB): 7.60e-63\n", 1280 | "Kurtosis: 6.753 Cond. No. 13.2\n", 1281 | "==============================================================================\n", 1282 | "\n", 1283 | "Warnings:\n", 1284 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" 1285 | ] 1286 | } 1287 | ], 1288 | "source": [ 1289 | "#Let's see the summary of our linear model\n", 1290 | "print(lm.summary())" 1291 | ] 1292 | }, 1293 | { 1294 | "cell_type": "markdown", 1295 | "metadata": {}, 1296 | "source": [ 1297 | "`Bedrooms` is insignificant in presence of other variables; can be dropped" 1298 | ] 1299 | }, 1300 | { 1301 | "cell_type": "code", 1302 | "execution_count": 23, 1303 | "metadata": {}, 1304 | "outputs": [], 1305 | "source": [ 1306 | "X_train_new = X_train_rfe.drop([\"bedrooms\"], axis = 1)" 1307 | ] 1308 | }, 1309 | { 1310 | "cell_type": "markdown", 1311 | "metadata": {}, 1312 | "source": [ 1313 | "Rebuilding the model without `bedrooms`" 1314 | ] 1315 | }, 1316 | { 1317 | "cell_type": "code", 1318 | "execution_count": 24, 1319 | "metadata": {}, 1320 | "outputs": [], 1321 | "source": [ 1322 | "# Adding a constant variable \n", 1323 | "import statsmodels.api as sm \n", 1324 | "X_train_lm = sm.add_constant(X_train_new)" 1325 | ] 1326 | }, 1327 | { 1328 | "cell_type": "code", 1329 | "execution_count": 25, 1330 | "metadata": {}, 1331 | "outputs": [], 1332 | "source": [ 1333 | "lm = sm.OLS(y_train,X_train_lm).fit() # Running the linear model" 1334 | ] 1335 | }, 1336 | { 1337 | "cell_type": "code", 1338 | "execution_count": 26, 1339 | "metadata": {}, 1340 | "outputs": [ 1341 | { 1342 | "name": "stdout", 1343 | "output_type": "stream", 1344 | "text": [ 1345 | " OLS Regression Results \n", 1346 | "==============================================================================\n", 1347 | "Dep. Variable: price R-squared: 0.666\n", 1348 | "Model: OLS Adj. R-squared: 0.658\n", 1349 | "Method: Least Squares F-statistic: 82.37\n", 1350 | "Date: Tue, 09 Oct 2018 Prob (F-statistic): 6.67e-83\n", 1351 | "Time: 13:15:31 Log-Likelihood: 373.00\n", 1352 | "No. Observations: 381 AIC: -726.0\n", 1353 | "Df Residuals: 371 BIC: -686.6\n", 1354 | "Df Model: 9 \n", 1355 | "Covariance Type: nonrobust \n", 1356 | "===================================================================================\n", 1357 | " coef std err t P>|t| [0.025 0.975]\n", 1358 | "-----------------------------------------------------------------------------------\n", 1359 | "const 0.0242 0.013 1.794 0.074 -0.002 0.051\n", 1360 | "area 0.2367 0.030 7.779 0.000 0.177 0.297\n", 1361 | "bathrooms 0.2070 0.022 9.537 0.000 0.164 0.250\n", 1362 | "stories 0.1096 0.017 6.280 0.000 0.075 0.144\n", 1363 | "mainroad 0.0536 0.014 3.710 0.000 0.025 0.082\n", 1364 | "guestroom 0.0390 0.013 2.991 0.003 0.013 0.065\n", 1365 | "hotwaterheating 0.0921 0.022 4.213 0.000 0.049 0.135\n", 1366 | "airconditioning 0.0710 0.011 6.212 0.000 0.049 0.094\n", 1367 | "parking 0.0669 0.018 3.665 0.000 0.031 0.103\n", 1368 | "prefarea 0.0653 0.012 5.513 0.000 0.042 0.089\n", 1369 | "==============================================================================\n", 1370 | "Omnibus: 91.542 Durbin-Watson: 2.107\n", 1371 | "Prob(Omnibus): 0.000 Jarque-Bera (JB): 315.402\n", 1372 | "Skew: 1.044 Prob(JB): 3.25e-69\n", 1373 | "Kurtosis: 6.938 Cond. No. 10.0\n", 1374 | "==============================================================================\n", 1375 | "\n", 1376 | "Warnings:\n", 1377 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" 1378 | ] 1379 | } 1380 | ], 1381 | "source": [ 1382 | "#Let's see the summary of our linear model\n", 1383 | "print(lm.summary())" 1384 | ] 1385 | }, 1386 | { 1387 | "cell_type": "code", 1388 | "execution_count": 27, 1389 | "metadata": {}, 1390 | "outputs": [ 1391 | { 1392 | "data": { 1393 | "text/plain": [ 1394 | "Index(['const', 'area', 'bathrooms', 'stories', 'mainroad', 'guestroom',\n", 1395 | " 'hotwaterheating', 'airconditioning', 'parking', 'prefarea'],\n", 1396 | " dtype='object')" 1397 | ] 1398 | }, 1399 | "execution_count": 27, 1400 | "metadata": {}, 1401 | "output_type": "execute_result" 1402 | } 1403 | ], 1404 | "source": [ 1405 | "X_train_new.columns" 1406 | ] 1407 | }, 1408 | { 1409 | "cell_type": "code", 1410 | "execution_count": 28, 1411 | "metadata": {}, 1412 | "outputs": [], 1413 | "source": [ 1414 | "X_train_new = X_train_new.drop(['const'], axis=1)" 1415 | ] 1416 | }, 1417 | { 1418 | "cell_type": "code", 1419 | "execution_count": 29, 1420 | "metadata": {}, 1421 | "outputs": [ 1422 | { 1423 | "data": { 1424 | "text/html": [ 1425 | "
\n", 1426 | "\n", 1439 | "\n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | "
FeaturesVIF
0area4.52
3mainroad4.26
2stories2.12
7parking2.10
6airconditioning1.75
1bathrooms1.58
8prefarea1.47
4guestroom1.30
5hotwaterheating1.12
\n", 1495 | "
" 1496 | ], 1497 | "text/plain": [ 1498 | " Features VIF\n", 1499 | "0 area 4.52\n", 1500 | "3 mainroad 4.26\n", 1501 | "2 stories 2.12\n", 1502 | "7 parking 2.10\n", 1503 | "6 airconditioning 1.75\n", 1504 | "1 bathrooms 1.58\n", 1505 | "8 prefarea 1.47\n", 1506 | "4 guestroom 1.30\n", 1507 | "5 hotwaterheating 1.12" 1508 | ] 1509 | }, 1510 | "execution_count": 29, 1511 | "metadata": {}, 1512 | "output_type": "execute_result" 1513 | } 1514 | ], 1515 | "source": [ 1516 | "# Calculate the VIFs for the new model\n", 1517 | "from statsmodels.stats.outliers_influence import variance_inflation_factor\n", 1518 | "\n", 1519 | "vif = pd.DataFrame()\n", 1520 | "X = X_train_new\n", 1521 | "vif['Features'] = X.columns\n", 1522 | "vif['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]\n", 1523 | "vif['VIF'] = round(vif['VIF'], 2)\n", 1524 | "vif = vif.sort_values(by = \"VIF\", ascending = False)\n", 1525 | "vif" 1526 | ] 1527 | }, 1528 | { 1529 | "cell_type": "markdown", 1530 | "metadata": {}, 1531 | "source": [ 1532 | "## Residual Analysis of the train data\n", 1533 | "\n", 1534 | "So, now to check if the error terms are also normally distributed (which is infact, one of the major assumptions of linear regression), let us plot the histogram of the error terms and see what it looks like." 1535 | ] 1536 | }, 1537 | { 1538 | "cell_type": "code", 1539 | "execution_count": 30, 1540 | "metadata": {}, 1541 | "outputs": [], 1542 | "source": [ 1543 | "y_train_price = lm.predict(X_train_lm)" 1544 | ] 1545 | }, 1546 | { 1547 | "cell_type": "code", 1548 | "execution_count": 31, 1549 | "metadata": {}, 1550 | "outputs": [], 1551 | "source": [ 1552 | "# Importing the required libraries for plots.\n", 1553 | "import matplotlib.pyplot as plt\n", 1554 | "import seaborn as sns\n", 1555 | "%matplotlib inline" 1556 | ] 1557 | }, 1558 | { 1559 | "cell_type": "code", 1560 | "execution_count": 32, 1561 | "metadata": {}, 1562 | "outputs": [ 1563 | { 1564 | "name": "stderr", 1565 | "output_type": "stream", 1566 | "text": [ 1567 | "C:\\Users\\admin\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.\n", 1568 | " warnings.warn(\"The 'normed' kwarg is deprecated, and has been \"\n" 1569 | ] 1570 | }, 1571 | { 1572 | "data": { 1573 | "text/plain": [ 1574 | "Text(0.5,0,'Errors')" 1575 | ] 1576 | }, 1577 | "execution_count": 32, 1578 | "metadata": {}, 1579 | "output_type": "execute_result" 1580 | }, 1581 | { 1582 | "data": { 1583 | "image/png": "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\n", 1584 | "text/plain": [ 1585 | "
" 1586 | ] 1587 | }, 1588 | "metadata": {}, 1589 | "output_type": "display_data" 1590 | } 1591 | ], 1592 | "source": [ 1593 | "# Plot the histogram of the error terms\n", 1594 | "fig = plt.figure()\n", 1595 | "sns.distplot((y_train - y_train_price), bins = 20)\n", 1596 | "fig.suptitle('Error Terms', fontsize = 20) # Plot heading \n", 1597 | "plt.xlabel('Errors', fontsize = 18) # X-label" 1598 | ] 1599 | }, 1600 | { 1601 | "cell_type": "markdown", 1602 | "metadata": {}, 1603 | "source": [ 1604 | "## Making Predictions" 1605 | ] 1606 | }, 1607 | { 1608 | "cell_type": "markdown", 1609 | "metadata": {}, 1610 | "source": [ 1611 | "#### Applying the scaling on the test sets" 1612 | ] 1613 | }, 1614 | { 1615 | "cell_type": "code", 1616 | "execution_count": 33, 1617 | "metadata": {}, 1618 | "outputs": [], 1619 | "source": [ 1620 | "num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking','price']\n", 1621 | "\n", 1622 | "df_test[num_vars] = scaler.transform(df_test[num_vars])" 1623 | ] 1624 | }, 1625 | { 1626 | "cell_type": "markdown", 1627 | "metadata": {}, 1628 | "source": [ 1629 | "#### Dividing into X_test and y_test" 1630 | ] 1631 | }, 1632 | { 1633 | "cell_type": "code", 1634 | "execution_count": 34, 1635 | "metadata": {}, 1636 | "outputs": [], 1637 | "source": [ 1638 | "y_test = df_test.pop('price')\n", 1639 | "X_test = df_test" 1640 | ] 1641 | }, 1642 | { 1643 | "cell_type": "code", 1644 | "execution_count": 35, 1645 | "metadata": {}, 1646 | "outputs": [], 1647 | "source": [ 1648 | "# Now let's use our model to make predictions.\n", 1649 | "\n", 1650 | "# Creating X_test_new dataframe by dropping variables from X_test\n", 1651 | "X_test_new = X_test[X_train_new.columns]\n", 1652 | "\n", 1653 | "# Adding a constant variable \n", 1654 | "X_test_new = sm.add_constant(X_test_new)" 1655 | ] 1656 | }, 1657 | { 1658 | "cell_type": "code", 1659 | "execution_count": 36, 1660 | "metadata": {}, 1661 | "outputs": [], 1662 | "source": [ 1663 | "# Making predictions\n", 1664 | "y_pred = lm.predict(X_test_new)" 1665 | ] 1666 | }, 1667 | { 1668 | "cell_type": "markdown", 1669 | "metadata": {}, 1670 | "source": [ 1671 | "## Model Evaluation" 1672 | ] 1673 | }, 1674 | { 1675 | "cell_type": "code", 1676 | "execution_count": 37, 1677 | "metadata": {}, 1678 | "outputs": [ 1679 | { 1680 | "data": { 1681 | "text/plain": [ 1682 | "Text(0,0.5,'y_pred')" 1683 | ] 1684 | }, 1685 | "execution_count": 37, 1686 | "metadata": {}, 1687 | "output_type": "execute_result" 1688 | }, 1689 | { 1690 | "data": { 1691 | "image/png": "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\n", 1692 | "text/plain": [ 1693 | "
" 1694 | ] 1695 | }, 1696 | "metadata": {}, 1697 | "output_type": "display_data" 1698 | } 1699 | ], 1700 | "source": [ 1701 | "# Plotting y_test and y_pred to understand the spread.\n", 1702 | "fig = plt.figure()\n", 1703 | "plt.scatter(y_test,y_pred)\n", 1704 | "fig.suptitle('y_test vs y_pred', fontsize=20) # Plot heading \n", 1705 | "plt.xlabel('y_test', fontsize=18) # X-label\n", 1706 | "plt.ylabel('y_pred', fontsize=16) # Y-label" 1707 | ] 1708 | } 1709 | ], 1710 | "metadata": { 1711 | "kernelspec": { 1712 | "display_name": "Python 3", 1713 | "language": "python", 1714 | "name": "python3" 1715 | }, 1716 | "language_info": { 1717 | "codemirror_mode": { 1718 | "name": "ipython", 1719 | "version": 3 1720 | }, 1721 | "file_extension": ".py", 1722 | "mimetype": "text/x-python", 1723 | "name": "python", 1724 | "nbconvert_exporter": "python", 1725 | "pygments_lexer": "ipython3", 1726 | "version": "3.6.5" 1727 | } 1728 | }, 1729 | "nbformat": 4, 1730 | "nbformat_minor": 2 1731 | } 1732 | --------------------------------------------------------------------------------