Qu’est ce que l’ACP ?

Très régulièrement, dans le cadre de ma mission d’appui au sein de l’IDELE on me demande de réaliser (ou d’aider à réaliser) des ACP, mais qu’est ce donc que l’ACP ?

ACP est l’abréviation de “Analyse en Composantes Principales”. C’est un outil de statistique descriptive de la famille des analyses factorielles (ACP, ACM, AFDM…) qui permet de visualiser et d’explorer un jeu de données dit quantitatif multivarié, c’est-à-dire dans lequel les individus sont décrits par plus de 2 variables quantitatives.

Cette analyse est une analyse descriptive, elle demande donc, pour être correctement réalisée et interprétée, une très bonne connaissance des données et du contexte métier de l’étude.

À quoi sert l’ACP ?

Un nuage de points permet de représenter un ensemble d’individus décrits par deux variables quantitatives :

La représentation de 3 variables quantitatives est encore possible, mais beaucoup plus complexe à visualiser et à décrire. Au-delà de 3 variables quantitatives, il est très difficile de visualiser et de décrire les données dans un “hyper-espace” multidimensionnel. L’ACP est un outil qui permet de répondre à cette problématique. Elle permet de passer d’un nuage de points dans un espace à N dimensions (N étant égal au nombre de variables), à une représentation en deux dimensions, (ou éventuellement plusieurs représentations à deux dimensions).

Comment fonctionne l’ACP ?

L’ACP est utilisée pour résumer le plus d’information possible en un nombre limité de nouvelles variables appelées composantes principales (deux ou trois). Ces composantes principales sont une combinaison linéaire des variables de départ, et peuvent être utilisées pour construire des représentations graphiques des données, en perdant le moins possible d’information.

En pratique, l’ACP va rechercher dans les N dimensions un axe pour lequel les observations sont les plus dispersées. Cet axe sera la première composante principale et son perpendiculaire la seconde composante principale. Ces deux composantes permettent de définir un plan : le premier plan de l’ACP qui résume, en deux dimensions, l’information principale contenue dans nos données multivariées. L’ACP définit N-1 composantes principales, dans la majorité des cas la description se fait sur les deux premières composantes principales de l’ACP.

Le plus souvent les résultats de l’ACP sont résumés dans deux représentations graphiques du premier plan de l’ACP : l’une concernant les observations, l’autre les variables, comme celles-ci :

Sur ces deux graphiques, on observe en abscisse la première composante principale (Dim1) et en ordonnée la deuxième composante principale (Dim2).

On utilisera ces deux graphiques pour décrire nos données :

  • Comment se structurent les variables :

    • Quelles sont celles qui vont dans le même sens ?

    • Quelles sont celles qui s’opposent ?

  • Comment se répartissent les individus :

    • Quels sont ceux qui se ressemblent ?

    • Comment se structurent les individus par rapport aux variables ?

On pourra également essayer de donner un sens “métier” aux composantes de l’ACP.

Un exemple d’ACP avec R

Les données

Pour cet exemple, je vais utiliser un jeu de données portant sur des mesures de barymétrie d’agneaux séparés en deux lots. Ces données sont issues de données réelles, mais elles ont été mélangées et ne correspondent donc à aucun agneau réel.

Le tableau ci-dessous montre un exemple des données avec :

  • Numéro: numéro d’identification de l’agneau fictif
  • LOT : numéro de lot (1 ou 2)
  • HG : hauteur au garrot
  • TP : tour de poitrine
  • PT : périmètre thoracique
  • Long : longueur garrot - base de la queue.

Numéro

LOT

HG

TP

PT

Long

21906

1

55.0

58

59

48

21910

1

56.0

58

66

51

21913

1

57.0

60

71

50

21917

1

58.0

62

66

50

21921

1

58.3

62

68

48

Le tableau ci-dessous donne les statistiques élémentaires de chaque variable (moyenne, écart-type, minimum et maximum) :

Barymetrie

Mean

Std.Dev

Min

Max

HG

60.50000

1.663079

55

65

Long

51.13699

2.572909

45

58

PT

67.27397

3.583373

59

76

TP

60.98630

2.502738

47

65

Gardons en tête ces statistiques élémentaires et passons à l’ACP. Dans cet exemple, nous allons l’utiliser pour décrire la répartition des agneaux en fonction de l’ensemble des mesures de barymétrie.

La fonction PCA

