ACP dans R : calcul, visualisation et interprétation

Résumez de nombreuses variables corrélées en quelques dimensions, puis lisez les variables, les individus et le biplot

Un guide pratique de l’analyse en composantes principales (ACP) dans R avec FactoMineR et factoextra : calculez l’ACP avec PCA(), lisez les valeurs propres et le graphique des éboulis, tracez le cercle des corrélations des variables, classez les contributions des variables et le cos2, représentez les individus, construisez le biplot et accédez à chaque résultat avec get_pca_var() / get_pca_ind(). Réalisé sur les données decathlon2.

Date de publication

24 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • L’ACP résume de nombreuses variables numériques corrélées en quelques composantes principales non corrélées qui conservent l’essentiel de la variation — vous pouvez ainsi représenter et interpréter un tableau de grande dimension.
  • Calculez-la avec PCA() de FactoMineR (qui standardise les variables pour vous), puis visualisez tout avec factoextra.
  • Les valeurs propres (get_eigenvalue()) vous indiquent quelle part de variance chaque composante détient ; le graphique des éboulis (fviz_eig()) vous aide à décider combien en conserver.
  • Le cercle des corrélations des variables (fviz_pca_var()) montre quelles variables vont ensemble ; les contributions (fviz_contrib()) et le cos2 (fviz_cos2()) vous indiquent quelles variables pilotent chaque composante et y sont bien représentées.
  • Le graphique des individus (fviz_pca_ind()) positionne les observations ; le biplot (fviz_pca_biplot()) superpose les deux — lisez les directions des variables, pas les positions absolues.
  • Extrayez chaque nombre avec get_pca_var() et get_pca_ind() (coordonnées, cos2, contributions).
Obtenez le livre — Principal Component Methods in R (PDF)

Introduction

L’analyse en composantes principales (ACP) résume et visualise l’information contenue dans un jeu de données décrit par plusieurs variables quantitatives inter-corrélées. Chaque variable est une dimension, et dès que vous en avez plus de trois, un espace multidimensionnel devient impossible à représenter.

L’ACP extrait l’information importante et la ré-exprime sous la forme d’un petit ensemble de nouvelles variables, les composantes principales. Chaque composante est une combinaison linéaire des variables d’origine, et le nombre de composantes est au plus égal au nombre de variables d’origine. L’objectif est de trouver les directions — les composantes principales — selon lesquelles les données varient le plus, puis de conserver les premières. Autrement dit, l’ACP réduit un jeu de données multivarié à deux ou trois composantes que vous pouvez représenter, avec une perte d’information minimale.

Utilisez-la lorsque vous avez de nombreuses mesures numériques corrélées et que vous voulez : repérer des motifs cachés, éliminer le bruit et la redondance, et voir quelles variables évoluent ensemble. L’ACP est particulièrement utile lorsque les variables sont fortement corrélées — la corrélation signifie de la redondance, et la redondance est exactement ce que l’ACP compresse.

Cette leçon ouvre la série Réduction de dimension. Elle utilise FactoMineR pour l’analyse et factoextra pour la visualisation. Si vous voulez spécifiquement la voie base-R, voyez ACP avec prcomp vs princomp ; pour des données catégorielles, passez à l’analyse des correspondances (AC) ou à l’analyse des correspondances multiples (ACM).

Les données

Nous utiliserons le jeu de données decathlon2 de factoextra : les performances d’athlètes lors de deux événements sportifs (Decastar et Jeux olympiques). Il comporte 27 individus (athlètes) décrits par 13 variables.

Tous les individus et variables n’entrent pas dans l’ACP — c’est un choix pédagogique délibéré :

  • Individus actifs (lignes 1:23) : utilisés pour construire les composantes principales.
  • Individus supplémentaires (lignes 24:27) : non utilisés pour construire les composantes — leurs coordonnées sont prédites a posteriori.
  • Variables actives (colonnes 1:10) : les dix résultats d’épreuves utilisés pour construire les composantes.
  • Variables supplémentaires : colonnes 11–12 (rang, points — continues) et colonne 13 (la compétition — une variable catégorielle/facteur, utile plus tard pour la coloration).

Nous commençons par le sous-ensemble actif — lignes 1:23, colonnes 1:10 :

library(factoextra)
data(decathlon2)

# Keep active individuals (rows 1:23) and active variables (cols 1:10)
decathlon2.active <- decathlon2[1:23, 1:10]

