ACP avec R : prcomp vs princomp

Choisissez la bonne fonction d’ACP, comparez leurs sorties et standardisez avant de lancer l’analyse

Un guide pratique des fonctions d’ACP de R : prcomp() (SVD), princomp() (spectrale/eigen), et PCA() de FactoMineR. Voyez comment leurs sorties s’alignent, pourquoi prcomp() est la valeur par défaut à privilégier, quand le diviseur n vs n-1 et les inversions de signe arbitraires comptent, plus dudi.pca() d’ade4, et comment visualiser un objet prcomp avec factoextra sur un exemple de décathlon travaillé.

Date de publication

24 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • R fournit deux fonctions d’ACP de base : prcomp() (décomposition en valeurs singulières, SVD) et princomp() (décomposition spectrale/eigen). PCA() de FactoMineR est une troisième option plus riche, et dudi.pca() d’ade4 une quatrième (les mêmes valeurs propres, une sortie au goût écologique).
  • prcomp() est la valeur par défaut à privilégier — la SVD qu’elle utilise offre une précision numérique légèrement meilleure et elle gère le cas n < p (plus de variables que d’observations) que princomp() refuse.
  • Standardisez toujours, sauf si vos variables sont déjà à la même échelle : prcomp(x, scale = TRUE) (ou princomp(x, cor = TRUE)). Sans cela, la variable à forte variance domine.
  • Leurs sorties portent des noms différentsprcomp()$rotation/$x sont princomp()$loadings/$scores — mais elles transportent par ailleurs la même information.
  • Deux différences anodines déroutent les utilisateurs : les inversions de signe arbitraires (un vecteur propre et son opposé sont tous deux valides) et le diviseur n vs n-1 (princomp divise par n, prcomp par n-1) — ni l’une ni l’autre ne change votre interprétation.
  • Visualisez n’importe quel objet d’ACP avec factoextra : fviz_eig(), fviz_pca_var(), fviz_pca_biplot().
Obtenez le livre — Principal Component Methods in R (PDF)

Introduction

Vous vous installez pour lancer une analyse en composantes principales avec R et vous butez aussitôt sur un choix : appelez-vous prcomp(), princomp(), ou PCA() de FactoMineR ? Toutes font de l’ACP — résumer de nombreuses variables corrélées en quelques composantes principales qui capturent l’essentiel de la variation — mais elles diffèrent par l’algorithme employé, le nom de leurs sorties, et une poignée de conventions qui déroutent les utilisateurs débutants.

Cette leçon tranche la question. Nous comparons les deux fonctions de base côte à côte sur un exemple travaillé, montrons qu’elles renvoient la même analyse (au signe près), expliquons les deux vraies différences (le diviseur n vs n-1 et les inversions de signe arbitraires), et vous donnons une recommandation claire. Nous concluons sur la place de PCA() de FactoMineR et la façon de visualiser chacune d’elles avec factoextra.

Nouveau dans l’ACP elle-même ? Commencez par ACP — Analyse en composantes principales pour le concept, les valeurs propres, et la lecture d’un biplot ; cette page porte sur quelle fonction appeler. Elle fait partie du guide Réduction de dimension.

Les deux méthodes générales

Il existe deux façons générales de calculer une ACP, et les fonctions de R se répartissent selon cette ligne :

  • La décomposition spectrale examine les covariances / corrélations entre variables. C’est ce qu’utilise princomp() (elle factorise la matrice de covariance ou de corrélation en valeurs propres et vecteurs propres). C’est la fonction la plus ancienne, compatible S-PLUS.
  • La décomposition en valeurs singulières (SVD) travaille directement sur la matrice de données (centrée, optionnellement standardisée) — en examinant les relations entre individus. C’est ce qu’utilisent prcomp() et PCA() [FactoMineR].
NoteLaquelle devrais-je utiliser ?

D’après l’aide de R, la SVD offre une précision numérique légèrement meilleure, donc prcomp() est à privilégier par rapport à princomp(). prcomp() fonctionne aussi quand vous avez plus de variables que d’observations (n < p), un cas où princomp() échoue. Ne recourez à princomp() que pour la compatibilité avec d’anciens codes S-PLUS.