Il existe plusieurs fonctions pour réaliser l’ACP dans R. Dans cet exemple, nous allons utiliser la fonction PCA() de FactoMineR. Elle présente l’avantage de centrer et de réduire automatiquement les variables. Cette étape est importante car elle permet que toutes les variables aient un poids identique dans la construction des composantes principales.

library(FactoMineR)
data.pca <- PCA(dataEx, graph = FALSE)

Valeurs propres et pourcentage d’inertie

Pour rappel, le premier objectif de l’ACP est de résumer le plus d’information possible en un nombre limité de nouvelles variables appelées composantes principales (généralement deux ou trois).

La réduction du nombre de variables a pour conséquence la perte d’une part de l’information originale. La dispersion du nuage de points dans les N dimensions originales s’appelle l’inertie, et pour évaluer la quantité d’informations conservées par l’approche ACP, on calcule le pourcentage d’inertie conservé par chacune des composantes principales. Ce pourcentage d’inertie est donné par les valeurs propres (eigenvalue en anglais).

Le tableau ci-dessous donne les valeurs propres (eigenvalue) de chaque composante de l’ACP :

library(flextable)
as.data.frame(data.pca$eig) %>% rownames_to_column( var = "Composante") %>% flextable()

Composante

eigenvalue

percentage of variance

cumulative percentage of variance

comp 1

1.9690656

49.22664

49.22664

comp 2

0.9176851

22.94213

72.16877

comp 3

0.6576955

16.44239

88.61116

comp 4

0.4555538

11.38884

100.00000

Les valeurs propres représentent l’inertie de la composante correspondante. Le pourcentage d’inertie (percentage of variance), correspond au pourcentage d’inertie de chaque composante par rapport au total. Le pourcentage cumulé (cumulative percentage of variance) représente le cumul de ces pourcentages.

L’inertie représentée dans l’ACP est identique à l’inertie des variables initiales. Cependant la fonction PCA() a automatiquement centré et réduit les variables. Ce processus ramène la variance de chaque variable à 1. L’inertie totale des individus est donc égale à 4 (on additionne les variances de chaque variable). On retrouve cette dispersion si on additionne les valeurs propres de l’ACP mais la répartition des variances a changé. Désormais les deux premières composantes portent 72% de l’inertie totale.

Par conséquent, les graphiques en dimension 2, qui seront présentés par la suite, résument 72% de la configuration réelle des données qui se trouvent en dimension 4, ce qui semble déjà un bon résumé des données d’origine. Dans cette analyse, on garde uniquement les premières composantes. Si ce pourcentage n’est pas suffisant on peut ajouter la composante 3 dans l’analyse des résultats. Il existe également des méthodes plus “objectives” pour vous aider à choisir le nombre de composantes à conserver tel que le critère de Kaiser ou la méthode du coude.

Les valeurs propres sont souvent représentées sur un graphique :

library(factoextra)
fviz_eig(data.pca,barfill = c("lightblue3","lightblue3","white","white"), addlabels = TRUE) 

Après avoir choisi le nombre de composantes à conserver, on peut analyser les résultats de l’ACP proprement dits.

Résultats sur les variables

Corrélation variables - composantes

Un premier résultat intéressant concernant les variables est le tableau des corrélations variables-composantes. Ce tableau montre les coefficients de corrélation linéaire entre les variables initiales et les composantes principales. Ces corrélations nous aident à interpréter les composantes et la répartition des individus dans l’espace. Pour simplifier l’analyse seules les 2 premières composantes, retenues pour l’analyse, sont expliquées dans cet exemple.

as.data.frame(data.pca$var$cor[,1:2]) %>% rownames_to_column( var = "Variables") %>% flextable()

Variables

Dim.1

Dim.2

HG

0.6358688

0.5215599

TP

0.8016906

-0.3155215

PT

0.7126971

-0.5530111

Long

0.6434994

0.4901890

Ce tableau de corrélation est à interpréter en parallèle avec le graphique des variables présenté précédemment :

library(flextable)
fviz_pca_var (data.pca,
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Évite le chevauchement de texte
             ) 

Le graphique des variables ci-dessus est également appelé cercle de corrélation. Sur ce graphique les variables sont représentées par des flèches projetées dans un cercle de rayon 1. Lorsque la flèche est proche du bord du cercle, la variable est bien représentée par le plan factoriel. Cette variable est alors bien correlée avec les 2 composantes constituant ce plan. Le cercle permet donc de représenter les corrélations entre les variables et les composantes décrites dans le tableau précédent.

Que peut-on conclure de ces premiers résultats sur les variables ?

