PCA on 🇫🇷 Automobile¶
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter('ignore')
#+autres
Load the auto.xlsx
dataset¶
Normaliser les données¶
array([[-0.77509889, -0.28335818, -1.88508077, -1.09734528, -1.56900676, 0.56976043], [-0.12016326, 0.01963869, 1.60580955, 2.0010414 , 0.23416142, 0.14597168], [-0.92920139, -0.83885242, -0.44217944, 0.25819889, -0.21663062, -0.53209032], [-1.12733318, -1.29334771, -1.00072189, -1.09734528, -1.11821472, -0.61684807], [-0.12841875, 0.67613189, 0.25599862, -0.51639778, 0.19659542, 0.56976043], [-0.9209459 , -0.13185975, -0.20945342, 0.45184806, 0.0087654 , 0.14597168], [ 0.45221746, -0.28335818, 0.72145067, 0.45184806, 0.60982146, -0.36257482], [-0.18345536, -1.49534562, -0.44217944, -0.71004695, -0.51715865, -1.54918332], [ 2.84080623, 2.19111619, 0.86108628, 1.22644473, 1.81193359, 1.84112668], [-1.28143568, -1.49534562, -1.60580955, -1.87194195, -1.98223281, -1.54918332], [-0.16969621, 1.23162613, -0.25599862, -0.90369611, -0.14149861, 1.41733793], [ 0.45772112, -0.13185975, 0.53526985, 1.03279556, 0.60982146, -0.02354382], [ 1.0080872 , 1.53462299, 1.65235475, 0.45184806, 2.18759363, 0.14597168], [ 0.99432805, 0.67613189, 0.20945342, 0.64549722, 0.0087654 , 0.73927593], [-0.5219305 , -0.2328587 , -0.11636301, -0.12909944, 0.37691224, -1.21015232], [ 0.37791804, -0.08136027, 0.30254383, -0.32274861, 0.12146341, 0.56976043], [ 0.95580242, 0.77713084, 1.18690271, 1.22644473, 0.30929343, 1.24782243], [-0.92920139, -0.83885242, -1.37308353, -1.09734528, -0.9303847 , -1.54918332]])
Importer le module PCA
de sklearn¶
Appliquer le données normalisées¶
La décomposition à générées p = 6 composantes
Afficher la variance associés aux axes factoriels¶
array([4.68090853, 0.90641889, 0.39501114, 0.22650574, 0.09826011, 0.04583676])
Afficher les valeurs singulières¶
array([8.920507 , 3.92544535, 2.59136825, 1.96229396, 1.29244799, 0.88273717])
Afficher le ratio de variance expliquée¶
Que voyez vous ?
array([73.68096766, 14.26770482, 6.21776796, 3.56536815, 1.54668687, 0.72150454])
Afficher un graphique des valeurs singulière en fonction du nombre d'axes factoriels¶
Afficher la variance expliquée en fonction du nombre d'axes¶
Détermination du nombre de facteurs à retenir¶
Plusieurs pistes existent pour répondre à la question des facteurs déterminant, on présentera dans ce cours le "test des bâtons brisées".
On définit des seuils $b_k$ par axe tel que, $$b_k = \sum_{m=k}^p \frac{1}{m}$$
Calculer les $b_k$ et afficher les seuils en fonctions des valeurs singulières.
Valeur propre seuil bk 0 8.920507 2.450000 1 3.925445 1.450000 2 2.591368 0.950000 3 1.962294 0.616667 4 1.292448 0.366667 5 0.882737 0.166667
Représentation des individus dans le plan factoriel¶
[<matplotlib.lines.Line2D at 0x1a1fff7be0>]
Représentation des individus sur les axes¶
Afin de calculer la qualité de représentation des individus sur les axes on doit d'abord calculer les carrés des distance $d_{i}^{2}$ à l'origine des individus (l'inertie totale) tel que $$d_{i}^{2} = \sum_{j=0}^{p-1}z_{ij}^{2}$$
Que voyez vous ?
ID d_i 0 Alfasud TI 8.225176 1 Audi 100 6.673755 2 Simca 1300 2.159327 3 Citroen GS Club 6.780145 4 Fiat 132 1.169124 5 Lancia Beta 1.134950 6 Peugeot 504 1.512793 7 Renault 16 TL 5.636826 8 Renault 30 21.789657 9 Toyota Corolla 16.290143 10 Alfetta 1.66 4.456770 11 Princess 1800 1.952513 12 Datsun 200L 11.112624 13 Taunus 2000 2.452986 14 Rancho 1.963373 15 Mazda 9295 0.684521 16 Opel Rekord 6.083119 17 Lada 1300 7.922198
Déduction de la qualité de représentation des individus sur les deux premiers axes¶
Afin de calculer la qualité de représentation des individus sur l'axe $k$, on utilise la formule suivantes : $$COS_{ik}^{2}=\frac{F_{ik}^{2}}{d_{i}^{2}}$$
Calculer $COS_{i1}^{2}$ et $COS_{i2}^{2}$ et afficher les suivant chaque ID
id COS2_1 COS2_2 0 Alfasud TI 0.556218 0.387670 1 Audi 100 0.365334 0.349406 2 Simca 1300 0.580284 0.210694 3 Citroen GS Club 0.976992 0.001879 4 Fiat 132 0.156579 0.413826 5 Lancia Beta 0.081555 0.033900 6 Peugeot 504 0.309202 0.575488 7 Renault 16 TL 0.673539 0.170535 8 Renault 30 0.892431 0.051920 9 Toyota Corolla 0.975219 0.003426 10 Alfetta 1.66 0.042978 0.820652 11 Princess 1800 0.530947 0.362855 12 Datsun 200L 0.778390 0.028137 13 Taunus 2000 0.704819 0.096496 14 Rancho 0.243273 0.410469 15 Mazda 9295 0.217336 0.185337 16 Opel Rekord 0.861900 0.001790 17 Lada 1300 0.926052 0.002607
Vérifier que $\sum_{i=1}^{n}COS_{ik}^{2}=1$¶
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
Contribution des individus aux les deux premiers axes (CTR)¶
Elles permettent de déterminer les individus qui pèses le plus dans la définition de chaque facteur avec la formule suivante : $$CTR_{ik} = \frac{F_{ik}^{2}}{n\times\lambda_k}$$ Que voyez vous ?
id CTR_1 CTR_2 0 Alfasud TI 0.028492 0.045128 1 Audi 100 0.015184 0.033002 2 Simca 1300 0.007804 0.006439 3 Citroen GS Club 0.041254 0.000180 4 Fiat 132 0.001140 0.006847 5 Lancia Beta 0.000576 0.000545 6 Peugeot 504 0.002913 0.012321 7 Renault 16 TL 0.023645 0.013605 8 Renault 30 0.121105 0.016011 9 Toyota Corolla 0.098938 0.000790 10 Alfetta 1.66 0.001193 0.051763 11 Princess 1800 0.006456 0.010027 12 Datsun 200L 0.053871 0.004425 13 Taunus 2000 0.010767 0.003350 14 Rancho 0.002975 0.011406 15 Mazda 9295 0.000927 0.001796 16 Opel Rekord 0.032653 0.000154 17 Lada 1300 0.045690 0.000292
Traitement des individus supplémentaires¶
Charger les individus supplémentaires Peugeot 304 & 604 tel que :
sup={
'CYL':[2664,1288],
'PUISS':[136,74],
'LONG':[472,414],
'LARG':[177,157],
'POIDS':[1410,915],
'V.MAX':[180,160],
}
CYL | PUISS | LONG | LARG | POIDS | V.MAX | |
---|---|---|---|---|---|---|
Peugeot604 | 2664 | 136 | 472 | 177 | 1410 | 180 |
Peugeot304 | 1288 | 74 | 414 | 157 | 915 | 160 |
Normaliser les nouveaux individus¶
/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: DataConversionWarning: Data with input dtype int64 were all converted to float64 by StandardScaler. """Entry point for launching an IPython kernel.
array([[ 2.84080623, 2.59511201, 1.79199036, 2.0010414 , 2.48812166, 1.84112668], [-0.94571238, -0.53585556, -0.90763148, -1.87194195, -1.23091273, 0.14597168]])
Appliqué la PCA
sur les nouveaux individus normalisés¶
array([[ 5.56329226, 0.33860928, -0.46428878, 0.40214608, -0.38981076, -0.08102064], [-2.21224139, 1.25777905, -0.09304388, -0.35370189, 0.648528 , 0.12473042]])
Représenter les nouveaux individus dans le plan factoriel¶
[<matplotlib.lines.Line2D at 0x1a2033fef0>]