Les deux fonctions, côte à côte

Les appels simplifiés sont presque identiques — la différence tient au nom de l’argument de standardisation :

prcomp(x, scale = FALSE)              # SVD;  scale = TRUE to standardize

princomp(x, cor = FALSE, scores = TRUE)   # spectral;  cor = TRUE to standardize
  • prcomp(x, scale = ...)x est une matrice ou un data frame numérique ; scale = TRUE met chaque variable à l’échelle de variance unitaire avant l’analyse (le centrage est toujours effectué).
  • princomp(x, cor = ...)cor = TRUE lance l’analyse sur la matrice de corrélation (c’est-à-dire centrée et standardisée) ; scores = TRUE renvoie aussi les coordonnées de chaque individu.

Les deux fonctions renvoient la même information sous des noms différents. Gardez ce tableau sous la main :

prcomp() princomp() Ce que c’est
sdev sdev écarts-types des composantes principales (√valeur propre)
rotation loadings les saturations des variables — les colonnes sont les vecteurs propres
center center les moyennes des variables soustraites
scale scale la mise à l’échelle appliquée à chaque variable
x scores les coordonnées des individus sur les composantes

Les données

Nous utiliserons le jeu de données decathlon2 de factoextra : les performances d’athlètes sur les dix épreuves du décathlon. Nous conservons les lignes actives (1–23) et les dix colonnes d’épreuves (1–10) pour l’analyse. Chargez-le et prévisualisez les premières épreuves :

library(factoextra)
data(decathlon2)

# Active individuals (rows) and active variables (event columns)
decathlon2.active <- decathlon2[1:23, 1:10]
head(decathlon2.active[, 1:6])
          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
ZSIVOCZKY 11.13      7.30    13.48      2.01 48.62        14.17
McMULLEN  10.83      7.31    13.76      2.13 49.91        14.38

Les épreuves sont à des échelles très différentesX100m tourne autour de 11 (secondes), Shot.put autour de 15 (mètres), X400m autour de 49. Une ACP sur les covariances brutes laisserait les épreuves à forte variance dominer, donc nous standardisons (ACP fondée sur la corrélation) dans chaque appel ci-dessous.

Lancez les deux, puis comparez

Lancez prcomp() avec scale = TRUE et princomp() avec cor = TRUE — les réglages de « standardisation » appariés — afin que les deux calculent la même ACP fondée sur la corrélation :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]

# SVD route (preferred)
res.prcomp  <- prcomp(decathlon2.active, scale = TRUE)

# Spectral route
res.princomp <- princomp(decathlon2.active, cor = TRUE)

Écarts-types (et valeurs propres)

La première chose à comparer est sdev — l’écart-type de chaque composante. Son carré est la valeur propre, la quantité de variance que la composante capture. Sur des données standardisées, les deux fonctions s’accordent à la précision affichée :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp   <- prcomp(decathlon2.active, scale = TRUE)
res.princomp <- princomp(decathlon2.active, cor = TRUE)

round(res.prcomp$sdev, 3)        # prcomp
 [1] 2.031 1.356 1.113 0.905 0.838 0.650 0.550 0.524 0.394 0.349
round(res.princomp$sdev, 3)      # princomp
 Comp.1  Comp.2  Comp.3  Comp.4  Comp.5  Comp.6  Comp.7  Comp.8  Comp.9 Comp.10 
  2.031   1.356   1.113   0.905   0.838   0.650   0.550   0.524   0.394   0.349 

Les deux rapportent les mêmes écarts-types de composantes (2.031, 1.356, 1.113, …). Élever le premier au carré donne la première valeur propre, \(2.031^2 \approx 4.124\) — la composante de tête capture environ 41 % de la variance totale. factoextra::get_eigenvalue() transforme un objet prcomp en ce tableau de valeurs propres familier :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp <- prcomp(decathlon2.active, scale = TRUE)

# Eigenvalue + % variance + cumulative %
get_eigenvalue(res.prcomp)
       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

Saturations (rotation)