La première composante est corrélée positivement avec chacune des 4 variables initiales ce qui signifie que plus un agneau est mesuré avec une valeur élevée dans chacune des 4 mesures plus il a un score élevé sur la première composante et inversement. La deuxième composante est corrélée positivement avec la hauteur au garrot et la longueur garrot-base de la queue, négativement avec les 2 autres variables. Les individus avec un score élevé sur la composante 2 auront une valeur élevée de hauteur au garrot et de longueur garrot-base de la queue mais des valeurs faibles dans les autres variables et inversement. Cette composante oppose donc deux types d’agneaux. D’une manière caricaturale on peut dire que les grands agneaux maigrichons auront des scores élevés sur la deuxième composante et les petits agneaux costauds des scores faibles.

Contribution et Cos2

Pour affiner l’interprétation de l’analyse on peut regarder les contributions et les cosinus carrés fournis dans les résultats de l’ACP.

La contribution donne les contributions des variables à la construction des composantes de l’ACP. Ces contributions sont données en pourcentage (la somme de chaque colonne est égale à 100) et permettent de repérer les variables les plus importantes au niveau de chaque composante. Sans surprise elles sont cohérentes avec les corrélations du paragraphe précédent. Les variables contribuent de manière relativement égales à la première composante. L’ajout de la deuxième composante augmente principalement la contribution de la longueur garrot-base de la queue.

as.data.frame(data.pca$var$contrib[,1:2]) %>% rownames_to_column( var = "Variables") %>% flextable()

Variables

Dim.1

Dim.2

HG

20.53406

29.64250

TP

32.64025

10.84836

PT

25.79584

33.32530

Long

21.02985

26.18384

fviz_pca_var (data.pca, col.var = "contrib",invisible="quanti.sup",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Évite le chevauchement de texte
            ) 

Le cosinus carré donne la qualité de la représentation de chaque variable sur chaque composante. Plus précisément le cosinus carré des deux premières composantes est celui de l’angle formé par le vecteur initial en N dimensions et sa projection dans le plan. Plus le vecteur initial est proche du plan, plus l’angle en question est petit, plus le cosinus carré est proche de 1 (ou de 100 %) et plus la représentation est bonne.

Au contraire, plus le vecteur initial est loin du plan, plus l’angle en question est grand et plus le cosinus carré est proche de 0 (ou de 0 %) : la représentation est alors mauvaise. On utilise les carrés des cosinus plutôt que les cosinus simples parce qu’ils s’additionnent entre les différentes dimensions.

as.data.frame(data.pca$var$cos2[,1:2]) %>% rownames_to_column( var = "Variables") %>% flextable()

Variables

Dim.1

Dim.2

HG

0.4043292

0.27202478

TP

0.6427078

0.09955382

PT

0.5079371

0.30582129

Long

0.4140915

0.24028521

fviz_pca_var (data.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Évite le chevauchement de texte
             ) 

On peut ainsi noter que l’ensemble des variables a une qualité de représentation de plus de 65% dans le plan des composantes 1 et 2 ce qui est un bon résultat.

Résultats sur les individus

Le but de l’étude des individus est de :

  • comprendre la dispersion globale des individus
  • détecter des individus caractéristiques et/ou atypiques

Comme pour les variables, les individus sont caractérisés par leurs coordonnées dans les plans d’ACP, leur contribution à chaque composante et leur cosinus carré.

La dispersion des individus peut être regardée de plusieurs façons. Ici nous allons la regarder en superposant les résultats des variables à celui des individus. Pour cela nous allons créer un biplot. Attention les coordonnées des individus et des variables ne sont pas construites dans le même espace. Par conséquent, dans le biplot, vous devez vous concentrer principalement sur la direction des variables mais pas sur leurs coordonnées.

Globalement, un biplot peut être interprété comme il suit :

Un individu qui se trouve du même côté qu’une variable donnée a une valeur élevée pour cette variable ; un individu qui se trouve sur le côté opposé d’une variable donnée a une faible valeur pour cette variable.

Pour une meilleure description, il est possible d’ajouter des couleurs en fonction des variables sur le graphique. Dans l’exemple ci-dessous la couleur des points varie en fonction de la longueur garrot-base de la queue et la taille en fonction du périmètre thoracique.

fviz_pca_biplot(data.pca, 
                geom.ind = "point",
                pointsize = dataEx$PT,
                pointshape = 21,
                fill.ind = dataEx$Long,
                col.ind ="black",
                col.var = "darkgreen",
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                legend.title = list(fill = "Longueur garrot-base de la queue ",size="Périmètre thoracique")
             )