# A peek at the first 6 columns of the first 4 athletes
head(decathlon2.active[, 1:6], 4)
        X100m Long.jump Shot.put High.jump X400m X110m.hurdle
SEBRLE  11.04      7.58    14.83      2.07 49.81        14.69
CLAY    10.76      7.40    14.26      1.86 49.37        14.05
BERNARD 11.02      7.23    14.25      1.92 48.93        14.99
YURKOV  11.34      7.09    15.19      2.10 50.42        15.31
NoteStandardisez d’abord — mais PCA() le fait pour vous

L’ACP repose sur des distances, donc les variables aux échelles plus grandes (secondes vs mètres vs points) domineraient. La solution est de mettre chaque variable à l’échelle, à une moyenne de 0 et un écart-type de 1. La fonction de base est scale(), mais PCA() de FactoMineR fixe scale.unit = TRUE par défaut et standardise les données automatiquement — vous n’avez donc pas besoin de les standardiser à la main avant de l’appeler.

Calculer l’ACP

L’outil de référence est PCA() de FactoMineR. Sa forme simplifiée est PCA(X, scale.unit = TRUE, ncp = 5, graph = TRUE) :

  • X — un data frame ; les lignes sont des individus, les colonnes des variables numériques.
  • scale.unit — si TRUE (la valeur par défaut), les variables sont d’abord mises à l’échelle pour avoir une variance unitaire.
  • ncp — combien de dimensions conserver dans les résultats (5 par défaut).
  • graph — si TRUE, les graphiques sont tracés immédiatement ; nous fixons FALSE et les traçons nous-mêmes avec factoextra.

Installez les deux packages une fois, puis lancez l’analyse sur le sous-ensemble actif :

install.packages(c("FactoMineR", "factoextra"))
library(FactoMineR)
library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]

res.pca <- PCA(decathlon2.active, graph = FALSE)

L’objet res.pca est une liste contenant tous les résultats — les valeurs propres, ainsi que les coordonnées, le cos2 et les contributions pour les variables comme pour les individus. Son affichage en montre le menu complet :

library(FactoMineR)
data(decathlon2)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

print(res.pca)
**Results for the Principal Component Analysis (PCA)**
The analysis was performed on 23 individuals, described by 10 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"          

Nous allons décortiquer chacun de ces éléments avec factoextra ci-dessous.

Valeurs propres et graphique des éboulis

Les valeurs propres mesurent quelle part de variance chaque composante principale détient. Elles sont grandes pour les premières composantes et diminuent pour les suivantes — la première composante pointe le long de la direction de variation maximale. Extrayez-les avec get_eigenvalue() :

library(FactoMineR)
library(factoextra)
data(decathlon2)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

eig.val <- get_eigenvalue(res.pca)
eig.val
       eigenvalue variance.percent cumulative.variance.percent
Dim.1   4.1242133        41.242133                    41.24213
Dim.2   1.8385309        18.385309                    59.62744
Dim.3   1.2391403        12.391403                    72.01885
Dim.4   0.8194402         8.194402                    80.21325
Dim.5   0.7015528         7.015528                    87.22878
Dim.6   0.4228828         4.228828                    91.45760
Dim.7   0.3025817         3.025817                    94.48342
Dim.8   0.2744700         2.744700                    97.22812
Dim.9   0.1552169         1.552169                    98.78029
Dim.10  0.1219710         1.219710                   100.00000

Lisez le tableau colonne par colonne :

  • eigenvalue — la variance détenue par chaque composante. Elles totalisent 10 ici (10 variables standardisées, chacune de variance 1).
  • variance.percent — cette valeur propre en part du total. La première composante détient 4.124 / 10 = 41.24% de la variation.
  • cumulative.variance.percent — le total cumulé. Les deux premières composantes ensemble expliquent 41.24% + 18.39% ≈ 59.6% ; les trois premières atteignent environ 72%.

Combien de composantes conserver ? Deux règles courantes :

  • Valeur propre > 1 (la règle de Kaiser) — sur des données standardisées, une valeur propre supérieure à 1 signifie que la composante détient plus de variance qu’une seule variable d’origine, elle vaut donc la peine d’être conservée. Ici, cela désigne les trois premières.
  • Une part de variance cible — conservez suffisamment de composantes pour atteindre, disons, 70% ou 80% du total.

Il n’y a pas de nombre « correct » objectif — cela dépend de votre domaine et de vos données ; en pratique vous examinez les premières composantes à la recherche d’une structure intéressante. Une aide visuelle est le graphique des éboulis : les valeurs propres (en pourcentage de variance) ordonnées de la plus grande à la plus petite, avec fviz_eig() :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))