Comparez ensuite les saturations des variablesrotation pour prcomp(), loadings pour princomp(). Ce sont les vecteurs propres : combien chaque épreuve contribue à chaque composante. Regardez les deux premières colonnes :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp   <- prcomp(decathlon2.active, scale = TRUE)
res.princomp <- princomp(decathlon2.active, cor = TRUE)

round(res.prcomp$rotation[, 1:2], 3)             # prcomp: rotation
                PC1    PC2
X100m        -0.419 -0.132
Long.jump     0.391  0.207
Shot.put      0.361  0.063
High.jump     0.300 -0.343
X400m        -0.345  0.214
X110m.hurdle -0.376 -0.018
Discus        0.366  0.037
Pole.vault   -0.107  0.595
Javeline      0.211  0.285
X1500m        0.002  0.579
round(unclass(res.princomp$loadings)[, 1:2], 3)  # princomp: loadings
             Comp.1 Comp.2
X100m         0.419  0.132
Long.jump    -0.391 -0.207
Shot.put     -0.361 -0.063
High.jump    -0.300  0.343
X400m         0.345 -0.214
X110m.hurdle  0.376  0.018
Discus       -0.366 -0.037
Pole.vault    0.107 -0.595
Javeline     -0.211 -0.285
X1500m       -0.002 -0.579

Les magnitudes sont identiquesX100m sature à ±0.419 sur PC1, Long.jump à ±0.391, et ainsi de suite. Mais les signes sont inversés entre les deux fonctions : là où prcomp() donne X100m = -0.419, princomp() donne +0.419. C’est normal et anodin — un vecteur propre et son opposé pointent le long du même axe, donc les deux sont des solutions d’ACP valides (plus de détails dans Problèmes courants). Ce qui compte, c’est le motif : les épreuves de course se regroupent d’un côté, les épreuves de lancer/saut de l’autre.

Scores (les coordonnées des individus)

Enfin les coordonnées des individusx pour prcomp(), scores pour princomp(). Même histoire : magnitudes égales, signes inversés (parce que les saturations se sont inversées) :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp   <- prcomp(decathlon2.active, scale = TRUE)
res.princomp <- princomp(decathlon2.active, cor = TRUE)

round(res.prcomp$x[1:3, 1:2], 3)        # prcomp: x
           PC1   PC2
SEBRLE   0.191 1.554
CLAY     0.790 2.420
BERNARD -1.329 1.612
round(res.princomp$scores[1:3, 1:2], 3) # princomp: scores
        Comp.1 Comp.2
SEBRLE  -0.196 -1.589
CLAY    -0.808 -2.475
BERNARD  1.359 -1.648

En résumé : sur les mêmes données standardisées, prcomp() et princomp() renvoient la même analyse — mêmes valeurs propres, mêmes magnitudes de saturation, mêmes magnitudes de score — ne différant que par un signe arbitraire et (sur le chemin de la covariance) une petite convention de diviseur. Votre interprétation n’en est pas affectée.

Standardisez toujours (scale. / cor)

L’argument le plus lourd de conséquences est de savoir si vous standardisez. L’ACP est pilotée par la variance, donc une variable mesurée dans de grandes unités (comme des décomptes Assault, ou un salaire en dollars) dominera, sauf si vous mettez d’abord chaque variable sur un pied d’égalité.

  • Avec prcomp() : posez scale = TRUE.
  • Avec princomp() : posez cor = TRUE (analysez la matrice de corrélation).

Par défaut, les deux ne font aucune mise à l’échelle (scale = FALSE, cor = FALSE), ce qui réalise l’ACP sur les covariances brutes. N’utilisez la forme non standardisée que lorsque vos variables sont déjà à la même échelle comparable (par exemple toutes dans la même unité physique). En cas de doute, standardisez — c’est la valeur par défaut sûre et conventionnelle pour des données aux unités mélangées.

Pourquoi prcomp() est à privilégier

Trois raisons concrètes de faire de prcomp() votre choix par défaut :

  1. Précision numérique. La SVD factorise directement la matrice de données plutôt que de former et de décomposer la matrice de covariance, ce qui est numériquement mieux conditionné. L’aide de R elle-même recommande prcomp() pour cette raison.
  2. Elle gère le cas n < p. Quand vous avez plus de variables que d’observations (fréquent en génomique, spectroscopie, données d’enquête), princomp() s’arrête avec “cannot use ‘princomp’ on a data matrix with more columns than rows”. prcomp() tourne sans problème.
  3. scale = TRUE est explicite. L’argument scale se lit plus clairement que le cor de princomp(), et l’objet prcomp est ce qu’attendent factoextra, ggbiplot et la plupart des tutoriels.

