├── 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 | " area_type | \n",
44 | " availability | \n",
45 | " size | \n",
46 | " society | \n",
47 | " total_sqft | \n",
48 | " bath | \n",
49 | " balcony | \n",
50 | " price | \n",
51 | " site_location | \n",
52 | "
\n",
53 | " \n",
54 | " \n",
55 | " \n",
56 | " | 0 | \n",
57 | " Super built-up Area | \n",
58 | " 19-Dec | \n",
59 | " 2 BHK | \n",
60 | " Coomee | \n",
61 | " 1056 | \n",
62 | " 2.0 | \n",
63 | " 1.0 | \n",
64 | " 39.07 | \n",
65 | " Alandi Road | \n",
66 | "
\n",
67 | " \n",
68 | " | 1 | \n",
69 | " Plot Area | \n",
70 | " Ready To Move | \n",
71 | " 4 Bedroom | \n",
72 | " Theanmp | \n",
73 | " 2600 | \n",
74 | " 5.0 | \n",
75 | " 3.0 | \n",
76 | " 120.00 | \n",
77 | " Ambegaon Budruk | \n",
78 | "
\n",
79 | " \n",
80 | " | 2 | \n",
81 | " Built-up Area | \n",
82 | " Ready To Move | \n",
83 | " 3 BHK | \n",
84 | " NaN | \n",
85 | " 1440 | \n",
86 | " 2.0 | \n",
87 | " 3.0 | \n",
88 | " 62.00 | \n",
89 | " Anandnagar | \n",
90 | "
\n",
91 | " \n",
92 | " | 3 | \n",
93 | " Super built-up Area | \n",
94 | " Ready To Move | \n",
95 | " 3 BHK | \n",
96 | " Soiewre | \n",
97 | " 1521 | \n",
98 | " 3.0 | \n",
99 | " 1.0 | \n",
100 | " 95.00 | \n",
101 | " Aundh | \n",
102 | "
\n",
103 | " \n",
104 | " | 4 | \n",
105 | " Super built-up Area | \n",
106 | " Ready To Move | \n",
107 | " 2 BHK | \n",
108 | " NaN | \n",
109 | " 1200 | \n",
110 | " 2.0 | \n",
111 | " 1.0 | \n",
112 | " 51.00 | \n",
113 | " Aundh Road | \n",
114 | "
\n",
115 | " \n",
116 | "
\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 | " area_type | \n",
345 | " availability | \n",
346 | " size | \n",
347 | " total_sqft | \n",
348 | " bath | \n",
349 | " balcony | \n",
350 | " price | \n",
351 | " site_location | \n",
352 | "
\n",
353 | " \n",
354 | " \n",
355 | " \n",
356 | " | 0 | \n",
357 | " Super built-up Area | \n",
358 | " 19-Dec | \n",
359 | " 2 BHK | \n",
360 | " 1056 | \n",
361 | " 2.0 | \n",
362 | " 1.0 | \n",
363 | " 39.07 | \n",
364 | " Alandi Road | \n",
365 | "
\n",
366 | " \n",
367 | " | 1 | \n",
368 | " Plot Area | \n",
369 | " Ready To Move | \n",
370 | " 4 Bedroom | \n",
371 | " 2600 | \n",
372 | " 5.0 | \n",
373 | " 3.0 | \n",
374 | " 120.00 | \n",
375 | " Ambegaon Budruk | \n",
376 | "
\n",
377 | " \n",
378 | " | 2 | \n",
379 | " Built-up Area | \n",
380 | " Ready To Move | \n",
381 | " 3 BHK | \n",
382 | " 1440 | \n",
383 | " 2.0 | \n",
384 | " 3.0 | \n",
385 | " 62.00 | \n",
386 | " Anandnagar | \n",
387 | "
\n",
388 | " \n",
389 | " | 3 | \n",
390 | " Super built-up Area | \n",
391 | " Ready To Move | \n",
392 | " 3 BHK | \n",
393 | " 1521 | \n",
394 | " 3.0 | \n",
395 | " 1.0 | \n",
396 | " 95.00 | \n",
397 | " Aundh | \n",
398 | "
\n",
399 | " \n",
400 | " | 4 | \n",
401 | " Super built-up Area | \n",
402 | " Ready To Move | \n",
403 | " 2 BHK | \n",
404 | " 1200 | \n",
405 | " 2.0 | \n",
406 | " 1.0 | \n",
407 | " 51.00 | \n",
408 | " Aundh Road | \n",
409 | "
\n",
410 | " \n",
411 | "
\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 | " area_type | \n",
664 | " availability | \n",
665 | " total_sqft | \n",
666 | " bath | \n",
667 | " balcony | \n",
668 | " price | \n",
669 | " site_location | \n",
670 | " bhk | \n",
671 | "
\n",
672 | " \n",
673 | " \n",
674 | " \n",
675 | " | 30 | \n",
676 | " Super built-up Area | \n",
677 | " 19-Dec | \n",
678 | " 2100 - 2850 | \n",
679 | " 4.0 | \n",
680 | " 0.0 | \n",
681 | " 186.000 | \n",
682 | " Gultekdi | \n",
683 | " 4 | \n",
684 | "
\n",
685 | " \n",
686 | " | 56 | \n",
687 | " Built-up Area | \n",
688 | " 20-Feb | \n",
689 | " 3010 - 3410 | \n",
690 | " 2.0 | \n",
691 | " 2.0 | \n",
692 | " 192.000 | \n",
693 | " Model colony | \n",
694 | " 4 | \n",
695 | "
\n",
696 | " \n",
697 | " | 81 | \n",
698 | " Built-up Area | \n",
699 | " 18-Oct | \n",
700 | " 2957 - 3450 | \n",
701 | " 2.0 | \n",
702 | " 2.0 | \n",
703 | " 224.500 | \n",
704 | " Shukrawar Peth | \n",
705 | " 4 | \n",
706 | "
\n",
707 | " \n",
708 | " | 122 | \n",
709 | " Super built-up Area | \n",
710 | " 18-Mar | \n",
711 | " 3067 - 8156 | \n",
712 | " 4.0 | \n",
713 | " 0.0 | \n",
714 | " 477.000 | \n",
715 | " Ganeshkhind | \n",
716 | " 4 | \n",
717 | "
\n",
718 | " \n",
719 | " | 137 | \n",
720 | " Super built-up Area | \n",
721 | " 19-Mar | \n",
722 | " 1042 - 1105 | \n",
723 | " 2.0 | \n",
724 | " 0.0 | \n",
725 | " 54.005 | \n",
726 | " Khadaki | \n",
727 | " 2 | \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 | " | 12990 | \n",
742 | " Super built-up Area | \n",
743 | " 18-May | \n",
744 | " 1804 - 2273 | \n",
745 | " 3.0 | \n",
746 | " 0.0 | \n",
747 | " 122.000 | \n",
748 | " Gokhale Nagar | \n",
749 | " 3 | \n",
750 | "
\n",
751 | " \n",
752 | " | 13059 | \n",
753 | " Super built-up Area | \n",
754 | " Ready To Move | \n",
755 | " 1200 - 1470 | \n",
756 | " 2.0 | \n",
757 | " 0.0 | \n",
758 | " 72.760 | \n",
759 | " Anandnagar | \n",
760 | " 2 | \n",
761 | "
\n",
762 | " \n",
763 | " | 13240 | \n",
764 | " Super built-up Area | \n",
765 | " Ready To Move | \n",
766 | " 1020 - 1130 | \n",
767 | " 2.0 | \n",
768 | " 2.0 | \n",
769 | " 52.570 | \n",
770 | " Vadgaon Budruk | \n",
771 | " 1 | \n",
772 | "
\n",
773 | " \n",
774 | " | 13265 | \n",
775 | " Super built-up Area | \n",
776 | " 20-Sep | \n",
777 | " 1133 - 1384 | \n",
778 | " 2.0 | \n",
779 | " 0.0 | \n",
780 | " 59.135 | \n",
781 | " Dapodi | \n",
782 | " 2 | \n",
783 | "
\n",
784 | " \n",
785 | " | 13299 | \n",
786 | " Super built-up Area | \n",
787 | " 18-Dec | \n",
788 | " 2830 - 2882 | \n",
789 | " 5.0 | \n",
790 | " 0.0 | \n",
791 | " 154.500 | \n",
792 | " Laxmi Road | \n",
793 | " 4 | \n",
794 | "
\n",
795 | " \n",
796 | "
\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 | " area_type | \n",
886 | " availability | \n",
887 | " bath | \n",
888 | " balcony | \n",
889 | " price | \n",
890 | " site_location | \n",
891 | " bhk | \n",
892 | " new_total_sqft | \n",
893 | "
\n",
894 | " \n",
895 | " \n",
896 | " \n",
897 | " | 0 | \n",
898 | " Super built-up Area | \n",
899 | " 19-Dec | \n",
900 | " 2.0 | \n",
901 | " 1.0 | \n",
902 | " 39.07 | \n",
903 | " Alandi Road | \n",
904 | " 2 | \n",
905 | " 1056.0 | \n",
906 | "
\n",
907 | " \n",
908 | " | 1 | \n",
909 | " Plot Area | \n",
910 | " Ready To Move | \n",
911 | " 5.0 | \n",
912 | " 3.0 | \n",
913 | " 120.00 | \n",
914 | " Ambegaon Budruk | \n",
915 | " 4 | \n",
916 | " 2600.0 | \n",
917 | "
\n",
918 | " \n",
919 | " | 2 | \n",
920 | " Built-up Area | \n",
921 | " Ready To Move | \n",
922 | " 2.0 | \n",
923 | " 3.0 | \n",
924 | " 62.00 | \n",
925 | " Anandnagar | \n",
926 | " 3 | \n",
927 | " 1440.0 | \n",
928 | "
\n",
929 | " \n",
930 | " | 3 | \n",
931 | " Super built-up Area | \n",
932 | " Ready To Move | \n",
933 | " 3.0 | \n",
934 | " 1.0 | \n",
935 | " 95.00 | \n",
936 | " Aundh | \n",
937 | " 3 | \n",
938 | " 1521.0 | \n",
939 | "
\n",
940 | " \n",
941 | " | 4 | \n",
942 | " Super built-up Area | \n",
943 | " Ready To Move | \n",
944 | " 2.0 | \n",
945 | " 1.0 | \n",
946 | " 51.00 | \n",
947 | " Aundh Road | \n",
948 | " 2 | \n",
949 | " 1200.0 | \n",
950 | "
\n",
951 | " \n",
952 | "
\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 | " area_type | \n",
1077 | " availability | \n",
1078 | " bath | \n",
1079 | " balcony | \n",
1080 | " price | \n",
1081 | " site_location | \n",
1082 | " bhk | \n",
1083 | " new_total_sqft | \n",
1084 | " price_per_sqft | \n",
1085 | "
\n",
1086 | " \n",
1087 | " \n",
1088 | " \n",
1089 | " | 0 | \n",
1090 | " Super built-up Area | \n",
1091 | " 19-Dec | \n",
1092 | " 2.0 | \n",
1093 | " 1.0 | \n",
1094 | " 39.07 | \n",
1095 | " Alandi Road | \n",
1096 | " 2 | \n",
1097 | " 1056.0 | \n",
1098 | " 3699.810606 | \n",
1099 | "
\n",
1100 | " \n",
1101 | " | 1 | \n",
1102 | " Plot Area | \n",
1103 | " Ready To Move | \n",
1104 | " 5.0 | \n",
1105 | " 3.0 | \n",
1106 | " 120.00 | \n",
1107 | " Ambegaon Budruk | \n",
1108 | " 4 | \n",
1109 | " 2600.0 | \n",
1110 | " 4615.384615 | \n",
1111 | "
\n",
1112 | " \n",
1113 | " | 2 | \n",
1114 | " Built-up Area | \n",
1115 | " Ready To Move | \n",
1116 | " 2.0 | \n",
1117 | " 3.0 | \n",
1118 | " 62.00 | \n",
1119 | " Anandnagar | \n",
1120 | " 3 | \n",
1121 | " 1440.0 | \n",
1122 | " 4305.555556 | \n",
1123 | "
\n",
1124 | " \n",
1125 | " | 3 | \n",
1126 | " Super built-up Area | \n",
1127 | " Ready To Move | \n",
1128 | " 3.0 | \n",
1129 | " 1.0 | \n",
1130 | " 95.00 | \n",
1131 | " Aundh | \n",
1132 | " 3 | \n",
1133 | " 1521.0 | \n",
1134 | " 6245.890861 | \n",
1135 | "
\n",
1136 | " \n",
1137 | " | 4 | \n",
1138 | " Super built-up Area | \n",
1139 | " Ready To Move | \n",
1140 | " 2.0 | \n",
1141 | " 1.0 | \n",
1142 | " 51.00 | \n",
1143 | " Aundh Road | \n",
1144 | " 2 | \n",
1145 | " 1200.0 | \n",
1146 | " 4250.000000 | \n",
1147 | "
\n",
1148 | " \n",
1149 | "
\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 | " area_type | \n",
1289 | " availability | \n",
1290 | " bath | \n",
1291 | " balcony | \n",
1292 | " price | \n",
1293 | " site_location | \n",
1294 | " bhk | \n",
1295 | " new_total_sqft | \n",
1296 | " price_per_sqft | \n",
1297 | "
\n",
1298 | " \n",
1299 | " \n",
1300 | " \n",
1301 | " | 0 | \n",
1302 | " Super built-up Area | \n",
1303 | " 19-Dec | \n",
1304 | " 2.0 | \n",
1305 | " 1.0 | \n",
1306 | " 39.07 | \n",
1307 | " Alandi Road | \n",
1308 | " 2 | \n",
1309 | " 1056.0 | \n",
1310 | " 3699.810606 | \n",
1311 | "
\n",
1312 | " \n",
1313 | " | 1 | \n",
1314 | " Plot Area | \n",
1315 | " Ready To Move | \n",
1316 | " 5.0 | \n",
1317 | " 3.0 | \n",
1318 | " 120.00 | \n",
1319 | " Ambegaon Budruk | \n",
1320 | " 4 | \n",
1321 | " 2600.0 | \n",
1322 | " 4615.384615 | \n",
1323 | "
\n",
1324 | " \n",
1325 | " | 2 | \n",
1326 | " Built-up Area | \n",
1327 | " Ready To Move | \n",
1328 | " 2.0 | \n",
1329 | " 3.0 | \n",
1330 | " 62.00 | \n",
1331 | " Anandnagar | \n",
1332 | " 3 | \n",
1333 | " 1440.0 | \n",
1334 | " 4305.555556 | \n",
1335 | "
\n",
1336 | " \n",
1337 | " | 3 | \n",
1338 | " Super built-up Area | \n",
1339 | " Ready To Move | \n",
1340 | " 3.0 | \n",
1341 | " 1.0 | \n",
1342 | " 95.00 | \n",
1343 | " Aundh | \n",
1344 | " 3 | \n",
1345 | " 1521.0 | \n",
1346 | " 6245.890861 | \n",
1347 | "
\n",
1348 | " \n",
1349 | " | 4 | \n",
1350 | " Super built-up Area | \n",
1351 | " Ready To Move | \n",
1352 | " 2.0 | \n",
1353 | " 1.0 | \n",
1354 | " 51.00 | \n",
1355 | " Aundh Road | \n",
1356 | " 2 | \n",
1357 | " 1200.0 | \n",
1358 | " 4250.000000 | \n",
1359 | "
\n",
1360 | " \n",
1361 | "
\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 | " area_type | \n",
1501 | " availability | \n",
1502 | " bath | \n",
1503 | " balcony | \n",
1504 | " price | \n",
1505 | " site_location | \n",
1506 | " bhk | \n",
1507 | " new_total_sqft | \n",
1508 | " price_per_sqft | \n",
1509 | "
\n",
1510 | " \n",
1511 | " \n",
1512 | " \n",
1513 | " | 0 | \n",
1514 | " Super built-up Area | \n",
1515 | " Not Ready | \n",
1516 | " 2.0 | \n",
1517 | " 1.0 | \n",
1518 | " 39.07 | \n",
1519 | " Alandi Road | \n",
1520 | " 2 | \n",
1521 | " 1056.0 | \n",
1522 | " 3699.810606 | \n",
1523 | "
\n",
1524 | " \n",
1525 | " | 1 | \n",
1526 | " Plot Area | \n",
1527 | " Ready To Move | \n",
1528 | " 5.0 | \n",
1529 | " 3.0 | \n",
1530 | " 120.00 | \n",
1531 | " Ambegaon Budruk | \n",
1532 | " 4 | \n",
1533 | " 2600.0 | \n",
1534 | " 4615.384615 | \n",
1535 | "
\n",
1536 | " \n",
1537 | " | 2 | \n",
1538 | " Built-up Area | \n",
1539 | " Ready To Move | \n",
1540 | " 2.0 | \n",
1541 | " 3.0 | \n",
1542 | " 62.00 | \n",
1543 | " Anandnagar | \n",
1544 | " 3 | \n",
1545 | " 1440.0 | \n",
1546 | " 4305.555556 | \n",
1547 | "
\n",
1548 | " \n",
1549 | " | 3 | \n",
1550 | " Super built-up Area | \n",
1551 | " Ready To Move | \n",
1552 | " 3.0 | \n",
1553 | " 1.0 | \n",
1554 | " 95.00 | \n",
1555 | " Aundh | \n",
1556 | " 3 | \n",
1557 | " 1521.0 | \n",
1558 | " 6245.890861 | \n",
1559 | "
\n",
1560 | " \n",
1561 | " | 4 | \n",
1562 | " Super built-up Area | \n",
1563 | " Ready To Move | \n",
1564 | " 2.0 | \n",
1565 | " 1.0 | \n",
1566 | " 51.00 | \n",
1567 | " Aundh Road | \n",
1568 | " 2 | \n",
1569 | " 1200.0 | \n",
1570 | " 4250.000000 | \n",
1571 | "
\n",
1572 | " \n",
1573 | "
\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 | " area_type | \n",
1925 | " availability | \n",
1926 | " bath | \n",
1927 | " balcony | \n",
1928 | " price | \n",
1929 | " site_location | \n",
1930 | " bhk | \n",
1931 | " new_total_sqft | \n",
1932 | " price_per_sqft | \n",
1933 | "
\n",
1934 | " \n",
1935 | " \n",
1936 | " \n",
1937 | " | 10923 | \n",
1938 | " Super built-up Area | \n",
1939 | " Not Ready | \n",
1940 | " 2.0 | \n",
1941 | " 1.0 | \n",
1942 | " 67.0 | \n",
1943 | " Yerawada | \n",
1944 | " 2 | \n",
1945 | " 1165.0 | \n",
1946 | " 5751.072961 | \n",
1947 | "
\n",
1948 | " \n",
1949 | " | 10928 | \n",
1950 | " Built-up Area | \n",
1951 | " Ready To Move | \n",
1952 | " 6.0 | \n",
1953 | " 2.0 | \n",
1954 | " 115.0 | \n",
1955 | " Yerawada | \n",
1956 | " 6 | \n",
1957 | " 3500.0 | \n",
1958 | " 3285.714286 | \n",
1959 | "
\n",
1960 | " \n",
1961 | " | 10931 | \n",
1962 | " Built-up Area | \n",
1963 | " Not Ready | \n",
1964 | " 2.0 | \n",
1965 | " 2.0 | \n",
1966 | " 353.0 | \n",
1967 | " Yerawada | \n",
1968 | " 5 | \n",
1969 | " 3210.0 | \n",
1970 | " 10996.884735 | \n",
1971 | "
\n",
1972 | " \n",
1973 | " | 10932 | \n",
1974 | " Super built-up Area | \n",
1975 | " Ready To Move | \n",
1976 | " 2.0 | \n",
1977 | " 2.0 | \n",
1978 | " 54.0 | \n",
1979 | " Yerawada | \n",
1980 | " 2 | \n",
1981 | " 1050.0 | \n",
1982 | " 5142.857143 | \n",
1983 | "
\n",
1984 | " \n",
1985 | " | 10936 | \n",
1986 | " Super built-up Area | \n",
1987 | " Not Ready | \n",
1988 | " 2.0 | \n",
1989 | " 1.0 | \n",
1990 | " 70.0 | \n",
1991 | " Yerawada | \n",
1992 | " 2 | \n",
1993 | " 1132.0 | \n",
1994 | " 6183.745583 | \n",
1995 | "
\n",
1996 | " \n",
1997 | "
\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 | " area_type | \n",
2070 | " availability | \n",
2071 | " bath | \n",
2072 | " balcony | \n",
2073 | " price | \n",
2074 | " site_location | \n",
2075 | " bhk | \n",
2076 | " new_total_sqft | \n",
2077 | "
\n",
2078 | " \n",
2079 | " \n",
2080 | " \n",
2081 | " | 0 | \n",
2082 | " Super built-up Area | \n",
2083 | " Not Ready | \n",
2084 | " 2.0 | \n",
2085 | " 1.0 | \n",
2086 | " 39.07 | \n",
2087 | " Alandi Road | \n",
2088 | " 2 | \n",
2089 | " 1056.0 | \n",
2090 | "
\n",
2091 | " \n",
2092 | " | 1 | \n",
2093 | " Plot Area | \n",
2094 | " Ready To Move | \n",
2095 | " 4.0 | \n",
2096 | " 1.0 | \n",
2097 | " 245.00 | \n",
2098 | " Alandi Road | \n",
2099 | " 4 | \n",
2100 | " 2894.0 | \n",
2101 | "
\n",
2102 | " \n",
2103 | " | 2 | \n",
2104 | " Super built-up Area | \n",
2105 | " Ready To Move | \n",
2106 | " 2.0 | \n",
2107 | " 2.0 | \n",
2108 | " 50.00 | \n",
2109 | " Alandi Road | \n",
2110 | " 2 | \n",
2111 | " 1084.0 | \n",
2112 | "
\n",
2113 | " \n",
2114 | " | 3 | \n",
2115 | " Super built-up Area | \n",
2116 | " Ready To Move | \n",
2117 | " 2.0 | \n",
2118 | " 2.0 | \n",
2119 | " 80.00 | \n",
2120 | " Alandi Road | \n",
2121 | " 2 | \n",
2122 | " 1230.0 | \n",
2123 | "
\n",
2124 | " \n",
2125 | " | 4 | \n",
2126 | " Super built-up Area | \n",
2127 | " Ready To Move | \n",
2128 | " 3.0 | \n",
2129 | " 2.0 | \n",
2130 | " 130.00 | \n",
2131 | " Alandi Road | \n",
2132 | " 3 | \n",
2133 | " 1750.0 | \n",
2134 | "
\n",
2135 | " \n",
2136 | "
\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 | " bath | \n",
2226 | " balcony | \n",
2227 | " price | \n",
2228 | " bhk | \n",
2229 | " new_total_sqft | \n",
2230 | " Alandi Road | \n",
2231 | " Ambegaon Budruk | \n",
2232 | " Anandnagar | \n",
2233 | " Aundh | \n",
2234 | " Aundh Road | \n",
2235 | " ... | \n",
2236 | " Wadgaon Sheri | \n",
2237 | " Wagholi | \n",
2238 | " Wakadewadi | \n",
2239 | " Wanowrie | \n",
2240 | " Warje | \n",
2241 | " Yerawada | \n",
2242 | " Ready To Move | \n",
2243 | " Built-up Area | \n",
2244 | " Carpet Area | \n",
2245 | " Plot Area | \n",
2246 | "
\n",
2247 | " \n",
2248 | " \n",
2249 | " \n",
2250 | " | 0 | \n",
2251 | " 2.0 | \n",
2252 | " 1.0 | \n",
2253 | " 39.07 | \n",
2254 | " 2 | \n",
2255 | " 1056.0 | \n",
2256 | " 1 | \n",
2257 | " 0 | \n",
2258 | " 0 | \n",
2259 | " 0 | \n",
2260 | " 0 | \n",
2261 | " ... | \n",
2262 | " 0 | \n",
2263 | " 0 | \n",
2264 | " 0 | \n",
2265 | " 0 | \n",
2266 | " 0 | \n",
2267 | " 0 | \n",
2268 | " 0 | \n",
2269 | " 0 | \n",
2270 | " 0 | \n",
2271 | " 0 | \n",
2272 | "
\n",
2273 | " \n",
2274 | " | 1 | \n",
2275 | " 4.0 | \n",
2276 | " 1.0 | \n",
2277 | " 245.00 | \n",
2278 | " 4 | \n",
2279 | " 2894.0 | \n",
2280 | " 1 | \n",
2281 | " 0 | \n",
2282 | " 0 | \n",
2283 | " 0 | \n",
2284 | " 0 | \n",
2285 | " ... | \n",
2286 | " 0 | \n",
2287 | " 0 | \n",
2288 | " 0 | \n",
2289 | " 0 | \n",
2290 | " 0 | \n",
2291 | " 0 | \n",
2292 | " 1 | \n",
2293 | " 0 | \n",
2294 | " 0 | \n",
2295 | " 1 | \n",
2296 | "
\n",
2297 | " \n",
2298 | " | 2 | \n",
2299 | " 2.0 | \n",
2300 | " 2.0 | \n",
2301 | " 50.00 | \n",
2302 | " 2 | \n",
2303 | " 1084.0 | \n",
2304 | " 1 | \n",
2305 | " 0 | \n",
2306 | " 0 | \n",
2307 | " 0 | \n",
2308 | " 0 | \n",
2309 | " ... | \n",
2310 | " 0 | \n",
2311 | " 0 | \n",
2312 | " 0 | \n",
2313 | " 0 | \n",
2314 | " 0 | \n",
2315 | " 0 | \n",
2316 | " 1 | \n",
2317 | " 0 | \n",
2318 | " 0 | \n",
2319 | " 0 | \n",
2320 | "
\n",
2321 | " \n",
2322 | " | 3 | \n",
2323 | " 2.0 | \n",
2324 | " 2.0 | \n",
2325 | " 80.00 | \n",
2326 | " 2 | \n",
2327 | " 1230.0 | \n",
2328 | " 1 | \n",
2329 | " 0 | \n",
2330 | " 0 | \n",
2331 | " 0 | \n",
2332 | " 0 | \n",
2333 | " ... | \n",
2334 | " 0 | \n",
2335 | " 0 | \n",
2336 | " 0 | \n",
2337 | " 0 | \n",
2338 | " 0 | \n",
2339 | " 0 | \n",
2340 | " 1 | \n",
2341 | " 0 | \n",
2342 | " 0 | \n",
2343 | " 0 | \n",
2344 | "
\n",
2345 | " \n",
2346 | " | 4 | \n",
2347 | " 3.0 | \n",
2348 | " 2.0 | \n",
2349 | " 130.00 | \n",
2350 | " 3 | \n",
2351 | " 1750.0 | \n",
2352 | " 1 | \n",
2353 | " 0 | \n",
2354 | " 0 | \n",
2355 | " 0 | \n",
2356 | " 0 | \n",
2357 | " ... | \n",
2358 | " 0 | \n",
2359 | " 0 | \n",
2360 | " 0 | \n",
2361 | " 0 | \n",
2362 | " 0 | \n",
2363 | " 0 | \n",
2364 | " 1 | \n",
2365 | " 0 | \n",
2366 | " 0 | \n",
2367 | " 0 | \n",
2368 | "
\n",
2369 | " \n",
2370 | " | 5 | \n",
2371 | " 2.0 | \n",
2372 | " 1.0 | \n",
2373 | " 41.00 | \n",
2374 | " 2 | \n",
2375 | " 995.0 | \n",
2376 | " 1 | \n",
2377 | " 0 | \n",
2378 | " 0 | \n",
2379 | " 0 | \n",
2380 | " 0 | \n",
2381 | " ... | \n",
2382 | " 0 | \n",
2383 | " 0 | \n",
2384 | " 0 | \n",
2385 | " 0 | \n",
2386 | " 0 | \n",
2387 | " 0 | \n",
2388 | " 1 | \n",
2389 | " 1 | \n",
2390 | " 0 | \n",
2391 | " 0 | \n",
2392 | "
\n",
2393 | " \n",
2394 | " | 8 | \n",
2395 | " 2.0 | \n",
2396 | " 1.0 | \n",
2397 | " 95.00 | \n",
2398 | " 2 | \n",
2399 | " 1360.0 | \n",
2400 | " 1 | \n",
2401 | " 0 | \n",
2402 | " 0 | \n",
2403 | " 0 | \n",
2404 | " 0 | \n",
2405 | " ... | \n",
2406 | " 0 | \n",
2407 | " 0 | \n",
2408 | " 0 | \n",
2409 | " 0 | \n",
2410 | " 0 | \n",
2411 | " 0 | \n",
2412 | " 1 | \n",
2413 | " 0 | \n",
2414 | " 0 | \n",
2415 | " 0 | \n",
2416 | "
\n",
2417 | " \n",
2418 | " | 9 | \n",
2419 | " 2.0 | \n",
2420 | " 2.0 | \n",
2421 | " 50.00 | \n",
2422 | " 2 | \n",
2423 | " 1040.0 | \n",
2424 | " 1 | \n",
2425 | " 0 | \n",
2426 | " 0 | \n",
2427 | " 0 | \n",
2428 | " 0 | \n",
2429 | " ... | \n",
2430 | " 0 | \n",
2431 | " 0 | \n",
2432 | " 0 | \n",
2433 | " 0 | \n",
2434 | " 0 | \n",
2435 | " 0 | \n",
2436 | " 1 | \n",
2437 | " 1 | \n",
2438 | " 0 | \n",
2439 | " 0 | \n",
2440 | "
\n",
2441 | " \n",
2442 | " | 10 | \n",
2443 | " 3.0 | \n",
2444 | " 2.0 | \n",
2445 | " 86.06 | \n",
2446 | " 3 | \n",
2447 | " 1655.0 | \n",
2448 | " 1 | \n",
2449 | " 0 | \n",
2450 | " 0 | \n",
2451 | " 0 | \n",
2452 | " 0 | \n",
2453 | " ... | \n",
2454 | " 0 | \n",
2455 | " 0 | \n",
2456 | " 0 | \n",
2457 | " 0 | \n",
2458 | " 0 | \n",
2459 | " 0 | \n",
2460 | " 1 | \n",
2461 | " 0 | \n",
2462 | " 0 | \n",
2463 | " 0 | \n",
2464 | "
\n",
2465 | " \n",
2466 | " | 12 | \n",
2467 | " 5.0 | \n",
2468 | " 3.0 | \n",
2469 | " 198.00 | \n",
2470 | " 4 | \n",
2471 | " 2790.0 | \n",
2472 | " 1 | \n",
2473 | " 0 | \n",
2474 | " 0 | \n",
2475 | " 0 | \n",
2476 | " 0 | \n",
2477 | " ... | \n",
2478 | " 0 | \n",
2479 | " 0 | \n",
2480 | " 0 | \n",
2481 | " 0 | \n",
2482 | " 0 | \n",
2483 | " 0 | \n",
2484 | " 0 | \n",
2485 | " 0 | \n",
2486 | " 0 | \n",
2487 | " 0 | \n",
2488 | "
\n",
2489 | " \n",
2490 | "
\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 | " model | \n",
2629 | " best_parameters | \n",
2630 | " accuracy | \n",
2631 | "
\n",
2632 | " \n",
2633 | " \n",
2634 | " \n",
2635 | " | 0 | \n",
2636 | " linear_regression | \n",
2637 | " {'normalize': True} | \n",
2638 | " 0.835475 | \n",
2639 | "
\n",
2640 | " \n",
2641 | " | 1 | \n",
2642 | " lasso | \n",
2643 | " {'alpha': 2, 'selection': 'random'} | \n",
2644 | " 0.829241 | \n",
2645 | "
\n",
2646 | " \n",
2647 | " | 2 | \n",
2648 | " decision_tree | \n",
2649 | " {'criterion': 'mse', 'splitter': 'best'} | \n",
2650 | " 0.781004 | \n",
2651 | "
\n",
2652 | " \n",
2653 | "
\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 |
--------------------------------------------------------------------------------