Scree plot of the decathlon2 PCA showing the percentage of explained variance for each of the ten dimensions, falling from 41 percent on dimension 1 to about 1 percent on dimension 10.

La courbe chute fortement, puis s’aplatit. Vous pourriez raisonnablement vous arrêter à la cinquième composante — les cinq premières détiennent 87% de l’information contenue dans les données.

Graphique des variables

Passons maintenant à la partie la plus utilisée d’une ACP : quelles variables vont ensemble, et lesquelles pilotent chaque composante.

Extrayez les résultats des variables avec get_pca_var() — il renvoie une liste de matrices pour les variables actives (coord = coordonnées, cor = corrélations, cos2 = qualité de représentation, contrib = contributions) :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

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 trois que vous utiliserez le plus :

  • var$coord — les coordonnées des variables, utilisées pour tracer le cercle des corrélations.
  • var$cos2 — la qualité de représentation sur la carte factorielle (elle est égale au carré des coordonnées).
  • var$contrib — la contribution (%) de chaque variable à chaque composante.

Cercle des corrélations

La coordonnée d’une variable sur une composante est sa corrélation avec cette composante, le graphique des variables est donc un cercle des corrélations. Les coordonnées sont :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)
var <- get_pca_var(res.pca)

head(var$coord, 4)
               Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
X100m     -0.8506257 -0.17939806  0.3015564  0.0335732 -0.1944440
Long.jump  0.7941806  0.28085695 -0.1905465 -0.1153896  0.2331567
Shot.put   0.7339127  0.08540412  0.5175978  0.1284684 -0.2488129
High.jump  0.6100840 -0.46521415  0.3300852  0.1445501  0.4027002

Tracez-les avec fviz_pca_var() :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_pca_var(res.pca, col.var = "black")

PCA variable correlation circle for the decathlon2 data: arrows for the ten events drawn from the origin, with running events pointing left and throwing or jumping events pointing right along the first dimension.

Voici le graphique des corrélations des variables. Lisez-le ainsi :

  • Les variables corrélées positivement pointent dans la même direction et se regroupent.
  • Les variables corrélées négativement pointent dans des directions opposées (de part et d’autre de l’origine).
  • La distance à l’origine mesure la qualité de représentation d’une variable : les flèches qui atteignent le cercle sont bien captées par ces deux composantes ; les flèches courtes près du centre ne le sont pas.

Qualité de représentation (cos2)

La qualité de représentation est le cos2 (cosinus carré = carré des coordonnées). La somme du cos2 d’une variable sur toutes les composantes vaut 1 ; si deux composantes la captent parfaitement, son cos2 sur ces deux-là totalise 1 et elle se place sur le cercle.

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)
var <- get_pca_var(res.pca)

head(var$cos2, 4)
              Dim.1       Dim.2      Dim.3      Dim.4      Dim.5
X100m     0.7235641 0.032183664 0.09093628 0.00112716 0.03780845
Long.jump 0.6307229 0.078880629 0.03630798 0.01331475 0.05436203
Shot.put  0.5386279 0.007293864 0.26790749 0.01650412 0.06190783
High.jump 0.3722025 0.216424207 0.10895622 0.02089474 0.16216747

Un corrplot montre d’un coup d’œil le cos2 de chaque variable sur chaque dimension :

library(FactoMineR)
library(factoextra)
library(corrplot)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)
var <- get_pca_var(res.pca)

corrplot(var$cos2, is.corr = FALSE)

A corrplot grid of the cos2 of each decathlon variable across the ten PCA dimensions, with darker, larger circles where a variable is well represented.

Ou bien sommez le cos2 sur les deux premières dimensions sous forme de diagramme en barres avec fviz_cos2() :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

# Total cos2 of variables on Dim.1 and Dim.2
fviz_cos2(res.pca, choice = "var", axes = 1:2)

Bar chart of the total cos2 of the decathlon variables on dimensions 1 and 2, ranked from highest to lowest quality of representation.

Un cos2 élevé signifie que la variable est bien représentée (et se place près du cercle) ; un cos2 faible signifie qu’elle est mal représentée (près du centre) — n’accordez pas trop d’importance à l’endroit où elle tombe. Vous pouvez aussi colorer le cercle des corrélations selon le cos2 pour combiner les deux vues :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)      # avoid text overlap

PCA variable correlation circle coloured by cos2: arrows shading from teal for low quality of representation through gold to orange-red for the best-represented decathlon variables.

