{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#Lab06"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Load libraries\n",
"import pandas as pd\n",
"#pd.set_option('display.max_rows', 500)\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.pipeline import Pipeline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Region | \n",
" price2018 | \n",
" price2000 | \n",
" purchacingPower2017 | \n",
" crime2019 | \n",
" crime1993 | \n",
" wage2018 | \n",
" IMT2018percapita | \n",
" IMI2018percapita | \n",
" Waste2018 | \n",
" WasteSel2018 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Portugal | \n",
" 108016.0 | \n",
" 53344 | \n",
" 100.0 | \n",
" 32.6 | \n",
" 30.8 | \n",
" 1166.9 | \n",
" 97.6 | \n",
" 146.8 | \n",
" 0.512959 | \n",
" 0.109483 | \n",
"
\n",
" \n",
" 1 | \n",
" Continente | \n",
" 109778.0 | \n",
" 53935 | \n",
" 100.7 | \n",
" 32.1 | \n",
" 30.9 | \n",
" 1170.3 | \n",
" 100.3 | \n",
" 149.2 | \n",
" 0.510957 | \n",
" 0.107298 | \n",
"
\n",
" \n",
" 2 | \n",
" Norte | \n",
" 80153.0 | \n",
" 47145 | \n",
" 92.1 | \n",
" 28.1 | \n",
" 23.0 | \n",
" 1056.6 | \n",
" 55.0 | \n",
" 120.2 | \n",
" 0.469846 | \n",
" 0.081176 | \n",
"
\n",
" \n",
" 3 | \n",
" Alto Minho | \n",
" 50090.0 | \n",
" 26874 | \n",
" 79.7 | \n",
" 28.7 | \n",
" 18.0 | \n",
" 978.1 | \n",
" 36.6 | \n",
" 115.1 | \n",
" 0.469507 | \n",
" 0.080048 | \n",
"
\n",
" \n",
" 4 | \n",
" Arcos de Valdevez | \n",
" 30437.0 | \n",
" 22576 | \n",
" 67.8 | \n",
" 26.5 | \n",
" 16.2 | \n",
" 882.1 | \n",
" 20.2 | \n",
" 96.9 | \n",
" 0.396206 | \n",
" 0.052423 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Region price2018 price2000 purchacingPower2017 crime2019 \\\n",
"0 Portugal 108016.0 53344 100.0 32.6 \n",
"1 Continente 109778.0 53935 100.7 32.1 \n",
"2 Norte 80153.0 47145 92.1 28.1 \n",
"3 Alto Minho 50090.0 26874 79.7 28.7 \n",
"4 Arcos de Valdevez 30437.0 22576 67.8 26.5 \n",
"\n",
" crime1993 wage2018 IMT2018percapita IMI2018percapita Waste2018 \\\n",
"0 30.8 1166.9 97.6 146.8 0.512959 \n",
"1 30.9 1170.3 100.3 149.2 0.510957 \n",
"2 23.0 1056.6 55.0 120.2 0.469846 \n",
"3 18.0 978.1 36.6 115.1 0.469507 \n",
"4 16.2 882.1 20.2 96.9 0.396206 \n",
"\n",
" WasteSel2018 \n",
"0 0.109483 \n",
"1 0.107298 \n",
"2 0.081176 \n",
"3 0.080048 \n",
"4 0.052423 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df=pd.read_excel('realEstate.xlsx')\n",
"\n",
"df=df.dropna()\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Region | \n",
" price2018 | \n",
" price2000 | \n",
" purchacingPower2017 | \n",
" crime2019 | \n",
" crime1993 | \n",
" wage2018 | \n",
" IMT2018percapita | \n",
" IMI2018percapita | \n",
" Waste2018 | \n",
" WasteSel2018 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Portugal | \n",
" 108016.0 | \n",
" 53344 | \n",
" 100.0 | \n",
" 32.6 | \n",
" 30.8 | \n",
" 1166.9 | \n",
" 97.6 | \n",
" 146.8 | \n",
" 0.512959 | \n",
" 0.109483 | \n",
"
\n",
" \n",
" 1 | \n",
" Continente | \n",
" 109778.0 | \n",
" 53935 | \n",
" 100.7 | \n",
" 32.1 | \n",
" 30.9 | \n",
" 1170.3 | \n",
" 100.3 | \n",
" 149.2 | \n",
" 0.510957 | \n",
" 0.107298 | \n",
"
\n",
" \n",
" 2 | \n",
" Norte | \n",
" 80153.0 | \n",
" 47145 | \n",
" 92.1 | \n",
" 28.1 | \n",
" 23.0 | \n",
" 1056.6 | \n",
" 55.0 | \n",
" 120.2 | \n",
" 0.469846 | \n",
" 0.081176 | \n",
"
\n",
" \n",
" 3 | \n",
" Alto Minho | \n",
" 50090.0 | \n",
" 26874 | \n",
" 79.7 | \n",
" 28.7 | \n",
" 18.0 | \n",
" 978.1 | \n",
" 36.6 | \n",
" 115.1 | \n",
" 0.469507 | \n",
" 0.080048 | \n",
"
\n",
" \n",
" 4 | \n",
" Arcos de Valdevez | \n",
" 30437.0 | \n",
" 22576 | \n",
" 67.8 | \n",
" 26.5 | \n",
" 16.2 | \n",
" 882.1 | \n",
" 20.2 | \n",
" 96.9 | \n",
" 0.396206 | \n",
" 0.052423 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 347 | \n",
" Ribeira Brava | \n",
" 34080.0 | \n",
" 17867 | \n",
" 68.4 | \n",
" 25.9 | \n",
" 22.4 | \n",
" 895.3 | \n",
" 29.6 | \n",
" 63.0 | \n",
" 0.426618 | \n",
" 0.098271 | \n",
"
\n",
" \n",
" 348 | \n",
" Santa Cruz | \n",
" 95380.0 | \n",
" 68514 | \n",
" 71.5 | \n",
" 14.3 | \n",
" 25.0 | \n",
" 1084.3 | \n",
" 46.7 | \n",
" 104.6 | \n",
" 0.398313 | \n",
" 0.088227 | \n",
"
\n",
" \n",
" 349 | \n",
" Santana | \n",
" 25299.0 | \n",
" 15434 | \n",
" 58.3 | \n",
" 19.9 | \n",
" 26.5 | \n",
" 862.4 | \n",
" 8.6 | \n",
" 62.6 | \n",
" 0.408434 | \n",
" 0.087468 | \n",
"
\n",
" \n",
" 350 | \n",
" São Vicente | \n",
" 45500.0 | \n",
" 20604 | \n",
" 61.0 | \n",
" 17.3 | \n",
" 46.2 | \n",
" 854.1 | \n",
" 24.3 | \n",
" 87.3 | \n",
" 0.388295 | \n",
" 0.086720 | \n",
"
\n",
" \n",
" 352 | \n",
" Porto Santo | \n",
" 74163.0 | \n",
" 49418 | \n",
" 93.5 | \n",
" 31.8 | \n",
" 24.4 | \n",
" 1142.9 | \n",
" 57.0 | \n",
" 285.0 | \n",
" 1.165898 | \n",
" 0.707036 | \n",
"
\n",
" \n",
"
\n",
"
341 rows × 11 columns
\n",
"
"
],
"text/plain": [
" Region price2018 price2000 purchacingPower2017 crime2019 \\\n",
"0 Portugal 108016.0 53344 100.0 32.6 \n",
"1 Continente 109778.0 53935 100.7 32.1 \n",
"2 Norte 80153.0 47145 92.1 28.1 \n",
"3 Alto Minho 50090.0 26874 79.7 28.7 \n",
"4 Arcos de Valdevez 30437.0 22576 67.8 26.5 \n",
".. ... ... ... ... ... \n",
"347 Ribeira Brava 34080.0 17867 68.4 25.9 \n",
"348 Santa Cruz 95380.0 68514 71.5 14.3 \n",
"349 Santana 25299.0 15434 58.3 19.9 \n",
"350 São Vicente 45500.0 20604 61.0 17.3 \n",
"352 Porto Santo 74163.0 49418 93.5 31.8 \n",
"\n",
" crime1993 wage2018 IMT2018percapita IMI2018percapita Waste2018 \\\n",
"0 30.8 1166.9 97.6 146.8 0.512959 \n",
"1 30.9 1170.3 100.3 149.2 0.510957 \n",
"2 23.0 1056.6 55.0 120.2 0.469846 \n",
"3 18.0 978.1 36.6 115.1 0.469507 \n",
"4 16.2 882.1 20.2 96.9 0.396206 \n",
".. ... ... ... ... ... \n",
"347 22.4 895.3 29.6 63.0 0.426618 \n",
"348 25.0 1084.3 46.7 104.6 0.398313 \n",
"349 26.5 862.4 8.6 62.6 0.408434 \n",
"350 46.2 854.1 24.3 87.3 0.388295 \n",
"352 24.4 1142.9 57.0 285.0 1.165898 \n",
"\n",
" WasteSel2018 \n",
"0 0.109483 \n",
"1 0.107298 \n",
"2 0.081176 \n",
"3 0.080048 \n",
"4 0.052423 \n",
".. ... \n",
"347 0.098271 \n",
"348 0.088227 \n",
"349 0.087468 \n",
"350 0.086720 \n",
"352 0.707036 \n",
"\n",
"[341 rows x 11 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"price2018 float64\n",
"price2000 int64\n",
"purchacingPower2017 float64\n",
"crime2019 float64\n",
"crime1993 float64\n",
"wage2018 float64\n",
"IMT2018percapita float64\n",
"IMI2018percapita float64\n",
"Waste2018 float64\n",
"WasteSel2018 float64\n",
"dtype: object"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X=df.drop(\"Region\",axis=1)\n",
"X.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"pipeline = Pipeline([('scaling', StandardScaler()), ('pca', PCA(n_components=3))])\n",
"\n",
"principalComponents=pipeline.fit_transform(X)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.972826 | \n",
" -1.198204 | \n",
" 0.136065 | \n",
"
\n",
" \n",
" 1 | \n",
" 2.005852 | \n",
" -1.252115 | \n",
" 0.087374 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.582760 | \n",
" -0.974156 | \n",
" -0.041264 | \n",
"
\n",
" \n",
" 3 | \n",
" -0.432546 | \n",
" -0.046321 | \n",
" 0.237438 | \n",
"
\n",
" \n",
" 4 | \n",
" -1.497081 | \n",
" 0.214608 | \n",
" 0.228310 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 336 | \n",
" -1.267692 | \n",
" 0.385313 | \n",
" 0.391458 | \n",
"
\n",
" \n",
" 337 | \n",
" 0.053560 | \n",
" -1.485031 | \n",
" -1.389320 | \n",
"
\n",
" \n",
" 338 | \n",
" -1.840092 | \n",
" 0.506480 | \n",
" 0.216991 | \n",
"
\n",
" \n",
" 339 | \n",
" -1.072990 | \n",
" 0.251504 | \n",
" 0.456633 | \n",
"
\n",
" \n",
" 340 | \n",
" 5.802427 | \n",
" 3.826544 | \n",
" -1.314745 | \n",
"
\n",
" \n",
"
\n",
"
341 rows × 3 columns
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 1.972826 -1.198204 0.136065\n",
"1 2.005852 -1.252115 0.087374\n",
"2 0.582760 -0.974156 -0.041264\n",
"3 -0.432546 -0.046321 0.237438\n",
"4 -1.497081 0.214608 0.228310\n",
".. ... ... ...\n",
"336 -1.267692 0.385313 0.391458\n",
"337 0.053560 -1.485031 -1.389320\n",
"338 -1.840092 0.506480 0.216991\n",
"339 -1.072990 0.251504 0.456633\n",
"340 5.802427 3.826544 -1.314745\n",
"\n",
"[341 rows x 3 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame(principalComponents)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.59161215, 0.16106816, 0.06103431])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipeline[1].explained_variance_ratio_"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8137146211505711"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## View the ratio of explained variance\n",
"sum(pipeline[1].explained_variance_ratio_)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"Comp=pd.DataFrame(pipeline[1].components_).T"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.363071 | \n",
" -0.145598 | \n",
" -0.376953 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.314375 | \n",
" -0.360249 | \n",
" -0.312781 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.311255 | \n",
" -0.436224 | \n",
" 0.167600 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.302549 | \n",
" 0.205530 | \n",
" 0.627603 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.322923 | \n",
" -0.053272 | \n",
" 0.481302 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.210538 | \n",
" -0.522779 | \n",
" 0.103148 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.340475 | \n",
" 0.208544 | \n",
" -0.254828 | \n",
"
\n",
" \n",
" 7 | \n",
" 0.343871 | \n",
" 0.212630 | \n",
" -0.101260 | \n",
"
\n",
" \n",
" 8 | \n",
" 0.325084 | \n",
" 0.387359 | \n",
" -0.081231 | \n",
"
\n",
" \n",
" 9 | \n",
" 0.304099 | \n",
" 0.318753 | \n",
" -0.118401 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 0.363071 -0.145598 -0.376953\n",
"1 0.314375 -0.360249 -0.312781\n",
"2 0.311255 -0.436224 0.167600\n",
"3 0.302549 0.205530 0.627603\n",
"4 0.322923 -0.053272 0.481302\n",
"5 0.210538 -0.522779 0.103148\n",
"6 0.340475 0.208544 -0.254828\n",
"7 0.343871 0.212630 -0.101260\n",
"8 0.325084 0.387359 -0.081231\n",
"9 0.304099 0.318753 -0.118401"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"Comp"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Region', 'price2018', 'price2000', 'purchacingPower2017', 'crime2019',\n",
" 'crime1993', 'wage2018', 'IMT2018percapita', 'IMI2018percapita',\n",
" 'Waste2018', 'WasteSel2018'],\n",
" dtype='object')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns[0:]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"Comp['variables']=df.columns[1:]\n",
"Comp=Comp.set_index('variables')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 float64\n",
"1 float64\n",
"2 float64\n",
"dtype: object"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Comp.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" | 0 | 1 | 2 |
variables | | | |
\n",
" \n",
" price2018 | \n",
" 0.363071 | \n",
" -0.145598 | \n",
" -0.376953 | \n",
"
\n",
" \n",
" IMI2018percapita | \n",
" 0.343871 | \n",
" 0.212630 | \n",
" -0.101260 | \n",
"
\n",
" \n",
" IMT2018percapita | \n",
" 0.340475 | \n",
" 0.208544 | \n",
" -0.254828 | \n",
"
\n",
" \n",
" Waste2018 | \n",
" 0.325084 | \n",
" 0.387359 | \n",
" -0.081231 | \n",
"
\n",
" \n",
" crime1993 | \n",
" 0.322923 | \n",
" -0.053272 | \n",
" 0.481302 | \n",
"
\n",
" \n",
" price2000 | \n",
" 0.314375 | \n",
" -0.360249 | \n",
" -0.312781 | \n",
"
\n",
" \n",
" purchacingPower2017 | \n",
" 0.311255 | \n",
" -0.436224 | \n",
" 0.167600 | \n",
"
\n",
" \n",
" WasteSel2018 | \n",
" 0.304099 | \n",
" 0.318753 | \n",
" -0.118401 | \n",
"
\n",
" \n",
" crime2019 | \n",
" 0.302549 | \n",
" 0.205530 | \n",
" 0.627603 | \n",
"
\n",
" \n",
" wage2018 | \n",
" 0.210538 | \n",
" -0.522779 | \n",
" 0.103148 | \n",
"
\n",
"
"
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"def moreThan01(val):\n",
" color = 'red' if val > 0.1 else 'black'\n",
" return 'color: %s' % color\n",
"\n",
"Comp1=Comp.sort_values(by=[0, 1, 2], ascending=False)\n",
"\n",
"s = Comp1.style.applymap(moreThan01)\n",
"s\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"\n",
"import numpy as np\n",
"from numpy.linalg import svd\n",
"def varimax(Phi, gamma = 1.0, q = 20, tol = 1e-6):\n",
" from scipy.linalg import svd\n",
" p,k = Phi.shape\n",
" R = np.eye(k)\n",
" d=0\n",
" for i in range(q):\n",
" d_old = d\n",
" Lambda = np.dot(Phi, R)\n",
" u,s,vh = svd(np.dot(Phi.T,np.asarray(Lambda)**3 - (gamma/p) * np.dot(Lambda, np.diag(np.diag(np.dot(Lambda.T,Lambda))))))\n",
" R = np.dot(u,vh)\n",
" d = np.sum(s)\n",
" if d_old!=0 and d/d_old < 1 + tol: break\n",
" return np.dot(Phi, R)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"rot_comps = varimax(Comp)\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"#rot_comps"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"Comp1=pd.DataFrame(rot_comps)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.357865 | \n",
" -0.347737 | \n",
" -0.214767 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.182294 | \n",
" -0.495110 | \n",
" -0.219267 | \n",
"
\n",
" \n",
" 2 | \n",
" -0.074974 | \n",
" -0.522058 | \n",
" 0.192601 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.045108 | \n",
" 0.050224 | \n",
" 0.723261 | \n",
"
\n",
" \n",
" 4 | \n",
" -0.008642 | \n",
" -0.186997 | \n",
" 0.551114 | \n",
"
\n",
" \n",
" 5 | \n",
" -0.164236 | \n",
" -0.543472 | \n",
" 0.076999 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.470298 | \n",
" -0.031651 | \n",
" -0.046571 | \n",
"
\n",
" \n",
" 7 | \n",
" 0.405968 | \n",
" -0.019052 | \n",
" 0.092405 | \n",
"
\n",
" \n",
" 8 | \n",
" 0.473936 | \n",
" 0.138197 | \n",
" 0.136421 | \n",
"
\n",
" \n",
" 9 | \n",
" 0.439762 | \n",
" 0.089916 | \n",
" 0.081377 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 0.357865 -0.347737 -0.214767\n",
"1 0.182294 -0.495110 -0.219267\n",
"2 -0.074974 -0.522058 0.192601\n",
"3 0.045108 0.050224 0.723261\n",
"4 -0.008642 -0.186997 0.551114\n",
"5 -0.164236 -0.543472 0.076999\n",
"6 0.470298 -0.031651 -0.046571\n",
"7 0.405968 -0.019052 0.092405\n",
"8 0.473936 0.138197 0.136421\n",
"9 0.439762 0.089916 0.081377"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Comp1"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"Comp1['variables']=df.columns[1:]\n",
"Comp1s=Comp1.set_index('variables')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" | 0 | 1 | 2 |
variables | | | |
\n",
" \n",
" Waste2018 | \n",
" 0.473936 | \n",
" 0.138197 | \n",
" 0.136421 | \n",
"
\n",
" \n",
" IMT2018percapita | \n",
" 0.470298 | \n",
" -0.031651 | \n",
" -0.046571 | \n",
"
\n",
" \n",
" WasteSel2018 | \n",
" 0.439762 | \n",
" 0.089916 | \n",
" 0.081377 | \n",
"
\n",
" \n",
" IMI2018percapita | \n",
" 0.405968 | \n",
" -0.019052 | \n",
" 0.092405 | \n",
"
\n",
" \n",
" price2018 | \n",
" 0.357865 | \n",
" -0.347737 | \n",
" -0.214767 | \n",
"
\n",
" \n",
" price2000 | \n",
" 0.182294 | \n",
" -0.495110 | \n",
" -0.219267 | \n",
"
\n",
" \n",
" crime2019 | \n",
" 0.045108 | \n",
" 0.050224 | \n",
" 0.723261 | \n",
"
\n",
" \n",
" crime1993 | \n",
" -0.008642 | \n",
" -0.186997 | \n",
" 0.551114 | \n",
"
\n",
" \n",
" purchacingPower2017 | \n",
" -0.074974 | \n",
" -0.522058 | \n",
" 0.192601 | \n",
"
\n",
" \n",
" wage2018 | \n",
" -0.164236 | \n",
" -0.543472 | \n",
" 0.076999 | \n",
"
\n",
"
"
],
"text/plain": [
""
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"def moreThan05(val):\n",
" color = 'red' if val > 0.35 or val<-0.35 else 'black'\n",
" return 'color: %s' % color\n",
"\n",
"Comp1s=Comp1s.sort_values(by=[0, 1, 2], ascending=False)\n",
"\n",
"s = Comp1s.style.applymap(moreThan05)\n",
"s"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"Comp1=pd.DataFrame(principalComponents)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.972826 | \n",
" -1.198204 | \n",
" 0.136065 | \n",
"
\n",
" \n",
" 1 | \n",
" 2.005852 | \n",
" -1.252115 | \n",
" 0.087374 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.582760 | \n",
" -0.974156 | \n",
" -0.041264 | \n",
"
\n",
" \n",
" 3 | \n",
" -0.432546 | \n",
" -0.046321 | \n",
" 0.237438 | \n",
"
\n",
" \n",
" 4 | \n",
" -1.497081 | \n",
" 0.214608 | \n",
" 0.228310 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 336 | \n",
" -1.267692 | \n",
" 0.385313 | \n",
" 0.391458 | \n",
"
\n",
" \n",
" 337 | \n",
" 0.053560 | \n",
" -1.485031 | \n",
" -1.389320 | \n",
"
\n",
" \n",
" 338 | \n",
" -1.840092 | \n",
" 0.506480 | \n",
" 0.216991 | \n",
"
\n",
" \n",
" 339 | \n",
" -1.072990 | \n",
" 0.251504 | \n",
" 0.456633 | \n",
"
\n",
" \n",
" 340 | \n",
" 5.802427 | \n",
" 3.826544 | \n",
" -1.314745 | \n",
"
\n",
" \n",
"
\n",
"
341 rows × 3 columns
\n",
"
"
],
"text/plain": [
" 0 1 2\n",
"0 1.972826 -1.198204 0.136065\n",
"1 2.005852 -1.252115 0.087374\n",
"2 0.582760 -0.974156 -0.041264\n",
"3 -0.432546 -0.046321 0.237438\n",
"4 -1.497081 0.214608 0.228310\n",
".. ... ... ...\n",
"336 -1.267692 0.385313 0.391458\n",
"337 0.053560 -1.485031 -1.389320\n",
"338 -1.840092 0.506480 0.216991\n",
"339 -1.072990 0.251504 0.456633\n",
"340 5.802427 3.826544 -1.314745\n",
"\n",
"[341 rows x 3 columns]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Comp1"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\profc\\AppData\\Roaming\\Python\\Python38\\site-packages\\sklearn\\cluster\\_kmeans.py:881: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=2.\n",
" warnings.warn(\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"