princomp() reste surtout utile pour la compatibilité avec d’anciens codes S-PLUS qui dépendent de ses noms de sortie et de sa convention de diviseur n.

Où s’inscrit PCA() de FactoMineR

Pour l’analyse multivariée au quotidien, PCA() de FactoMineR est l’option la plus complète. Elle utilise aussi la SVD (donc ses valeurs propres correspondent à celles de prcomp()), mais elle ajoute beaucoup par-dessus :

  • Sortie plus riche d’emblée — coordonnées, contributions, et cos2 (qualité de représentation) pour les variables comme pour les individus, prêtes à interpréter.
  • Individus et variables supplémentaires — prédit les coordonnées de lignes mises de côté ou de variables quantitatives/qualitatives supplémentaires en un seul appel.
  • Elle se marie naturellement avec factoextra pour des graphiques prêts à publier.

Ses valeurs propres s’accordent avec celles des fonctions de base — la même analyse, plus de commodité :

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

res.PCA <- PCA(decathlon2.active, graph = FALSE)  # SVD; standardizes by default
head(res.PCA$eig, 3)                              # same eigenvalues as prcomp
       eigenvalue percentage of variance cumulative percentage of variance
comp 1   4.124213               41.24213                          41.24213
comp 2   1.838531               18.38531                          59.62744
comp 3   1.239140               12.39140                          72.01885

Par défaut, PCA() standardise les variables (ACP de corrélation), donc vous ne passez pas d’argument scale. La première valeur propre est de nouveau ~4.124 (41.2 % de la variance) — identique à prcomp(scale = TRUE). Pour le flux de travail complet FactoMineR + factoextra, voir ACP — Analyse en composantes principales.

Visualisez un objet prcomp avec factoextra

factoextra dessine des graphiques d’ACP élégants, fondés sur ggplot2, à partir d’un objet prcomp directement — pas besoin d’extraire quoi que ce soit à la main. Commencez par le graphique des éboulis, qui montre le pourcentage de variance que capture chaque composante :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp <- prcomp(decathlon2.active, scale = TRUE)

fviz_eig(res.prcomp)

Scree plot of the decathlon2 PCA: a bar chart of the percentage of variance explained by each of the ten principal components, falling from about 41 percent for the first dimension to under 2 percent for the last.

Les deux premières composantes capturent ensemble ~60 % de la variance, donc une image en 2-D est raisonnablement fidèle. Le graphique des variables (cercle des corrélations) montre comment les épreuves se relient : les variables pointant dans le même sens sont positivement corrélées, des directions opposées sont négativement corrélées. Nous colorons par la contribution de chaque variable aux composantes :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp <- prcomp(decathlon2.active, scale = TRUE)

fviz_pca_var(res.prcomp,
             col.var = "contrib",                         # colour by contribution
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE)                                # avoid label overlap

PCA variables plot (correlation circle) of the ten decathlon events from a prcomp object, arrows coloured by their contribution to the first two principal components, with sprinting events pointing opposite to throwing and jumping events.

Enfin le biplot superpose les individus (les athlètes) et les variables (les épreuves) sur un seul graphique, pour que vous puissiez lire quels athlètes excellent dans quelles épreuves :

library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.prcomp <- prcomp(decathlon2.active, scale = TRUE)

fviz_pca_biplot(res.prcomp, repel = TRUE,
                col.var = "#2E9FDF",   # variables (events) in blue
                col.ind = "#696969")   # individuals (athletes) in grey

PCA biplot from a prcomp object showing the 23 decathlon athletes as grey points and the ten events as blue arrows on the first two principal components.

Les mêmes fonctions fviz_* acceptent un objet PCA() de FactoMineR ; pour les objets princomp, elles fonctionnent aussi, bien que prcomp soit le chemin qu’emprunte chaque exemple.