Contributions des variables

La contribution est la part (%) de la variance d’une composante qu’une variable explique. Les variables qui sont fortement corrélées à la PC1 et à la PC2 sont les plus importantes pour expliquer les données ; les variables qui ne sont corrélées à aucune composante contribuent peu et pourraient être écartées.

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)
var <- get_pca_var(res.pca)

head(var$contrib, 4)
              Dim.1      Dim.2     Dim.3     Dim.4     Dim.5
X100m     17.544293  1.7505098  7.338659 0.1375524  5.389252
Long.jump 15.293168  4.2904162  2.930094 1.6248594  7.748815
Shot.put  13.060137  0.3967224 21.620432 2.0140727  8.824401
High.jump  9.024811 11.7715838  8.792888 2.5498795 23.115504

Plus la contribution est grande, plus la variable façonne cette composante. Tracez les principaux contributeurs de chaque composante avec fviz_contrib() :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

# Contributions to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)

Two bar charts of variable contributions, to dimension 1 and dimension 2 respectively, each ranking the top ten decathlon events with a red dashed line at the expected average contribution of ten percent.

# Contributions to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)

Two bar charts of variable contributions, to dimension 1 and dimension 2 respectively, each ranking the top ten decathlon events with a red dashed line at the expected average contribution of ten percent.

La ligne pointillée rouge est la contribution moyenne attendue : si toutes les variables contribuaient également, chacune représenterait 1 / 10 = 10%. Une variable au-dessus de la ligne est un contributeur important à cette composante. Ici, X100m, Long.jump et Pole.vault contribuent le plus aux deux premières dimensions. Colorez le cercle des corrélations selon la contribution pour le voir sur la carte :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_pca_var(res.pca, col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))

PCA variable correlation circle coloured by contribution: the longest arrows, for the running and jumping events, shaded orange-red to mark them as the strongest contributors.

Notecos2 vs contribution — ils répondent à des questions différentes

Le cos2 demande « cette variable est-elle bien représentée sur ces axes ? » (qualité). La contribution demande « dans quelle mesure cette variable a-t-elle façonné cet axe ? » (influence). Une variable peut être bien représentée (cos2 élevé) tout en contribuant peu à une composante donnée, et inversement — lisez les deux.

Description des dimensions

Pour obtenir les variables les plus significativement associées à chaque composante (triées par la p-value de la corrélation), utilisez dimdesc() de FactoMineR :

library(FactoMineR)
data(decathlon2)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

res.desc <- dimdesc(res.pca, axes = c(1, 2), proba = 0.05)

# Variables most associated with dimension 1
res.desc$Dim.1

Link between the variable and the continuous variables (R-square)
=================================================================================
             correlation      p.value
Long.jump      0.7941806 6.059893e-06
Discus         0.7432090 4.842563e-05
Shot.put       0.7339127 6.723102e-05
High.jump      0.6100840 1.993677e-03
Javeline       0.4282266 4.149192e-02
X400m         -0.7016034 1.910387e-04
X110m.hurdle  -0.7641252 2.195812e-05
X100m         -0.8506257 2.727129e-07

$quanti contient les résultats des variables quantitatives, triés par la p-value de la corrélation — une lecture rapide et objective de ce que chaque dimension signifie.

Graphique des individus

Les individus sont les athlètes. Extrayez leurs résultats avec get_pca_ind() — même structure que les variables (coord, cos2, contrib) :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

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"

Tracez les individus avec fviz_pca_ind(), colorés selon leur cos2 afin de voir quels athlètes sont bien représentés :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_pca_ind(res.pca, col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)      # avoid label overlap

PCA individuals factor map of the 23 athletes, points and labels coloured by cos2 from teal for low to orange-red for high quality of representation on the first two dimensions.

Les individus proches les uns des autres se ressemblent. Comme pour les variables, un cos2 élevé signifie que l’individu est bien représenté sur ces deux dimensions.

Les individus contribuent eux aussi aux composantes. Le même fviz_contrib() indique quels athlètes façonnent les deux premières dimensions, avec choice = "ind" :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

# Contribution of individuals to Dim.1 and Dim.2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)

Bar chart of the contribution of each of the 23 athletes to dimensions 1 and 2 of the decathlon2 PCA, ranked from highest to lowest, with a red dashed line at the expected average contribution.

Les athlètes au-dessus de la ligne pointillée rouge pèsent le plus sur les deux premières composantes — généralement les performeurs extrêmes situés loin de l’origine sur la carte des individus.

