├── README.md └── Pune house price prediction.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # Machine-Learning-Project- Pune House Price Prediction 2 | This repository consists House Prices Prediction in Pune. Datasets are provided in each of the folders above, and also the solution to the problem statements have been provided. 3 | 4 | Please do ⭐ the repository, if it helped you in anyway. 5 | -------------------------------------------------------------------------------- /Pune house price prediction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 244, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Importing essential libraries\n", 10 | "import numpy as np\n", 11 | "import pandas as pd\n", 12 | "from matplotlib import pyplot as plt\n", 13 | "from matplotlib import rcParams as rcP\n", 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 245, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "data": { 24 | "text/html": [ 25 | "
\n", 26 | "\n", 39 | "\n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \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 | "
area_typeavailabilitysizesocietytotal_sqftbathbalconypricesite_location
0Super built-up Area19-Dec2 BHKCoomee10562.01.039.07Alandi Road
1Plot AreaReady To Move4 BedroomTheanmp26005.03.0120.00Ambegaon Budruk
2Built-up AreaReady To Move3 BHKNaN14402.03.062.00Anandnagar
3Super built-up AreaReady To Move3 BHKSoiewre15213.01.095.00Aundh
4Super built-up AreaReady To Move2 BHKNaN12002.01.051.00Aundh Road
\n", 117 | "
" 118 | ], 119 | "text/plain": [ 120 | " area_type availability size society total_sqft bath \\\n", 121 | "0 Super built-up Area 19-Dec 2 BHK Coomee 1056 2.0 \n", 122 | "1 Plot Area Ready To Move 4 Bedroom Theanmp 2600 5.0 \n", 123 | "2 Built-up Area Ready To Move 3 BHK NaN 1440 2.0 \n", 124 | "3 Super built-up Area Ready To Move 3 BHK Soiewre 1521 3.0 \n", 125 | "4 Super built-up Area Ready To Move 2 BHK NaN 1200 2.0 \n", 126 | "\n", 127 | " balcony price site_location \n", 128 | "0 1.0 39.07 Alandi Road \n", 129 | "1 3.0 120.00 Ambegaon Budruk \n", 130 | "2 3.0 62.00 Anandnagar \n", 131 | "3 1.0 95.00 Aundh \n", 132 | "4 1.0 51.00 Aundh Road " 133 | ] 134 | }, 135 | "execution_count": 245, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | } 139 | ], 140 | "source": [ 141 | "# Loading the dataset\n", 142 | "df = pd.read_csv('pune_House_Data.csv')\n", 143 | "df.head()" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 246, 149 | "metadata": {}, 150 | "outputs": [ 151 | { 152 | "data": { 153 | "text/plain": [ 154 | "(13320, 9)" 155 | ] 156 | }, 157 | "execution_count": 246, 158 | "metadata": {}, 159 | "output_type": "execute_result" 160 | } 161 | ], 162 | "source": [ 163 | "# Exploring the dataset\n", 164 | "df.shape" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 247, 170 | "metadata": { 171 | "scrolled": true 172 | }, 173 | "outputs": [ 174 | { 175 | "data": { 176 | "text/plain": [ 177 | "area_type\n", 178 | "Built-up Area 2418\n", 179 | "Carpet Area 87\n", 180 | "Plot Area 2025\n", 181 | "Super built-up Area 8790\n", 182 | "Name: area_type, dtype: int64" 183 | ] 184 | }, 185 | "execution_count": 247, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "# Exploring the dataset\n", 192 | "df.groupby('area_type')['area_type'].agg('count')" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": 248, 198 | "metadata": { 199 | "scrolled": true 200 | }, 201 | "outputs": [ 202 | { 203 | "data": { 204 | "text/plain": [ 205 | "availability\n", 206 | "14-Jul 1\n", 207 | "14-Nov 1\n", 208 | "15-Aug 1\n", 209 | "15-Dec 1\n", 210 | "15-Jun 1\n", 211 | " ... \n", 212 | "22-Mar 3\n", 213 | "22-May 10\n", 214 | "22-Nov 2\n", 215 | "Immediate Possession 16\n", 216 | "Ready To Move 10581\n", 217 | "Name: availability, Length: 81, dtype: int64" 218 | ] 219 | }, 220 | "execution_count": 248, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "# Exploring the dataset\n", 227 | "df.groupby('availability')['availability'].agg('count')" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 249, 233 | "metadata": { 234 | "scrolled": true 235 | }, 236 | "outputs": [ 237 | { 238 | "data": { 239 | "text/plain": [ 240 | "size\n", 241 | "1 BHK 538\n", 242 | "1 Bedroom 105\n", 243 | "1 RK 13\n", 244 | "10 BHK 2\n", 245 | "10 Bedroom 12\n", 246 | "11 BHK 2\n", 247 | "11 Bedroom 2\n", 248 | "12 Bedroom 1\n", 249 | "13 BHK 1\n", 250 | "14 BHK 1\n", 251 | "16 BHK 1\n", 252 | "18 Bedroom 1\n", 253 | "19 BHK 1\n", 254 | "2 BHK 5199\n", 255 | "2 Bedroom 329\n", 256 | "27 BHK 1\n", 257 | "3 BHK 4310\n", 258 | "3 Bedroom 547\n", 259 | "4 BHK 591\n", 260 | "4 Bedroom 826\n", 261 | "43 Bedroom 1\n", 262 | "5 BHK 59\n", 263 | "5 Bedroom 297\n", 264 | "6 BHK 30\n", 265 | "6 Bedroom 191\n", 266 | "7 BHK 17\n", 267 | "7 Bedroom 83\n", 268 | "8 BHK 5\n", 269 | "8 Bedroom 84\n", 270 | "9 BHK 8\n", 271 | "9 Bedroom 46\n", 272 | "Name: size, dtype: int64" 273 | ] 274 | }, 275 | "execution_count": 249, 276 | "metadata": {}, 277 | "output_type": "execute_result" 278 | } 279 | ], 280 | "source": [ 281 | "# Exploring the dataset\n", 282 | "df.groupby('size')['size'].agg('count')" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 250, 288 | "metadata": {}, 289 | "outputs": [ 290 | { 291 | "data": { 292 | "text/plain": [ 293 | "site_location\n", 294 | "Alandi Road 139\n", 295 | "Ambegaon Budruk 139\n", 296 | "Anandnagar 139\n", 297 | "Aundh 139\n", 298 | "Aundh Road 139\n", 299 | " ... \n", 300 | "Wakadewadi 138\n", 301 | "Wanowrie 138\n", 302 | "Warje 138\n", 303 | "Yerawada 138\n", 304 | "other 1\n", 305 | "Name: site_location, Length: 97, dtype: int64" 306 | ] 307 | }, 308 | "execution_count": 250, 309 | "metadata": {}, 310 | "output_type": "execute_result" 311 | } 312 | ], 313 | "source": [ 314 | "# Exploring the dataset\n", 315 | "df.groupby('site_location')['site_location'].agg('count')" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 251, 321 | "metadata": {}, 322 | "outputs": [ 323 | { 324 | "data": { 325 | "text/html": [ 326 | "
\n", 327 | "\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 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | "
area_typeavailabilitysizetotal_sqftbathbalconypricesite_location
0Super built-up Area19-Dec2 BHK10562.01.039.07Alandi Road
1Plot AreaReady To Move4 Bedroom26005.03.0120.00Ambegaon Budruk
2Built-up AreaReady To Move3 BHK14402.03.062.00Anandnagar
3Super built-up AreaReady To Move3 BHK15213.01.095.00Aundh
4Super built-up AreaReady To Move2 BHK12002.01.051.00Aundh Road
\n", 412 | "
" 413 | ], 414 | "text/plain": [ 415 | " area_type availability size total_sqft bath balcony \\\n", 416 | "0 Super built-up Area 19-Dec 2 BHK 1056 2.0 1.0 \n", 417 | "1 Plot Area Ready To Move 4 Bedroom 2600 5.0 3.0 \n", 418 | "2 Built-up Area Ready To Move 3 BHK 1440 2.0 3.0 \n", 419 | "3 Super built-up Area Ready To Move 3 BHK 1521 3.0 1.0 \n", 420 | "4 Super built-up Area Ready To Move 2 BHK 1200 2.0 1.0 \n", 421 | "\n", 422 | " price site_location \n", 423 | "0 39.07 Alandi Road \n", 424 | "1 120.00 Ambegaon Budruk \n", 425 | "2 62.00 Anandnagar \n", 426 | "3 95.00 Aundh \n", 427 | "4 51.00 Aundh Road " 428 | ] 429 | }, 430 | "execution_count": 251, 431 | "metadata": {}, 432 | "output_type": "execute_result" 433 | } 434 | ], 435 | "source": [ 436 | "# Removing the columns of society\n", 437 | "df = df.drop('society', axis='columns')\n", 438 | "df.head()" 439 | ] 440 | }, 441 | { 442 | "cell_type": "markdown", 443 | "metadata": {}, 444 | "source": [ 445 | "## Data Cleaning Process" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 252, 451 | "metadata": {}, 452 | "outputs": [ 453 | { 454 | "data": { 455 | "text/plain": [ 456 | "area_type 0\n", 457 | "availability 0\n", 458 | "size 16\n", 459 | "total_sqft 0\n", 460 | "bath 73\n", 461 | "balcony 609\n", 462 | "price 0\n", 463 | "site_location 1\n", 464 | "dtype: int64" 465 | ] 466 | }, 467 | "execution_count": 252, 468 | "metadata": {}, 469 | "output_type": "execute_result" 470 | } 471 | ], 472 | "source": [ 473 | "# Data Cleaning\n", 474 | "# Checking the null values in the dataset\n", 475 | "df.isnull().sum()" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": 253, 481 | "metadata": {}, 482 | "outputs": [], 483 | "source": [ 484 | "# Applying median to the balcony and bath column\n", 485 | "from math import floor\n", 486 | "\n", 487 | "balcony_median = float(floor(df.balcony.median()))\n", 488 | "bath_median = float(floor(df.bath.median()))\n", 489 | "\n", 490 | "df.balcony = df.balcony.fillna(balcony_median)\n", 491 | "df.bath = df.bath.fillna(bath_median)" 492 | ] 493 | }, 494 | { 495 | "cell_type": "code", 496 | "execution_count": 254, 497 | "metadata": {}, 498 | "outputs": [ 499 | { 500 | "data": { 501 | "text/plain": [ 502 | "area_type 0\n", 503 | "availability 0\n", 504 | "size 16\n", 505 | "total_sqft 0\n", 506 | "bath 0\n", 507 | "balcony 0\n", 508 | "price 0\n", 509 | "site_location 1\n", 510 | "dtype: int64" 511 | ] 512 | }, 513 | "execution_count": 254, 514 | "metadata": {}, 515 | "output_type": "execute_result" 516 | } 517 | ], 518 | "source": [ 519 | "# Checking the null values in the dataset again\n", 520 | "df.isnull().sum()" 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "execution_count": 255, 526 | "metadata": {}, 527 | "outputs": [ 528 | { 529 | "data": { 530 | "text/plain": [ 531 | "area_type 0\n", 532 | "availability 0\n", 533 | "size 0\n", 534 | "total_sqft 0\n", 535 | "bath 0\n", 536 | "balcony 0\n", 537 | "price 0\n", 538 | "site_location 0\n", 539 | "dtype: int64" 540 | ] 541 | }, 542 | "execution_count": 255, 543 | "metadata": {}, 544 | "output_type": "execute_result" 545 | } 546 | ], 547 | "source": [ 548 | "# Dropping the rows with null values because the dataset is huge as compared to null values.\n", 549 | "df = df.dropna()\n", 550 | "df.isnull().sum()" 551 | ] 552 | }, 553 | { 554 | "cell_type": "code", 555 | "execution_count": 256, 556 | "metadata": { 557 | "scrolled": true 558 | }, 559 | "outputs": [ 560 | { 561 | "data": { 562 | "text/plain": [ 563 | "bhk\n", 564 | "1 656\n", 565 | "2 5527\n", 566 | "3 4857\n", 567 | "4 1417\n", 568 | "5 356\n", 569 | "6 221\n", 570 | "7 100\n", 571 | "8 89\n", 572 | "9 54\n", 573 | "10 14\n", 574 | "11 4\n", 575 | "12 1\n", 576 | "13 1\n", 577 | "14 1\n", 578 | "16 1\n", 579 | "18 1\n", 580 | "19 1\n", 581 | "27 1\n", 582 | "43 1\n", 583 | "Name: bhk, dtype: int64" 584 | ] 585 | }, 586 | "execution_count": 256, 587 | "metadata": {}, 588 | "output_type": "execute_result" 589 | } 590 | ], 591 | "source": [ 592 | "# Converting the size column to bhk\n", 593 | "df['bhk'] = df['size'].apply(lambda x: int(x.split(' ')[0]))\n", 594 | "df = df.drop('size', axis='columns')\n", 595 | "df.groupby('bhk')['bhk'].agg('count')" 596 | ] 597 | }, 598 | { 599 | "cell_type": "code", 600 | "execution_count": 257, 601 | "metadata": { 602 | "scrolled": true 603 | }, 604 | "outputs": [ 605 | { 606 | "data": { 607 | "text/plain": [ 608 | "array(['1056', '2600', '1440', ..., '1133 - 1384', '774', '4689'],\n", 609 | " dtype=object)" 610 | ] 611 | }, 612 | "execution_count": 257, 613 | "metadata": {}, 614 | "output_type": "execute_result" 615 | } 616 | ], 617 | "source": [ 618 | "# Exploring the total_sqft column\n", 619 | "df.total_sqft.unique()" 620 | ] 621 | }, 622 | { 623 | "cell_type": "code", 624 | "execution_count": 258, 625 | "metadata": {}, 626 | "outputs": [], 627 | "source": [ 628 | "# Since the total_sqft contains range values such as 1133-1384, lets filter out these values\n", 629 | "def isFloat(x):\n", 630 | " try:\n", 631 | " float(x)\n", 632 | " except:\n", 633 | " return False\n", 634 | " return True" 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": 259, 640 | "metadata": {}, 641 | "outputs": [ 642 | { 643 | "data": { 644 | "text/html": [ 645 | "
\n", 646 | "\n", 659 | "\n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \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 | "
area_typeavailabilitytotal_sqftbathbalconypricesite_locationbhk
30Super built-up Area19-Dec2100 - 28504.00.0186.000Gultekdi4
56Built-up Area20-Feb3010 - 34102.02.0192.000Model colony4
81Built-up Area18-Oct2957 - 34502.02.0224.500Shukrawar Peth4
122Super built-up Area18-Mar3067 - 81564.00.0477.000Ganeshkhind4
137Super built-up Area19-Mar1042 - 11052.00.054.005Khadaki2
...........................
12990Super built-up Area18-May1804 - 22733.00.0122.000Gokhale Nagar3
13059Super built-up AreaReady To Move1200 - 14702.00.072.760Anandnagar2
13240Super built-up AreaReady To Move1020 - 11302.02.052.570Vadgaon Budruk1
13265Super built-up Area20-Sep1133 - 13842.00.059.135Dapodi2
13299Super built-up Area18-Dec2830 - 28825.00.0154.500Laxmi Road4
\n", 797 | "

