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
             )