Colorer les individus par groupe

Une variable facteur peut colorer les individus par groupes, avec des ellipses de concentration. Le sous-ensemble decathlon2.active n’a pas de variable de regroupement, nous le démontrerons donc sur les données intégrées iris, en utilisant Species. Calculez d’abord l’ACP (en écartant la colonne non numérique Species), puis tracez :

library(FactoMineR)
library(factoextra)
data(iris)

# Drop the Species column (index 5) before the PCA
iris.pca <- PCA(iris[, -5], graph = FALSE)

fviz_pca_ind(iris.pca,
             geom.ind = "point",       # points only, no labels
             col.ind = iris$Species,   # colour by species
             palette = "jco",          # colourblind-safe journal palette
             addEllipses = TRUE,        # concentration ellipses
             legend.title = "Species")

PCA individuals plot of the iris data with the three species coloured by a colourblind-safe journal palette and a concentration ellipse drawn around each group; setosa separates cleanly from versicolor and virginica.

setosa se sépare nettement ; versicolor et virginica se chevauchent un peu. Passez à des ellipses de confiance avec ellipse.type = "confidence", ou retirez le point moyen du groupe avec mean.point = FALSE.

Le biplot

Le biplot superpose les individus et les variables sur un même graphique avec fviz_pca_biplot() :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#3a86d4",   # variables
                col.ind = "#696969")   # individuals

PCA biplot of the decathlon2 data: grey athlete points with blue variable arrows overlaid, showing each athlete positioned relative to the event vectors.

Un biplot est surtout utile avec un nombre modeste de variables et d’individus — sinon c’est un enchevêtrement. Et comme les individus et les variables ne sont pas à la même échelle, lisez la direction des flèches de variables, pas les positions absolues :

  • Un individu du même côté qu’une variable a une valeur élevée pour celle-ci.
  • Un individu du côté opposé a une valeur faible pour celle-ci.

Un biplot plus riche colore les individus par groupe et trace les variables dans une couleur contrastée — ici sur iris :

library(FactoMineR)
library(factoextra)
data(iris)
iris.pca <- PCA(iris[, -5], graph = FALSE)

fviz_pca_biplot(iris.pca,
                col.ind = iris$Species, palette = "jco",
                addEllipses = TRUE, label = "var",
                col.var = "black", repel = TRUE,
                legend.title = "Species")

PCA biplot of the iris data with individuals coloured by species using a journal palette, concentration ellipses per species, and the four flower-measurement variables drawn as black labelled arrows.

Éléments supplémentaires

Jusqu’ici les composantes étaient construites à partir des seules lignes et colonnes actives. Les individus et variables supplémentaires ne servent pas à construire les composantes — ils sont projetés sur la carte finie a posteriori, prédits à partir de l’analyse active. Cela vous permet de superposer une information supplémentaire (quelques athlètes écartés, le rang et les points, la compétition qu’ils ont disputée) sans la laisser déformer les axes.

Déclarez les trois types lorsque vous appelez PCA(), sur l’ensemble des données decathlon2 :

library(FactoMineR)
library(factoextra)
data(decathlon2)

# Active = rows 1:23, cols 1:10 (set implicitly).
# Supplementary individuals (rows 24:27), continuous vars Rank/Points (11:12),
# and the qualitative Competition factor (col 13).
res.pca <- PCA(decathlon2,
               ind.sup = 24:27,
               quanti.sup = 11:12,
               quali.sup = 13,
               graph = FALSE)

# Predicted coordinates of the supplementary individuals
res.pca$ind.sup$coord
             Dim.1       Dim.2      Dim.3      Dim.4       Dim.5
KARPOV   0.7947206  0.77951227 -1.6330203  1.7242283 -0.75070396
WARNERS -0.3864645 -0.12159237 -1.7387332 -0.7063341 -0.03230011
Nool    -0.5591306  1.97748871 -0.4830358 -2.2784526 -0.25461493
Drews   -1.1092038  0.01741477 -3.0488182 -1.5343468 -0.32642192

L’analyse active est inchangée — les composantes restent celles que définissent les 23 athlètes actifs et les 10 épreuves. Les quatre athlètes supplémentaires se placent simplement là où le modèle le prédit. Colorez les individus selon le facteur supplémentaire Competition avec habillage = 13 :

library(FactoMineR)
library(factoextra)
data(decathlon2)
res.pca <- PCA(decathlon2,
               ind.sup = 24:27, quanti.sup = 11:12, quali.sup = 13,
               graph = FALSE)

