├── Week 1 Dataset.xlsx ├── Week 1- Breast Cancer detection proejct.ipynb ├── Week 2- Breast Cancer detection using Machine Learning.ipynb ├── Week 3 Breast Cancer Detection .ipynb ├── Week 4-Breast Cancer detection.ipynb └── cancer dataset.csv /Week 1 Dataset.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimlcommunity/Breast-Cancer-Detection-using-Machine-Learning/ba38d2b8fa694a285a12e0934f5ed3028a03d937/Week 1 Dataset.xlsx -------------------------------------------------------------------------------- /Week 1- Breast Cancer detection proejct.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Week 1- Getting the basics right" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Welcome to this guided project. This is a part of AIML Community's Data Science for social good initiative wherein we are trying to make an impact using Data Science. Our first project is Breast Cancer prediction using Machine Learning. \n", 15 | "\n", 16 | "This notebook consists of material for week 1\n", 17 | "\n", 18 | "This week, we are going to familiarize ourselves with the basics we will need in the project. This is a jupyter notebook, coding in Python is preferred on a Jupyter notebook but you can use pycharm as well. \n", 19 | "\n", 20 | "#### What will you learn after completing week 1?\n", 21 | "1. A basic introduction to major Python libraries\n", 22 | "2. Learn basic commands associated with those libraries\n", 23 | "3. Run some code using a simple dataset before we move to a larger dataset for our project\n", 24 | "\n", 25 | "#### How to use this notebook?\n", 26 | "This notebook consists of both the text and the codes. We will be having questions in between which will require coding from you. The dataset for week 1 will be attached in the same folder by the name \"week 1 dataset\". Please download it. \n", 27 | "You can make a separate python notebook on Google Colab/Pycharm/Jupyter and send us or upload on github and send us the link. This is as a part of your evaluation which will be used to provide you the certificate. " 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "## Learning the basic libraries of Python " 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "### 1. Numpy" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "We will not be using Numpy much in our Breast Cancer detection project but it is an important library. Pandas is made on Numpy and Pandas is a very essentail library for using, manipulating and analyzing data. \n", 49 | "\n", 50 | "NumPy is the fundamental package for scientific computing with Python. It contains among other things:\n", 51 | "\n", 52 | "1. a powerful N-dimensional array object\n", 53 | "\n", 54 | "2. sophisticated (broadcasting) functions\n", 55 | "\n", 56 | "3. tools for integrating C/C++ and Fortran code\n", 57 | "\n", 58 | "4. useful linear algebra, Fourier transform, and random number capabilities\n", 59 | "\n", 60 | "Besides its obvious scientific uses, NumPy can also be used as an efficient multi-dimensional container of generic data. Arbitrary data-types can be defined. This allows NumPy to seamlessly and speedily integrate with a wide variety of databases." 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "#### What is an array?\n", 68 | "\n", 69 | "Array data structure, or simply an array, is a data structure consisting of a collection of elements (values or variables), each identified by at least one array index or key.\n", 70 | "\n", 71 | "There are two things in an array, the rows(which are horizontal lines) and columns (which are vertical lines). We write them in the form (rows x columns). So if we see (4,5), it means it has 4 rows and 5 columns. \n", 72 | "\n", 73 | "We all have read matrix on our schools and colleges. Matrix generally implies two dimensions, arrays are usually one dimensional unless specified otherwise. A matrix has the size m*n (2d). An array has the size m (1d), so it is a special case.\n", 74 | "\n", 75 | "NumPy helps us to perform linear algebra operation swiftly on our machines. We will now proceed and learn how to use Numpy. \n", 76 | "\n", 77 | "First we will import NumPy module in our notebook." 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": {}, 84 | "outputs": [], 85 | "source": [ 86 | "import numpy as np #the reason we import is as np is to save time from writing \"numpy\" everytime we use it" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": {}, 92 | "source": [ 93 | "We will first learn how to create an array. There are different methods for creating an array:" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": {}, 100 | "outputs": [ 101 | { 102 | "name": "stdout", 103 | "output_type": "stream", 104 | "text": [ 105 | "arr1:[[1. 2. 4.]\n", 106 | " [5. 8. 7.]]\n", 107 | "arr2:[1 3 2]\n", 108 | "arr3:[[0. 0. 0.]\n", 109 | " [0. 0. 0.]]\n", 110 | "arr4:[ 0 2 4 6 8 10 12 14 16 18]\n", 111 | "arr5[ 0. 0.52631579 1.05263158 1.57894737 2.10526316 2.63157895\n", 112 | " 3.15789474 3.68421053 4.21052632 4.73684211 5.26315789 5.78947368\n", 113 | " 6.31578947 6.84210526 7.36842105 7.89473684 8.42105263 8.94736842\n", 114 | " 9.47368421 10. ]\n", 115 | "arr6:[[ 0 1 2 3 4]\n", 116 | " [ 5 6 7 8 9]\n", 117 | " [10 11 12 13 14]]\n" 118 | ] 119 | } 120 | ], 121 | "source": [ 122 | "# Creating array from list \n", 123 | "arr1 = np.array([[1, 2, 4], [5, 8, 7]], dtype = 'float') \n", 124 | "print(\"arr1:{}\".format(arr1)) \n", 125 | " \n", 126 | "# Creating array from tuple \n", 127 | "arr2 = np.array((1 , 3, 2)) \n", 128 | "print(\"arr2:{}\".format(arr2))\n", 129 | " \n", 130 | "# Creating a 2X3 array with all zeros \n", 131 | "arr3 = np.zeros((2, 3)) \n", 132 | "print (\"arr3:{}\".format(arr3)) \n", 133 | " \n", 134 | "\n", 135 | "# Create a sequence of integers from 0 to 20 with steps of 2 \n", 136 | "arr4 = np.arange(0, 20, 2) \n", 137 | "print (\"arr4:{}\".format(arr4)) \n", 138 | " \n", 139 | "# Create a sequence of 20 values in range 0 to 10 \n", 140 | "arr5 = np.linspace(0, 10, 20) \n", 141 | "print (\"arr5{}\".format(arr5)) \n", 142 | "\n", 143 | "#making an array of consecutive natural numbers\n", 144 | "arr6 = np.arange(15).reshape(3, 5)\n", 145 | "print(\"arr6:{}\".format(arr6))" 146 | ] 147 | }, 148 | { 149 | "cell_type": "markdown", 150 | "metadata": {}, 151 | "source": [ 152 | "### Q1. Create an array having consecutive natural numbers of size 6x3 and print it. " 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": {}, 158 | "source": [ 159 | "Since our project will not be using much numpy, we will not read about it further. You can read about more features in Numpy by visiting at: https://numpy.org/devdocs/user/quickstart.html" 160 | ] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "metadata": {}, 165 | "source": [ 166 | "## 2. Pandas " 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "Pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python. Additionally, it has the broader goal of becoming the most powerful and flexible open source data analysis / manipulation tool available in any language. It is already well on its way toward this goal.\n", 174 | "\n", 175 | "Pandas is well suited for many different kinds of data:\n", 176 | "\n", 177 | "1. Tabular data with heterogeneously-typed columns, as in an SQL table or Excel spreadsheet\n", 178 | "\n", 179 | "2. Ordered and unordered (not necessarily fixed-frequency) time series data.\n", 180 | "\n", 181 | "3. Arbitrary matrix data (homogeneously typed or heterogeneous) with row and column labels\n", 182 | "\n", 183 | "4. Any other form of observational / statistical data sets. The data actually need not be labeled at all to be placed into a pandas data structure\n", 184 | "\n", 185 | "The two primary data structures of pandas, Series (1-dimensional) and DataFrame (2-dimensional), handle the vast majority of typical use cases in finance, statistics, social science, and many areas of engineering. Pandas is built on top of NumPy and is intended to integrate well within a scientific computing environment with many other 3rd party libraries." 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": {}, 191 | "source": [ 192 | "### Why use Pandas?\n", 193 | "#### These are some of the things that Pandas does well:\n", 194 | "\n", 195 | "1. Easy handling of missing data (represented as NaN) in floating point as well as non-floating point data\n", 196 | "\n", 197 | "2. Size mutability: columns can be inserted and deleted from DataFrame and higher dimensional objects\n", 198 | "\n", 199 | "3. Automatic and explicit data alignment: objects can be explicitly aligned to a set of labels, or the user can simply ignore the labels and let Series, DataFrame, etc. automatically align the data for you in computations\n", 200 | "\n", 201 | "4. Powerful, flexible group by functionality to perform split-apply-combine operations on data sets, for both aggregating and transforming data\n", 202 | "\n", 203 | "5. Make it easy to convert ragged, differently-indexed data in other Python and NumPy data structures into DataFrame objects\n", 204 | "\n", 205 | "6. Intelligent label-based slicing, fancy indexing, and subsetting of large data sets\n", 206 | "\n", 207 | "7. Intuitive merging and joining data sets\n", 208 | "\n", 209 | "8. Flexible reshaping and pivoting of data sets\n", 210 | "\n", 211 | "9. Hierarchical labeling of axes (possible to have multiple labels per tick)\n", 212 | "\n", 213 | "10. Robust IO tools for loading data from flat files (CSV and delimited), Excel files, databases, and saving / loading data from the ultrafast HDF5 format\n", 214 | "\n", 215 | "11. Time series-specific functionality: date range generation and frequency conversion, moving window statistics, date shifting and lagging." 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "#### We have attached a data set named \"Week 1 dataset\". Please download that dataset, go to that file in folder, shift+right click and you will find an option \"copy as path\", click on the that and you will get the source of that file in your system and now we will use that to open our file in this notebook. \n", 223 | "\n", 224 | "## Objective of our dataset:\n", 225 | "We are trying to find out the factors affecting number of siblings. " 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": {}, 231 | "source": [ 232 | "There are few formats in which dataset can be saved, the most famous ones are CSV (Comma separated values) and Excel file. \n", 233 | "We will create a DataFrame of our data. To open a csv file and excel file, use the codes given below:" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 40, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "import pandas as pd\n", 243 | "#df=pd.read_csv()\n", 244 | "#df=pd.read_excel()" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "Now, our file is in Excel format so we will use the second command:" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 41, 257 | "metadata": {}, 258 | "outputs": [ 259 | { 260 | "name": "stdout", 261 | "output_type": "stream", 262 | "text": [ 263 | " Name Income per month State Age Sex Number of siblings\n", 264 | "0 A 50 Tamil Nadu 23 M 0\n", 265 | "1 B 34 Karnataka 37 F 3\n", 266 | "2 C 54 Tamil Nadu 35 F 1\n", 267 | "3 D 24 Uttar Pradesh 26 F 4\n", 268 | "4 E 19 Bihar 59 M 5\n", 269 | "5 F 21 Bihar 48 M 6\n", 270 | "6 G 40 Delhi 30 F 2\n", 271 | "7 H 20 Uttar Pradesh 72 M 10\n", 272 | "8 I 30 Telangana 22 F 0\n", 273 | "9 J 18 Chattisgarh 42 M 7\n" 274 | ] 275 | } 276 | ], 277 | "source": [ 278 | "df=pd.read_excel(r\"C:\\Users\\srtpa\\Desktop\\Week 1 Dataset.xlsx\")\n", 279 | "print(df)" 280 | ] 281 | }, 282 | { 283 | "cell_type": "markdown", 284 | "metadata": {}, 285 | "source": [ 286 | "This is a small dataset that we had created to make it easier to understand the basics. This is demographic and geographical information of 10 individuals. " 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 42, 292 | "metadata": {}, 293 | "outputs": [ 294 | { 295 | "data": { 296 | "text/html": [ 297 | "
\n", 298 | "\n", 311 | "\n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \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 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | "
NameIncome per monthStateAgeSexNumber of siblings
0A50Tamil Nadu23M0
1B34Karnataka37F3
2C54Tamil Nadu35F1
3D24Uttar Pradesh26F4
4E19Bihar59M5
5F21Bihar48M6
6G40Delhi30F2
7H20Uttar Pradesh72M10
8I30Telangana22F0
9J18Chattisgarh42M7
\n", 416 | "
" 417 | ], 418 | "text/plain": [ 419 | " Name Income per month State Age Sex Number of siblings\n", 420 | "0 A 50 Tamil Nadu 23 M 0\n", 421 | "1 B 34 Karnataka 37 F 3\n", 422 | "2 C 54 Tamil Nadu 35 F 1\n", 423 | "3 D 24 Uttar Pradesh 26 F 4\n", 424 | "4 E 19 Bihar 59 M 5\n", 425 | "5 F 21 Bihar 48 M 6\n", 426 | "6 G 40 Delhi 30 F 2\n", 427 | "7 H 20 Uttar Pradesh 72 M 10\n", 428 | "8 I 30 Telangana 22 F 0\n", 429 | "9 J 18 Chattisgarh 42 M 7" 430 | ] 431 | }, 432 | "execution_count": 42, 433 | "metadata": {}, 434 | "output_type": "execute_result" 435 | } 436 | ], 437 | "source": [ 438 | "df #using this command prints out the DataFrame" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 43, 444 | "metadata": {}, 445 | "outputs": [ 446 | { 447 | "data": { 448 | "text/html": [ 449 | "
\n", 450 | "\n", 463 | "\n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | "
0123456789
NameABCDEFGHIJ
Income per month50345424192140203018
StateTamil NaduKarnatakaTamil NaduUttar PradeshBiharBiharDelhiUttar PradeshTelanganaChattisgarh
Age23373526594830722242
SexMFFFMMFMFM
Number of siblings03145621007
\n", 560 | "
" 561 | ], 562 | "text/plain": [ 563 | " 0 1 2 3 4 \\\n", 564 | "Name A B C D E \n", 565 | "Income per month 50 34 54 24 19 \n", 566 | "State Tamil Nadu Karnataka Tamil Nadu Uttar Pradesh Bihar \n", 567 | "Age 23 37 35 26 59 \n", 568 | "Sex M F F F M \n", 569 | "Number of siblings 0 3 1 4 5 \n", 570 | "\n", 571 | " 5 6 7 8 9 \n", 572 | "Name F G H I J \n", 573 | "Income per month 21 40 20 30 18 \n", 574 | "State Bihar Delhi Uttar Pradesh Telangana Chattisgarh \n", 575 | "Age 48 30 72 22 42 \n", 576 | "Sex M F M F M \n", 577 | "Number of siblings 6 2 10 0 7 " 578 | ] 579 | }, 580 | "execution_count": 43, 581 | "metadata": {}, 582 | "output_type": "execute_result" 583 | } 584 | ], 585 | "source": [ 586 | "#we can find a transpose the matrix using:\n", 587 | "df.T" 588 | ] 589 | }, 590 | { 591 | "cell_type": "markdown", 592 | "metadata": {}, 593 | "source": [ 594 | "Our dataset can be very big which we cannot print like this, so we need to print limited number of rows so that we can assess the dataset and the parameters it uses. if we have to print a few number of rows, we use:" 595 | ] 596 | }, 597 | { 598 | "cell_type": "code", 599 | "execution_count": 44, 600 | "metadata": {}, 601 | "outputs": [ 602 | { 603 | "data": { 604 | "text/html": [ 605 | "
\n", 606 | "\n", 619 | "\n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | "
NameIncome per monthStateAgeSexNumber of siblings
0A50Tamil Nadu23M0
1B34Karnataka37F3
2C54Tamil Nadu35F1
\n", 661 | "
" 662 | ], 663 | "text/plain": [ 664 | " Name Income per month State Age Sex Number of siblings\n", 665 | "0 A 50 Tamil Nadu 23 M 0\n", 666 | "1 B 34 Karnataka 37 F 3\n", 667 | "2 C 54 Tamil Nadu 35 F 1" 668 | ] 669 | }, 670 | "execution_count": 44, 671 | "metadata": {}, 672 | "output_type": "execute_result" 673 | } 674 | ], 675 | "source": [ 676 | "df.head(3) #from beginning" 677 | ] 678 | }, 679 | { 680 | "cell_type": "code", 681 | "execution_count": 45, 682 | "metadata": {}, 683 | "outputs": [ 684 | { 685 | "data": { 686 | "text/html": [ 687 | "
\n", 688 | "\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 | "
NameIncome per monthStateAgeSexNumber of siblings
8I30Telangana22F0
9J18Chattisgarh42M7
\n", 734 | "
" 735 | ], 736 | "text/plain": [ 737 | " Name Income per month State Age Sex Number of siblings\n", 738 | "8 I 30 Telangana 22 F 0\n", 739 | "9 J 18 Chattisgarh 42 M 7" 740 | ] 741 | }, 742 | "execution_count": 45, 743 | "metadata": {}, 744 | "output_type": "execute_result" 745 | } 746 | ], 747 | "source": [ 748 | "df.tail(2) #from the end" 749 | ] 750 | }, 751 | { 752 | "cell_type": "markdown", 753 | "metadata": {}, 754 | "source": [ 755 | "If we have to get an overview of the data, we use:" 756 | ] 757 | }, 758 | { 759 | "cell_type": "code", 760 | "execution_count": 46, 761 | "metadata": {}, 762 | "outputs": [ 763 | { 764 | "name": "stdout", 765 | "output_type": "stream", 766 | "text": [ 767 | "\n", 768 | "RangeIndex: 10 entries, 0 to 9\n", 769 | "Data columns (total 6 columns):\n", 770 | "Name 10 non-null object\n", 771 | "Income per month 10 non-null int64\n", 772 | "State 10 non-null object\n", 773 | "Age 10 non-null int64\n", 774 | "Sex 10 non-null object\n", 775 | "Number of siblings 10 non-null int64\n", 776 | "dtypes: int64(3), object(3)\n", 777 | "memory usage: 608.0+ bytes\n" 778 | ] 779 | } 780 | ], 781 | "source": [ 782 | "df.info() " 783 | ] 784 | }, 785 | { 786 | "cell_type": "markdown", 787 | "metadata": {}, 788 | "source": [ 789 | "### Renaming columns:\n", 790 | "Many a times in dataset, we need to rename the column names for our convenience and that is where we will use the following command:\n" 791 | ] 792 | }, 793 | { 794 | "cell_type": "code", 795 | "execution_count": 47, 796 | "metadata": {}, 797 | "outputs": [ 798 | { 799 | "data": { 800 | "text/html": [ 801 | "
\n", 802 | "\n", 815 | "\n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \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 | "
NameIncome per monthState_nameAgeSexNumber of siblings
0A50Tamil Nadu23M0
1B34Karnataka37F3
2C54Tamil Nadu35F1
3D24Uttar Pradesh26F4
4E19Bihar59M5
5F21Bihar48M6
6G40Delhi30F2
7H20Uttar Pradesh72M10
8I30Telangana22F0
9J18Chattisgarh42M7
\n", 920 | "
" 921 | ], 922 | "text/plain": [ 923 | " Name Income per month State_name Age Sex Number of siblings\n", 924 | "0 A 50 Tamil Nadu 23 M 0\n", 925 | "1 B 34 Karnataka 37 F 3\n", 926 | "2 C 54 Tamil Nadu 35 F 1\n", 927 | "3 D 24 Uttar Pradesh 26 F 4\n", 928 | "4 E 19 Bihar 59 M 5\n", 929 | "5 F 21 Bihar 48 M 6\n", 930 | "6 G 40 Delhi 30 F 2\n", 931 | "7 H 20 Uttar Pradesh 72 M 10\n", 932 | "8 I 30 Telangana 22 F 0\n", 933 | "9 J 18 Chattisgarh 42 M 7" 934 | ] 935 | }, 936 | "execution_count": 47, 937 | "metadata": {}, 938 | "output_type": "execute_result" 939 | } 940 | ], 941 | "source": [ 942 | "df1=df.rename(columns={\"State\":\"State_name\"})\n", 943 | "df1" 944 | ] 945 | }, 946 | { 947 | "cell_type": "markdown", 948 | "metadata": {}, 949 | "source": [ 950 | "## Q2: Rename alll the coumns in the dataset as per your wish and save it in another dataframe and name it df2" 951 | ] 952 | }, 953 | { 954 | "cell_type": "markdown", 955 | "metadata": {}, 956 | "source": [ 957 | "Now, if we had to rename the coumns in our original dataframe, without making a new dataframe df1, we will use inplace=True" 958 | ] 959 | }, 960 | { 961 | "cell_type": "code", 962 | "execution_count": 48, 963 | "metadata": {}, 964 | "outputs": [ 965 | { 966 | "data": { 967 | "text/html": [ 968 | "
\n", 969 | "\n", 982 | "\n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \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 | "
NameIncome per monthState_nameAgeSexNumber of siblings
0A50Tamil Nadu23M0
1B34Karnataka37F3
2C54Tamil Nadu35F1
3D24Uttar Pradesh26F4
4E19Bihar59M5
5F21Bihar48M6
6G40Delhi30F2
7H20Uttar Pradesh72M10
8I30Telangana22F0
9J18Chattisgarh42M7
\n", 1087 | "
" 1088 | ], 1089 | "text/plain": [ 1090 | " Name Income per month State_name Age Sex Number of siblings\n", 1091 | "0 A 50 Tamil Nadu 23 M 0\n", 1092 | "1 B 34 Karnataka 37 F 3\n", 1093 | "2 C 54 Tamil Nadu 35 F 1\n", 1094 | "3 D 24 Uttar Pradesh 26 F 4\n", 1095 | "4 E 19 Bihar 59 M 5\n", 1096 | "5 F 21 Bihar 48 M 6\n", 1097 | "6 G 40 Delhi 30 F 2\n", 1098 | "7 H 20 Uttar Pradesh 72 M 10\n", 1099 | "8 I 30 Telangana 22 F 0\n", 1100 | "9 J 18 Chattisgarh 42 M 7" 1101 | ] 1102 | }, 1103 | "execution_count": 48, 1104 | "metadata": {}, 1105 | "output_type": "execute_result" 1106 | } 1107 | ], 1108 | "source": [ 1109 | "df.rename(columns={\"State\":\"State_name\"}, inplace=True)\n", 1110 | "df" 1111 | ] 1112 | }, 1113 | { 1114 | "cell_type": "markdown", 1115 | "metadata": {}, 1116 | "source": [ 1117 | "As you can see, our original dataframe has been changed. \n", 1118 | "\n", 1119 | "## Q3: After you have created df2, make the same changes in the original dataframe using the inplace. " 1120 | ] 1121 | }, 1122 | { 1123 | "cell_type": "markdown", 1124 | "metadata": {}, 1125 | "source": [ 1126 | "Now suppose we only want the columns information, State_name and age, then we will use the following command:" 1127 | ] 1128 | }, 1129 | { 1130 | "cell_type": "code", 1131 | "execution_count": 50, 1132 | "metadata": {}, 1133 | "outputs": [ 1134 | { 1135 | "data": { 1136 | "text/html": [ 1137 | "
\n", 1138 | "\n", 1151 | "\n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | "
NameState_nameAge
0ATamil Nadu23
1BKarnataka37
2CTamil Nadu35
3DUttar Pradesh26
4EBihar59
5FBihar48
6GDelhi30
7HUttar Pradesh72
8ITelangana22
9JChattisgarh42
\n", 1223 | "
" 1224 | ], 1225 | "text/plain": [ 1226 | " Name State_name Age\n", 1227 | "0 A Tamil Nadu 23\n", 1228 | "1 B Karnataka 37\n", 1229 | "2 C Tamil Nadu 35\n", 1230 | "3 D Uttar Pradesh 26\n", 1231 | "4 E Bihar 59\n", 1232 | "5 F Bihar 48\n", 1233 | "6 G Delhi 30\n", 1234 | "7 H Uttar Pradesh 72\n", 1235 | "8 I Telangana 22\n", 1236 | "9 J Chattisgarh 42" 1237 | ] 1238 | }, 1239 | "execution_count": 50, 1240 | "metadata": {}, 1241 | "output_type": "execute_result" 1242 | } 1243 | ], 1244 | "source": [ 1245 | "df[[\"Name\",\"State_name\",\"Age\"]]" 1246 | ] 1247 | }, 1248 | { 1249 | "cell_type": "markdown", 1250 | "metadata": {}, 1251 | "source": [ 1252 | "## Q4: Show only the columns information, sex and number of siblings. \n", 1253 | "\n", 1254 | "There is one more method which we can use to select rwos and columns, the iloc method. We mentioned the rwo and coumn numbers. Always remeber that counting of rows and coumns starts from 0 in Python. \n", 1255 | "\n", 1256 | "First we mention the number of rows then columns, in our case, we used 0:3, note that 3 is excluded, so if we had to use 0-3 rows, we will write 0:4 " 1257 | ] 1258 | }, 1259 | { 1260 | "cell_type": "code", 1261 | "execution_count": 60, 1262 | "metadata": {}, 1263 | "outputs": [ 1264 | { 1265 | "data": { 1266 | "text/html": [ 1267 | "
\n", 1268 | "\n", 1281 | "\n", 1282 | " \n", 1283 | " \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 | "
NameIncome per month
0A50
1B34
2C54
\n", 1307 | "
" 1308 | ], 1309 | "text/plain": [ 1310 | " Name Income per month\n", 1311 | "0 A 50\n", 1312 | "1 B 34\n", 1313 | "2 C 54" 1314 | ] 1315 | }, 1316 | "execution_count": 60, 1317 | "metadata": {}, 1318 | "output_type": "execute_result" 1319 | } 1320 | ], 1321 | "source": [ 1322 | "df.iloc[0:3,0:2]" 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "markdown", 1327 | "metadata": {}, 1328 | "source": [ 1329 | "## Q5: Use iloc method to print data from column 1 to 4 and rows 3 to 9" 1330 | ] 1331 | }, 1332 | { 1333 | "cell_type": "markdown", 1334 | "metadata": {}, 1335 | "source": [ 1336 | "This dataset is small and we can manually see if there are missing values or not, but in a large dataset, it will not be possible, so we will use the following command:" 1337 | ] 1338 | }, 1339 | { 1340 | "cell_type": "code", 1341 | "execution_count": 51, 1342 | "metadata": {}, 1343 | "outputs": [ 1344 | { 1345 | "data": { 1346 | "text/plain": [ 1347 | "Name 0\n", 1348 | "Income per month 0\n", 1349 | "State_name 0\n", 1350 | "Age 0\n", 1351 | "Sex 0\n", 1352 | "Number of siblings 0\n", 1353 | "dtype: int64" 1354 | ] 1355 | }, 1356 | "execution_count": 51, 1357 | "metadata": {}, 1358 | "output_type": "execute_result" 1359 | } 1360 | ], 1361 | "source": [ 1362 | "df.isna().sum()" 1363 | ] 1364 | }, 1365 | { 1366 | "cell_type": "markdown", 1367 | "metadata": {}, 1368 | "source": [ 1369 | "### Basic Statistics with Pandas" 1370 | ] 1371 | }, 1372 | { 1373 | "cell_type": "markdown", 1374 | "metadata": {}, 1375 | "source": [ 1376 | "When we look at a dataset, we need to know the information of the data in statistical terms. So we use describe function and info function: " 1377 | ] 1378 | }, 1379 | { 1380 | "cell_type": "code", 1381 | "execution_count": 52, 1382 | "metadata": {}, 1383 | "outputs": [ 1384 | { 1385 | "data": { 1386 | "text/html": [ 1387 | "
\n", 1388 | "\n", 1401 | "\n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | "
Income per monthAgeNumber of siblings
count10.0000010.00000010.000000
mean31.0000039.4000003.800000
std13.1824816.3040553.259175
min18.0000022.0000000.000000
25%20.2500027.0000001.250000
50%27.0000036.0000003.500000
75%38.5000046.5000005.750000
max54.0000072.00000010.000000
\n", 1461 | "
" 1462 | ], 1463 | "text/plain": [ 1464 | " Income per month Age Number of siblings\n", 1465 | "count 10.00000 10.000000 10.000000\n", 1466 | "mean 31.00000 39.400000 3.800000\n", 1467 | "std 13.18248 16.304055 3.259175\n", 1468 | "min 18.00000 22.000000 0.000000\n", 1469 | "25% 20.25000 27.000000 1.250000\n", 1470 | "50% 27.00000 36.000000 3.500000\n", 1471 | "75% 38.50000 46.500000 5.750000\n", 1472 | "max 54.00000 72.000000 10.000000" 1473 | ] 1474 | }, 1475 | "execution_count": 52, 1476 | "metadata": {}, 1477 | "output_type": "execute_result" 1478 | } 1479 | ], 1480 | "source": [ 1481 | "df.describe()" 1482 | ] 1483 | }, 1484 | { 1485 | "cell_type": "markdown", 1486 | "metadata": {}, 1487 | "source": [ 1488 | "This gives us the total count, mean, standard deviation, minimum and maximum values, interquartile values. This helps us to get more insights into data. If you are not familiar with these terms, I advise you to read more about them as machine learning makes use of statistics to a very great degree. \n", 1489 | "\n", 1490 | "Suppose we have to find how many males and females are there in our dataset, we will use the following command:" 1491 | ] 1492 | }, 1493 | { 1494 | "cell_type": "code", 1495 | "execution_count": 53, 1496 | "metadata": {}, 1497 | "outputs": [ 1498 | { 1499 | "data": { 1500 | "text/plain": [ 1501 | "F 5\n", 1502 | "M 5\n", 1503 | "Name: Sex, dtype: int64" 1504 | ] 1505 | }, 1506 | "execution_count": 53, 1507 | "metadata": {}, 1508 | "output_type": "execute_result" 1509 | } 1510 | ], 1511 | "source": [ 1512 | "df[\"Sex\"].value_counts()" 1513 | ] 1514 | }, 1515 | { 1516 | "cell_type": "markdown", 1517 | "metadata": {}, 1518 | "source": [ 1519 | "## Q6: Find the total value count of number of siblings in the given dataset" 1520 | ] 1521 | }, 1522 | { 1523 | "cell_type": "markdown", 1524 | "metadata": {}, 1525 | "source": [ 1526 | "# 3. Learning Seaborn" 1527 | ] 1528 | }, 1529 | { 1530 | "cell_type": "markdown", 1531 | "metadata": {}, 1532 | "source": [ 1533 | "Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics.\n", 1534 | "\n", 1535 | "Here is some of the functionality that seaborn offers:\n", 1536 | "\n", 1537 | "1. A dataset-oriented API for examining relationships between multiple variables\n", 1538 | "\n", 1539 | "2. Specialized support for using categorical variables to show observations or aggregate statistics\n", 1540 | "\n", 1541 | "3. Options for visualizing univariate or bivariate distributions and for comparing them between subsets of data\n", 1542 | "\n", 1543 | "4. Automatic estimation and plotting of linear regression models for different kinds dependent variables\n", 1544 | "\n", 1545 | "5. Convenient views onto the overall structure of complex datasets\n", 1546 | "\n", 1547 | "6. High-level abstractions for structuring multi-plot grids that let you easily build complex visualizations\n", 1548 | "\n", 1549 | "7. Concise control over matplotlib figure styling with several built-in themes\n", 1550 | "\n", 1551 | "8. Tools for choosing color palettes that faithfully reveal patterns in your data\n", 1552 | "\n", 1553 | "Seaborn aims to make visualization a central part of exploring and understanding data. Its dataset-oriented plotting functions operate on dataframes and arrays containing whole datasets and internally perform the necessary semantic mapping and statistical aggregation to produce informative plots." 1554 | ] 1555 | }, 1556 | { 1557 | "cell_type": "markdown", 1558 | "metadata": {}, 1559 | "source": [ 1560 | "Visualization is always a better method to get insights from the data we are using because we get a better picture. There are lot of visuzliation figures that we can create with its help but we will be focussing on paiplot and correlation matrix. You can read about rest of them at: https://seaborn.pydata.org/introduction.html" 1561 | ] 1562 | }, 1563 | { 1564 | "cell_type": "markdown", 1565 | "metadata": {}, 1566 | "source": [ 1567 | "The pairplot function creates a grid of Axes such that each variable in data will by shared in the y-axis across a single row and in the x-axis across a single column. It helps us to analyze trends in our data by pairing it with various independent variables centered around our dependent variable (which we will write in the hue section in our code). \n", 1568 | "\n", 1569 | "## Q7: What are dependent and independent varibles in our dataset? " 1570 | ] 1571 | }, 1572 | { 1573 | "cell_type": "code", 1574 | "execution_count": 56, 1575 | "metadata": {}, 1576 | "outputs": [ 1577 | { 1578 | "data": { 1579 | "text/plain": [ 1580 | "" 1581 | ] 1582 | }, 1583 | "execution_count": 56, 1584 | "metadata": {}, 1585 | "output_type": "execute_result" 1586 | }, 1587 | { 1588 | "data": { 1589 | "image/png": "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\n", 1590 | "text/plain": [ 1591 | "
" 1592 | ] 1593 | }, 1594 | "metadata": { 1595 | "needs_background": "light" 1596 | }, 1597 | "output_type": "display_data" 1598 | } 1599 | ], 1600 | "source": [ 1601 | "import seaborn as sns\n", 1602 | "sns.pairplot(df, hue=\"Number of siblings\")" 1603 | ] 1604 | }, 1605 | { 1606 | "cell_type": "markdown", 1607 | "metadata": {}, 1608 | "source": [ 1609 | "We can infer two things: \n", 1610 | "1. As income per month increases, the number of siblings decreases \n", 1611 | "2. People who are older have more silings than younger ones. " 1612 | ] 1613 | }, 1614 | { 1615 | "cell_type": "markdown", 1616 | "metadata": {}, 1617 | "source": [ 1618 | "### We will be getting similar insights in our week 2 module wherein we will analyze our breast cancer dataset. " 1619 | ] 1620 | }, 1621 | { 1622 | "cell_type": "markdown", 1623 | "metadata": {}, 1624 | "source": [ 1625 | "Now we will try to make a correlation matrix of our dataframe. It will give us a mathematical connotation about the correlation that variables have with each other. \n", 1626 | "\n", 1627 | "Objective of making a correlation matrix: \n", 1628 | "\n", 1629 | "1. To summarize a large amount of data where the goal is to see patterns. \n", 1630 | "2. To input into other analyses. For example, people commonly use correlation matrixes as inputs for exploratory factor analysis, confirmatory factor analysis, structural equation models, and linear regression when excluding missing values pairwise.\n", 1631 | "3. As a diagnostic when checking other analyses. " 1632 | ] 1633 | }, 1634 | { 1635 | "cell_type": "code", 1636 | "execution_count": 57, 1637 | "metadata": {}, 1638 | "outputs": [ 1639 | { 1640 | "data": { 1641 | "text/html": [ 1642 | "
\n", 1643 | "\n", 1656 | "\n", 1657 | " \n", 1658 | " \n", 1659 | " \n", 1660 | " \n", 1661 | " \n", 1662 | " \n", 1663 | " \n", 1664 | " \n", 1665 | " \n", 1666 | " \n", 1667 | " \n", 1668 | " \n", 1669 | " \n", 1670 | " \n", 1671 | " \n", 1672 | " \n", 1673 | " \n", 1674 | " \n", 1675 | " \n", 1676 | " \n", 1677 | " \n", 1678 | " \n", 1679 | " \n", 1680 | " \n", 1681 | " \n", 1682 | " \n", 1683 | " \n", 1684 | " \n", 1685 | "
Income per monthAgeNumber of siblings
Income per month1.000000-0.567917-0.773257
Age-0.5679171.0000000.855771
Number of siblings-0.7732570.8557711.000000
\n", 1686 | "
" 1687 | ], 1688 | "text/plain": [ 1689 | " Income per month Age Number of siblings\n", 1690 | "Income per month 1.000000 -0.567917 -0.773257\n", 1691 | "Age -0.567917 1.000000 0.855771\n", 1692 | "Number of siblings -0.773257 0.855771 1.000000" 1693 | ] 1694 | }, 1695 | "execution_count": 57, 1696 | "metadata": {}, 1697 | "output_type": "execute_result" 1698 | } 1699 | ], 1700 | "source": [ 1701 | "df.corr(method=\"pearson\")" 1702 | ] 1703 | }, 1704 | { 1705 | "cell_type": "markdown", 1706 | "metadata": {}, 1707 | "source": [ 1708 | "Whatever we had inferred from the visualiztion done above, we can see it in numbers in this correlation matrix. We can also make a heatmap and see this matrix in a visaulized form:" 1709 | ] 1710 | }, 1711 | { 1712 | "cell_type": "code", 1713 | "execution_count": 58, 1714 | "metadata": {}, 1715 | "outputs": [ 1716 | { 1717 | "data": { 1718 | "text/plain": [ 1719 | "" 1720 | ] 1721 | }, 1722 | "execution_count": 58, 1723 | "metadata": {}, 1724 | "output_type": "execute_result" 1725 | }, 1726 | { 1727 | "data": { 1728 | "image/png": "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\n", 1729 | "text/plain": [ 1730 | "
" 1731 | ] 1732 | }, 1733 | "metadata": { 1734 | "needs_background": "light" 1735 | }, 1736 | "output_type": "display_data" 1737 | } 1738 | ], 1739 | "source": [ 1740 | "sns.heatmap(df.corr(), annot=True,fmt=\"0.0%\")" 1741 | ] 1742 | }, 1743 | { 1744 | "cell_type": "markdown", 1745 | "metadata": {}, 1746 | "source": [ 1747 | "## Q8: Mention all your finding from the above given heatmap. " 1748 | ] 1749 | }, 1750 | { 1751 | "cell_type": "markdown", 1752 | "metadata": {}, 1753 | "source": [ 1754 | "That is all for week 1, see you next week! " 1755 | ] 1756 | } 1757 | ], 1758 | "metadata": { 1759 | "kernelspec": { 1760 | "display_name": "Python 3", 1761 | "language": "python", 1762 | "name": "python3" 1763 | }, 1764 | "language_info": { 1765 | "codemirror_mode": { 1766 | "name": "ipython", 1767 | "version": 3 1768 | }, 1769 | "file_extension": ".py", 1770 | "mimetype": "text/x-python", 1771 | "name": "python", 1772 | "nbconvert_exporter": "python", 1773 | "pygments_lexer": "ipython3", 1774 | "version": "3.7.4" 1775 | } 1776 | }, 1777 | "nbformat": 4, 1778 | "nbformat_minor": 2 1779 | } 1780 | -------------------------------------------------------------------------------- /Week 2- Breast Cancer detection using Machine Learning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Week 2: Breast Cancer detection using Machine Learning" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "In week 2, we will be implementing the tools we learnt in week 1 on the breast cancer data set. In the second half, we will also learn some of the basic commands from the library scikit learn. " 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "The Breast Cancer Dataset is available at: https://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+%28original%29" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "Those who are having trouble downloading the Dataset from the website, the data will be uploaded in the folder and you can directly download from there. In the following few code cells, I will write all the instructions step wise, your assignment for this week is to write codes for the steps simultaneously in your python file and take time to analyze. \n", 29 | "In future projects, you will have to think and come up with these steps alongwith writing the codes. " 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "#### Step 1: Open the file in your python notebook, print first 5 rows of the dataset and mention what are the dependent and independent variables in the Data.\n", 37 | "\n", 38 | "#### Step 2: Find the statistical parameters of the Data that you have\n", 39 | "\n", 40 | "#### Step 3: Find the shape of the Dataset in hand. \n", 41 | "\n", 42 | "#### Step 4: Find missing values from the Dataset\n", 43 | "\n", 44 | "#### Step 5: Find the value count of B(Benign) and M(Malignant) cancer cells in the column \"diagnosis\"" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": {}, 50 | "source": [ 51 | "Before proceeding to step 6, we will learn an important concept which is called label encoding. While navigating through the data, you would have seen that the classification has been done in form of words B and M for benign and malignant cancer cells. But we need this to be converted in number so that this parameter can also be used statistically. " 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": null, 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [ 60 | "from sklearn.preprocessing import LabelEncoder\n", 61 | "labelencoder_Y=LabelEncoder()\n", 62 | "df.iloc[:,1]=labelencoder_Y.fit_transform(df.iloc[:,1].values)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "In the above code, we have applied label encoding on all the rows and one column. This is the syntax, there is nothing much to understand here, so just write this code in your notebook and remeber that whenever you will be needing to convert textual feature in form of numbers, you will be needing this coding and this process is called label encoding. " 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": {}, 75 | "source": [ 76 | "#### Step 6: Creating a pairplot and mention the findings\n", 77 | "Before proceeding to creating a pairplot of all the columns, know that the number of columns in the dataset is huge and if we attempt to create a pairplot, either our hardware will not support it or it will crash if it supports. Even if our hardware is able to do so, the pairplot would be so large that it will be virtually impossible to make a sense of the data. Therefore, we will only create a pairplot of first 5 columns and write the findings. \n", 78 | "\n", 79 | "We can do better analysis with the help of correlation matrix. " 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "#### Step 7: Create a correlation matrix and mention strongly, weakly and negatively correlated quantities. " 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": {}, 92 | "source": [ 93 | "We tend to drop features having very strong correlation. Why? Think and try to write the answer. I will write this question's answer in week 3 module. " 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "#### (Optional) Step 8: Create a heatmap of the correlated features (helps in visualization) " 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "That is all for week 2! We will learn about various algorithms in week 3 and implement them. See you next week!" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "All the best!" 115 | ] 116 | } 117 | ], 118 | "metadata": { 119 | "kernelspec": { 120 | "display_name": "Python 3", 121 | "language": "python", 122 | "name": "python3" 123 | }, 124 | "language_info": { 125 | "codemirror_mode": { 126 | "name": "ipython", 127 | "version": 3 128 | }, 129 | "file_extension": ".py", 130 | "mimetype": "text/x-python", 131 | "name": "python", 132 | "nbconvert_exporter": "python", 133 | "pygments_lexer": "ipython3", 134 | "version": "3.7.4" 135 | } 136 | }, 137 | "nbformat": 4, 138 | "nbformat_minor": 2 139 | } 140 | -------------------------------------------------------------------------------- /Week 3 Breast Cancer Detection .ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "import seaborn as sns" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 3, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "df=pd.read_csv(r\"C:\\Users\\srtpa\\Downloads\\cancer dataset.csv\")" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 4, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "from sklearn.preprocessing import LabelEncoder\n", 31 | "labelencoder_Y=LabelEncoder()\n", 32 | "df.iloc[:,1]=labelencoder_Y.fit_transform(df.iloc[:,1].values)" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 5, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/html": [ 43 | "
\n", 44 | "\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 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | "
iddiagnosisradius_meantexture_meanperimeter_meanarea_meansmoothness_meancompactness_meanconcavity_meanconcave points_mean...radius_worsttexture_worstperimeter_worstarea_worstsmoothness_worstcompactness_worstconcavity_worstconcave points_worstsymmetry_worstfractal_dimension_worst
0842302117.9910.38122.801001.00.118400.277600.30010.14710...25.3817.33184.602019.00.16220.66560.71190.26540.46010.11890
1842517120.5717.77132.901326.00.084740.078640.08690.07017...24.9923.41158.801956.00.12380.18660.24160.18600.27500.08902
284300903119.6921.25130.001203.00.109600.159900.19740.12790...23.5725.53152.501709.00.14440.42450.45040.24300.36130.08758
384348301111.4220.3877.58386.10.142500.283900.24140.10520...14.9126.5098.87567.70.20980.86630.68690.25750.66380.17300
484358402120.2914.34135.101297.00.100300.132800.19800.10430...22.5416.67152.201575.00.13740.20500.40000.16250.23640.07678
\n", 207 | "

5 rows × 32 columns

\n", 208 | "
" 209 | ], 210 | "text/plain": [ 211 | " id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n", 212 | "0 842302 1 17.99 10.38 122.80 1001.0 \n", 213 | "1 842517 1 20.57 17.77 132.90 1326.0 \n", 214 | "2 84300903 1 19.69 21.25 130.00 1203.0 \n", 215 | "3 84348301 1 11.42 20.38 77.58 386.1 \n", 216 | "4 84358402 1 20.29 14.34 135.10 1297.0 \n", 217 | "\n", 218 | " smoothness_mean compactness_mean concavity_mean concave points_mean \\\n", 219 | "0 0.11840 0.27760 0.3001 0.14710 \n", 220 | "1 0.08474 0.07864 0.0869 0.07017 \n", 221 | "2 0.10960 0.15990 0.1974 0.12790 \n", 222 | "3 0.14250 0.28390 0.2414 0.10520 \n", 223 | "4 0.10030 0.13280 0.1980 0.10430 \n", 224 | "\n", 225 | " ... radius_worst texture_worst perimeter_worst area_worst \\\n", 226 | "0 ... 25.38 17.33 184.60 2019.0 \n", 227 | "1 ... 24.99 23.41 158.80 1956.0 \n", 228 | "2 ... 23.57 25.53 152.50 1709.0 \n", 229 | "3 ... 14.91 26.50 98.87 567.7 \n", 230 | "4 ... 22.54 16.67 152.20 1575.0 \n", 231 | "\n", 232 | " smoothness_worst compactness_worst concavity_worst concave points_worst \\\n", 233 | "0 0.1622 0.6656 0.7119 0.2654 \n", 234 | "1 0.1238 0.1866 0.2416 0.1860 \n", 235 | "2 0.1444 0.4245 0.4504 0.2430 \n", 236 | "3 0.2098 0.8663 0.6869 0.2575 \n", 237 | "4 0.1374 0.2050 0.4000 0.1625 \n", 238 | "\n", 239 | " symmetry_worst fractal_dimension_worst \n", 240 | "0 0.4601 0.11890 \n", 241 | "1 0.2750 0.08902 \n", 242 | "2 0.3613 0.08758 \n", 243 | "3 0.6638 0.17300 \n", 244 | "4 0.2364 0.07678 \n", 245 | "\n", 246 | "[5 rows x 32 columns]" 247 | ] 248 | }, 249 | "execution_count": 5, 250 | "metadata": {}, 251 | "output_type": "execute_result" 252 | } 253 | ], 254 | "source": [ 255 | "df.head()" 256 | ] 257 | }, 258 | { 259 | "cell_type": "markdown", 260 | "metadata": {}, 261 | "source": [ 262 | "We will now split the original data into dependent and indepndent dataset. " 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": 7, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "X=df.iloc[:,2:31].values #features that help us determine if patient has cancer or not\n", 272 | "Y=df.iloc[:,1].values #this is the dataset containing our target variable which indicates diagnosis" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": {}, 278 | "source": [ 279 | "The data we use is usually split into training data and test data. The training set contains a known output and the model learns on this data in order to be generalized to other data later on. We have the test dataset (or subset) in order to test our model’s prediction on this subset.\n", 280 | "\n", 281 | "From Sklearn, sub-library model_selection, we will import the train_test_split so we can split to training and test sets. The test_size inside the function indicates the percentage of the data that should be held over for testing. It’s usually around 80/20 or 70/30. The ratio is kept as such so that model does not overfit or underfit. \n", 282 | "Let us understand first what overfitting and underfitting means:" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "#### Overfitting\n", 290 | "Overfitting means that model we trained has trained “too well” and is now, well, fit too closely to the training dataset. This usually happens when the model is too complex i.e. too many features/variables compared to the number of observations. This model will be very accurate on the training data but will probably be very not accurate on untrained or new data. It is because this model is not generalized, meaning you can generalize the results and can’t make any inferences on other data, which is, ultimately, what you are trying to do. Basically, when this happens, the model learns or describes the “noise” in the training data instead of the actual relationships between variables in the data. This noise, obviously, isn’t part in of any new dataset, and cannot be applied to it.\n", 291 | "\n", 292 | "#### Underfitting\n", 293 | "In contrast to overfitting, when a model is underfitted, it means that the model does not fit the training data and therefore misses the trends in the data. It also means the model cannot be generalized to new data. This is usually the result of a very simple model which does not have enough predictors/independent variables. It could also happen when, for example, we fit a linear model ,like linear regression to data that is not linear. It almost goes without saying that this model will have poor predictive ability on training data and can’t be generalized to other data.\n" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "execution_count": 9, 299 | "metadata": {}, 300 | "outputs": [], 301 | "source": [ 302 | "from sklearn.model_selection import train_test_split\n", 303 | "X_train, X_test, Y_train, Y_test= train_test_split(X,Y, test_size=0.25, random_state=0)" 304 | ] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": {}, 309 | "source": [ 310 | "This is the code that you can use to test and split data using scikit learn" 311 | ] 312 | }, 313 | { 314 | "cell_type": "markdown", 315 | "metadata": {}, 316 | "source": [ 317 | "#### Q1: Now, there is a small homeowrk for statistics wherein you have to read about the parameteres, define them in brief and write about two main types of distributions: \n", 318 | "#### 1. Gaussian distribution \n", 319 | "#### 2. Binomial distribution \n", 320 | "#### Differentiate between both as well. " 321 | ] 322 | }, 323 | { 324 | "cell_type": "markdown", 325 | "metadata": {}, 326 | "source": [ 327 | "I had written about this on the group as well and shall write it once again that statistics is a very important element of machine learning. While we are working things on Python in this project, you should be working on things in statistics and trying to find statistical conclusions and means in the project. " 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "### Fit Transform" 335 | ] 336 | }, 337 | { 338 | "cell_type": "markdown", 339 | "metadata": {}, 340 | "source": [ 341 | "To center the data (make it have zero mean and unit standard error), you subtract the mean and then divide the result by the standard deviation.\n", 342 | "\n", 343 | "x′=(x−μ)/σ.\n", 344 | "\n", 345 | "You do that on the training set of data. But then you have to apply the same transformation to your testing set (e.g. in cross-validation), or to newly obtained examples before forecast. But you have to use the same two parameters μ and σ (values) that you used for centering the training set.\n", 346 | "\n", 347 | "Hence, every sklearn's transform's fit() just calculates the parameters (e.g. μ and σ in case of StandardScaler) and saves them as an internal objects state. Afterwards, you can call its transform() method to apply the transformation to a particular set of examples.\n", 348 | "\n", 349 | "fit_transform() joins these two steps and is used for the initial fitting of parameters on the training set x, but it also returns a transformed x′. Internally, it just calls first fit() and then transform() on the same data." 350 | ] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": 10, 355 | "metadata": {}, 356 | "outputs": [], 357 | "source": [ 358 | "from sklearn.preprocessing import StandardScaler\n", 359 | "sc=StandardScaler()\n", 360 | "X_train=sc.fit_transform(X_train)\n", 361 | "X_test=sc.fit_transform(X_test)" 362 | ] 363 | }, 364 | { 365 | "cell_type": "markdown", 366 | "metadata": {}, 367 | "source": [ 368 | "We have applied fit transform on our test and train data. Now it is time to read about various models that can be used to predict whether a cancer cell is beningn or malignant. " 369 | ] 370 | }, 371 | { 372 | "cell_type": "markdown", 373 | "metadata": {}, 374 | "source": [ 375 | "Model selection is an important part of solving a machine learning but not as important as data cleaning! Your model will always be as good as your data is so focus should always be on getting high quality data and cleaning it properly. \n", 376 | "\n", 377 | "There are a number of Machine Learning models avaialble which can be employed to read to meaningful conclusions and selecting the right model depends on a variety of factors such as:\n", 378 | "\n", 379 | "1. The accuracy of the model.\n", 380 | "2. The interpretability of the model.\n", 381 | "3. The complexity of the model.\n", 382 | "4. The scalability of the model.\n", 383 | "5. How long does it take to build, train, and test the model?\n", 384 | "6. How long does it take to make predictions using the model?\n", 385 | "7. Does the model meet the business goal?" 386 | ] 387 | }, 388 | { 389 | "cell_type": "markdown", 390 | "metadata": {}, 391 | "source": [ 392 | "In this project, we will be mainly focussing on three algorithms which can be used to model our dataset:\n", 393 | " 1. Logistics regression\n", 394 | " 2. Decision tree classifier \n", 395 | " 3. Random Forest classifier " 396 | ] 397 | }, 398 | { 399 | "cell_type": "markdown", 400 | "metadata": {}, 401 | "source": [ 402 | "### Q2: Selectively write 5 lines about each of the above three algorithms so that even a rather inexperienced person can understand it alongwith dealing all the technicalities. " 403 | ] 404 | }, 405 | { 406 | "cell_type": "markdown", 407 | "metadata": {}, 408 | "source": [ 409 | "This week's assignment is more theory oriented because communication skills are equally important in Data Science as is coding and Statistics (Mathematics). These questions will help you gain a command over explaining things. " 410 | ] 411 | }, 412 | { 413 | "cell_type": "markdown", 414 | "metadata": {}, 415 | "source": [ 416 | "That is all for week 3, we will apply these algorithms in the week 4 and calculate accuracy of the models and the final submission and evaluation will be done after that week. All the best!" 417 | ] 418 | } 419 | ], 420 | "metadata": { 421 | "kernelspec": { 422 | "display_name": "Python 3", 423 | "language": "python", 424 | "name": "python3" 425 | }, 426 | "language_info": { 427 | "codemirror_mode": { 428 | "name": "ipython", 429 | "version": 3 430 | }, 431 | "file_extension": ".py", 432 | "mimetype": "text/x-python", 433 | "name": "python", 434 | "nbconvert_exporter": "python", 435 | "pygments_lexer": "ipython3", 436 | "version": "3.7.4" 437 | } 438 | }, 439 | "nbformat": 4, 440 | "nbformat_minor": 2 441 | } 442 | -------------------------------------------------------------------------------- /Week 4-Breast Cancer detection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "I hope you have all finished week 3 assignements with zeal as it is important to know about algorithms before we actually start applying to our dataset. This is the final week of our assignment and after this, we shall be doing final evaluation of your submissions and then providing you respective certificates.\n", 8 | "\n", 9 | "We will start with applying the models, I will aplly logistic regression and explain things accordingly, your assignment for this week is to apply the rest two classifier models to the data. " 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np\n", 19 | "import pandas as pd\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "import seaborn as sns" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "df=pd.read_csv(r\"C:\\Users\\srtpa\\Downloads\\cancer dataset.csv\")" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 3, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "from sklearn.preprocessing import LabelEncoder\n", 40 | "labelencoder_Y=LabelEncoder()\n", 41 | "df.iloc[:,1]=labelencoder_Y.fit_transform(df.iloc[:,1].values)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 4, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "X=df.iloc[:,2:31].values \n", 51 | "Y=df.iloc[:,1].values " 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 5, 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [ 60 | "from sklearn.model_selection import train_test_split\n", 61 | "X_train, X_test, Y_train, Y_test= train_test_split(X,Y, test_size=0.25, random_state=0)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 6, 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": [ 70 | "from sklearn.preprocessing import StandardScaler\n", 71 | "sc=StandardScaler()\n", 72 | "X_train=sc.fit_transform(X_train)\n", 73 | "X_test=sc.fit_transform(X_test)" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | " We will start off by creating a function for applying logistic regression to our data. We will use the in-built modules present in the scikit learn library. " 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 15, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "def logreg (X_train, Y_train):\n", 90 | " from sklearn.linear_model import LogisticRegression\n", 91 | " log=LogisticRegression (random_state=0)\n", 92 | " log.fit(X_train, Y_train)\n", 93 | " print(\"Logistic Regression Training Accuracy:\", log.score(X_train, Y_train))\n", 94 | " return log" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": {}, 100 | "source": [ 101 | "You will be seeing random state in the code. What is random state used for?\n", 102 | "\n", 103 | "If there is no randomstate provided the system will use a randomstate that is generated internally. So, when you run the program multiple times you might see different train/test data points and the behavior will be unpredictable. In case, you have an issue with your model you will not be able to recreate it as you do not know the random number that was generated when you ran the program.\n", 104 | "\n", 105 | "### If these codes are a bit overwhelming at the moment, do not worry, you will be doing Decision Tree classifier and Random Forest classifier on your own. Then it will be clearer!" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 17, 111 | "metadata": {}, 112 | "outputs": [ 113 | { 114 | "name": "stdout", 115 | "output_type": "stream", 116 | "text": [ 117 | "Logistic Regression Training Accuracy: 0.9906103286384976\n" 118 | ] 119 | }, 120 | { 121 | "name": "stderr", 122 | "output_type": "stream", 123 | "text": [ 124 | "C:\\Users\\srtpa\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", 125 | " FutureWarning)\n" 126 | ] 127 | } 128 | ], 129 | "source": [ 130 | "logrex=logreg(X_train, Y_train)" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "The above given accuracy is when we apply the algorithm to the data which we have used for training, it is much obvious that it will be very close to 100% because we are training with that data. We will be finding out the accuracy of the testing data with the help of confusion matrix. " 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "metadata": {}, 143 | "source": [ 144 | "Now we will apply this algorithm to our testing data as we had earlier applied to the training set and create a confusion matrix. \n", 145 | "\n", 146 | "### Confusion Matrix \n", 147 | "\n", 148 | "A confusion matrix is a summary of prediction results on a classification problem. The number of correct and incorrect predictions are summarized with count values and broken down by each class. This is the key to the confusion matrix. The confusion matrix shows the ways in which your classification model is confused when it makes predictions. It gives us insight not only into the errors being made by a classifier but more importantly the types of errors that are being made.\n", 149 | "\n", 150 | "#### Definition of the Terms:\n", 151 | "\n", 152 | "Positive (P) : Observation is positive (for example: is an apple).\n", 153 | "Negative (N) : Observation is not positive (for example: is not an apple).\n", 154 | "True Positive (TP) : Observation is positive, and is predicted to be positive.\n", 155 | "False Negative (FN) : Observation is positive, but is predicted negative.\n", 156 | "True Negative (TN) : Observation is negative, and is predicted to be negative.\n", 157 | "False Positive (FP) : Observation is negative, but is predicted positive." 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "Rates that are often computed from a confusion matrix for a binary classifier:\n", 165 | "\n", 166 | "Accuracy: Overall, how often is the classifier correct?\n", 167 | "(TP+TN)/total\n", 168 | "\n", 169 | "Misclassification Rate: Overall, how often is it wrong?\n", 170 | "(FP+FN)/total" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 20, 176 | "metadata": {}, 177 | "outputs": [ 178 | { 179 | "name": "stdout", 180 | "output_type": "stream", 181 | "text": [ 182 | "[[86 4]\n", 183 | " [ 3 50]]\n" 184 | ] 185 | } 186 | ], 187 | "source": [ 188 | "from sklearn.metrics import confusion_matrix\n", 189 | "cm = confusion_matrix(Y_test, logrex.predict(X_test))\n", 190 | "print(cm)" 191 | ] 192 | }, 193 | { 194 | "cell_type": "markdown", 195 | "metadata": {}, 196 | "source": [ 197 | "In this model\n", 198 | "1. true positive=86\n", 199 | "2. True negative=50\n", 200 | "3. False positive=4\n", 201 | "4. False negative=3" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 21, 207 | "metadata": {}, 208 | "outputs": [ 209 | { 210 | "name": "stdout", 211 | "output_type": "stream", 212 | "text": [ 213 | "Testing accuracy of logistic regression model= 0.951048951048951\n" 214 | ] 215 | } 216 | ], 217 | "source": [ 218 | "TP=cm[0][0]\n", 219 | "TN=cm[1][1]\n", 220 | "FN=cm[1][0]\n", 221 | "FP=cm[0][1]\n", 222 | "print(\"Testing accuracy of logistic regression model=\", (TP+TN)/(TP+TN+FN+FP))" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": {}, 228 | "source": [ 229 | "In this way, I have applied the logistic regression model to our data. Now it is your turn to apply Decision tree classifier and Random forest classifier to this data and find out the accuracy of the model using confusion matrix as shown above and also comment on which model had higher accuracy and why. You can find the codes for applying these models online, please use them!\n", 230 | "With this, we come towards the end of the project and in week 5, we will be doing your final evaluation, taking feedbacks from you all and providing you certificates. \n", 231 | "All the best and hope we will do more projects in future! " 232 | ] 233 | } 234 | ], 235 | "metadata": { 236 | "kernelspec": { 237 | "display_name": "Python 3", 238 | "language": "python", 239 | "name": "python3" 240 | }, 241 | "language_info": { 242 | "codemirror_mode": { 243 | "name": "ipython", 244 | "version": 3 245 | }, 246 | "file_extension": ".py", 247 | "mimetype": "text/x-python", 248 | "name": "python", 249 | "nbconvert_exporter": "python", 250 | "pygments_lexer": "ipython3", 251 | "version": "3.7.4" 252 | } 253 | }, 254 | "nbformat": 4, 255 | "nbformat_minor": 2 256 | } 257 | --------------------------------------------------------------------------------