239 rows × 8 columns

\n", 798 | "
" 799 | ], 800 | "text/plain": [ 801 | " area_type availability total_sqft bath balcony \\\n", 802 | "30 Super built-up Area 19-Dec 2100 - 2850 4.0 0.0 \n", 803 | "56 Built-up Area 20-Feb 3010 - 3410 2.0 2.0 \n", 804 | "81 Built-up Area 18-Oct 2957 - 3450 2.0 2.0 \n", 805 | "122 Super built-up Area 18-Mar 3067 - 8156 4.0 0.0 \n", 806 | "137 Super built-up Area 19-Mar 1042 - 1105 2.0 0.0 \n", 807 | "... ... ... ... ... ... \n", 808 | "12990 Super built-up Area 18-May 1804 - 2273 3.0 0.0 \n", 809 | "13059 Super built-up Area Ready To Move 1200 - 1470 2.0 0.0 \n", 810 | "13240 Super built-up Area Ready To Move 1020 - 1130 2.0 2.0 \n", 811 | "13265 Super built-up Area 20-Sep 1133 - 1384 2.0 0.0 \n", 812 | "13299 Super built-up Area 18-Dec 2830 - 2882 5.0 0.0 \n", 813 | "\n", 814 | " price site_location bhk \n", 815 | "30 186.000 Gultekdi 4 \n", 816 | "56 192.000 Model colony 4 \n", 817 | "81 224.500 Shukrawar Peth 4 \n", 818 | "122 477.000 Ganeshkhind 4 \n", 819 | "137 54.005 Khadaki 2 \n", 820 | "... ... ... ... \n", 821 | "12990 122.000 Gokhale Nagar 3 \n", 822 | "13059 72.760 Anandnagar 2 \n", 823 | "13240 52.570 Vadgaon Budruk 1 \n", 824 | "13265 59.135 Dapodi 2 \n", 825 | "13299 154.500 Laxmi Road 4 \n", 826 | "\n", 827 | "[239 rows x 8 columns]" 828 | ] 829 | }, 830 | "execution_count": 259, 831 | "metadata": {}, 832 | "output_type": "execute_result" 833 | } 834 | ], 835 | "source": [ 836 | "# Displaying all the rows that are not integers\n", 837 | "df[~df['total_sqft'].apply(isFloat)]" 838 | ] 839 | }, 840 | { 841 | "cell_type": "code", 842 | "execution_count": 260, 843 | "metadata": {}, 844 | "outputs": [], 845 | "source": [ 846 | "# Converting the range values to integer values and removing other types of error\n", 847 | "def convert_sqft_to_num(x):\n", 848 | " tokens = x.split('-')\n", 849 | " if len(tokens) == 2:\n", 850 | " return (float(tokens[0])+float(tokens[1]))/2\n", 851 | " try:\n", 852 | " return float(x)\n", 853 | " except:\n", 854 | " return None" 855 | ] 856 | }, 857 | { 858 | "cell_type": "code", 859 | "execution_count": 261, 860 | "metadata": { 861 | "scrolled": false 862 | }, 863 | "outputs": [ 864 | { 865 | "data": { 866 | "text/html": [ 867 | "
\n", 868 | "\n", 881 | "\n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \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 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqft
0Super built-up Area19-Dec2.01.039.07Alandi Road21056.0
1Plot AreaReady To Move5.03.0120.00Ambegaon Budruk42600.0
2Built-up AreaReady To Move2.03.062.00Anandnagar31440.0
3Super built-up AreaReady To Move3.01.095.00Aundh31521.0
4Super built-up AreaReady To Move2.01.051.00Aundh Road21200.0
\n", 953 | "
" 954 | ], 955 | "text/plain": [ 956 | " area_type availability bath balcony price \\\n", 957 | "0 Super built-up Area 19-Dec 2.0 1.0 39.07 \n", 958 | "1 Plot Area Ready To Move 5.0 3.0 120.00 \n", 959 | "2 Built-up Area Ready To Move 2.0 3.0 62.00 \n", 960 | "3 Super built-up Area Ready To Move 3.0 1.0 95.00 \n", 961 | "4 Super built-up Area Ready To Move 2.0 1.0 51.00 \n", 962 | "\n", 963 | " site_location bhk new_total_sqft \n", 964 | "0 Alandi Road 2 1056.0 \n", 965 | "1 Ambegaon Budruk 4 2600.0 \n", 966 | "2 Anandnagar 3 1440.0 \n", 967 | "3 Aundh 3 1521.0 \n", 968 | "4 Aundh Road 2 1200.0 " 969 | ] 970 | }, 971 | "execution_count": 261, 972 | "metadata": {}, 973 | "output_type": "execute_result" 974 | } 975 | ], 976 | "source": [ 977 | "df['new_total_sqft'] = df.total_sqft.apply(convert_sqft_to_num)\n", 978 | "df = df.drop('total_sqft', axis='columns')\n", 979 | "df.head()" 980 | ] 981 | }, 982 | { 983 | "cell_type": "code", 984 | "execution_count": 262, 985 | "metadata": {}, 986 | "outputs": [ 987 | { 988 | "data": { 989 | "text/plain": [ 990 | "area_type 0\n", 991 | "availability 0\n", 992 | "bath 0\n", 993 | "balcony 0\n", 994 | "price 0\n", 995 | "site_location 0\n", 996 | "bhk 0\n", 997 | "new_total_sqft 46\n", 998 | "dtype: int64" 999 | ] 1000 | }, 1001 | "execution_count": 262, 1002 | "metadata": {}, 1003 | "output_type": "execute_result" 1004 | } 1005 | ], 1006 | "source": [ 1007 | "# Removing the rows in new_total_sqft column that hase None values\n", 1008 | "df.isna().sum()" 1009 | ] 1010 | }, 1011 | { 1012 | "cell_type": "code", 1013 | "execution_count": 263, 1014 | "metadata": {}, 1015 | "outputs": [ 1016 | { 1017 | "data": { 1018 | "text/plain": [ 1019 | "area_type 0\n", 1020 | "availability 0\n", 1021 | "bath 0\n", 1022 | "balcony 0\n", 1023 | "price 0\n", 1024 | "site_location 0\n", 1025 | "bhk 0\n", 1026 | "new_total_sqft 0\n", 1027 | "dtype: int64" 1028 | ] 1029 | }, 1030 | "execution_count": 263, 1031 | "metadata": {}, 1032 | "output_type": "execute_result" 1033 | } 1034 | ], 1035 | "source": [ 1036 | "# Removing the rows in new_total_sqft column that hase None values\n", 1037 | "df = df.dropna()\n", 1038 | "df.isna().sum()" 1039 | ] 1040 | }, 1041 | { 1042 | "cell_type": "markdown", 1043 | "metadata": {}, 1044 | "source": [ 1045 | "## Feature Engineering" 1046 | ] 1047 | }, 1048 | { 1049 | "cell_type": "code", 1050 | "execution_count": 264, 1051 | "metadata": { 1052 | "scrolled": true 1053 | }, 1054 | "outputs": [ 1055 | { 1056 | "data": { 1057 | "text/html": [ 1058 | "
\n", 1059 | "\n", 1072 | "\n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqftprice_per_sqft
0Super built-up Area19-Dec2.01.039.07Alandi Road21056.03699.810606
1Plot AreaReady To Move5.03.0120.00Ambegaon Budruk42600.04615.384615
2Built-up AreaReady To Move2.03.062.00Anandnagar31440.04305.555556
3Super built-up AreaReady To Move3.01.095.00Aundh31521.06245.890861
4Super built-up AreaReady To Move2.01.051.00Aundh Road21200.04250.000000
\n", 1150 | "
" 1151 | ], 1152 | "text/plain": [ 1153 | " area_type availability bath balcony price \\\n", 1154 | "0 Super built-up Area 19-Dec 2.0 1.0 39.07 \n", 1155 | "1 Plot Area Ready To Move 5.0 3.0 120.00 \n", 1156 | "2 Built-up Area Ready To Move 2.0 3.0 62.00 \n", 1157 | "3 Super built-up Area Ready To Move 3.0 1.0 95.00 \n", 1158 | "4 Super built-up Area Ready To Move 2.0 1.0 51.00 \n", 1159 | "\n", 1160 | " site_location bhk new_total_sqft price_per_sqft \n", 1161 | "0 Alandi Road 2 1056.0 3699.810606 \n", 1162 | "1 Ambegaon Budruk 4 2600.0 4615.384615 \n", 1163 | "2 Anandnagar 3 1440.0 4305.555556 \n", 1164 | "3 Aundh 3 1521.0 6245.890861 \n", 1165 | "4 Aundh Road 2 1200.0 4250.000000 " 1166 | ] 1167 | }, 1168 | "execution_count": 264, 1169 | "metadata": {}, 1170 | "output_type": "execute_result" 1171 | } 1172 | ], 1173 | "source": [ 1174 | "# Adding a new column of price_per_sqft\n", 1175 | "df1 = df.copy()\n", 1176 | "\n", 1177 | "# In our dataset the price column is in Lakhs\n", 1178 | "df1['price_per_sqft'] = (df1['price']*100000)/df1['new_total_sqft']\n", 1179 | "df1.head()" 1180 | ] 1181 | }, 1182 | { 1183 | "cell_type": "code", 1184 | "execution_count": 265, 1185 | "metadata": { 1186 | "scrolled": true 1187 | }, 1188 | "outputs": [ 1189 | { 1190 | "name": "stdout", 1191 | "output_type": "stream", 1192 | "text": [ 1193 | "97\n" 1194 | ] 1195 | } 1196 | ], 1197 | "source": [ 1198 | "# Checking unique values of 'location' column\n", 1199 | "locations = list(df['site_location'].unique())\n", 1200 | "print(len(locations))" 1201 | ] 1202 | }, 1203 | { 1204 | "cell_type": "code", 1205 | "execution_count": 266, 1206 | "metadata": { 1207 | "scrolled": false 1208 | }, 1209 | "outputs": [ 1210 | { 1211 | "data": { 1212 | "text/plain": [ 1213 | "site_location\n", 1214 | "Pune Railway Station 139\n", 1215 | "Paud Road 139\n", 1216 | "Ganesh Peth 139\n", 1217 | "Mangalwar peth 139\n", 1218 | "Manik Bagh 139\n", 1219 | " ... \n", 1220 | "Nagar Road 136\n", 1221 | "Narayangaon 136\n", 1222 | "Fatima Nagar 136\n", 1223 | "Camp 136\n", 1224 | "other 1\n", 1225 | "Name: site_location, Length: 97, dtype: int64" 1226 | ] 1227 | }, 1228 | "execution_count": 266, 1229 | "metadata": {}, 1230 | "output_type": "execute_result" 1231 | } 1232 | ], 1233 | "source": [ 1234 | "# Removing the extra spaces at the end\n", 1235 | "df1.site_location = df1.site_location.apply(lambda x: x.strip())\n", 1236 | "\n", 1237 | "# Calulating all the unqiue values in 'site_location' column\n", 1238 | "location_stats = df1.groupby('site_location')['site_location'].agg('count').sort_values(ascending=False)\n", 1239 | "location_stats" 1240 | ] 1241 | }, 1242 | { 1243 | "cell_type": "code", 1244 | "execution_count": 267, 1245 | "metadata": { 1246 | "scrolled": false 1247 | }, 1248 | "outputs": [ 1249 | { 1250 | "name": "stdout", 1251 | "output_type": "stream", 1252 | "text": [ 1253 | "1 97\n" 1254 | ] 1255 | } 1256 | ], 1257 | "source": [ 1258 | "# Checking locations with less than 10 values\n", 1259 | "print(len(location_stats[location_stats<=10]), len(df1.site_location.unique()))" 1260 | ] 1261 | }, 1262 | { 1263 | "cell_type": "code", 1264 | "execution_count": 268, 1265 | "metadata": {}, 1266 | "outputs": [ 1267 | { 1268 | "data": { 1269 | "text/html": [ 1270 | "
\n", 1271 | "\n", 1284 | "\n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqftprice_per_sqft
0Super built-up Area19-Dec2.01.039.07Alandi Road21056.03699.810606
1Plot AreaReady To Move5.03.0120.00Ambegaon Budruk42600.04615.384615
2Built-up AreaReady To Move2.03.062.00Anandnagar31440.04305.555556
3Super built-up AreaReady To Move3.01.095.00Aundh31521.06245.890861
4Super built-up AreaReady To Move2.01.051.00Aundh Road21200.04250.000000
\n", 1362 | "
" 1363 | ], 1364 | "text/plain": [ 1365 | " area_type availability bath balcony price \\\n", 1366 | "0 Super built-up Area 19-Dec 2.0 1.0 39.07 \n", 1367 | "1 Plot Area Ready To Move 5.0 3.0 120.00 \n", 1368 | "2 Built-up Area Ready To Move 2.0 3.0 62.00 \n", 1369 | "3 Super built-up Area Ready To Move 3.0 1.0 95.00 \n", 1370 | "4 Super built-up Area Ready To Move 2.0 1.0 51.00 \n", 1371 | "\n", 1372 | " site_location bhk new_total_sqft price_per_sqft \n", 1373 | "0 Alandi Road 2 1056.0 3699.810606 \n", 1374 | "1 Ambegaon Budruk 4 2600.0 4615.384615 \n", 1375 | "2 Anandnagar 3 1440.0 4305.555556 \n", 1376 | "3 Aundh 3 1521.0 6245.890861 \n", 1377 | "4 Aundh Road 2 1200.0 4250.000000 " 1378 | ] 1379 | }, 1380 | "execution_count": 268, 1381 | "metadata": {}, 1382 | "output_type": "execute_result" 1383 | } 1384 | ], 1385 | "source": [ 1386 | "df1.head()" 1387 | ] 1388 | }, 1389 | { 1390 | "cell_type": "code", 1391 | "execution_count": 269, 1392 | "metadata": { 1393 | "scrolled": true 1394 | }, 1395 | "outputs": [ 1396 | { 1397 | "data": { 1398 | "text/plain": [ 1399 | "97" 1400 | ] 1401 | }, 1402 | "execution_count": 269, 1403 | "metadata": {}, 1404 | "output_type": "execute_result" 1405 | } 1406 | ], 1407 | "source": [ 1408 | "# Labelling the locations with less than or equal to 10 occurences to 'other'\n", 1409 | "locations_less_than_10 = location_stats[location_stats<=10]\n", 1410 | "\n", 1411 | "df1.site_location = df1.site_location.apply(lambda x: 'other' if x in locations_less_than_10 else x)\n", 1412 | "len(df1.site_location.unique())" 1413 | ] 1414 | }, 1415 | { 1416 | "cell_type": "code", 1417 | "execution_count": 270, 1418 | "metadata": {}, 1419 | "outputs": [ 1420 | { 1421 | "data": { 1422 | "text/plain": [ 1423 | "availability\n", 1424 | "Ready To Move 10541\n", 1425 | "18-Dec 306\n", 1426 | "18-May 294\n", 1427 | "18-Apr 271\n", 1428 | "18-Aug 199\n", 1429 | " ... \n", 1430 | "15-Jun 1\n", 1431 | "15-Dec 1\n", 1432 | "15-Aug 1\n", 1433 | "14-Nov 1\n", 1434 | "14-Jul 1\n", 1435 | "Name: availability, Length: 80, dtype: int64" 1436 | ] 1437 | }, 1438 | "execution_count": 270, 1439 | "metadata": {}, 1440 | "output_type": "execute_result" 1441 | } 1442 | ], 1443 | "source": [ 1444 | "# Checking the unique values in 'availability column'\n", 1445 | "df1.groupby('availability')['availability'].agg('count').sort_values(ascending=False)" 1446 | ] 1447 | }, 1448 | { 1449 | "cell_type": "code", 1450 | "execution_count": 271, 1451 | "metadata": {}, 1452 | "outputs": [ 1453 | { 1454 | "data": { 1455 | "text/plain": [ 1456 | "2" 1457 | ] 1458 | }, 1459 | "execution_count": 271, 1460 | "metadata": {}, 1461 | "output_type": "execute_result" 1462 | } 1463 | ], 1464 | "source": [ 1465 | "# Labelling the dates into Not Ready\n", 1466 | "dates = df1.groupby('availability')['availability'].agg('count').sort_values(ascending=False)\n", 1467 | "\n", 1468 | "dates_not_ready = dates[dates<10000]\n", 1469 | "df1.availability = df1.availability.apply(lambda x: 'Not Ready' if x in dates_not_ready else x)\n", 1470 | "\n", 1471 | "len(df1.availability.unique())" 1472 | ] 1473 | }, 1474 | { 1475 | "cell_type": "code", 1476 | "execution_count": 272, 1477 | "metadata": {}, 1478 | "outputs": [ 1479 | { 1480 | "data": { 1481 | "text/html": [ 1482 | "
\n", 1483 | "\n", 1496 | "\n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqftprice_per_sqft
0Super built-up AreaNot Ready2.01.039.07Alandi Road21056.03699.810606
1Plot AreaReady To Move5.03.0120.00Ambegaon Budruk42600.04615.384615
2Built-up AreaReady To Move2.03.062.00Anandnagar31440.04305.555556
3Super built-up AreaReady To Move3.01.095.00Aundh31521.06245.890861
4Super built-up AreaReady To Move2.01.051.00Aundh Road21200.04250.000000
\n", 1574 | "
" 1575 | ], 1576 | "text/plain": [ 1577 | " area_type availability bath balcony price \\\n", 1578 | "0 Super built-up Area Not Ready 2.0 1.0 39.07 \n", 1579 | "1 Plot Area Ready To Move 5.0 3.0 120.00 \n", 1580 | "2 Built-up Area Ready To Move 2.0 3.0 62.00 \n", 1581 | "3 Super built-up Area Ready To Move 3.0 1.0 95.00 \n", 1582 | "4 Super built-up Area Ready To Move 2.0 1.0 51.00 \n", 1583 | "\n", 1584 | " site_location bhk new_total_sqft price_per_sqft \n", 1585 | "0 Alandi Road 2 1056.0 3699.810606 \n", 1586 | "1 Ambegaon Budruk 4 2600.0 4615.384615 \n", 1587 | "2 Anandnagar 3 1440.0 4305.555556 \n", 1588 | "3 Aundh 3 1521.0 6245.890861 \n", 1589 | "4 Aundh Road 2 1200.0 4250.000000 " 1590 | ] 1591 | }, 1592 | "execution_count": 272, 1593 | "metadata": {}, 1594 | "output_type": "execute_result" 1595 | } 1596 | ], 1597 | "source": [ 1598 | "df1.head()" 1599 | ] 1600 | }, 1601 | { 1602 | "cell_type": "code", 1603 | "execution_count": 273, 1604 | "metadata": {}, 1605 | "outputs": [ 1606 | { 1607 | "data": { 1608 | "text/plain": [ 1609 | "area_type\n", 1610 | "Super built-up Area 8778\n", 1611 | "Built-up Area 2402\n", 1612 | "Plot Area 1991\n", 1613 | "Carpet Area 86\n", 1614 | "Name: area_type, dtype: int64" 1615 | ] 1616 | }, 1617 | "execution_count": 273, 1618 | "metadata": {}, 1619 | "output_type": "execute_result" 1620 | } 1621 | ], 1622 | "source": [ 1623 | "# Checking the unique values in 'area_type' column\n", 1624 | "df1.groupby('area_type')['area_type'].agg('count').sort_values(ascending=False)\n", 1625 | "\n", 1626 | "# Since the column has only few unique values, we don't perform any operation" 1627 | ] 1628 | }, 1629 | { 1630 | "cell_type": "markdown", 1631 | "metadata": {}, 1632 | "source": [ 1633 | "## Removing Outliers" 1634 | ] 1635 | }, 1636 | { 1637 | "cell_type": "code", 1638 | "execution_count": 274, 1639 | "metadata": {}, 1640 | "outputs": [ 1641 | { 1642 | "name": "stdout", 1643 | "output_type": "stream", 1644 | "text": [ 1645 | "12513 13257\n" 1646 | ] 1647 | } 1648 | ], 1649 | "source": [ 1650 | "# Removing the rows that have 1 Room for less than 300sqft\n", 1651 | "\n", 1652 | "df2 = df1[~(df1.new_total_sqft/df1.bhk<300)]\n", 1653 | "print(len(df2), len(df1))" 1654 | ] 1655 | }, 1656 | { 1657 | "cell_type": "code", 1658 | "execution_count": 275, 1659 | "metadata": {}, 1660 | "outputs": [ 1661 | { 1662 | "data": { 1663 | "text/plain": [ 1664 | "count 12513.000000\n", 1665 | "mean 6307.567166\n", 1666 | "std 4160.879784\n", 1667 | "min 267.829813\n", 1668 | "25% 4211.469534\n", 1669 | "50% 5295.138889\n", 1670 | "75% 6916.666667\n", 1671 | "max 176470.588235\n", 1672 | "Name: price_per_sqft, dtype: float64" 1673 | ] 1674 | }, 1675 | "execution_count": 275, 1676 | "metadata": {}, 1677 | "output_type": "execute_result" 1678 | } 1679 | ], 1680 | "source": [ 1681 | "df2.price_per_sqft.describe()" 1682 | ] 1683 | }, 1684 | { 1685 | "cell_type": "code", 1686 | "execution_count": 276, 1687 | "metadata": {}, 1688 | "outputs": [ 1689 | { 1690 | "name": "stdout", 1691 | "output_type": "stream", 1692 | "text": [ 1693 | "12513 10937\n" 1694 | ] 1695 | } 1696 | ], 1697 | "source": [ 1698 | "# Since there is a wide range for 'price_per_sqft' column with min = Rs.267/sqft till max = Rs. 127470/sqft, we remove the extreme ends using the SD\n", 1699 | "def remove_pps_outliers(df):\n", 1700 | " \n", 1701 | " df_out = pd.DataFrame()\n", 1702 | " \n", 1703 | " for key, sub_df in df.groupby('site_location'):\n", 1704 | " m = np.mean(sub_df.price_per_sqft)\n", 1705 | " sd = np.std(sub_df.price_per_sqft)\n", 1706 | " reduce_df = sub_df[(sub_df.price_per_sqft>(m-sd)) & (sub_df.price_per_sqft<(m+sd))]\n", 1707 | " df_out = pd.concat([df_out, reduce_df], ignore_index=True)\n", 1708 | " \n", 1709 | " return df_out\n", 1710 | "\n", 1711 | "df3 = remove_pps_outliers(df2)\n", 1712 | "print(len(df2), len(df3))" 1713 | ] 1714 | }, 1715 | { 1716 | "cell_type": "code", 1717 | "execution_count": 277, 1718 | "metadata": {}, 1719 | "outputs": [ 1720 | { 1721 | "data": { 1722 | "image/png": "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5CEP6Xub1Wmcd9xxR5aXl/POd77zvmtvfOMbc/PNN9/3q9cFF1yQSy65JDfccMPmiuwh7AEAAJ2wuHi8o3ei5eXk8OGNP/Y999yTF7zgBXnRi16U5z//+ae9/dlnn51nPetZ+dCHPrSux3/wgx+c3/3d380v/dIv5frrr994oT2s2QMAADphx45mjV6/wDc9nWzfvrHHrbVm9+7dufzyy7Nnz5513+cjH/nISdM113LBBRfk/e9/f+bm5nL++efnmc985sYKXqGzBwAAdML8fDJ1ioQzNdVc34gPf/jD+bVf+7V88IMfvG+93b59+/rednXN3hVXXJF77703L3/5y8/ouS677LK8973vzUte8pJ87GMf21jBK0qtdVMPMEqzs7P10KFDoy4DAAAYoE996lO5/PLL13XbfrtxTk1tbjfOcdHvfSil3FRrne13e9M4AQCAzti5MzlypNmM5fDhZurm/Hyycn75RBH2AACATtm2Ldm9e9RVjJ6wB0AnLC01/xd3cbFZoD8/n8zMjLoqABgdYQ+A1uu3PmPPnm6szwCAjbIbJwCttrTUBL2lpeNbbS8vHx8/enS09QHAqAh7ALTawkLT0evn2LHmOgBMImEPgFZbXOx/eG7SjB8+PNx6AOieu+66K9/xHd+RJz7xiXn84x+f1772tX1vd/XVV+eyyy7LlVdemcc+9rF53eted9+1ubm59B4bd8stt+SKK65Ikuzfvz/Pfe5z77v2b/7Nv8kzn/nMfP3rX99U3cIeAK22Y0ezRq+f6elmy20AJs/c3rnM7Z3bksc655xz8sEPfjAf//jHc/PNN+f9739/brzxxr63feMb35ibb745N998c6677rp89rOfPaPnev3rX58Pf/jDec973pNzzjlnU3ULewC02vx8c1huP1NTzXUA2IxSSratHNR3zz335J577kkpZc373HXXXUmS6VP9H8k+3vSmN2Xfvn357d/+7TzoQQ/aeMEr7MYJQKvNzDS7bp64G+fUVDM+iYfoArD1vvGNb+Tbv/3bc/jw4bziFa/IU57ylL63e/WrX52f+ZmfyeHDh/PKV74yj3jEI+679qIXvei+EHf33Xdnquf/Vn74wx/Opz/96dx00033BcvNEvYAaL2dO5MjR5rNWA4fbqZuzs8LegCTpnfa5oFbD5w0tv/q/Rt+7Ac84AG5+eab8+Uv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\n", 1723 | "text/plain": [ 1724 | "
" 1725 | ] 1726 | }, 1727 | "metadata": { 1728 | "needs_background": "light" 1729 | }, 1730 | "output_type": "display_data" 1731 | } 1732 | ], 1733 | "source": [ 1734 | "def plot_scatter_chart(df, site_location):\n", 1735 | " bhk2 = df[(df.site_location == site_location) & (df.bhk == 2)]\n", 1736 | " bhk3 = df[(df.site_location == site_location) & (df.bhk == 3)]\n", 1737 | " rcP['figure.figsize'] = (15,10)\n", 1738 | " plt.scatter(bhk2.new_total_sqft, bhk2.price, color='blue', label='2 BHK', s=50)\n", 1739 | " plt.scatter(bhk3.new_total_sqft, bhk3.price, color='green', marker='+', label='3 BHK', s=50)\n", 1740 | " plt.xlabel('Total Square Feet Area')\n", 1741 | " plt.ylabel('Price (in Lakhs)')\n", 1742 | " plt.title(site_location)\n", 1743 | " plt.legend()\n", 1744 | " \n", 1745 | "plot_scatter_chart(df3, 'Hadapsar')" 1746 | ] 1747 | }, 1748 | { 1749 | "cell_type": "code", 1750 | "execution_count": 278, 1751 | "metadata": {}, 1752 | "outputs": [ 1753 | { 1754 | "name": "stdout", 1755 | "output_type": "stream", 1756 | "text": [ 1757 | "10937 7459\n" 1758 | ] 1759 | } 1760 | ], 1761 | "source": [ 1762 | "# Here we observe that 3 BHK cost that same as 2 BHK in 'Hebbal' location hence removing such outliers is necessary\n", 1763 | "def remove_bhk_outliers(df):\n", 1764 | " exclude_indices = np.array([])\n", 1765 | " \n", 1766 | " for site_location, site_location_df in df.groupby('site_location'):\n", 1767 | " bhk_stats = {}\n", 1768 | " \n", 1769 | " for bhk, bhk_df in site_location_df.groupby('bhk'):\n", 1770 | " bhk_stats[bhk] = {\n", 1771 | " 'mean': np.mean(bhk_df.price_per_sqft),\n", 1772 | " 'std': np.std(bhk_df.price_per_sqft),\n", 1773 | " 'count': bhk_df.shape[0]\n", 1774 | " }\n", 1775 | " \n", 1776 | " for bhk, bhk_df in site_location_df.groupby('bhk'):\n", 1777 | " stats = bhk_stats.get(bhk-1)\n", 1778 | " if stats and stats['count']>5:\n", 1779 | " exclude_indices = np.append(exclude_indices, bhk_df[bhk_df.price_per_sqft<(stats['mean'])].index.values)\n", 1780 | " \n", 1781 | " return df.drop(exclude_indices, axis='index')\n", 1782 | "\n", 1783 | "df4 = remove_bhk_outliers(df3)\n", 1784 | "print(len(df3), len(df4))" 1785 | ] 1786 | }, 1787 | { 1788 | "cell_type": "code", 1789 | "execution_count": 279, 1790 | "metadata": {}, 1791 | "outputs": [ 1792 | { 1793 | "data": { 1794 | "image/png": "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fz4rKyt529vedl/f6173utx00033ffU699xzc8EFF+Ttb3/71orsIewBAACtsLx8bETveCsryeHDm3/ue+65Jy94wQvyohe9KM9//vNPev/TTz89z3zmM/OBD3xgQ8//4Ac/OO95z3vya7/2a7nuuus2X2gPa/YAAIBW2L27WaPXL/DNzia7dm3ueWutueKKK3LxxRdn3759G37Mhz70oftN11zPueeem/e+971ZWFjIOeeck2c84xmbK7jLyB4AANAKi4vJzAkSzsxM078ZH/zgB/Nbv/Vbef/733/ferv9+/f3ve/amr1LLrkk9957b1760pee0mtddNFFede73pUf+7Efy4c//OHNFdxVaq1beoJRmp+fr4cOHRp1GQAAwADdfPPNufjiizd03367cc7MbG03znHR73MopdxYa53vd3/TOAEAgNbYsyc5cqTZjOXw4Wbq5uJi0j2/fKoIewAAQKvs2JFcccWoqxg9YQ+AVuh0mv+Lu7zcLNBfXEzm5kZdFQCMjrAHwMTrtz5j3752rM8AgM2yGycAE63TaYJep3Nsq+2VlWPtR4+Otj4AGBVhD4CJtrTUjOj1s7ra9APANBL2AJhoy8v9D89NmvbDh4dbDwDtc9ddd+XJT35ynvCEJ+Rxj3tcXvnKV/a93+WXX56LLrool156aR7zmMfkVa961X19CwsL6T027pZbbskll1ySJLn++uvznOc8576+f/kv/2We8Yxn5Gtf+9qW6hb2AJhou3c3a/T6mZ1tttwGYPosXLOQhWsWtuW5zjjjjLz//e/PRz7ykdx0001573vfmxtuuKHvfV/3utflpptuyk033ZRrr702n/70p0/ptV796lfngx/8YN75znfmjDPO2FLdwh4AE21xsTkst5+ZmaYfALailJId3YP67rnnntxzzz0ppaz7mLvuuitJMnui/yPZx+tf//rs378/f/AHf5AHPehBmy+4y26cAEy0ublm183jd+OcmWnap/EQXQC239e//vV8x3d8Rw4fPpyXvexlecpTntL3fq94xSvyi7/4izl8+HBe/vKX5+EPf/h9fS960YvuC3F33313Znr+b+UHP/jBfOITn8iNN954X7DcKmEPgIm3Z09y5EizGcvhw83UzcVFQQ9g2vRO2zxw64H7tV1/+fWbfu4HPOABuemmm/KlL30pP/RDP5SPfexj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\n", 1795 | "text/plain": [ 1796 | "
" 1797 | ] 1798 | }, 1799 | "metadata": { 1800 | "needs_background": "light" 1801 | }, 1802 | "output_type": "display_data" 1803 | } 1804 | ], 1805 | "source": [ 1806 | "plot_scatter_chart(df4, 'Hadapsar')" 1807 | ] 1808 | }, 1809 | { 1810 | "cell_type": "code", 1811 | "execution_count": 280, 1812 | "metadata": {}, 1813 | "outputs": [ 1814 | { 1815 | "data": { 1816 | "text/plain": [ 1817 | "Text(0, 0.5, 'Count')" 1818 | ] 1819 | }, 1820 | "execution_count": 280, 1821 | "metadata": {}, 1822 | "output_type": "execute_result" 1823 | }, 1824 | { 1825 | "data": { 1826 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4EAAAJNCAYAAACP93C3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dfbBkd13n8c+XDAQUMMEMbEziTsDRJVoacQgRdCuCQngog1WgsSiJGDc+AOvzbpBaWXWpiorisiIYIRpYJEREiRCNMbKIrpBMIAkJATOSQMZEMhgIUVw08bt/9Blpwr137gy35z78Xq+qrtv9O6e7f31PnZl5zzn33OruAAAAMIb7rfcEAAAAOHxEIAAAwEBEIAAAwEBEIAAAwEBEIAAAwEBEIAAAwEC2rfcEFuGYY47pHTt2rPc0AAAA1sXVV1/98e7evtSyLRmBO3bsyO7du9d7GgAAAOuiqj6y3DKngwIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxEBAIAAAxkYRFYVQ+sqiur6tqquqGqfnYaP7Gq3lNVN1XVm6rqAdP4kdPjPdPyHXOv9aJp/ENV9ZRFzRkAAGCrW+SRwM8keWJ3f12Sk5OcXlWnJvmFJC/v7p1JPpHk7Gn9s5N8oru/IsnLp/VSVSclOTPJVyc5PcmvV9URC5w3AADAlrWwCOyZf5ge3n+6dZInJnnzNH5hkmdO98+YHmda/qSqqmn8ou7+THffnGRPklMWNW8AAICtbKE/E1hVR1TVNUnuSHJ5kr9J8snuvmdaZW+S46b7xyW5NUmm5Xcl+dL58SWeAwAAwEFYaAR2973dfXKS4zM7evfopVabvtYyy5Yb/xxVdU5V7a6q3fv27TvUKQMAAGxph+XqoN39yST/J8mpSY6qqm3TouOT3Dbd35vkhCSZln9Jkjvnx5d4zvx7nN/du7p71/bt2xfxMQAAADa9RV4ddHtVHTXdf1CSb01yY5J3JHnWtNpZSd463b9kepxp+Z91d0/jZ05XDz0xyc4kVy5q3gAAAFvZtgOvcsiOTXLhdCXP+yW5uLvfVlUfSHJRVf2PJO9L8tpp/dcmeX1V7cnsCOCZSdLdN1TVxUk+kOSeJM/v7nsXOG8AAIAtq2YH27aWXbt29e7du9d7GgAAAOuiqq7u7l1LLTssPxMIAADAxrDI00GBDWbHuW9f7yms6Jbznr7eUwAA2PIcCQQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABiICAQAABjIwiKwqk6oqndU1Y1VdUNV/cg0/t+r6m+r6prp9rS557yoqvZU1Yeq6ilz46dPY3uq6txFzRkAAGCr27bA174nyU9093ur6iFJrq6qy6dlL+/ul82vXFUnJTkzyVcn+bIkf1pVXzktfmWSb0uyN8lVVXVJd39ggXMHAADYkhYWgd19e5Lbp/t3V9WNSY5b4SlnJLmouz+T5Oaq2pPklGnZnu7+cJJU1UXTuiIQAADgIB2Wnwmsqh1Jvj7Je6ahF1TVdVV1QVUdPY0dl+TWuaftncaWGwcAAOAgLTwCq+rBSX4vyY9296eSvCrJo5KcnNmRwl/ev+oST+8Vxu/7PudU1e6q2r1v3741mTsAAMBWs9AIrKr7ZxaAb+jutyRJd3+su+/t7n9N8pv57Cmfe5OcMPf045PctsL45+ju87t7V3fv2r59+9p/GAAAgC1gkVcHrSSvTXJjd//K3Pixc6t9R5Lrp/uXJDmzqo6sqhOT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AICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBiEAAAICBrEsEVtUtVfX+qrqmqnZPYw+rqsur6qbp69HTeFXVK6pqT1VdV1WPWY85AwAAbAXreSTwW7r75O7eNT0+N8kV3b0zyRXT4yR5apKd0+2cJK867DMFAADYIjbS6aBnJLlwun9hkmfOjb+uZ96d5KiqOnY9JggAALDZrVcEdpI/qaqrq+qcaewR3X17kkxfHz6NH5fk1rnn7p3GAAAAOEjb1ul9n9Ddt1XVw5NcXlUfXGHdWmKsP2+lWUyekyRf/uVfvjazBAAA2GLW5Uhgd982fb0jye8nOSXJx/af5jl9vWNafW+SE+aefnyS25Z4zfO7e1d379q+ffsipw8AALBpHfYjgVX1xUnu1913T/efnOTnklyS5Kwk501f3zo95ZIkL6iqi5I8Lsld+08bBWDz2HHu29d7Ciu65bynr/cUAOCwWI/TQR+R5Perav/7/053/3FVXZXk4qo6O8lHkzx7Wv/SJE9LsifJp5M87/BPGQAAYGs47BHY3R9O8nVLjP99kictMd5Jnn8YpgYAALDlbaRfEQEAAMCCiUAAAICBiEAAAICBiEAAAICBiEAAAICBrMeviBjWRv8dWYnfkwUAAFudI4EAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEAAAADEYEA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\n", 1827 | "text/plain": [ 1828 | "
" 1829 | ] 1830 | }, 1831 | "metadata": { 1832 | "needs_background": "light" 1833 | }, 1834 | "output_type": "display_data" 1835 | } 1836 | ], 1837 | "source": [ 1838 | "plt.hist(df4.price_per_sqft, rwidth=0.5)\n", 1839 | "plt.xlabel('Price Per Square Feet')\n", 1840 | "plt.ylabel('Count')" 1841 | ] 1842 | }, 1843 | { 1844 | "cell_type": "code", 1845 | "execution_count": 281, 1846 | "metadata": {}, 1847 | "outputs": [ 1848 | { 1849 | "data": { 1850 | "text/plain": [ 1851 | "Text(0, 0.5, 'Count')" 1852 | ] 1853 | }, 1854 | "execution_count": 281, 1855 | "metadata": {}, 1856 | "output_type": "execute_result" 1857 | }, 1858 | { 1859 | "data": { 1860 | "image/png": "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\n", 1861 | "text/plain": [ 1862 | "
" 1863 | ] 1864 | }, 1865 | "metadata": { 1866 | "needs_background": "light" 1867 | }, 1868 | "output_type": "display_data" 1869 | } 1870 | ], 1871 | "source": [ 1872 | "plt.hist(df4.bath, rwidth=0.5)\n", 1873 | "plt.xlabel('Number of Bathrooms')\n", 1874 | "plt.ylabel('Count')" 1875 | ] 1876 | }, 1877 | { 1878 | "cell_type": "code", 1879 | "execution_count": 282, 1880 | "metadata": { 1881 | "scrolled": true 1882 | }, 1883 | "outputs": [ 1884 | { 1885 | "name": "stdout", 1886 | "output_type": "stream", 1887 | "text": [ 1888 | "7459 7395\n" 1889 | ] 1890 | } 1891 | ], 1892 | "source": [ 1893 | "# Removing the rows that have 'bath' greater than 'bhk'+2\n", 1894 | "df5 = df4[df4.bath<(df4.bhk+2)]\n", 1895 | "print(len(df4), len(df5))" 1896 | ] 1897 | }, 1898 | { 1899 | "cell_type": "code", 1900 | "execution_count": 283, 1901 | "metadata": {}, 1902 | "outputs": [ 1903 | { 1904 | "data": { 1905 | "text/html": [ 1906 | "
\n", 1907 | "\n", 1920 | "\n", 1921 | " \n", 1922 | " \n", 1923 | " \n", 1924 | " \n", 1925 | " \n", 1926 | " \n", 1927 | " \n", 1928 | " \n", 1929 | " \n", 1930 | " \n", 1931 | " \n", 1932 | " \n", 1933 | " \n", 1934 | " \n", 1935 | " \n", 1936 | " \n", 1937 | " \n", 1938 | " \n", 1939 | " \n", 1940 | " \n", 1941 | " \n", 1942 | " \n", 1943 | " \n", 1944 | " \n", 1945 | " \n", 1946 | " \n", 1947 | " \n", 1948 | " \n", 1949 | " \n", 1950 | " \n", 1951 | " \n", 1952 | " \n", 1953 | " \n", 1954 | " \n", 1955 | " \n", 1956 | " \n", 1957 | " \n", 1958 | " \n", 1959 | " \n", 1960 | " \n", 1961 | " \n", 1962 | " \n", 1963 | " \n", 1964 | " \n", 1965 | " \n", 1966 | " \n", 1967 | " \n", 1968 | " \n", 1969 | " \n", 1970 | " \n", 1971 | " \n", 1972 | " \n", 1973 | " \n", 1974 | " \n", 1975 | " \n", 1976 | " \n", 1977 | " \n", 1978 | " \n", 1979 | " \n", 1980 | " \n", 1981 | " \n", 1982 | " \n", 1983 | " \n", 1984 | " \n", 1985 | " \n", 1986 | " \n", 1987 | " \n", 1988 | " \n", 1989 | " \n", 1990 | " \n", 1991 | " \n", 1992 | " \n", 1993 | " \n", 1994 | " \n", 1995 | " \n", 1996 | " \n", 1997 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqftprice_per_sqft
10923Super built-up AreaNot Ready2.01.067.0Yerawada21165.05751.072961
10928Built-up AreaReady To Move6.02.0115.0Yerawada63500.03285.714286
10931Built-up AreaNot Ready2.02.0353.0Yerawada53210.010996.884735
10932Super built-up AreaReady To Move2.02.054.0Yerawada21050.05142.857143
10936Super built-up AreaNot Ready2.01.070.0Yerawada21132.06183.745583
\n", 1998 | "
" 1999 | ], 2000 | "text/plain": [ 2001 | " area_type availability bath balcony price \\\n", 2002 | "10923 Super built-up Area Not Ready 2.0 1.0 67.0 \n", 2003 | "10928 Built-up Area Ready To Move 6.0 2.0 115.0 \n", 2004 | "10931 Built-up Area Not Ready 2.0 2.0 353.0 \n", 2005 | "10932 Super built-up Area Ready To Move 2.0 2.0 54.0 \n", 2006 | "10936 Super built-up Area Not Ready 2.0 1.0 70.0 \n", 2007 | "\n", 2008 | " site_location bhk new_total_sqft price_per_sqft \n", 2009 | "10923 Yerawada 2 1165.0 5751.072961 \n", 2010 | "10928 Yerawada 6 3500.0 3285.714286 \n", 2011 | "10931 Yerawada 5 3210.0 10996.884735 \n", 2012 | "10932 Yerawada 2 1050.0 5142.857143 \n", 2013 | "10936 Yerawada 2 1132.0 6183.745583 " 2014 | ] 2015 | }, 2016 | "execution_count": 283, 2017 | "metadata": {}, 2018 | "output_type": "execute_result" 2019 | } 2020 | ], 2021 | "source": [ 2022 | "df5.tail()" 2023 | ] 2024 | }, 2025 | { 2026 | "cell_type": "markdown", 2027 | "metadata": {}, 2028 | "source": [ 2029 | "## Model Building" 2030 | ] 2031 | }, 2032 | { 2033 | "cell_type": "code", 2034 | "execution_count": 284, 2035 | "metadata": {}, 2036 | "outputs": [], 2037 | "source": [ 2038 | "# Removing the unnecessary columns (columns that were added only for removing the outliers)\n", 2039 | "df6 = df5.copy()\n", 2040 | "df6 = df6.drop('price_per_sqft', axis='columns')" 2041 | ] 2042 | }, 2043 | { 2044 | "cell_type": "code", 2045 | "execution_count": 285, 2046 | "metadata": {}, 2047 | "outputs": [ 2048 | { 2049 | "data": { 2050 | "text/html": [ 2051 | "
\n", 2052 | "\n", 2065 | "\n", 2066 | " \n", 2067 | " \n", 2068 | " \n", 2069 | " \n", 2070 | " \n", 2071 | " \n", 2072 | " \n", 2073 | " \n", 2074 | " \n", 2075 | " \n", 2076 | " \n", 2077 | " \n", 2078 | " \n", 2079 | " \n", 2080 | " \n", 2081 | " \n", 2082 | " \n", 2083 | " \n", 2084 | " \n", 2085 | " \n", 2086 | " \n", 2087 | " \n", 2088 | " \n", 2089 | " \n", 2090 | " \n", 2091 | " \n", 2092 | " \n", 2093 | " \n", 2094 | " \n", 2095 | " \n", 2096 | " \n", 2097 | " \n", 2098 | " \n", 2099 | " \n", 2100 | " \n", 2101 | " \n", 2102 | " \n", 2103 | " \n", 2104 | " \n", 2105 | " \n", 2106 | " \n", 2107 | " \n", 2108 | " \n", 2109 | " \n", 2110 | " \n", 2111 | " \n", 2112 | " \n", 2113 | " \n", 2114 | " \n", 2115 | " \n", 2116 | " \n", 2117 | " \n", 2118 | " \n", 2119 | " \n", 2120 | " \n", 2121 | " \n", 2122 | " \n", 2123 | " \n", 2124 | " \n", 2125 | " \n", 2126 | " \n", 2127 | " \n", 2128 | " \n", 2129 | " \n", 2130 | " \n", 2131 | " \n", 2132 | " \n", 2133 | " \n", 2134 | " \n", 2135 | " \n", 2136 | "
area_typeavailabilitybathbalconypricesite_locationbhknew_total_sqft
0Super built-up AreaNot Ready2.01.039.07Alandi Road21056.0
1Plot AreaReady To Move4.01.0245.00Alandi Road42894.0
2Super built-up AreaReady To Move2.02.050.00Alandi Road21084.0
3Super built-up AreaReady To Move2.02.080.00Alandi Road21230.0
4Super built-up AreaReady To Move3.02.0130.00Alandi Road31750.0
\n", 2137 | "
" 2138 | ], 2139 | "text/plain": [ 2140 | " area_type availability bath balcony price site_location \\\n", 2141 | "0 Super built-up Area Not Ready 2.0 1.0 39.07 Alandi Road \n", 2142 | "1 Plot Area Ready To Move 4.0 1.0 245.00 Alandi Road \n", 2143 | "2 Super built-up Area Ready To Move 2.0 2.0 50.00 Alandi Road \n", 2144 | "3 Super built-up Area Ready To Move 2.0 2.0 80.00 Alandi Road \n", 2145 | "4 Super built-up Area Ready To Move 3.0 2.0 130.00 Alandi Road \n", 2146 | "\n", 2147 | " bhk new_total_sqft \n", 2148 | "0 2 1056.0 \n", 2149 | "1 4 2894.0 \n", 2150 | "2 2 1084.0 \n", 2151 | "3 2 1230.0 \n", 2152 | "4 3 1750.0 " 2153 | ] 2154 | }, 2155 | "execution_count": 285, 2156 | "metadata": {}, 2157 | "output_type": "execute_result" 2158 | } 2159 | ], 2160 | "source": [ 2161 | "df6.head()" 2162 | ] 2163 | }, 2164 | { 2165 | "cell_type": "code", 2166 | "execution_count": 286, 2167 | "metadata": {}, 2168 | "outputs": [], 2169 | "source": [ 2170 | "# Converting the categorical_value into numerical_values using get_dummies method\n", 2171 | "dummy_cols = pd.get_dummies(df6.site_location)\n", 2172 | "df6 = pd.concat([df6,dummy_cols], axis='columns')" 2173 | ] 2174 | }, 2175 | { 2176 | "cell_type": "code", 2177 | "execution_count": 287, 2178 | "metadata": {}, 2179 | "outputs": [], 2180 | "source": [ 2181 | "# Converting the categorical_value into numerical_values using get_dummies method\n", 2182 | "dummy_cols = pd.get_dummies(df6.availability).drop('Not Ready', axis='columns')\n", 2183 | "df6 = pd.concat([df6,dummy_cols], axis='columns')" 2184 | ] 2185 | }, 2186 | { 2187 | "cell_type": "code", 2188 | "execution_count": 288, 2189 | "metadata": {}, 2190 | "outputs": [], 2191 | "source": [ 2192 | "# Converting the categorical_value into numerical_values using get_dummies method\n", 2193 | "dummy_cols = pd.get_dummies(df6.area_type).drop('Super built-up Area', axis='columns')\n", 2194 | "df6 = pd.concat([df6,dummy_cols], axis='columns')" 2195 | ] 2196 | }, 2197 | { 2198 | "cell_type": "code", 2199 | "execution_count": 289, 2200 | "metadata": { 2201 | "scrolled": false 2202 | }, 2203 | "outputs": [ 2204 | { 2205 | "data": { 2206 | "text/html": [ 2207 | "
\n", 2208 | "\n", 2221 | "\n", 2222 | " \n", 2223 | " \n", 2224 | " \n", 2225 | " \n", 2226 | " \n", 2227 | " \n", 2228 | " \n", 2229 | " \n", 2230 | " \n", 2231 | " \n", 2232 | " \n", 2233 | " \n", 2234 | " \n", 2235 | " \n", 2236 | " \n", 2237 | " \n", 2238 | " \n", 2239 | " \n", 2240 | " \n", 2241 | " \n", 2242 | " \n", 2243 | " \n", 2244 | " \n", 2245 | " \n", 2246 | " \n", 2247 | " \n", 2248 | " \n", 2249 | " \n", 2250 | " \n", 2251 | " \n", 2252 | " \n", 2253 | " \n", 2254 | " \n", 2255 | " \n", 2256 | " \n", 2257 | " \n", 2258 | " \n", 2259 | " \n", 2260 | " \n", 2261 | " \n", 2262 | " \n", 2263 | " \n", 2264 | " \n", 2265 | " \n", 2266 | " \n", 2267 | " \n", 2268 | " \n", 2269 | " \n", 2270 | " \n", 2271 | " \n", 2272 | " \n", 2273 | " \n", 2274 | " \n", 2275 | " \n", 2276 | " \n", 2277 | " \n", 2278 | " \n", 2279 | " \n", 2280 | " \n", 2281 | " \n", 2282 | " \n", 2283 | " \n", 2284 | " \n", 2285 | " \n", 2286 | " \n", 2287 | " \n", 2288 | " \n", 2289 | " \n", 2290 | " \n", 2291 | " \n", 2292 | " \n", 2293 | " \n", 2294 | " \n", 2295 | " \n", 2296 | " \n", 2297 | " \n", 2298 | " \n", 2299 | " \n", 2300 | " \n", 2301 | " \n", 2302 | " \n", 2303 | " \n", 2304 | " \n", 2305 | " \n", 2306 | " \n", 2307 | " \n", 2308 | " \n", 2309 | " \n", 2310 | " \n", 2311 | " \n", 2312 | " \n", 2313 | " \n", 2314 | " \n", 2315 | " \n", 2316 | " \n", 2317 | " \n", 2318 | " \n", 2319 | " \n", 2320 | " \n", 2321 | " \n", 2322 | " \n", 2323 | " \n", 2324 | " \n", 2325 | " \n", 2326 | " \n", 2327 | " \n", 2328 | " \n", 2329 | " \n", 2330 | " \n", 2331 | " \n", 2332 | " \n", 2333 | " \n", 2334 | " \n", 2335 | " \n", 2336 | " \n", 2337 | " \n", 2338 | " \n", 2339 | " \n", 2340 | " \n", 2341 | " \n", 2342 | " \n", 2343 | " \n", 2344 | " \n", 2345 | " \n", 2346 | " \n", 2347 | " \n", 2348 | " \n", 2349 | " \n", 2350 | " \n", 2351 | " \n", 2352 | " \n", 2353 | " \n", 2354 | " \n", 2355 | " \n", 2356 | " \n", 2357 | " \n", 2358 | " \n", 2359 | " \n", 2360 | " \n", 2361 | " \n", 2362 | " \n", 2363 | " \n", 2364 | " \n", 2365 | " \n", 2366 | " \n", 2367 | " \n", 2368 | " \n", 2369 | " \n", 2370 | " \n", 2371 | " \n", 2372 | " \n", 2373 | " \n", 2374 | " \n", 2375 | " \n", 2376 | " \n", 2377 | " \n", 2378 | " \n", 2379 | " \n", 2380 | " \n", 2381 | " \n", 2382 | " \n", 2383 | " \n", 2384 | " \n", 2385 | " \n", 2386 | " \n", 2387 | " \n", 2388 | " \n", 2389 | " \n", 2390 | " \n", 2391 | " \n", 2392 | " \n", 2393 | " \n", 2394 | " \n", 2395 | " \n", 2396 | " \n", 2397 | " \n", 2398 | " \n", 2399 | " \n", 2400 | " \n", 2401 | " \n", 2402 | " \n", 2403 | " \n", 2404 | " \n", 2405 | " \n", 2406 | " \n", 2407 | " \n", 2408 | " \n", 2409 | " \n", 2410 | " \n", 2411 | " \n", 2412 | " \n", 2413 | " \n", 2414 | " \n", 2415 | " \n", 2416 | " \n", 2417 | " \n", 2418 | " \n", 2419 | " \n", 2420 | " \n", 2421 | " \n", 2422 | " \n", 2423 | " \n", 2424 | " \n", 2425 | " \n", 2426 | " \n", 2427 | " \n", 2428 | " \n", 2429 | " \n", 2430 | " \n", 2431 | " \n", 2432 | " \n", 2433 | " \n", 2434 | " \n", 2435 | " \n", 2436 | " \n", 2437 | " \n", 2438 | " \n", 2439 | " \n", 2440 | " \n", 2441 | " \n", 2442 | " \n", 2443 | " \n", 2444 | " \n", 2445 | " \n", 2446 | " \n", 2447 | " \n", 2448 | " \n", 2449 | " \n", 2450 | " \n", 2451 | " \n", 2452 | " \n", 2453 | " \n", 2454 | " \n", 2455 | " \n", 2456 | " \n", 2457 | " \n", 2458 | " \n", 2459 | " \n", 2460 | " \n", 2461 | " \n", 2462 | " \n", 2463 | " \n", 2464 | " \n", 2465 | " \n", 2466 | " \n", 2467 | " \n", 2468 | " \n", 2469 | " \n", 2470 | " \n", 2471 | " \n", 2472 | " \n", 2473 | " \n", 2474 | " \n", 2475 | " \n", 2476 | " \n", 2477 | " \n", 2478 | " \n", 2479 | " \n", 2480 | " \n", 2481 | " \n", 2482 | " \n", 2483 | " \n", 2484 | " \n", 2485 | " \n", 2486 | " \n", 2487 | " \n", 2488 | " \n", 2489 | " \n", 2490 | "
bathbalconypricebhknew_total_sqftAlandi RoadAmbegaon BudrukAnandnagarAundhAundh Road...Wadgaon SheriWagholiWakadewadiWanowrieWarjeYerawadaReady To MoveBuilt-up AreaCarpet AreaPlot Area
02.01.039.0721056.010000...0000000000
14.01.0245.0042894.010000...0000001001
22.02.050.0021084.010000...0000001000
32.02.080.0021230.010000...0000001000
43.02.0130.0031750.010000...0000001000
52.01.041.002995.010000...0000001100
82.01.095.0021360.010000...0000001000
92.02.050.0021040.010000...0000001100
103.02.086.0631655.010000...0000001000
125.03.0198.0042790.010000...0000000000
\n", 2491 | "

10 rows × 105 columns

\n", 2492 | "
" 2493 | ], 2494 | "text/plain": [ 2495 | " bath balcony price bhk new_total_sqft Alandi Road Ambegaon Budruk \\\n", 2496 | "0 2.0 1.0 39.07 2 1056.0 1 0 \n", 2497 | "1 4.0 1.0 245.00 4 2894.0 1 0 \n", 2498 | "2 2.0 2.0 50.00 2 1084.0 1 0 \n", 2499 | "3 2.0 2.0 80.00 2 1230.0 1 0 \n", 2500 | "4 3.0 2.0 130.00 3 1750.0 1 0 \n", 2501 | "5 2.0 1.0 41.00 2 995.0 1 0 \n", 2502 | "8 2.0 1.0 95.00 2 1360.0 1 0 \n", 2503 | "9 2.0 2.0 50.00 2 1040.0 1 0 \n", 2504 | "10 3.0 2.0 86.06 3 1655.0 1 0 \n", 2505 | "12 5.0 3.0 198.00 4 2790.0 1 0 \n", 2506 | "\n", 2507 | " Anandnagar Aundh Aundh Road ... Wadgaon Sheri Wagholi Wakadewadi \\\n", 2508 | "0 0 0 0 ... 0 0 0 \n", 2509 | "1 0 0 0 ... 0 0 0 \n", 2510 | "2 0 0 0 ... 0 0 0 \n", 2511 | "3 0 0 0 ... 0 0 0 \n", 2512 | "4 0 0 0 ... 0 0 0 \n", 2513 | "5 0 0 0 ... 0 0 0 \n", 2514 | "8 0 0 0 ... 0 0 0 \n", 2515 | "9 0 0 0 ... 0 0 0 \n", 2516 | "10 0 0 0 ... 0 0 0 \n", 2517 | "12 0 0 0 ... 0 0 0 \n", 2518 | "\n", 2519 | " Wanowrie Warje Yerawada Ready To Move Built-up Area Carpet Area \\\n", 2520 | "0 0 0 0 0 0 0 \n", 2521 | "1 0 0 0 1 0 0 \n", 2522 | "2 0 0 0 1 0 0 \n", 2523 | "3 0 0 0 1 0 0 \n", 2524 | "4 0 0 0 1 0 0 \n", 2525 | "5 0 0 0 1 1 0 \n", 2526 | "8 0 0 0 1 0 0 \n", 2527 | "9 0 0 0 1 1 0 \n", 2528 | "10 0 0 0 1 0 0 \n", 2529 | "12 0 0 0 0 0 0 \n", 2530 | "\n", 2531 | " Plot Area \n", 2532 | "0 0 \n", 2533 | "1 1 \n", 2534 | "2 0 \n", 2535 | "3 0 \n", 2536 | "4 0 \n", 2537 | "5 0 \n", 2538 | "8 0 \n", 2539 | "9 0 \n", 2540 | "10 0 \n", 2541 | "12 0 \n", 2542 | "\n", 2543 | "[10 rows x 105 columns]" 2544 | ] 2545 | }, 2546 | "execution_count": 289, 2547 | "metadata": {}, 2548 | "output_type": "execute_result" 2549 | } 2550 | ], 2551 | "source": [ 2552 | "df6.drop(['area_type','availability','site_location'], axis='columns', inplace=True)\n", 2553 | "df6.head(10)" 2554 | ] 2555 | }, 2556 | { 2557 | "cell_type": "code", 2558 | "execution_count": 290, 2559 | "metadata": {}, 2560 | "outputs": [ 2561 | { 2562 | "data": { 2563 | "text/plain": [ 2564 | "(7395, 105)" 2565 | ] 2566 | }, 2567 | "execution_count": 290, 2568 | "metadata": {}, 2569 | "output_type": "execute_result" 2570 | } 2571 | ], 2572 | "source": [ 2573 | "# Size of the dataset\n", 2574 | "df6.shape" 2575 | ] 2576 | }, 2577 | { 2578 | "cell_type": "code", 2579 | "execution_count": 291, 2580 | "metadata": {}, 2581 | "outputs": [], 2582 | "source": [ 2583 | "# Splitting the dataset into features and label\n", 2584 | "X = df6.drop('price', axis='columns')\n", 2585 | "y = df6['price']" 2586 | ] 2587 | }, 2588 | { 2589 | "cell_type": "code", 2590 | "execution_count": 292, 2591 | "metadata": {}, 2592 | "outputs": [], 2593 | "source": [ 2594 | "# Using GridSearchCV to find the best algorithm for this problem\n", 2595 | "from sklearn.model_selection import GridSearchCV\n", 2596 | "from sklearn.model_selection import ShuffleSplit\n", 2597 | "from sklearn.linear_model import LinearRegression\n", 2598 | "from sklearn.linear_model import Lasso\n", 2599 | "from sklearn.tree import DecisionTreeRegressor" 2600 | ] 2601 | }, 2602 | { 2603 | "cell_type": "code", 2604 | "execution_count": 293, 2605 | "metadata": {}, 2606 | "outputs": [ 2607 | { 2608 | "data": { 2609 | "text/html": [ 2610 | "
\n", 2611 | "\n", 2624 | "\n", 2625 | " \n", 2626 | " \n", 2627 | " \n", 2628 | " \n", 2629 | " \n", 2630 | " \n", 2631 | " \n", 2632 | " \n", 2633 | " \n", 2634 | " \n", 2635 | " \n", 2636 | " \n", 2637 | " \n", 2638 | " \n", 2639 | " \n", 2640 | " \n", 2641 | " \n", 2642 | " \n", 2643 | " \n", 2644 | " \n", 2645 | " \n", 2646 | " \n", 2647 | " \n", 2648 | " \n", 2649 | " \n", 2650 | " \n", 2651 | " \n", 2652 | " \n", 2653 | "
modelbest_parametersaccuracy
0linear_regression{'normalize': True}0.835475
1lasso{'alpha': 2, 'selection': 'random'}0.829241
2decision_tree{'criterion': 'mse', 'splitter': 'best'}0.781004
\n", 2654 | "
" 2655 | ], 2656 | "text/plain": [ 2657 | " model best_parameters accuracy\n", 2658 | "0 linear_regression {'normalize': True} 0.835475\n", 2659 | "1 lasso {'alpha': 2, 'selection': 'random'} 0.829241\n", 2660 | "2 decision_tree {'criterion': 'mse', 'splitter': 'best'} 0.781004" 2661 | ] 2662 | }, 2663 | "execution_count": 293, 2664 | "metadata": {}, 2665 | "output_type": "execute_result" 2666 | } 2667 | ], 2668 | "source": [ 2669 | "# Creating a function for GridSearchCV\n", 2670 | "\n", 2671 | "def find_best_model(X, y):\n", 2672 | " models = {\n", 2673 | " 'linear_regression': {\n", 2674 | " 'model': LinearRegression(),\n", 2675 | " 'parameters': {\n", 2676 | " 'normalize': [True,False]\n", 2677 | " }\n", 2678 | " },\n", 2679 | " \n", 2680 | " 'lasso': {\n", 2681 | " 'model': Lasso(),\n", 2682 | " 'parameters': {\n", 2683 | " 'alpha': [1,2],\n", 2684 | " 'selection': ['random', 'cyclic']\n", 2685 | " }\n", 2686 | " },\n", 2687 | " \n", 2688 | " 'decision_tree': {\n", 2689 | " 'model': DecisionTreeRegressor(),\n", 2690 | " 'parameters': {\n", 2691 | " 'criterion': ['mse', 'friedman_mse'],\n", 2692 | " 'splitter': ['best', 'random']\n", 2693 | " }\n", 2694 | " }\n", 2695 | " }\n", 2696 | " \n", 2697 | " scores = []\n", 2698 | " cv_X_y = ShuffleSplit(n_splits=5, test_size=0.20, random_state=0)\n", 2699 | " \n", 2700 | " for model_name, model_params in models.items():\n", 2701 | " gs = GridSearchCV(model_params['model'], model_params['parameters'], cv=cv_X_y, return_train_score=False)\n", 2702 | " gs.fit(X, y)\n", 2703 | " scores.append({\n", 2704 | " 'model': model_name,\n", 2705 | " 'best_parameters': gs.best_params_,\n", 2706 | " 'accuracy': gs.best_score_\n", 2707 | " })\n", 2708 | " \n", 2709 | " return pd.DataFrame(scores, columns=['model', 'best_parameters', 'accuracy'])\n", 2710 | "\n", 2711 | "find_best_model(X, y)" 2712 | ] 2713 | }, 2714 | { 2715 | "cell_type": "markdown", 2716 | "metadata": {}, 2717 | "source": [ 2718 | "#### Since the Linear Regression has the highest accuracy, the model selected for this problem is Linear Regression" 2719 | ] 2720 | }, 2721 | { 2722 | "cell_type": "code", 2723 | "execution_count": 294, 2724 | "metadata": {}, 2725 | "outputs": [], 2726 | "source": [ 2727 | "# Splitting the dataset into train and test set\n", 2728 | "from sklearn.model_selection import train_test_split\n", 2729 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=20)" 2730 | ] 2731 | }, 2732 | { 2733 | "cell_type": "code", 2734 | "execution_count": 295, 2735 | "metadata": {}, 2736 | "outputs": [ 2737 | { 2738 | "data": { 2739 | "text/plain": [ 2740 | "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=True)" 2741 | ] 2742 | }, 2743 | "execution_count": 295, 2744 | "metadata": {}, 2745 | "output_type": "execute_result" 2746 | } 2747 | ], 2748 | "source": [ 2749 | "# Creating Linear Regression Model\n", 2750 | "from sklearn.linear_model import LinearRegression\n", 2751 | "model = LinearRegression(normalize=True)\n", 2752 | "model.fit(X_train, y_train)" 2753 | ] 2754 | }, 2755 | { 2756 | "cell_type": "code", 2757 | "execution_count": 296, 2758 | "metadata": {}, 2759 | "outputs": [ 2760 | { 2761 | "data": { 2762 | "text/plain": [ 2763 | "0.8180571987758956" 2764 | ] 2765 | }, 2766 | "execution_count": 296, 2767 | "metadata": {}, 2768 | "output_type": "execute_result" 2769 | } 2770 | ], 2771 | "source": [ 2772 | "model.score(X_test, y_test)" 2773 | ] 2774 | }, 2775 | { 2776 | "cell_type": "markdown", 2777 | "metadata": {}, 2778 | "source": [ 2779 | "#### Predicting the values using our trained model" 2780 | ] 2781 | }, 2782 | { 2783 | "cell_type": "code", 2784 | "execution_count": 297, 2785 | "metadata": {}, 2786 | "outputs": [ 2787 | { 2788 | "data": { 2789 | "text/plain": [ 2790 | "Index(['bath', 'balcony', 'bhk', 'new_total_sqft', 'Alandi Road',\n", 2791 | " 'Ambegaon Budruk', 'Anandnagar', 'Aundh', 'Aundh Road', 'Balaji Nagar',\n", 2792 | " ...\n", 2793 | " 'Wadgaon Sheri', 'Wagholi', 'Wakadewadi', 'Wanowrie', 'Warje',\n", 2794 | " 'Yerawada', 'Ready To Move', 'Built-up Area', 'Carpet Area',\n", 2795 | " 'Plot Area'],\n", 2796 | " dtype='object', length=104)" 2797 | ] 2798 | }, 2799 | "execution_count": 297, 2800 | "metadata": {}, 2801 | "output_type": "execute_result" 2802 | } 2803 | ], 2804 | "source": [ 2805 | "X.columns" 2806 | ] 2807 | }, 2808 | { 2809 | "cell_type": "code", 2810 | "execution_count": 298, 2811 | "metadata": {}, 2812 | "outputs": [ 2813 | { 2814 | "data": { 2815 | "text/plain": [ 2816 | "9" 2817 | ] 2818 | }, 2819 | "execution_count": 298, 2820 | "metadata": {}, 2821 | "output_type": "execute_result" 2822 | } 2823 | ], 2824 | "source": [ 2825 | "# For finding the appropriate location\n", 2826 | "np.where(X.columns=='Balaji Nagar')[0][0]" 2827 | ] 2828 | }, 2829 | { 2830 | "cell_type": "code", 2831 | "execution_count": 299, 2832 | "metadata": {}, 2833 | "outputs": [ 2834 | { 2835 | "data": { 2836 | "text/plain": [ 2837 | "101" 2838 | ] 2839 | }, 2840 | "execution_count": 299, 2841 | "metadata": {}, 2842 | "output_type": "execute_result" 2843 | } 2844 | ], 2845 | "source": [ 2846 | "# For finding the appropriate area_type\n", 2847 | "np.where(X.columns=='Built-up Area')[0][0]" 2848 | ] 2849 | }, 2850 | { 2851 | "cell_type": "code", 2852 | "execution_count": 300, 2853 | "metadata": {}, 2854 | "outputs": [ 2855 | { 2856 | "data": { 2857 | "text/plain": [ 2858 | "100" 2859 | ] 2860 | }, 2861 | "execution_count": 300, 2862 | "metadata": {}, 2863 | "output_type": "execute_result" 2864 | } 2865 | ], 2866 | "source": [ 2867 | "# For finding the appropriate availability\n", 2868 | "np.where(X.columns=='Ready To Move')[0][0]" 2869 | ] 2870 | }, 2871 | { 2872 | "cell_type": "code", 2873 | "execution_count": 301, 2874 | "metadata": {}, 2875 | "outputs": [], 2876 | "source": [ 2877 | "# Creating a fuction to predict values\n", 2878 | "def prediction(location, bhk, bath, balcony, sqft, area_type, availability):\n", 2879 | " \n", 2880 | " loc_index, area_index, avail_index = -1,-1,-1\n", 2881 | " \n", 2882 | " if location!='other':\n", 2883 | " loc_index = int(np.where(X.columns==location)[0][0])\n", 2884 | " \n", 2885 | " if area_type!='Super built-up Area':\n", 2886 | " area_index = np.where(X.columns==area_type)[0][0]\n", 2887 | " \n", 2888 | " if availability!='Not Ready': \n", 2889 | " avail_index = np.where(X.columns==availability)[0][0]\n", 2890 | " \n", 2891 | " x = np.zeros(len(X.columns))\n", 2892 | " x[0] = bath\n", 2893 | " x[1] = balcony\n", 2894 | " x[2] = bhk\n", 2895 | " x[3] = sqft\n", 2896 | " \n", 2897 | " if loc_index >= 0:\n", 2898 | " x[loc_index] = 1\n", 2899 | " if area_index >= 0:\n", 2900 | " x[area_index] = 1\n", 2901 | " if avail_index >= 0:\n", 2902 | " x[avail_index] = 1\n", 2903 | " \n", 2904 | " return model.predict([x])[0]" 2905 | ] 2906 | }, 2907 | { 2908 | "cell_type": "code", 2909 | "execution_count": 302, 2910 | "metadata": {}, 2911 | "outputs": [ 2912 | { 2913 | "data": { 2914 | "text/plain": [ 2915 | "52.17049124040433" 2916 | ] 2917 | }, 2918 | "execution_count": 302, 2919 | "metadata": {}, 2920 | "output_type": "execute_result" 2921 | } 2922 | ], 2923 | "source": [ 2924 | "# Prediction 1\n", 2925 | "# Input in the form : Location, BHK, Bath, Balcony, Sqft, area_type, availability.\n", 2926 | "prediction('Balaji Nagar', 2, 2, 2, 1000, 'Built-up Area', 'Ready To Move')" 2927 | ] 2928 | }, 2929 | { 2930 | "cell_type": "code", 2931 | "execution_count": 303, 2932 | "metadata": {}, 2933 | "outputs": [ 2934 | { 2935 | "data": { 2936 | "text/plain": [ 2937 | "52.09543340931981" 2938 | ] 2939 | }, 2940 | "execution_count": 303, 2941 | "metadata": {}, 2942 | "output_type": "execute_result" 2943 | } 2944 | ], 2945 | "source": [ 2946 | "# Prediction 2\n", 2947 | "# Input in the form : Location, BHK, Bath, Balcony, Sqft, area_type, availability.\n", 2948 | "prediction('Hadapsar', 2, 2, 2, 1000, 'Super built-up Area', 'Ready To Move')" 2949 | ] 2950 | }, 2951 | { 2952 | "cell_type": "code", 2953 | "execution_count": 304, 2954 | "metadata": {}, 2955 | "outputs": [ 2956 | { 2957 | "data": { 2958 | "text/plain": [ 2959 | "140.1821349541965" 2960 | ] 2961 | }, 2962 | "execution_count": 304, 2963 | "metadata": {}, 2964 | "output_type": "execute_result" 2965 | } 2966 | ], 2967 | "source": [ 2968 | "# Prediction 3\n", 2969 | "# Input in the form : Location, BHK, Bath, Balcony, Sqft, area_type, availability.\n", 2970 | "prediction('Camp', 2, 3, 2, 2000, 'Plot Area', 'Not Ready')" 2971 | ] 2972 | }, 2973 | { 2974 | "cell_type": "code", 2975 | "execution_count": 305, 2976 | "metadata": {}, 2977 | "outputs": [ 2978 | { 2979 | "data": { 2980 | "text/plain": [ 2981 | "140.2386444110721" 2982 | ] 2983 | }, 2984 | "execution_count": 305, 2985 | "metadata": {}, 2986 | "output_type": "execute_result" 2987 | } 2988 | ], 2989 | "source": [ 2990 | "# Prediction 4\n", 2991 | "# Input in the form : Location, BHK, Bath, Balcony, Sqft, area_type, availability.\n", 2992 | "prediction('Baner', 2, 3, 2, 2000, 'Plot Area', 'Not Ready')" 2993 | ] 2994 | } 2995 | ], 2996 | "metadata": { 2997 | "kernelspec": { 2998 | "display_name": "Python 3", 2999 | "language": "python", 3000 | "name": "python3" 3001 | }, 3002 | "language_info": { 3003 | "codemirror_mode": { 3004 | "name": "ipython", 3005 | "version": 3 3006 | }, 3007 | "file_extension": ".py", 3008 | "mimetype": "text/x-python", 3009 | "name": "python", 3010 | "nbconvert_exporter": "python", 3011 | "pygments_lexer": "ipython3", 3012 | "version": "3.7.4" 3013 | } 3014 | }, 3015 | "nbformat": 4, 3016 | "nbformat_minor": 2 3017 | } 3018 | --------------------------------------------------------------------------------