L’ACP avec le package ade4

ade4 est un package spécialisé pour les données multivariées d’écologie et d’environnement, mais sa fonction d’ACP, dudi.pca(), est une quatrième façon parfaitement générale de lancer l’analyse. L’ACP, c’est l’ACP : dudi.pca() standardise par défaut et renvoie les mêmes valeurs propres que prcomp() et FactoMineR — elle les range simplement sous la famille de noms dudi.* (schéma de dualité). Si vous travaillez déjà dans l’écosystème ade4, vous n’avez pas besoin d’en sortir pour l’ACP.

Calculez l’ACP avec dudi.pca(). Posez scannf = FALSE pour sauter l’invite interactive du graphique des éboulis et nf = 5 pour conserver cinq composantes dans le résultat. Par défaut, dudi.pca() centre et standardise les variables (ACP de corrélation), donc — comme FactoMineR — vous ne passez pas d’argument scale :

library(ade4)
library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]

res.dudi <- dudi.pca(decathlon2.active,
                     scannf = FALSE,  # don't prompt for the scree plot
                     nf = 5)          # keep 5 components

Le résultat porte l’analyse sous trois compartiments centraux — $eig (les valeurs propres), $li (les coordonnées des individus, les scores « ligne ») et $co (les coordonnées des variables sur le cercle des corrélations). Vérifiez d’abord les valeurs propres et confirmez qu’elles correspondent aux fonctions précédentes :

library(ade4)
library(factoextra)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.dudi <- dudi.pca(decathlon2.active, scannf = FALSE, nf = 5)

round(res.dudi$eig, 3)                 # ade4 eigenvalues
 [1] 4.124 1.839 1.239 0.819 0.702 0.423 0.303 0.274 0.155 0.122
round(get_eigenvalue(prcomp(decathlon2.active, scale = TRUE))[, 1], 3)  # prcomp, for comparison
 [1] 4.124 1.839 1.239 0.819 0.702 0.423 0.303 0.274 0.155 0.122

Les valeurs propres sont identiques4.124, 1.839, 1.239, … la composante de tête capture de nouveau ~41 % de la variance. ade4 atteint la même ACP par un chemin différent.

ade4 fournit ses propres fonctions de tracé en base R qui lisent directement les compartiments dudi — la façon naturelle de visualiser un dudi.pca. Utilisez screeplot() pour les valeurs propres, s.corcircle() sur $co pour le cercle des corrélations, et s.label() sur $li pour les individus étiquetés :

library(ade4)
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1:10]
res.dudi <- dudi.pca(decathlon2.active, scannf = FALSE, nf = 5)

par(mfrow = c(2, 2))
screeplot(res.dudi, main = "Screeplot - Eigenvalues")
s.corcircle(res.dudi$co)                # correlation circle (variables)
s.label(res.dudi$li, xax = 1, yax = 2)  # individuals on PC1 vs PC2

ade4 base-R PCA graphics in a two-by-two panel: a screeplot of the eigenvalues, the s.corcircle correlation circle of the ten decathlon events, and the s.label map of the 23 athletes on the first two principal components.

Points supplémentaires. Comme FactoMineR, ade4 peut projeter des lignes mises de côté et des variables supplémentaires sur les axes existants — prédisez des individus supplémentaires avec suprow(res.dudi, new.rows)$lisup et des variables supplémentaires avec supcol(res.dudi, scale(new.vars))$cosup (puis tracez-les avec factoextra::fviz_add()). La mécanique reflète celle de FactoMineR ; choisissez le package que vous utilisez déjà.

Quelle fonction et quand

Un guide de décision en un coup d’œil :

Vous voulez… Utilisez Pourquoi
La valeur par défaut sensée prcomp(x, scale = TRUE) SVD, meilleure précision, gère n < p, prête pour factoextra
La compatibilité S-PLUS héritée princomp(x, cor = TRUE) décomposition spectrale, diviseur n, anciens noms de sortie
Sortie riche + points supplémentaires PCA(x) [FactoMineR] contributions, cos2, individus/variables supplémentaires intégrés
Déjà dans l’écosystème ade4 dudi.pca(x, scannf = FALSE) [ade4] la famille dudi.* du schéma de dualité (écologie/environnement) ; $eig/$li/$co, suprow/supcol, s.corcircle/s.label en base R

