Plusieurs fonctions, de différents packages, sont disponibles dans le logiciel R pour le calcul de l’ACP:
prcomp() et princomp() [fonction de base, package stats],PCA() [package FactoMineR],dudi.pca() [package ade4],et epPCA() [package ExPosition]
Peu importe la fonction que vous décidez d’utiliser, vous pouvez facilement extraire et visualiser les résultats de l’ACP en utilisant les fonctions R fournies dans le package factoextra.
Format des données
À titre d’exemple d’utilisation de ces fonctions, considérons l’ensemble des données enregistré comme data.frame dans R sous le nom mtcars. Un appel d’aide mtcars permet d’obtenir un description détaillée des données. En résumé, cette base de données contient les mesures de 11 variables liées à l’aspect et aux performances d’un ensemble de 32 voitures (modèles 1973-1974).
data(mtcars)
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Explication du modèles
Fonction R: PCA() [FactoMineR].
Format simplifié:
#PCA(mtcars, scale.unit = TRUE, graph = TRUE)
\(X\): jeu de données de type data frame. Les lignes sont des individus et les colonnes sont des variables numériques \(scale.unit\): une valeur logique. Si TRUE, les données sont standardisées/normalisées avant l’analyse. \(ncp\): nombre de dimensions conservées dans les résultats finaux. \(graph\): une valeur logique. Si TRUE un graphique est affiché.
Calculer l’ACP sur les individus/variables actifs:
library("FactoMineR")
## Warning: package 'FactoMineR' was built under R version 4.2.3
res.pca <- PCA(mtcars, graph = FALSE)
Le résultat de la fonction PCA() est une liste, contenant les éléments suivants:
print(res.pca)
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 32 individuals, described by 11 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
Visualisation et interprétation Les fonctions suivantes, de factoextra, seront utilisées:
get_eigenvalue(res.pca): Extraction des valeurs propres / variances des composantes principales fviz_eig(res.pca): Visualisation des valeurs propres get_pca_ind(res.pca), get_pca_var(res.pca): Extraction des résultats pour les individus et les variables, respectivement. fviz_pca_ind(res.pca), fviz_pca_var(res.pca): visualisez les résultats des individus et des variables, respectivement. fviz_pca_biplot(res.pca): Création d’un biplot des individus et des variables. Dans les sections suivantes, nous allons illustrer chacune de ces fonctions.
Valeurs propres / Variances
Comme décrit dans les sections précédentes, les valeurs propres (eigenvalues en anglais) mesurent la quantité de variance expliquée par chaque axe principal. Les valeurs propres sont grandes pour les premiers axes et petits pour les axes suivants. Autrement dit, les premiers axes correspondent aux directions portant la quantité maximale de variation contenue dans le jeu de données.
Nous examinons les valeurs propres pour déterminer le nombre de composantes principales à prendre en considération. Les valeurs propres et la proportion de variances (i.e. information) retenues par les composantes principales peuvent être extraites à l’aide de la fonction get_eigenvalue() [package factoextra].
library("factoextra")
## Warning: package 'factoextra' was built under R version 4.2.3
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
eig.val <- get_eigenvalue(res.pca)
eig.val
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 6.60840025 60.0763659 60.07637
## Dim.2 2.65046789 24.0951627 84.17153
## Dim.3 0.62719727 5.7017934 89.87332
## Dim.4 0.26959744 2.4508858 92.32421
## Dim.5 0.22345110 2.0313737 94.35558
## Dim.6 0.21159612 1.9236011 96.27918
## Dim.7 0.13526199 1.2296544 97.50884
## Dim.8 0.12290143 1.1172858 98.62612
## Dim.9 0.07704665 0.7004241 99.32655
## Dim.10 0.05203544 0.4730495 99.79960
## Dim.11 0.02204441 0.2004037 100.00000
La somme de toutes les valeurs propres donne une variance totale de 11.
Le graphique des valeurs propres peut être généré à l’aide de la fonction fviz_eig () ou fviz_screeplot () [package factoextra].
fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))
Graphique des variables
Résultats
Une méthode simple pour extraire les résultats, pour les variables, à partir de l’ACP est d’utiliser la fonction get_pca_var() [package factoextra]. Cette fonction retourne une liste d’éléments contenant tous les résultats pour les variables actives (coordonnées, corrélation entre variables et les axes, cosinus-carré et contributions).
var <- get_pca_var(res.pca)
var
## Principal Component Analysis Results for variables
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the variables"
## 2 "$cor" "Correlations between variables and dimensions"
## 3 "$cos2" "Cos2 for the variables"
## 4 "$contrib" "contributions of the variables"
Les composants de get_pca_var() peuvent être utilisés dans le graphique des variables comme suit:
var\(coord: coordonnées des variables pour créer un nuage de points. var\)cos2: cosinus carré des variables. Représente la qualité de représentation des variables sur le graphique de l’ACP. Il est calculé comme étant les coordonnées au carré: var.cos2 = var.coord * var.coord. var$contrib: contient les contributions (en pourcentage), des variables, aux composantes principales. La contribution d’une variable (var) à une composante principale donnée: (var.cos2 * 100) / (total cos2 du composant).
Les différents éléments peuvent être consultés comme suit:
# Coordonnées
head(var$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg -0.9319502 0.02625094 -0.17877989 -0.011703525 0.04861531
## cyl 0.9612188 0.07121589 -0.13883907 -0.001345754 0.02764565
## disp 0.9464866 -0.08030095 -0.04869285 0.133237930 0.18624400
## hp 0.8484710 0.40502680 0.11088579 -0.035139337 0.25528375
## drat -0.7561693 0.44720905 0.12765473 0.443850788 0.03655308
## wt 0.8897212 -0.23286996 0.27070586 0.127677743 -0.03546673
# Cos2: qualité de répresentation
head(var$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 0.8685312 0.0006891117 0.031962249 1.369725e-04 0.0023634487
## cyl 0.9239416 0.0050717032 0.019276287 1.811054e-06 0.0007642822
## disp 0.8958370 0.0064482423 0.002370993 1.775235e-02 0.0346868281
## hp 0.7199031 0.1640467049 0.012295659 1.234773e-03 0.0651697911
## drat 0.5717921 0.1999959326 0.016295731 1.970035e-01 0.0013361275
## wt 0.7916038 0.0542284172 0.073281663 1.630161e-02 0.0012578888
# Contributions aux composantes principales
head(var$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 13.142837 0.02599962 5.0960440 5.080631e-02 1.0577029
## cyl 13.981320 0.19135124 3.0734010 6.717622e-04 0.3420355
## disp 13.556034 0.24328694 0.3780299 6.584761e+00 15.5232297
## hp 10.893757 6.18934888 1.9604134 4.580062e-01 29.1651238
## drat 8.652504 7.54568403 2.5981826 7.307322e+01 0.5979507
## wt 11.978751 2.04599412 11.6839894 6.046647e+00 0.5629370
Cercle de corrélation
La corrélation entre une variable et une composante principale (PC) est utilisée comme coordonnées de la variable sur la composante principale. La représentation des variables diffère de celle des observations: les observations sont représentées par leurs projections, mais les variables sont représentées par leurs corrélations (Abdi and Williams 2010).
# Coordonnées des variables
head(var$coord, 1)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg -0.9319502 0.02625094 -0.1787799 -0.01170353 0.04861531
Pour visualiser les variables, tapez ceci:
fviz_pca_var(res.pca, col.var = "black")
Le graphique ci-dessus est également connu sous le nom de graphique de corrélation des variables. Il montre les relations entre toutes les variables. Il peut être interprété comme suit:
Les variables positivement corrélées sont regroupées. Les variables négativement corrélées sont positionnées sur les côtés opposés de l’origine du graphique (quadrants opposés). La distance entre les variables et l’origine mesure la qualité de représentation des variables. Les variables qui sont loin de l’origine sont bien représentées par l’ACP.
Qualité de représentation
La qualité de représentation des variables sur la carte de l’ACP s’appelle cos2 (cosinus carré) . Vous pouvez accéder au cos2 comme suit:
head(var$cos2, 4)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 0.8685312 0.0006891117 0.031962249 1.369725e-04 0.0023634487
## cyl 0.9239416 0.0050717032 0.019276287 1.811054e-06 0.0007642822
## disp 0.8958370 0.0064482423 0.002370993 1.775235e-02 0.0346868281
## hp 0.7199031 0.1640467049 0.012295659 1.234773e-03 0.0651697911
Vous pouvez visualiser le cos2 des variables sur toutes les dimensions en utilisant le package corrplot:
library("corrplot")
## corrplot 0.92 loaded
corrplot(var$cos2, is.corr=FALSE)
Il est également possible de créer un bar plot du cosinus carré des variables en utilisant la fonction fviz_cos2() [dans factoextra]:
# Cos2 total des variables sur Dim.1 et Dim.2
fviz_cos2(res.pca, choice = "var", axes = 1:2)
Il est possible de colorer les variables en fonction de la valeur de leurs cos2 à l’aide de l’argument col.var = “cos2”. Cela produit un gradient de couleurs. Dans ce cas, l’argument gradient.cols peut être utilisé pour spécifier une palette de couleur personnalisée. Par exemple, gradient.cols = c(“white”, “blue”, “red”) signifie que:
les variables à faible valeur de cos2 seront colorées en “white” (blanc) les variables avec les valeurs moyennes de cos2 seront colorées en “blue” (bleu) les variables avec des valeurs élevées de cos2 seront colorées en “red” (rouge)
# Colorer en fonction du cos2: qualité de représentation
fviz_pca_var(res.pca, col.var = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Évite le chevauchement de texte
)
Notez qu’il est également possible de modifier la transparence des variables en fonction de leurs valeurs de cos2 à l’aide de l’option alpha.var = “cos2”. Par exemple, tapez ceci:
# Changer la transparence en fonction du cos2
fviz_pca_var(res.pca, alpha.var = "cos2")
Contributions des variables aux axes principaux
Les contributions des variables dans la définition d’un axe principal donné, sont exprimées en pourcentage.
Les variables corrélées avec PC1 (i.e., Dim.1) et PC2 (i.e., Dim.2) sont les plus importantes pour expliquer la variabilité dans le jeu de données. Les variables qui ne sont pas en corrélation avec un axe ou qui sont corrélées avec les derniers axes sont des variables à faible apport et peuvent être supprimées pour simplifier l’analyse globale. La contribution des variables peut être extraite comme suit:
head(var$contrib, 4)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## mpg 13.14284 0.02599962 5.0960440 0.0508063075 1.0577029
## cyl 13.98132 0.19135124 3.0734010 0.0006717622 0.3420355
## disp 13.55603 0.24328694 0.3780299 6.5847606540 15.5232297
## hp 10.89376 6.18934888 1.9604134 0.4580062170 29.1651238
Il est possible d’utiliser la fonction corrplot() [package corrplot] pour mettre en évidence les variables les plus contributives pour chaque dimension:
library("corrplot")
corrplot(var$contrib, is.corr=FALSE)
La fonction fviz_contrib() [package factoextra] peut être utilisée pour créer un bar plot de la contribution des variables. Si vos données contiennent de nombreuses variables, vous pouvez décider de ne montrer que les principales variables contributives. Le code R ci-dessous montre le top 10 des variables contribuant le plus aux composantes principales:
# Contributions des variables à PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 11)
# Contributions des variables à PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 11)
La contribution totale à PC1 et PC2 est obtenue avec le code R suivant:
fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 11)
Les variables les plus importantes (ou, contributives) peuvent être mises en évidence sur le graphe de corrélation comme suit:
fviz_pca_var(res.pca, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")
)
Notez qu’il est aussi possible de modifier la transparence des variables en fonction de leurs contributions en utilisant l’option alpha.var = “contrib”. Par exemple, tapez ceci:
# Changez la transparence en fonction de contrib
fviz_pca_var(res.pca, alpha.var = "contrib")
Graphique des individus
es résultats, pour les individus, peuvent être extraits à l’aide de la fonction get_pca_ind() [package factoextra]. Comme get_pca_var(), la fonction get_pca_ind() retourne une liste de matrices contenant tous les résultats pour les individus (coordonnées, corrélation entre individus et axes, cosinus-carré et contributions).
ind <- get_pca_ind(res.pca)
ind
## Principal Component Analysis Results for individuals
## ===================================================
## Name Description
## 1 "$coord" "Coordinates for the individuals"
## 2 "$cos2" "Cos2 for the individuals"
## 3 "$contrib" "contributions of the individuals"
Pour accéder aux différents éléments, utilisez ceci:
# Coordonnées des individus
head(ind$coord)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Mazda RX4 -0.65721320 1.7354457 -0.6011992 0.11552157 -0.9606527
## Mazda RX4 Wag -0.62939551 1.5500334 -0.3823225 0.20230735 -1.0329487
## Datsun 710 -2.77939704 -0.1464566 -0.2412383 -0.24913915 0.4051429
## Hornet 4 Drive -0.31177071 -2.3630190 -0.1357593 -0.51186167 0.5579968
## Hornet Sportabout 1.97448894 -0.7544022 -1.1344023 0.07565343 0.2108362
## Valiant -0.05613753 -2.7859996 0.1638257 -0.99077109 0.2150522
# Qualité des individus
head(ind$cos2)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Mazda RX4 0.0865668022 0.603616196 0.072439529 0.0026746376 0.184957365
## Mazda RX4 Wag 0.0914912300 0.554899491 0.033759176 0.0094526923 0.246427782
## Datsun 710 0.8658555795 0.002404154 0.006522842 0.0069570996 0.018397581
## Hornet 4 Drive 0.0152981449 0.878825380 0.002900732 0.0412357002 0.049004011
## Hornet Sportabout 0.6462798598 0.094344610 0.213326802 0.0009487864 0.007368879
## Valiant 0.0003469941 0.854628846 0.002955149 0.1080841726 0.005092176
# Contributions des individus
head(ind$contrib)
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Mazda RX4 0.204251964 3.5509908 1.80087124 0.15468934 12.9062577
## Mazda RX4 Wag 0.187327250 2.8327589 0.72829194 0.47441410 14.9219299
## Datsun 710 3.653043676 0.0252898 0.28996026 0.71947914 2.2955352
## Hornet 4 Drive 0.045964687 6.5835769 0.09183014 3.03696290 4.3544268
## Hornet Sportabout 1.843584695 0.6710167 6.41180157 0.06634245 0.6216669
## Valiant 0.001490254 9.1514429 0.13372413 11.37839273 0.6467783
Graphique: qualité et contribution
La fonction fviz_pca_ind() est utilisée pour produire le graphique des individus. Pour créer un graphique simple, tapez ceci:
fviz_pca_ind (res.pca)
Comme les variables, il est également possible de colorer les individus en fonction de leurs valeurs de cos2:
fviz_pca_ind (res.pca, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Évite le chevauchement de texte
)
Vous pouvez également modifier la taille des points en fonction du cos2 des individus correspondants:
fviz_pca_ind (res.pca, pointsize = "cos2",
pointshape = 21, fill = "#E7B800",
repel = TRUE # Évite le chevauchement de texte
)