On observe alors des résultats cohérents avec les précédentes conclusions sur les variables. On retrouve les petits agneaux maigrichons à gauche du graphique et les grands agneaux costauds plutôt à droite. En haut à gauche les agneaux sont plutôt grands et maigrichons et en bas à gauche plutôt petits et costauds.

Comme pour les variables, on peut s’intéresser aux contributions et aux cos2.

Sur le graphique ci-dessous, les individus bien représentés ont une taille de point importante. Les individus les plus contributifs sont de couleur rouge.

fviz_pca_biplot(data.pca, 
                geom.ind = "point",
                pointsize = "cos2",
                pointshape = 21,
                fill.ind = "contrib",
                  col.ind ="black",
                col.var = "darkgreen",
                gradient.cols = c("#00AFBB",  "#FC4E07")
             )

On peut également représenter uniquement les 4 agneaux qui contribuent le plus aux composantes sur le graphique (utile si les individus sont nombreux par exemple).

fviz_pca_biplot (data.pca, select.ind = list (contrib = 4),
               select.var = list (contrib = 4),
               ggtheme = theme_minimal())

On peut ensuite regarder les caractéristiques des agneaux qui contribuent le plus aux composantes 1 et 2. Ces agneaux permettent de décrire plus précisément la répartition des individus par rapport aux variables.

Mcontrib<-t(dataEx[c("21920", "21906" ,"21976" ,"21998"),]) %>% as.data.frame()
Mcontrib$Moyenne_Globale<-colMeans(dataEx) %>% round(2)
rbind(LOT=c("LOT1","LOT1","LOT2","LOT2",NA),Mcontrib) %>% rownames_to_column( var = "Variable") %>% flextable() %>%vline( j = 5, border = fp_border_default(color = "gray"), part = "all")

Variable

21920

21906

21976

21998

Moyenne_Globale

LOT

LOT1

LOT1

LOT2

LOT2

HG

60

55

63

64

60.5

TP

47

58

65

65

60.99

PT

64

59

70

70

67.27

Long

51

48

58

55

51.14

On note que les agneaux 21920 et 21906 sont plutôt situés à gauche de l’ACP et ont des valeurs inférieures à la moyenne globale tandis que les agneaux 21976 et 21998 sont situés à droite de l’ACP et ont des valeurs supérieures à la moyenne globale. On confirme donc nos conclusions sur la répartition des individus avec des petits agneaux maigrichons à gauche du graphique (21920 et 21906) et les grands agneaux costaux plutôt à droite (21976 et 21998).

Une fois ces descriptions réalisées et vérifiées nous pouvons aller un peu plus loin avec l’ACP. Dans le cas de notre exemple nous allons simplement regarder comment nos agneaux se répartissement en fonction d’une variable qualitative à savoir le lot.

fviz_pca_biplot (data.pca,
                 pointsize=3,
                 geom.ind = "point",
                 col.ind = data$LOT[-1], 
                addEllipses = TRUE, 
                palette = "jco",
                col.var = "darkgreen",
                legend.title = "LOT")

On peut conclure que les agneaux du lot1 seront probablement plus petits et maigrichons que les agneaux du lot2 mais le fort chevauchement des ellipses laisse supposer que cette tendance ne sera pas très forte et qu’il sera peut-être difficile de séparer les agneaux des deux lots sur leurs mesures de barymétrie.

Pour conclure sur l’ACP

Les résultats présentés dans ce cas pratique ne sont qu’un exemple de ce que l’on peut faire lorsqu’on réalise une ACP. Il faut retenir que l’ACP est un outil de statistique descriptive. Elle sert à visualiser et décrire un ensemble d’individus caractérisés par plus de deux variables quantitatives en résumant l’information contenue dans les variables à un espace à 2 dimensions.

L’ACP est rarement une fin en soi, les composantes principales sont généralement utilisées à la place des variables d’origine pour réaliser des analyses plus poussées (classification, régression, modèle de prédiction…).

J’espère que cet article vous permettra de mieux comprendre l’ACP dont le principe et l’interprétation peuvent être difficile à appréhender. Si vous souhaitez en savoir plus sur l’ACP et ses cousines (AFC, ACM et classification) le service DATA’STAT de l’IDELE propose une formation “Faire parler ses données grâce au Data mining” plus d’information en cliquant sur ce lien : https://idele.fr/detail-formation/formation-faire-parler-ses-donnees-grace-au-data-mining.