Recommandation : par défaut, optez pour prcomp() pour l’analyse et factoextra pour les graphiques ; passez à PCA() de FactoMineR quand vous avez besoin de contributions, de cos2, ou d’une projection supplémentaire sans les coder à la main. Restez sur dudi.pca() d’ade4 si votre flux de travail plus large vit déjà dans ade4 — les valeurs propres sont les mêmes.

Essayez en direct

Modifiez et lancez la comparaison dans votre navigateur — aucune installation nécessaire. Essayez de désactiver scale = TRUE, ou comparez les saturations prcomp aux saturations princomp et observez l’inversion de signe.

🟢 Avec un agent IA

Vous ne savez pas trop quelle fonction d’ACP convient à vos données, ou pourquoi vos saturations semblent « à l’envers » ? Demandez à Prova “devrais-je utiliser prcomp ou princomp pour mes données, et pourquoi mes signes d’ACP sont-ils inversés ?” — elle répond avec du code R que vous pouvez lancer sur votre propre jeu de données, puis vous aide à lire les valeurs propres et les saturations. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Vous avez oublié de standardiser, et une variable domine. Si la première composante est essentiellement une seule variable à forte variance, vous avez lancé l’ACP sur des covariances brutes. Standardisez : prcomp(x, scale = TRUE) ou princomp(x, cor = TRUE). Ne sautez la mise à l’échelle que lorsque chaque variable est déjà dans la même unité.
  • Les signes sont inversés entre les fonctions (ou entre versions de R). Un vecteur propre et son opposé couvrent le même axe, donc le signe d’une saturation (et des scores) est arbitraire. prcomp() et princomp() peuvent choisir des signes opposés, et même la même fonction peut s’inverser d’une version de R/LAPACK à l’autre. Cela ne change jamais l’analyse — interprétez le motif des saturations, pas leur signe absolu. Si vous avez besoin d’une orientation fixe (par exemple pour comparer deux exécutions), inversez une composante vous-même : res$rotation[, 1] <- -res$rotation[, 1]; res$x[, 1] <- -res$x[, 1].
  • prcomp et princomp donnent des sdev légèrement différents sur des données non standardisées. Ils utilisent un diviseur différent : prcomp() divise par n − 1 (la variance d’échantillon non biaisée), princomp() par n. Sur des données standardisées (corrélation), ils s’accordent à la précision affichée ; sur les covariances brutes, le rapport est exactement \(\sqrt{n/(n-1)}\) — une différence minime et attendue, pas un bug.
  • princomp() échoue avec “more columns than rows”. princomp() ne peut pas tourner quand vous avez plus de variables que d’observations (n < p). Utilisez prcomp() (ou PCA() de FactoMineR), qui gèrent ce cas via la SVD.

Questions fréquentes

prcomp() utilise la décomposition en valeurs singulières (SVD) de la matrice de données ; princomp() utilise la décomposition spectrale (eigen) de la matrice de covariance/corrélation. Elles renvoient la même analyse sous des noms différents (rotation/x vs loadings/scores), mais prcomp() offre une précision numérique légèrement meilleure, gère le cas n < p, et constitue la valeur par défaut recommandée. princomp() divise la variance par n (vs n - 1 pour prcomp()) et existe surtout pour la compatibilité S-PLUS.

Utilisez prcomp() pour l’analyse et factoextra (fviz_eig, fviz_pca_var, fviz_pca_biplot) pour les graphiques — c’est précis, ça gère plus de variables que d’observations, et c’est ce qu’attendent la plupart des tutoriels. Passez à PCA() de FactoMineR quand vous voulez des contributions, le cos2 (qualité de représentation), ou projeter des individus/variables supplémentaires sans les coder à la main. Évitez princomp() sauf si vous avez besoin de compatibilité avec d’anciens codes S-PLUS.

Presque toujours, oui — sauf si chaque variable est déjà à la même échelle comparable. L’ACP est pilotée par la variance, donc une variable à forte variance non standardisée dominera la première composante. Standardisez avec prcomp(x, scale = TRUE) ou princomp(x, cor = TRUE) (ACP fondée sur la corrélation).

Parce que le signe d’une composante principale est arbitraire — un vecteur propre et son opposé décrivent le même axe. Des fonctions différentes (prcomp vs princomp), des versions de R/LAPACK différentes, ou des plateformes différentes peuvent choisir des signes opposés. Cela ne change pas l’analyse ; interprétez le motif relatif des saturations. Pour forcer une orientation, multipliez les saturations et les scores de la composante fautive par −1.

Utilisez dudi.pca(x, scannf = FALSE, nf = 5) — elle standardise (centre + met à l’échelle) par défaut, donc elle lance une ACP de corrélation avec les mêmes valeurs propres que prcomp() et FactoMineR. Lisez le résultat depuis $eig (valeurs propres), $li (coordonnées des individus) et $co (coordonnées des variables). Tracez-le avec factoextra (fviz_eig/fviz_pca_ind) ou les graphiques en base R d’ade4 (screeplot, s.corcircle(res$co), s.label(res$li)), et projetez des points supplémentaires avec suprow() / supcol().

Les deux utilisent la SVD et renvoient les mêmes valeurs propres, donc l’analyse sous-jacente est identique. PCA() de FactoMineR ajoute de la commodité : elle standardise par défaut et renvoie coordonnées, contributions, et cos2 pour les variables et les individus, plus une projection facile d’individus et de variables supplémentaires — des choses que vous calculeriez à la main à partir d’un objet prcomp nu. Utilisez prcomp() pour une analyse légère en base R, PCA() quand vous voulez la sortie multivariée plus riche.

Testez vos connaissances

Utilisez les données intégrées USArrests (quatre variables numériques de criminalité/urbanisation). Standardisez-les avec prcomp(scale = TRUE), affichez le tableau des valeurs propres avec factoextra::get_eigenvalue(), et tracez le graphique des éboulis.

USArrests est déjà numérique, donc passez-le directement à prcomp(USArrests, scale = TRUE). Appelez ensuite get_eigenvalue() sur le résultat et fviz_eig() pour le graphique des éboulis.

library(factoextra)
data(USArrests)

res <- prcomp(USArrests, scale = TRUE)

get_eigenvalue(res)   # eigenvalues + % variance
fviz_eig(res)         # scree plot

La première composante capture environ 62 % de la variance et la seconde environ 25 %, donc deux composantes résument bien les quatre variables de criminalité.

Vérification rapide. Votre collègue lance princomp() sur une matrice d’expression génique de 50 échantillons et 2 000 gènes et obtient une erreur. Quelle en est la cause, et quel est le correctif en un mot ?

Les données ont plus de variables que d’observations (n < p : 50 < 2000), et princomp() ne peut pas tourner sur cela. Le correctif : utilisez prcomp() (ou PCA() de FactoMineR), qui calculent l’ACP via la SVD et gèrent le cas n < p.

Conclusion

R vous offre trois bonnes façons de lancer une ACP, et elles s’accordent sur le fond. Optez par défaut pour prcomp(x, scale = TRUE) — la SVD est plus précise, gère plus de variables que d’observations, et se marie avec factoextra d’emblée. Gardez princomp(x, cor = TRUE) pour la compatibilité S-PLUS héritée, en vous souvenant de son diviseur n et de ses noms de sortie différents. Recourez à PCA() de FactoMineR quand vous voulez des contributions, le cos2, ou une projection supplémentaire sans l’écrire vous-même. Et quelle que soit votre fonction : standardisez d’abord, et ne vous alarmez pas d’une inversion de signe arbitraire. Pour approfondir la lecture du résultat, continuez avec ACP — Analyse en composantes principales.

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 et chaque nombre ont été produits par le code montré — modifiez n’importe quel bloc et lancez-le, et le bac à sable + le quiz se relancent en direct dans votre navigateur. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {ACP avec R : prcomp vs princomp},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/dimension-reduction/pca-prcomp-vs-princomp},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“ACP avec R : prcomp vs princomp.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/dimension-reduction/pca-prcomp-vs-princomp.