Ressources pour l'ACP

L’ACP, ou Analyse en Composantes Principales, ou Principal Component Analysis en anglais, est une approche statistique qui est employée pour résumer l’information contenue dans une matrice (tableau) de données comportant un nombre important de variables numériques (je dirais à partir d’une dizaine jusqu’à une centaine, sans doute plus dans certains domaines). Lorsque les données ne comportent que deux variables numériques, on peut facilement comprendre comment ces deux variables sont liées entre elles en réalisant un scatterplot. Mais lorsque le nombre de variables augmente, cela devient impossible à appréhender. L’ACP permet alors de passer d’un nuage de points (les observations) qui évolue dans un espace à N dimensions (N étant égal au nombre de variables (ou colonnes), à une représentation en deux dimensions, (ou éventuellement plusieurs représentations à deux dimensions).

Principe

De façon très résumée, en pratique l’ACP va rechercher l’axe dans lequel les observations sont le plus dispersée.

Cette animation est issue de ce post sur Cross Validated (n’hésitez pas à le consulter il est vraiment intéressant !).

Elle va ensuite considérer cet axe (c’est ce qu’on appelle la première composante principale), et son perpendiculaire (la seconde composante principale), pour définir un plan (le premier plan de l’ACP). Et pour résumer le nuage des observations, l’ACP va les projeter sur le plan défini. Une approche similaire est réalisée avec le nuage des variables.

A la fin de l’ACP, on obtient deux représentations graphiques, en deux dimensions : l’une concernant les observations, l’autre les variables, comme celles-ci :

A partir de ces plots on va pouvoir étudier :

  • les relations entre les variables (les colonnes),
  • les relations entre les observations (lignes),
  • les relations entre les observations et les variables (par exemple, quelles sont les observations ayant des valeurs élevées pour telle ou telle variable).
  • essayer de donner une signification “métier” aux axes de l’ACP.

En réalité l’ACP ne s’arrête pas à 2 axes et en définie N-1. Mais, en pratique, on représente généralement les projections des observations et des variables sur les plans définis par les axes 1 et 2, voir 1 et 3 mais rarement plus.

Sans entrer dans le détail des calculs mathématiques, il est assez intuitif de comprendre que le passage d’un nuage de points à N dimensions, dans un espace à deux dimensions, est forcément imparfait et qu’une part de l’information originale se perd dans cette réduction. La dispersion du nuage de points dans les N dimensions originales s’appelle l’inertie, et pour évaluer la quantité d’information conservée par l’approche ACP, on calcul le pourcentage d’inertie expliqué par chacun des axes. Ces pourcentages sont d’ailleurs rapportés sur le plot du cercle des corrélations (plot des variables).

Dans le cadre des analyses prédictives, l’ACP n’est plus vraiment employée pour étudier les relations entres les observations ou entre les variables, mais simplement pour réduire le nombre de variables qui seront inclues dans le modèle de prédiction. Dans cette situation, les variables sont remplacée par les composantes principales.

Ressources vidéos

Si le paragraphe précédent est du charabia pour vous, je vous recommande VIVEMENT de visionner la vidéo qui suit, que François Husson (d’agrocampus ouest) a réalisée sur l’ACP. Elle va de la théorie (expliquée de manière extrêmement pédagogique, avec des schémas, et des animations), à la pratique avec la réalisation d’une ACP avec le package FactoMineR (developpé, par François Husson). J’ai longtemps eu du mal à comprendre cette approche statistique et cette vidéo m’a BEAUCOUP BEAUCOUP aidée !

Et si vous n’accrochez pas, vous pouvez aussi essayer la vidéo suivante, de Jérôme Pagès, lui aussi d’agroucampus ouest. Elle est également très appréciée des étudiants :

Si vous trouvez les vidéos trop longues, vous pouvez les visionner en vitesse 1.5, ça reste très compréhensible !

Le package FactoMineR

Plusieurs packages permettent de faire de l’ACP (vegan, ade4 par exemple), mais je vous recommande d’utiliser FactoMineR, car :

  • l’ACP ne supporte pas les données manquantes. Or, par défaut, la fonction PCA() de FactoMineR les substitue par la moyenne de la variable. Cela est très pratique lorsque le jeu de données ne comporte que peu de données manquantes.
  • par défaut également, les données sont centrées, réduites ; cette procédure n’a donc pas besoin d’être spécifiée.
  • les plots des variables et des observations sont générés de façon automatique.
  • il est possible d’ajouter des variables supplémentaires sur les plots des variables et/ou des observations pour voir comment celles-ci sont liées aux axes de l’ACP, ou encore aux autres variables du jeu de données.
  • les sorties de la fonction PCA peuvent être utilisées avec le package ‘factoextra’ développé par Alboukadel Kassambara (qui gère le site STHDA) afin d’améliorer les plots de base l’ACP ou en réaliser d’autres. Par exemple, pour visualiser la qualité de représentation de chaque variable, ou encore pour visualiser leur contribution aux axes.

Un exemple

Les données du Décastar

Pour cette partie, je vais utiliser une partie du jeu de données décathlon (inclus dans le package FactoMineR). C’est un exemple ultra classique mais je le trouve vraiment pédagogique :

library(FactoMineR)
data(decatlon) 
A l’origine le jeu de données comporte les résultats de 13 athlètes aux 10 épreuves du décathlon, et ce pour deux compétitions, le Décastar et les jeux olympiques. Ici, on va se limiter aux données du Décastar :
library(tidyverse)
data(decathlon)

decastar<- decathlon %>%
    filter(Competition=="Decastar") %>%
    dplyr::select(-Competition) 
Le nom des athlètes n’est pas contenu dans une variable, mais en label des lignes. C’est ce qui permettra d’afficher le nom des athlètes sur le plot des observations.
rownames(decastar) <- rownames(decathlon)[1:13] 
En plus des 10 épreuves, le jeu de données comporte une variable ‘Rank’ qui informe sur le classement de l’athlète et une variable ‘Points’ qui contient le nombre de points réalisés.
 head(decastar)
         100m Long.jump Shot.put High.jump  400m 110m.hurdle Discus
SEBRLE  11.04      7.58    14.83      2.07 49.81       14.69  43.75
CLAY    10.76      7.40    14.26      1.86 49.37       14.05  50.72
KARPOV  11.02      7.30    14.77      2.04 48.37       14.09  48.95
BERNARD 11.02      7.23    14.25      1.92 48.93       14.99  40.87
YURKOV  11.34      7.09    15.19      2.10 50.42       15.31  46.26
WARNERS 11.11      7.60    14.31      1.98 48.68       14.23  41.10
        Pole.vault Javeline 1500m Rank Points
SEBRLE        5.02    63.19 291.7    1   8217
CLAY          4.92    60.15 301.5    2   8122
KARPOV        4.92    50.31 300.2    3   8099
BERNARD       5.32    62.77 280.1    4   8067
YURKOV        4.72    63.44 276.4    5   8036
WARNERS       4.92    51.77 278.1    6   8030 

La fonction PCA()

Comme expliqué précédemment, par défaut, la fonction ‘PCA()’ de ‘FactoMineR’ centre et réduit les variables avant de réaliser l’ACP. Cette étape est importante afin que toutes les variables aient le même poids dans la construction des plans de l’ACP. Si pour une raison ou une autre vous souhaitez vous passer de la réduction des variables, (ce qui n’est pas recommandé) vous pouvez utiliser l’argument ‘scale.unit=FALSE’.

Ici, on va réaliser l’ACP uniquement sur les 10 variables des disciplines; les variables score et rank seront ajoutées comme variables supplémentaires dans un second temps. Les plots des variables et des observations sont générés automatiquement.

decastar.pca <- PCA(decastar[,1:10]) 
Ici, on peut voir que l’axe 1 est plutôt expliqué par les variables du saut en longueur (long jump), 100m, 110 mètres haies, alors que l’axe 2 est plutôt expliqué par le saut à la perche (Pole vault). La flèche du lancer de javelot est faible et ne peut donc pas s’interpréter.

Ajouter des variables supplémentaires

Il s’agit d’ajouter des variables sur les plots pour voir comment elles sont liées aux variables qui ont servi à construire l’ACP. Ces nouvelles variables ne sont pas prise en compte pour la définition des axes de l’ACP. On les ajoute après coup. Pour illustrer l’ajout d’une variable supplémentaire de type catégoriel, je créé une variable ‘group’ qui prend la valeur ‘high’ si le nombre de points est > 8000, et “low” sinon :
decastar <- decastar %>%
mutate(group=ifelse(Points>8000, "high", "low")) 
J’ajoute les variables numériques Points et Rank, et la variable catégorielle group en utilisant les arguments quanti.supp et quali.supp :
decastar.pca2 <- PCA(decastar, quanti.sup=11:12, quali.sup=13) 
Les résultats nous montrent que plus les athlètes sautent loin et courent rapidement les épreuves du 100 mètres et du 110 mètres haie plus leur nombre de points est important, et plus leur rang est faible (meilleur classement).

Autres types de résultats

La fonction summary() permet d’accéder à de nombreuses informations.

summary(decastar.pca) 
Dans la première partie des résultats, on retrouve les pourcentages d’inertie expliqués par chaque axe, ainsi que les pourcentage cumulés:

Remarque : les pourcentages d’inertie sont les valeurs propres ou d’eigen values (il s’agit de la quantité de variance expliquée), exprimées en pourcentage.

Il est également possible de réaliser un plot pour visualiser ces pourcentages d’inertie :

barplot(decastar.pca$eig[,1])
 
Dans la seconde partie des sorties de la fonction ‘summary()’, on retrouve les coordonnées de chaque observation (ici les athlètes) sur les différents axes de l’ACP, ainsi qu’une mesure de la contribution de l’observation sur chaque axe (ctr), et une mesure de sa représentation (cos2).

La troisième partie des résultats est identique à la deuxième, mais concerne les variables :

Utiliser le package factoextra

Le package ‘factoextra’ peut être utilisé pour améliorer les représentations graphiques de base du package ‘FactoMineR’, et notamment pour explorer la contribution des variables aux axes, ou encore la qualité de leur représentation.

Visualiser le pourcentage d'inertie des axes

Le package ‘factoextra’ peut être utilisé pour améliorer les représentations graphiques de base du package ‘FactoMineR’, et notamment pour explorer la contribution des variables aux axes, ou encore la qualité de leur représentation.

Visualiser le pourcentage d'inertie des axes

library(factoextra)
library(corrplot)
fviz_eig(decastar.pca, addlabels = TRUE) 

Visualiser la qualité de la représentation des variables

res <- get_pca_var(decastar.pca)
corrplot(res$cos2) 
fviz_pca_ind (decastar.pca, col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Évite le chevauchement de texte
             ) 

Visualiser la contribution des variables aux axes

corrplot(res$contrib, is.corr=FALSE) 

Visualiser la qualité de la représentation des observations

fviz_pca_ind (decastar.pca, col.ind = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE # Évite le chevauchement de texte) 
ACP FactoMineR

Vous trouverez d’autres exemples de représentations ici.

Conclusion

L’ACP est une approche qui m’a longtemps posé problème, j’avais du mal à saisir le principe et à interpréter les résultats. Pour en avoir discuté, à bâtons rompus, avec de nombreuses personnes, je sais que ces difficultés sont souvent partagées. J’espère donc que les ressources présentées dans cet article qui m’ont été très utiles, vous le seront aussi !
Si vous en connaissez d’autres, n’hésitez pas à me les indiquer en commentaire,
Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏

22 réponses

  1. Je recherchais justement un cours assezsouple sur l’ACP et vous me rendez ce grand service. Je vous remercie pour tout et surtout pour ces belles illustrations qui m’aideront beaucoup.

  2. Merci pour le rappel très utile, cours effectuée en DEA d’économie mais trop générique à l’époque (avec Eviews). C’est on a du mal à trouver sur le net des ressources sur la question pour une mise à niveau.

  3. Très bon article merci!
    Je n’ai pas trouvé sur votre blog, auriez vous par hasard la même chose pour l’AFC?
    L’ACM?
    On ne sait jamais 🙂
    Très bonne continuation et à bientôt sur ce très bon blog!

  4. Bravo Claire !

    Comme d’habitue vous nous fascinez par vos très baux articles et très belles astuces sur votre tops adorable blog,
    NB: Je signale que vous n’avez pas mis le bon code de “factoextra” quant au graphe des variables,

    Merci infiniment,

  5. Bonjour,

    merci pour ce bel article, toujours bien expliqué !
    Serait-il possible de corriger le code du package factoextra, qui permet de faire le graphique des variables ?

    Merci !

  6. Bonjour Claire,
    dans l’exemple, le nom des athlètes n’est pas contenu dans une variable, mais en label des lignes. Comment est-il possible de faire de même avec une autre base de données, sachant que l’ID de chaque individu est en colonne 1 ?

    Merci 🙂

  7. Bonjour, pourquoi les résultats des packages “FactoMineR” et “ade4” donnent-ils des résultats différents par exemple pour les coordonnées des individus les signes sont inversés. J’ai fait un calcul manuel en utilisant les formules théoriques et mes calculs concordent plus avec le package “ade4”

    1. Je pense que les résultats doivent simplement être inversés. cela n’a pas d’importance. Si ils sont un peu différents, c’est peut être qu’une standardisation est faite de façon différente. Dans tous les cas, les distances entre les points restent identiques.
      Bonne continuation.

    2. Bonjour à vous, le package FactoMineR prend en compte les NA par défaut dans son analyse, si vous voulez qu’il fasse pareil que ade4, il faut lui ajouter l’argument complete.obs

      Cela est dû à un traitement différent des valeurs manquantes. Alors que *dudi.acm* de ade4 exclu les valeurs manquantes, *MCA* de FactoMineR les considérent, par défaut comme une modalité additionnelle. Pour calculer l’ACM uniquement sur les individus n’ayant pas de valeurs manquantes avec FactoMineR, on aura recours à *complete.cases*

    3. Bonjour à vous,
      Cela est dû à un traitement différent des valeurs manquantes. Alors que *dudi.acm* de ade4 exclu les valeurs manquantes, *MCA* de FactoMineR les considérent, par défaut comme une modalité additionnelle. Pour calculer l’ACM uniquement sur les individus n’ayant pas de valeurs manquantes avec FactoMineR, on aura recours à *complete.cases*

  8. bonjour Claire, c’est toujours super bien expliqué votre blog. Juste une petite erreur dans 4.5.2, l’affichage est bien les variables, mais les commandes sont pour l’affichage des individus. sinon, avec pca de FactoMiner, je n’obtiens qu’une figure de variables, mais pas celle de individus.

  9. Bonjour Claire!

    Merci pour cette explication ! Je suis nouvelle sur R et ce cercle des corrélation est particulièrement approprié je trouve.
    J’ai une petite question. Le package factoextra ne semble pas fonctionner et du coup, je ne peux pas adapter le visuel de la représentation par individus, car il ne reconnait pas la fonction fviz_pca_ind.

    Y’a-t-il un autre moyen d’indiquer à R de faire des catégories, comme il est possible de le faire dans ggplot, par exemple avec des ellipse ?

    Salomé

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *