Articles - Méthodes des Composantes Principales dans R: Guide Pratique

ACP dans R avec Ade4: Scripts Faciles

Cet article fournit le code R pour calculer facilement l’analyse en composantes principales (ACP) en utilisant la fonction dudi.pca() du package R ade4. Nous utiliserons le package factoextra pour visualiser les résultats de l’ACP. Nous décrirons également comment prédire les coordonnées de nouvelles données individus / variables en utilisant les fonctions ade4.

Apprendre plus sur l’ACP: ACP - Analyse en Composantes Principales avec R: L’Essentiel.

ACP dans R avec ade4

Contents:


Installer et charger les packages

Installer:

install.packages("magrittr")  # pour le pipe %>%
install.packages("ade4")      # Calcul de l'ACP
install.packages("factoextra")# Visualisation  de l'ACP

Charger:

library(ade4)
library(factoextra)
library(magrittr)

Données

  • Données démo: decathlon2 [factoextra].
  • Contenu des données:
    • Individus actifs (lignes 1 à 23) et variables actives (colonnes 1 à 10). Utilisé pour l’ACP.
    • Individus supplémentaires (lignes 24 à 27) et variables supplémentaires (colonnes 11 à 13). Coordonnées prédites à l’aide de l’information de l’ACP et des paramètres obtenus avec les individus / variables actifs.

Analyse en composantes principales. Format des données

Extraction des individus et variables actifs:

library("factoextra")
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
head(decathlon2.active[, 1:6])
##           X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## SEBRLE     11.0      7.58     14.8      2.07  49.8         14.7
## CLAY       10.8      7.40     14.3      1.86  49.4         14.1
## BERNARD    11.0      7.23     14.2      1.92  48.9         15.0
## YURKOV     11.3      7.09     15.2      2.10  50.4         15.3
## ZSIVOCZKY  11.1      7.30     13.5      2.01  48.6         14.2
## McMULLEN   10.8      7.31     13.8      2.13  49.9         14.4

Calculer l’ACP avec dudi.pca()

library(ade4)
res.pca <- dudi.pca(decathlon2.active,
                    scannf = FALSE,   # Cacher le scree plot
                    nf = 5            # Nombre d'axes gardés
                    )

Visualisation des résultats de l’ACP

Visualisation avec factoextra

Le package factoextra crée des graphiques de type ggplot2

  1. Visualiser les valeurs propres. Montre le pourcentage de variances expliquées par chaque axe principal.
fviz_eig(res.pca)

  1. Graphique des individus. Coloration en fonction du cos2 (qualité de représentation). Les individus similaires sont groupés ensemble.
fviz_pca_ind(res.pca,
             col.ind = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE     
             )

  1. Graphique des variables. Coloration en fonction de la contribution des variables. Les variables corrélées positivement sont du même côté du graphique. Les variables corrélées négativement sont sur des côtés opposés du graphique.
fviz_pca_var(res.pca,
             col.var = "contrib", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE     
             )

  1. Biplot des individus et des variables
fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF", 
                col.ind = "#696969"  
                )

Visualisation avec ade4

Le package ad4 crée des graphiques de base

# Valeurs propres
screeplot(res.pca, main = "Screeplot - Eigenvalues")

# Cercle de corrélation des variables
s.corcircle(res.pca$co)

# Graphique des individus (lignes)
s.label(res.pca$li, 
        xax = 1,     # Dimension 1
        yax = 2)     # Dimension 2

# Biplot des individus et des variables
scatter(res.pca,
        posieig = "none", # Cacher le scree plot
        clab.row = 0      # Caché l'annotation de slignes
        )

## NULL

Accéder aux résultats de l’ACP

library(factoextra)
# Valeurs propres
eig.val <- get_eigenvalue(res.pca)
eig.val
  
# Résultats des variables
res.var <- get_pca_var(res.pca)
res.var$coord          # Coordonnées
res.var$contrib        # Contributions aux axes
res.var$cos2           # Qualité de représentation 
# Résultats des individus
res.ind <- get_pca_ind(res.pca)
res.ind$coord          # Coordonnées
res.ind$contrib        # Contributions aux axes
res.ind$cos2           # Qualité de représentation