fviz_pca_ind(res.pca, habillage = 13,
             addEllipses = FALSE,
             palette = "jco",        # colourblind-safe journal palette
             repel = TRUE)

PCA individuals factor map of the decathlon2 data with athletes coloured by the supplementary Competition factor, Decastar versus Olympic Games, using a journal palette; the Olympic-Games group sits further right along dimension 1.

Chaque athlète est projeté dans l’espace des composantes que les lignes et colonnes actives ont déjà défini, puis coloré selon le facteur supplémentaire Competition (Decastar vs Jeux olympiques) via habillage = 13. Le groupe Jeux olympiques se situe à une PC1 plus élevée que Decastar (moyennes de groupe PC1 ≈ +1.23 vs −1.34), donc les mêmes athlètes ont mieux performé aux Jeux olympiques — une lecture nette d’un effet qui n’a jamais façonné les axes.

Les variables supplémentaires ne sont pas tracées sur la carte des variables, mais leurs coordonnées sont leur corrélation avec chaque composante :

library(FactoMineR)
data(decathlon2)
res.pca <- PCA(decathlon2, ind.sup = 24:27, quanti.sup = 11:12, quali.sup = 13, graph = FALSE)

# Supplementary quantitative variables: their correlation with each component
res.pca$quanti.sup$coord
            Dim.1       Dim.2      Dim.3       Dim.4       Dim.5
Rank   -0.7014777 -0.24519443 -0.1834294  0.05575186 -0.07382647
Points  0.9637075  0.07768262  0.1580225 -0.16623092 -0.03114711

Sur Dim.1, Points corrèle à r = 0.96 et Rank à r = −0.70 : le score total du décathlon se projette presque parfaitement sur la PC1, et un meilleur rang final (plus bas) va de pair avec une PC1 plus élevée. La PC1 est donc l’axe de performance globale — confirmé par deux variables qui n’ont jamais aidé à construire les composantes.

Accéder aux résultats

Tout ce qui précède est sorti de deux fonctions d’extraction — gardez-les sous la main :

library(FactoMineR)
library(factoextra)
res.pca <- PCA(decathlon2[1:23, 1:10], graph = FALSE)

var <- get_pca_var(res.pca)   # variable results
ind <- get_pca_ind(res.pca)   # individual results

# Variable coordinates / cos2 / contributions
head(var$coord, 2)
               Dim.1      Dim.2      Dim.3      Dim.4      Dim.5
X100m     -0.8506257 -0.1793981  0.3015564  0.0335732 -0.1944440
Long.jump  0.7941806  0.2808570 -0.1905465 -0.1153896  0.2331567
head(var$cos2, 2)
              Dim.1      Dim.2      Dim.3      Dim.4      Dim.5
X100m     0.7235641 0.03218366 0.09093628 0.00112716 0.03780845
Long.jump 0.6307229 0.07888063 0.03630798 0.01331475 0.05436203
head(var$contrib, 2)
             Dim.1    Dim.2    Dim.3     Dim.4    Dim.5
X100m     17.54429 1.750510 7.338659 0.1375524 5.389252
Long.jump 15.29317 4.290416 2.930094 1.6248594 7.748815
  • get_eigenvalue(res.pca) — valeurs propres + pourcentages de variance.
  • get_pca_var(res.pca)coord, cor, cos2, contrib pour les variables.
  • get_pca_ind(res.pca)coord, cos2, contrib pour les individus.

Pour gérer les éléments supplémentaires (prédire leurs coordonnées sans les laisser façonner les composantes), passez leurs indices à PCA() : PCA(decathlon2, ind.sup = 24:27, quanti.sup = 11:12, quali.sup = 13). La variable qualitative supplémentaire (la compétition) devient alors un groupe tout prêt pour colorer les individus via habillage = 13.

L’ACP repose sur la décomposition en valeurs propres de la matrice de corrélation \(R\) des variables standardisées (de façon équivalente, la décomposition en valeurs singulières de la matrice de données mise à l’échelle).

Pour un jeu de données à \(p\) variables, \(R\) est la matrice \(p \times p\) des corrélations deux à deux. Résoudre

\[ R\,v_k = \lambda_k\,v_k \]

donne \(p\) paires valeur propre–vecteur propre. Chaque vecteur propre \(v_k\) est une direction principale (les poids, ou loadings, qui combinent les variables d’origine), et sa valeur propre \(\lambda_k\) est la variance captée le long de cette direction. Les composantes sont triées de sorte que \(\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_p\), et comme les variables sont standardisées,

