{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### In this demo and lab exercise we will look at scaling numerical data\n", "### The examples given below illustrate using a min-max scaler\n", "\n", "\n", "#### Let's beging with importing the data set\n", "#### Download this from webpage" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np \n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.preprocessing import MinMaxScaler\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#read in the data set\n", "#NB. you will need to edit this command to change it to the directory you are using\n", "data = pd.read_csv('/Users/brendan.tierney/Dropbox/4-Datasets/small_purchases.csv', )" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 10 entries, 0 to 9\n", "Data columns (total 4 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Country 10 non-null object \n", " 1 Age 9 non-null float64\n", " 2 Salary 9 non-null float64\n", " 3 Purchased 10 non-null object \n", "dtypes: float64(2), object(2)\n", "memory usage: 448.0+ bytes\n" ] } ], "source": [ "#Display basic information about the Pandas dataframe\n", "data.info()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10, 4)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#How many rows and columns does the dataframe have?\n", "data.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CountryAgeSalaryPurchased
0France44.027000.0No
1Spain27.048000.0Yes
2Germany30.054000.0No
3Spain38.061000.0No
4Germany40.0NaNYes
5France35.058000.0Yes
6SpainNaN52000.0No
7France48.079000.0Yes
8Germany50.083000.0No
9France37.067000.0Yes
\n", "
" ], "text/plain": [ " Country Age Salary Purchased\n", "0 France 44.0 27000.0 No\n", "1 Spain 27.0 48000.0 Yes\n", "2 Germany 30.0 54000.0 No\n", "3 Spain 38.0 61000.0 No\n", "4 Germany 40.0 NaN Yes\n", "5 France 35.0 58000.0 Yes\n", "6 Spain NaN 52000.0 No\n", "7 France 48.0 79000.0 Yes\n", "8 Germany 50.0 83000.0 No\n", "9 France 37.0 67000.0 Yes" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Display the first 10 rows\n", "#Question: How many rows does the dataframe contain\n", "#Question: Modify the code to display all the data\n", "\n", "data.head(10)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AgeSalary
count9.0000009.000000
mean38.77777858777.777778
std7.69379316820.952543
min27.00000027000.000000
25%35.00000052000.000000
50%38.00000058000.000000
75%44.00000067000.000000
max50.00000083000.000000
\n", "
" ], "text/plain": [ " Age Salary\n", "count 9.000000 9.000000\n", "mean 38.777778 58777.777778\n", "std 7.693793 16820.952543\n", "min 27.000000 27000.000000\n", "25% 35.000000 52000.000000\n", "50% 38.000000 58000.000000\n", "75% 44.000000 67000.000000\n", "max 50.000000 83000.000000" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Crate summary statisics about the data in the dataframe\n", "#This only provides summary statistics for Numerical data\n", "data.describe()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countmeanstdmin25%50%75%max
Age9.038.7777787.69379327.035.038.044.050.0
Salary9.058777.77777816820.95254327000.052000.058000.067000.083000.0
\n", "
" ], "text/plain": [ " count mean std min 25% 50% 75% \\\n", "Age 9.0 38.777778 7.693793 27.0 35.0 38.0 44.0 \n", "Salary 9.0 58777.777778 16820.952543 27000.0 52000.0 58000.0 67000.0 \n", "\n", " max \n", "Age 50.0 \n", "Salary 83000.0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#An alternative was of viewing the summary statistics\n", "data.describe().transpose()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CountryAgeSalaryPurchased
0France44.027000.0No
1Spain27.048000.0Yes
2Germany30.054000.0No
3Spain38.061000.0No
4Germany40.0NaNYes
5France35.058000.0Yes
6SpainNaN52000.0No
7France48.079000.0Yes
8Germany50.083000.0No
9France37.067000.0Yes
\n", "
" ], "text/plain": [ " Country Age Salary Purchased\n", "0 France 44.0 27000.0 No\n", "1 Spain 27.0 48000.0 Yes\n", "2 Germany 30.0 54000.0 No\n", "3 Spain 38.0 61000.0 No\n", "4 Germany 40.0 NaN Yes\n", "5 France 35.0 58000.0 Yes\n", "6 Spain NaN 52000.0 No\n", "7 France 48.0 79000.0 Yes\n", "8 Germany 50.0 83000.0 No\n", "9 France 37.0 67000.0 Yes" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Display the data from the dataframe\n", "#NB: notices we have some values to NO values -> See question later in the notebook\n", "data" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CountryAgeSalaryPurchased
0France0.7391300.000000No
1Spain0.0000000.375000Yes
2Germany0.1304350.482143No
3Spain0.4782610.607143No
4Germany0.565217NaNYes
5France0.3478260.553571Yes
6SpainNaN0.446429No
7France0.9130430.928571Yes
8Germany1.0000001.000000No
9France0.4347830.714286Yes
\n", "
" ], "text/plain": [ " Country Age Salary Purchased\n", "0 France 0.739130 0.000000 No\n", "1 Spain 0.000000 0.375000 Yes\n", "2 Germany 0.130435 0.482143 No\n", "3 Spain 0.478261 0.607143 No\n", "4 Germany 0.565217 NaN Yes\n", "5 France 0.347826 0.553571 Yes\n", "6 Spain NaN 0.446429 No\n", "7 France 0.913043 0.928571 Yes\n", "8 Germany 1.000000 1.000000 No\n", "9 France 0.434783 0.714286 Yes" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Setup the MinMaxScaler\n", "#This will only work on Numerical attributes/features\n", "scaler = MinMaxScaler()\n", "\n", "#Apply the scaler to the numerical data\n", "# and save the data back to the dataframe\n", "# overwriting the original values\n", "data[['Age', 'Salary']] = scaler.fit_transform(data[['Age', 'Salary']])\n", "\n", "#Display the dataframe\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Copy and modify the above code to repace the NaN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Modify the data set to replace the empty data (NaN) with an appropriate values\n", "#### Rerun the scaler with this updated/modified dataframe\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Another Example and Exercise - Complete all the steps\n", "\n", "#### Data set = Pima Indian diabetes dataset \n", "#### https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediageclass
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
\n", "
" ], "text/plain": [ " preg plas pres skin test mass pedi age class\n", "0 6 148 72 35 0 33.6 0.627 50 1\n", "1 1 85 66 29 0 26.6 0.351 31 0\n", "2 8 183 64 0 0 23.3 0.672 32 1\n", "3 1 89 66 23 94 28.1 0.167 21 0\n", "4 0 137 40 35 168 43.1 2.288 33 1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Import the data set\n", "\n", "import pandas as pd\n", "columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']\n", "data = pd.read_csv('/Users/brendan.tierney/Dropbox/4-Datasets/pima-indians-diabetes.csv', names=columns)\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediageclass
count768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000
mean3.845052120.89453169.10546920.53645879.79947931.9925780.47187633.2408850.348958
std3.36957831.97261819.35580715.952218115.2440027.8841600.33132911.7602320.476951
min0.0000000.0000000.0000000.0000000.0000000.0000000.07800021.0000000.000000
25%1.00000099.00000062.0000000.0000000.00000027.3000000.24375024.0000000.000000
50%3.000000117.00000072.00000023.00000030.50000032.0000000.37250029.0000000.000000
75%6.000000140.25000080.00000032.000000127.25000036.6000000.62625041.0000001.000000
max17.000000199.000000122.00000099.000000846.00000067.1000002.42000081.0000001.000000
\n", "
" ], "text/plain": [ " preg plas pres skin test mass \\\n", "count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 \n", "mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 \n", "std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 \n", "50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 \n", "75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 \n", "max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 \n", "\n", " pedi age class \n", "count 768.000000 768.000000 768.000000 \n", "mean 0.471876 33.240885 0.348958 \n", "std 0.331329 11.760232 0.476951 \n", "min 0.078000 21.000000 0.000000 \n", "25% 0.243750 24.000000 0.000000 \n", "50% 0.372500 29.000000 0.000000 \n", "75% 0.626250 41.000000 1.000000 \n", "max 2.420000 81.000000 1.000000 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Create the summary statistics\n", "data.describe()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countmeanstdmin25%50%75%max
preg768.03.8450523.3695780.0001.000003.00006.0000017.00
plas768.0120.89453131.9726180.00099.00000117.0000140.25000199.00
pres768.069.10546919.3558070.00062.0000072.000080.00000122.00
skin768.020.53645815.9522180.0000.0000023.000032.0000099.00
test768.079.799479115.2440020.0000.0000030.5000127.25000846.00
mass768.031.9925787.8841600.00027.3000032.000036.6000067.10
pedi768.00.4718760.3313290.0780.243750.37250.626252.42
age768.033.24088511.76023221.00024.0000029.000041.0000081.00
class768.00.3489580.4769510.0000.000000.00001.000001.00
\n", "
" ], "text/plain": [ " count mean std min 25% 50% 75% \\\n", "preg 768.0 3.845052 3.369578 0.000 1.00000 3.0000 6.00000 \n", "plas 768.0 120.894531 31.972618 0.000 99.00000 117.0000 140.25000 \n", "pres 768.0 69.105469 19.355807 0.000 62.00000 72.0000 80.00000 \n", "skin 768.0 20.536458 15.952218 0.000 0.00000 23.0000 32.00000 \n", "test 768.0 79.799479 115.244002 0.000 0.00000 30.5000 127.25000 \n", "mass 768.0 31.992578 7.884160 0.000 27.30000 32.0000 36.60000 \n", "pedi 768.0 0.471876 0.331329 0.078 0.24375 0.3725 0.62625 \n", "age 768.0 33.240885 11.760232 21.000 24.00000 29.0000 41.00000 \n", "class 768.0 0.348958 0.476951 0.000 0.00000 0.0000 1.00000 \n", "\n", " max \n", "preg 17.00 \n", "plas 199.00 \n", "pres 122.00 \n", "skin 99.00 \n", "test 846.00 \n", "mass 67.10 \n", "pedi 2.42 \n", "age 81.00 \n", "class 1.00 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe().transpose()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data[columns].hist(stacked=False, bins=100, figsize=(12,30), layout=(14,2));" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediage
061487235033.60.62750
11856629026.60.35131
28183640023.30.67232
318966239428.10.16721
40137403516843.12.28833
\n", "
" ], "text/plain": [ " preg plas pres skin test mass pedi age\n", "0 6 148 72 35 0 33.6 0.627 50\n", "1 1 85 66 29 0 26.6 0.351 31\n", "2 8 183 64 0 0 23.3 0.672 32\n", "3 1 89 66 23 94 28.1 0.167 21\n", "4 0 137 40 35 168 43.1 2.288 33" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#The data set contains a Class attribute. \n", "#This is an indicator variable that is non-descriptive and only indicates if the \n", "# descriptive data indicates a particular event\n", "\n", "#Let's separate the data to into 2 dataframes.\n", "# - The first will contain the descriptive attributes\n", "# - The second will contain the indication attribute\n", "\n", "#Create a new dataframe (X) to contain the descriptive attributes, droping the indicitor attribute\n", "X = data.drop('class', axis=1)\n", "\n", "#Create a new dataframe (Y) to only contain the indicator attribute\n", "Y = data['class']\n", "X.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediage
00.3529410.7437190.5901640.3535350.0000000.5007450.2344150.483333
10.0588240.4271360.5409840.2929290.0000000.3964230.1165670.166667
20.4705880.9195980.5245900.0000000.0000000.3472430.2536290.183333
30.0588240.4472360.5409840.2323230.1111110.4187780.0380020.000000
40.0000000.6884420.3278690.3535350.1985820.6423250.9436380.200000
\n", "
" ], "text/plain": [ " preg plas pres skin test mass pedi \\\n", "0 0.352941 0.743719 0.590164 0.353535 0.000000 0.500745 0.234415 \n", "1 0.058824 0.427136 0.540984 0.292929 0.000000 0.396423 0.116567 \n", "2 0.470588 0.919598 0.524590 0.000000 0.000000 0.347243 0.253629 \n", "3 0.058824 0.447236 0.540984 0.232323 0.111111 0.418778 0.038002 \n", "4 0.000000 0.688442 0.327869 0.353535 0.198582 0.642325 0.943638 \n", "\n", " age \n", "0 0.483333 \n", "1 0.166667 \n", "2 0.183333 \n", "3 0.000000 \n", "4 0.200000 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "X_copy = X.copy() #We create a copy so we can still refer to the original dataframe later\n", "scaler = MinMaxScaler()\n", "#Create list of Columns to transform/scale\n", "X_columns = X.columns\n", "#Create a new dataframe\n", "X_scaled = pd.DataFrame(scaler.fit_transform(X_copy), columns=X_columns)\n", "X_scaled.head()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediageclass
count768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000
mean3.845052120.89453169.10546920.53645879.79947931.9925780.47187633.2408850.348958
std3.36957831.97261819.35580715.952218115.2440027.8841600.33132911.7602320.476951
min0.0000000.0000000.0000000.0000000.0000000.0000000.07800021.0000000.000000
25%1.00000099.00000062.0000000.0000000.00000027.3000000.24375024.0000000.000000
50%3.000000117.00000072.00000023.00000030.50000032.0000000.37250029.0000000.000000
75%6.000000140.25000080.00000032.000000127.25000036.6000000.62625041.0000001.000000
max17.000000199.000000122.00000099.000000846.00000067.1000002.42000081.0000001.000000
\n", "
" ], "text/plain": [ " preg plas pres skin test mass \\\n", "count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 \n", "mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 \n", "std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 \n", "50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 \n", "75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 \n", "max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 \n", "\n", " pedi age class \n", "count 768.000000 768.000000 768.000000 \n", "mean 0.471876 33.240885 0.348958 \n", "std 0.331329 11.760232 0.476951 \n", "min 0.078000 21.000000 0.000000 \n", "25% 0.243750 24.000000 0.000000 \n", "50% 0.372500 29.000000 0.000000 \n", "75% 0.626250 41.000000 1.000000 \n", "max 2.420000 81.000000 1.000000 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediage
count768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000
mean0.2261800.6075100.5664380.2074390.0943260.4767900.1681790.204015
std0.1982100.1606660.1586540.1611340.1362220.1174990.1414730.196004
min0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%0.0588240.4974870.5081970.0000000.0000000.4068550.0707730.050000
50%0.1764710.5879400.5901640.2323230.0360520.4769000.1257470.133333
75%0.3529410.7047740.6557380.3232320.1504140.5454550.2340950.333333
max1.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
\n", "
" ], "text/plain": [ " preg plas pres skin test mass \\\n", "count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 \n", "mean 0.226180 0.607510 0.566438 0.207439 0.094326 0.476790 \n", "std 0.198210 0.160666 0.158654 0.161134 0.136222 0.117499 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 0.058824 0.497487 0.508197 0.000000 0.000000 0.406855 \n", "50% 0.176471 0.587940 0.590164 0.232323 0.036052 0.476900 \n", "75% 0.352941 0.704774 0.655738 0.323232 0.150414 0.545455 \n", "max 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 \n", "\n", " pedi age \n", "count 768.000000 768.000000 \n", "mean 0.168179 0.204015 \n", "std 0.141473 0.196004 \n", "min 0.000000 0.000000 \n", "25% 0.070773 0.050000 \n", "50% 0.125747 0.133333 \n", "75% 0.234095 0.333333 \n", "max 1.000000 1.000000 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_scaled.describe()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "#Question: Add code (below) to create a new dataframe, where only the 'preg' and 'plas' attributes are transformed" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pregplaspresskintestmasspediage
00.3529410.7437197235033.60.62750
10.0588240.4271366629026.60.35131
20.4705880.919598640023.30.67232
30.0588240.44723666239428.10.16721
40.0000000.688442403516843.12.28833
\n", "
" ], "text/plain": [ " preg plas pres skin test mass pedi age\n", "0 0.352941 0.743719 72 35 0 33.6 0.627 50\n", "1 0.058824 0.427136 66 29 0 26.6 0.351 31\n", "2 0.470588 0.919598 64 0 0 23.3 0.672 32\n", "3 0.058824 0.447236 66 23 94 28.1 0.167 21\n", "4 0.000000 0.688442 40 35 168 43.1 2.288 33" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "X_copy = X.copy()\n", "scaler = MinMaxScaler()\n", "X_copy[['preg', 'plas']] = scaler.fit_transform(X_copy[['preg', 'plas']])\n", "X_copy.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" } }, "nbformat": 4, "nbformat_minor": 4 }