Prediction avec l’ACP

Dans cette section, nous allons montrer comment prédire les coordonnées des individus et des variables supplémentaires en utilisant uniquement les informations fournies par l’ACP précédemment effectuée.

Individus supplémentaires

  1. Données: lignes 24 à 27 et colonnes 1 à 10 [jeu de données decathlon2]. Les nouvelles données doivent contenir les colonnes (variables) portant les mêmes noms et dans le même ordre que les données actives utilisées pour calculer l’ACP.
# Individus supplémentaires
ind.sup <- decathlon2[24:27, 1:10]
ind.sup[, 1:6]
##         X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## KARPOV   11.0      7.30     14.8      2.04  48.4         14.1
## WARNERS  11.1      7.60     14.3      1.98  48.7         14.2
## Nool     10.8      7.53     14.3      1.88  48.8         14.8
## Drews    10.9      7.38     13.1      1.88  48.5         14.0
  1. Predire les coordonnées des individus.
ind.sup.coord <- suprow(res.pca, ind.sup) %>%
  .$lisup
ind.sup.coord[, 1:4]
##          Axis1   Axis2 Axis3  Axis4
## KARPOV  -0.795  0.7795 1.633  1.724
## WARNERS  0.386 -0.1216 1.739 -0.706
## Nool     0.559  1.9775 0.483 -2.278
## Drews    1.109  0.0174 3.049 -1.534
  1. Graphique des individus incluant les individus supplémentaires:
# Individus actifs
p <- fviz_pca_ind(res.pca, repel = TRUE)
# Ajouter les individus supplementaires
fviz_add(p, ind.sup.coord, color ="blue")

Variables supplémentaires

Variables catégorielles

Le jeu de données decathlon2 contient une variable qualitative supplémentaire, la colonne 13 correspondant aux types de compétition.

Les variables qualitatives / catégorielles peuvent être utilisées pour colorer les individus par groupes. La variable catégorielle doit être de même longueur que le nombre d’individus actifs (ici 23).

  • Graphique factoextra
groups <- as.factor(decathlon2$Competition[1:23])
fviz_pca_ind(res.pca,
             col.ind = groups, # colorer par groupes
             palette = c("#00AFBB",  "#FC4E07"),
             addEllipses = TRUE, # Ellipses de concentrations
             ellipse.type = "confidence",
             legend.title = "Groups",
             repel = TRUE
             )

  • Graphiques ade4
groups <- as.factor(decathlon2$Competition[1:23])
s.class(res.pca$li,
        fac = groups,  # colorer par groupes
        col = c("#00AFBB",  "#FC4E07")
        )

# Biplot
res <- scatter(res.pca, clab.row = 0, posieig = "none")
s.class(res.pca$li, 
        fac = groups,
        col = c("#00AFBB",  "#FC4E07"),
        add.plot = TRUE,         # Add onto the scatter plot
        cstar = 0,               # Remove stars
        cellipse = 0             # Remove ellipses
        )

Variables quantitatives

Données: colonnes 11:12. Doit être de la même longueur que le nombre d’individus actifs (ici 23).

quanti.sup <- decathlon2[1:23, 11:12, drop = FALSE]
head(quanti.sup)
##           Rank Points
## SEBRLE       1   8217
## CLAY         2   8122
## BERNARD      4   8067
## YURKOV       5   8036
## ZSIVOCZKY    7   8004
## McMULLEN     8   7995

Les coordonnées d’une variable quantitative donnée sont calculées comme étant la corrélation entre les variables quantitatives et les composantes principales.

# Predire les coordonées et calculer le cos2
quanti.coord <- supcol(res.pca, scale(quanti.sup)) %>%
  .$cosup
quanti.cos2 <- quanti.coord^2
# Graphique des variables incluants les variables supplementaires
p <- fviz_pca_var(res.pca)
fviz_add(p, quanti.coord, color ="blue", geom="arrow")