\[ \sum_{k=1}^{p} \lambda_k = p , \]

donc chaque valeur propre divisée par \(p\) est la part de variance totale que cette composante explique — exactement la colonne variance.percent. Le score d’un individu sur la composante \(k\) est la projection de sa ligne standardisée sur \(v_k\) ; le cos2 d’une variable sur une composante est le carré de la corrélation entre elles, et ces valeurs somment à 1 sur l’ensemble des composantes. Voilà toute la machine : faire pivoter les axes sur les directions de plus grande variance, classées selon la part de variance que chacune détient.

Essayez en direct

Lancez l’analyse dans votre navigateur — aucune installation nécessaire. Essayez de remplacer par un autre jeu de données numérique intégré (par ex. mtcars), ou de colorer les variables par "contrib" plutôt que par "cos2", puis relancez et regardez les graphiques se mettre à jour.

🟢 Avec un agent IA

Vous avez vos propres données multivariées ? Demandez à Prova « lance une ACP sur mes données, dis-moi combien de composantes conserver, et lesquelles de mes variables pilotent chacune. » — elle répond avec du code R que vous pouvez exécuter sur votre jeu de données, puis vous aide à lire le graphique des éboulis, le cercle des corrélations et les contributions. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Vous avez oublié de standardiser, et une variable domine. Si une seule variable à grande échelle semble définir la PC1, vous avez mal mis à l’échelle. Avec PCA(), cela arrive rarement — scale.unit = TRUE est la valeur par défaut — mais si vous utilisez prcomp() à la place, passez scale. = TRUE. Des unités mélangées (secondes, mètres, points) doivent être standardisées.
  • Vous ne savez pas si une variable est « active » ou « supplémentaire ». Les variables actives construisent les composantes ; les supplémentaires ne sont projetées qu’après coup et n’influencent jamais les axes. Décidez dès le départ, et passez les indices supplémentaires via quanti.sup / quali.sup / ind.sup afin qu’ils ne se glissent pas dans l’analyse.
  • Vous n’arrivez pas à décider combien de composantes conserver. Il n’y a pas de règle unique. Combinez le seuil valeur propre > 1 (sur données standardisées), une variance cible (par ex. 70–80% cumulés), et le coude du graphique des éboulis. Pour ces données, les trois premières composantes (72%) ou cinq (87%) sont toutes deux défendables.
  • Vous lisez le cos2 et la contribution comme une même chose. Ce n’en est pas une. Le cos2 = qualité de représentation (la variable est-elle bien montrée sur ces axes ?) ; la contribution = influence (dans quelle mesure a-t-elle façonné l’axe ?). Une variable peut obtenir un score élevé sur l’une et faible sur l’autre.

Questions fréquentes

L’ACP est une méthode non supervisée qui résume de nombreuses variables numériques corrélées en quelques composantes principales non corrélées — de nouvelles variables qui sont des combinaisons linéaires des variables d’origine, ordonnées de sorte que la première détienne le plus de variance. Elle réduit la dimensionnalité (vous pouvez représenter 2–3 composantes au lieu de dizaines de variables) tout en conservant l’essentiel de l’information, ce qui rend faciles à voir les motifs, la redondance et les variables corrélées.

Sur un biplot, concentrez-vous sur la direction des flèches de variables, pas sur les positions absolues (les individus et les variables ne sont pas à la même échelle). Un individu du même côté qu’une flèche de variable a une valeur élevée pour cette variable ; un individu du côté opposé a une valeur faible. Des flèches pointant dans la même direction marquent des variables corrélées positivement ; des directions opposées marquent des variables corrélées négativement. Construisez-le avec fviz_pca_biplot(res.pca).

Il n’y a pas de règle objective, alors combinez les signaux. La règle de Kaiser conserve les composantes dont la valeur propre > 1 (valable uniquement sur données standardisées). Sinon, conservez suffisamment de composantes pour atteindre une variance cumulée cible (souvent 70–80%). Le graphique des éboulis (fviz_eig()) aide : cherchez le coude au-delà duquel des composantes supplémentaires n’apportent que peu. En pratique, vous conservez les premières et vérifiez qu’elles présentent une structure interprétable.

Le cos2 (cosinus carré) est la qualité de représentation d’une variable ou d’un individu sur une composante — un cos2 élevé signifie qu’il est bien montré sur cet axe (près du cercle des corrélations) ; il somme à 1 sur l’ensemble des composantes. La contribution est le pourcentage de la variance d’une composante qu’un élément explique — son influence sur cet axe. Le cos2 répond à « est-il bien représenté ? » ; la contribution répond à « dans quelle mesure a-t-il façonné cet axe ? ». Lisez les deux avec fviz_cos2() et fviz_contrib().

L’ACP est une technique descriptive : elle fait pivoter les axes pour capter le maximum de variance et ne fait aucune hypothèse sur un modèle sous-jacent — les composantes ne sont que des sommes pondérées des variables observées. L’analyse factorielle exploratoire (AFE) suppose que des facteurs latents génèrent les variables observées plus une erreur unique, et estime ce modèle. Utilisez l’ACP pour résumer et visualiser ; utilisez l’analyse factorielle pour tester une hypothèse de structure latente. Voyez l’analyse factorielle.

Les lignes et variables actives construisent les composantes principales ; les éléments supplémentaires sont projetés sur la carte finie a posteriori et n’influencent jamais les axes. Utilisez-les pour superposer une information supplémentaire — des observations écartées, ou des variables que vous voulez relier aux composantes sans les intégrer au calcul des composantes. Passez leurs indices à PCA() : ind.sup pour les individus, quanti.sup pour les variables continues, quali.sup pour un facteur catégoriel (pratique pour la coloration via habillage).

Testez vos connaissances

Lancez une ACP sur les quatre mesures numériques du jeu de données intégré iris (écartez la colonne Species ). Affichez les valeurs propres, tracez le graphique des éboulis, et tracez le cercle des corrélations des variables coloré selon la contribution.

Écartez la colonne facteur avec iris[, -5], passez-la à PCA(..., graph = FALSE), puis utilisez get_eigenvalue(), fviz_eig() et fviz_pca_var(..., col.var = "contrib").

library(FactoMineR)
library(factoextra)

# Numeric measurements only
iris.pca <- PCA(iris[, -5], graph = FALSE)

# Eigenvalues + scree plot
get_eigenvalue(iris.pca)
fviz_eig(iris.pca, addlabels = TRUE)

# Variable correlation circle, coloured by contribution
fviz_pca_var(iris.pca, col.var = "contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)

La première composante capte l’essentiel de la variance et est pilotée par la longueur des pétales, la largeur des pétales et la longueur des sépales, qui évoluent ensemble ; la largeur des sépales pointe dans l’autre sens.

Vérification rapide. La flèche d’une variable sur le cercle des corrélations est courte et se situe près du centre. Que vous dit cela sur son cos2, et quelle importance devez-vous accorder à sa position ?

Une flèche courte près du centre signifie un cos2 faible — la variable est mal représentée sur ces deux dimensions. Ne sur-interprétez pas l’endroit où elle tombe ; elle serait mieux montrée par d’autres composantes (ou nécessite plus de deux dimensions pour être captée).

Conclusion

Vous avez calculé l’ACP avec PCA(), lu les valeurs propres et le graphique des éboulis pour estimer combien de composantes conserver, interprété les variables à travers le cercle des corrélations, leurs contributions et le cos2, tracé les individus et le biplot, et extrait chaque nombre avec get_pca_var() et get_pca_ind(). L’ACP est le fondement de la réduction de dimension pour les données numériques. Pour les fonctions base-R, poursuivez avec prcomp vs princomp ; pour des données catégorielles, passez à l’ analyse des correspondances et à l’ analyse des correspondances multiples.

Leçons connexes

Vous préférez un livre ? Principal Component Methods in R est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Réduction de dimension en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : chaque figure a été produite par le code montré — modifiez n’importe quel bloc et Exécutez, et le bac à sable + l’exercice se relancent en direct dans votre navigateur. The runtime is the judge.

Références

  • Kaiser, H. F. (1961). A note on Guttman’s lower bound for the number of common factors. British Journal of Statistical Psychology, 14, 1–2.
  • Jolliffe, I. T. (2002). Principal Component Analysis, 2nd ed. Springer.
  • Abdi, H., & Williams, L. J. (2010). Principal component analysis. Wiley Interdisciplinary Reviews: Computational Statistics, 2(4), 433–459.
  • Husson, F., Lê, S., & Pagès, J. (2017). Exploratory Multivariate Analysis by Example Using R, 2nd ed. CRC Press.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {ACP dans R : calcul, visualisation et interprétation},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/dimension-reduction/principal-component-analysis},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“ACP dans R : calcul, visualisation et interprétation.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/dimension-reduction/principal-component-analysis.