Analyse des correspondances multiples (ACM) en R

Résumez plusieurs variables catégorielles, puis lisez les structures sur une carte factorielle

Un guide pratique de l’analyse des correspondances multiples (ACM) en R : exécutez MCA() de FactoMineR sur les données d’enquête poison, lisez les valeurs propres et l’éboulis des valeurs propres, et visualisez les individus, les catégories de variables, les contributions et le cos2 avec factoextra. Comprend comment définir les variables actives et supplémentaires et comment interpréter la carte factorielle.

Date de publication

24 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • L’analyse des correspondances multiples (ACM) résume un tableau de plusieurs variables catégorielles — voyez-la comme une ACP, mais pour des données qualitatives, ou comme l’analyse des correspondances généralisée au-delà d’un tableau à deux entrées.
  • C’est la méthode de référence pour les données d’enquête : elle trouve des groupes d’individus aux profils de réponses similaires et révèle quelles catégories de variables vont ensemble.
  • Exécutez-la avec MCA() de FactoMineR ; chaque variable de l’ensemble actif doit être un facteur (catégorielle).
  • Choisissez combien de dimensions lire à partir des valeurs propres / de l’éboulis des valeurs propres (fviz_screeplot()) ; ici, les deux premiers axes captent 46 % de l’inertie totale.
  • Visualisez le résultat avec factoextra : le biplot (fviz_mca_biplot()), la carte des catégories de variables (fviz_mca_var()) et la carte des individus (fviz_mca_ind()), colorés par cos2 (qualité) ou contrib (importance).
  • Marquez comme supplémentaires (quanti.sup/quali.sup) les variables que vous ne voulez pas voir piloter les axes — elles sont projetées sur la carte mais ne la construisent pas.
Obtenez le livre — Principal Component Methods in R (PDF)

Introduction

L’analyse des correspondances multiples (ACM) est une extension de l’analyse des correspondances simple pour résumer et visualiser un tableau de données qui contient plus de deux variables catégorielles. Vous pouvez aussi la voir comme une généralisation de l’analyse en composantes principales (ACP) au cas où les variables sont qualitatives (catégories) au lieu d’être quantitatives (nombres). Lorsqu’un tableau mêle des colonnes numériques et catégorielles, la méthode à privilégier est l’analyse factorielle de données mixtes (FAMD).

L’ACM est le plus souvent utilisée pour analyser des données d’enquête. Étant donné un ensemble d’individus décrits par leurs réponses à plusieurs questions catégorielles, l’objectif est d’identifier :

  • des groupes d’individus au profil de réponses similaire, et
  • les associations entre catégories de variables — quelles réponses tendent à survenir ensemble.

Cette leçon fait partie de la série Réduction de dimension en R. Nous calculerons l’analyse avec FactoMineR et la visualiserons avec factoextra, puis lirons chaque graphique en langage clair. Si votre tableau ne comporte que deux variables catégorielles, utilisez plutôt l’analyse des correspondances simple ; s’il mêle des variables quantitatives et qualitatives, la méthode est l’analyse factorielle de données mixtes (FAMD).

NoteL’ACM se lit comme l’AC

Le résultat de l’ACM s’interprète exactement comme celui d’une analyse des correspondances simple — des points proches sont similaires, la distance à l’origine mesure à quel point un point est bien représenté. Si l’AC est nouvelle pour vous, lisez d’abord l’analyse des correspondances ; tout ce qui s’y trouve se reporte ici.

Packages R requis

Plusieurs fonctions R peuvent calculer une ACM — MCA() (FactoMineR), dudi.acm() (ade4), epMCA() (ExPosition). Nous utilisons FactoMineR pour l’analyse et factoextra pour une visualisation élégante fondée sur ggplot2 ; factoextra sait lire la sortie de n’importe laquelle d’entre elles.

install.packages(c("FactoMineR", "factoextra"))
library("FactoMineR")
library("factoextra")

Les données

Nous utiliserons le jeu de données poison fourni avec FactoMineR. Il provient d’une enquête menée auprès d’enfants d’école primaire ayant subi un épisode d’intoxication alimentaire : on a interrogé chaque enfant sur ses symptômes (nausée, vomissement, fièvre, …) et sur ce qu’il avait mangé (pomme de terre, mayonnaise, courgette, …).

Le tableau comporte 55 lignes (enfants) et 15 colonnes (variables). Chargez-le et regardez les premières colonnes :

library("FactoMineR")
data(poison)
head(poison[, 1:7], 3)
  Age Time   Sick Sex   Nausea Vomiting Abdominals
1   9   22 Sick_y   F Nausea_y  Vomit_n     Abdo_y
2   5    0 Sick_n   F Nausea_n  Vomit_n     Abdo_n
3   6   16 Sick_y   F Nausea_n  Vomit_y     Abdo_y

Avant d’exécuter l’ACM, vous décidez quelles lignes et colonnes construisent réellement l’analyse. Dans la terminologie de l’ACM :

  • Individus actifs (lignes 1:55) — les enfants utilisés pour calculer l’analyse.
  • Variables actives (colonnes 5:15) — les questions catégorielles sur les symptômes et les aliments qui construisent les axes.
  • Variables supplémentaires — projetées sur la carte mais non utilisées pour la construire :
    • Quantitatives (quanti.sup) : colonnes 1–2, Age et Time.
    • Qualitatives (quali.sup) : colonnes 3–4, Sick et Sex — pratiques pour colorer les individus plus tard.

Pour la première exécution, la plus simple, nous ne conservons que les individus et variables actifs. Remarquez qu’ils sont tous des facteurs — l’ACM exige une entrée catégorielle :

library("FactoMineR")
data(poison)
poison.active <- poison[1:55, 5:15]
head(poison.active[, 1:6], 3)
    Nausea Vomiting Abdominals   Fever   Diarrhae   Potato
1 Nausea_y  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y
2 Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y
3 Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y

Vous pouvez inspecter l’effectif de chaque catégorie avec summary(). Les catégories à très faible fréquence peuvent fausser l’analyse et méritent d’être repérées tôt :

library("FactoMineR")
data(poison)
poison.active <- poison[1:55, 5:15]

# Frequency of the categories of the first 4 variables
summary(poison.active)[, 1:4]
      Nausea      Vomiting   Abdominals     Fever   
 Nausea_n:43   Vomit_n:33   Abdo_n:18   Fever_n:20  
 Nausea_y:12   Vomit_y:22   Abdo_y:37   Fever_y:35  

Exécuter l’ACM

La fonction MCA() fait le travail. L’appel simplifié est MCA(X, ncp = 5, graph = TRUE) :

  • X — un data frame de n individus (lignes) par p variables catégorielles (colonnes).
  • ncp — combien de dimensions conserver dans le résultat (5 par défaut).
  • graph — mettez FALSE ici ; nous tracerons les graphiques nous-mêmes avec factoextra pour un contrôle total.

Exécutez-la sur le sous-ensemble actif :

library("FactoMineR")
data(poison)
poison.active <- poison[1:55, 5:15]

res.mca <- MCA(poison.active, graph = FALSE)

L’objet renvoyé est une liste contenant les valeurs propres, ainsi que les coordonnées, le cos2 et les contributions pour les individus comme pour les catégories de variables. Les fonctions auxiliaires de factoextra ci-dessous extraient exactement ce dont vous avez besoin :

  • get_eigenvalue(res.mca) / fviz_screeplot(res.mca) — la variance retenue par chaque axe.
  • get_mca_var(res.mca) / fviz_mca_var(res.mca) — les résultats pour les catégories de variables.
  • get_mca_ind(res.mca) / fviz_mca_ind(res.mca) — les résultats pour les individus.
  • fviz_mca_biplot(res.mca) — les deux à la fois.

Valeurs propres et éboulis des valeurs propres

La première question après toute analyse factorielle est combien de dimensions valent la peine d’être lues ? Chaque dimension explique une part de l’inertie totale (l’équivalent de la variance en ACM). Extrayez le détail avec get_eigenvalue() :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

eig.val <- get_eigenvalue(res.mca)
head(eig.val)
      eigenvalue variance.percent cumulative.variance.percent
Dim.1 0.33523140        33.523140                    33.52314
Dim.2 0.12913979        12.913979                    46.43712
Dim.3 0.10734849        10.734849                    57.17197
Dim.4 0.09587950         9.587950                    66.75992
Dim.5 0.07883277         7.883277                    74.64319
Dim.6 0.07108981         7.108981                    81.75217

La dimension 1 capte à elle seule 33.5 % de l’inertie et la dimension 2 12.9 % de plus, de sorte que les deux premiers axes retiennent ensemble environ 46 % — assez pour rendre les cartes en 2-D ci-dessous pertinentes, tout en vous rappelant que plus de la moitié de la structure réside dans des dimensions supérieures.

fviz_screeplot() montre les mêmes chiffres sous forme de diagramme en barres, ce qui rend la décroissance facile à lire :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_screeplot(res.mca, addlabels = TRUE, ylim = c(0, 45),
               barfill = "#3a86d4", barcolor = "#3a86d4")

Scree plot of the percentage of inertia explained by each MCA dimension of the poison data, with the first dimension at 33.5 percent and the second at 12.9 percent.

Le biplot

fviz_mca_biplot() trace tout sur une seule carte — les individus et les catégories de variables — pour donner une première vue d’ensemble des données :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_biplot(res.mca,
                repel = TRUE,            # avoid label overlap (slower)
                ggtheme = theme_minimal())

MCA biplot of the poison data showing 55 individuals as blue points and the variable categories as red triangles on the first two dimensions.

Les lignes (individus) sont les points bleus, les catégories de variables les triangles rouges. La règle générale est la même qu’en AC : la distance entre deux points de même type mesure leur similarité, donc les individus au profil de réponses similaire se situent près les uns des autres, et les catégories qui co-occurrent se situent proches les unes des autres. Le biplot est chargé par nature — ensuite, nous le séparons en une carte des variables et une carte des individus.

Graphique des catégories de variables

Extrayez les résultats pour les catégories avec get_mca_var(). Elle renvoie trois éléments — coord (positions sur la carte), cos2 (qualité de représentation) et contrib (contribution à chaque axe) :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

var <- get_mca_var(res.mca)

# Coordinates of the first few categories
head(round(var$coord, 2), 4)
         Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
Nausea_n  0.27  0.12 -0.27  0.03  0.07
Nausea_y -0.96 -0.43  0.95 -0.12 -0.26
Vomit_n   0.48 -0.41  0.08  0.27  0.05
Vomit_y  -0.72  0.61 -0.13 -0.41 -0.08

Tracez les catégories seules avec fviz_mca_var() :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_var(res.mca,
             repel = TRUE,
             ggtheme = theme_minimal())

MCA map of variable categories from the poison survey, with symptom-present and food categories spread across the first two dimensions.

Lisez-la ainsi :

  • Les catégories au profil similaire sont regroupées.
  • Les catégories associées négativement se situent de part et d’autre de l’origine (par ex. Fever_y vs Fever_n).
  • La distance à l’origine mesure à quel point une catégorie est bien représentée — les points loin du centre sont bien affichés sur cette carte.

Qualité de représentation (cos2)

Toutes les catégories ne sont pas montrées aussi bien par les deux premières dimensions. Le cosinus carré (cos2) mesure à quel point un axe représente une catégorie ; une catégorie est bien montrée lorsque son cos2 sur les deux dimensions affichées est proche de 1.

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)
var <- get_mca_var(res.mca)

# cos2 of the first few categories
head(round(var$cos2, 3), 4)
         Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
Nausea_n 0.256 0.053 0.253 0.004 0.019
Nausea_y 0.256 0.053 0.253 0.004 0.019
Vomit_n  0.344 0.251 0.011 0.112 0.004
Vomit_y  0.344 0.251 0.011 0.112 0.004

Colorez les catégories par cos2 pour voir d’un coup d’œil lesquelles sont fiables. Nous utilisons un gradient de cos2 — pâle pour une faible qualité, azur de marque pour une qualité élevée :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_var(res.mca, col.var = "cos2",
             gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
             repel = TRUE,
             ggtheme = theme_minimal())

MCA variable-categories map coloured by cos2, where categories far from the origin are darker, indicating a higher quality of representation.

Un diagramme en barres illustre le même point de façon quantitative — fviz_cos2() classe les catégories selon leur cos2 sur les dimensions 1 et 2 :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_cos2(res.mca, choice = "var", axes = 1:2)

Bar plot of the cos2 of variable categories on the first two MCA dimensions, ranked from highest to lowest quality of representation.

Les catégories d’aliments Fish_n, Fish_y, Icecream_n et Icecream_y ont un cos2 faible — elles ne sont pas bien représentées par les deux premières dimensions, donc lisez leur position avec prudence ; une solution en dimensions supérieures les décrirait mieux.

Contribution aux dimensions

La contribution vous indique quelles catégories construisent réellement chaque axe — les catégories les plus importantes pour expliquer la variation des données. Extrayez-la avec var$contrib :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)
var <- get_mca_var(res.mca)

# Contribution (%) of the first few categories
head(round(var$contrib, 2), 4)
         Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
Nausea_n  1.52  0.81  4.67  0.08  0.49
Nausea_y  5.43  2.91 16.73  0.30  1.76
Vomit_n   3.73  7.07  0.36  4.26  0.19
Vomit_y   5.60 10.61  0.54  6.39  0.29

fviz_contrib() trace les principaux contributeurs sous forme de diagramme en barres, une dimension à la fois. La ligne rouge en tirets marque la contribution attendue si toutes les catégories étaient également importantes — les barres au-dessus sont les catégories qui comptent pour cet axe :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

# Top 15 categories contributing to dimension 1
fviz_contrib(res.mca, choice = "var", axes = 1, top = 15,
             fill = "#3a86d4", color = "#3a86d4")

Bar plot of the top fifteen variable categories contributing to MCA dimension 1, with Abdo_n, Diarrhea_n, Fever_n and Mayo_n above the expected-average reference line.

Les catégories Abdo_n, Diarrhea_n, Fever_n et Mayo_n dominent la dimension 1 — globalement, l’ axe sépare les enfants qui sont tombés malades de ceux qui ne le sont pas. (Exécutez axes = 2 pour voir que Courg_n, Potato_n, Vomit_y et Icecream_n pilotent la dimension 2.)

Colorez la carte des variables par contrib pour voir sur la carte se situent les catégories importantes :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_var(res.mca, col.var = "contrib",
             gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
             repel = TRUE,
             ggtheme = theme_minimal())

MCA variable-categories map coloured by contribution, highlighting the symptom-absent categories that define the positive pole of dimension 1.

Cela montre vers quel pôle de chaque dimension une catégorie contribue : Abdo_n, Diarrhea_n, Fever_n et Mayo_n construisent le pôle positif de la dimension 1 (aucun symptôme), tandis que Fever_y et Diarrhea_y construisent son pôle négatif (symptômes présents).

Corrélation entre les variables et les dimensions

fviz_mca_var(choice = "mca.cor") trace les variables elles-mêmes (et non leurs catégories), en utilisant la corrélation carrée avec chaque axe comme coordonnées. C’est le moyen le plus rapide de voir quelles questions pilotent quelle dimension :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_var(res.mca, choice = "mca.cor",
             repel = TRUE,
             ggtheme = theme_minimal())

MCA correlation plot of variables versus dimensions, with Diarrhae, Abdominals and Fever near dimension 1 and Courgette and Potato near dimension 2.

Diarrhae, Abdominals et Fever s’alignent sur la dimension 1 (l’axe des symptômes) ; Courgette et Potato s’alignent sur la dimension 2 (un axe alimentaire). Ce seul graphique résume la structure : un axe sur le fait d’être malade, un sur ce qui a été mangé.

Lorsqu’une carte des catégories est encombrée, select.var (et select.ind pour les individus) la filtre pour ne garder que les principaux contributeurs — par ex. fviz_mca_var(res.mca, select.var = list(contrib = 10)) ne conserve que les 10 catégories les plus influentes.

Description des dimensions

Lire les contributions à l’œil fonctionne, mais dimdesc() de FactoMineR le fait pour vous : elle trouve automatiquement quelles variables et catégories décrivent le mieux chaque dimension — une façon de nommer les axes sans hypothèse de départ. Interrogez-la sur la dimension 1 :

library("FactoMineR")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

dimdesc(res.mca, axes = 1)
$`Dim 1`

Link between the variable and the categorical variable (1-way anova)
=============================================
                  R2      p.value
Abdominals 0.8451157 4.055640e-23
Diarrhae   0.7994680 3.910776e-20
Fever      0.7846788 2.600566e-19
Mayo       0.3829749 4.756234e-07
Vomiting   0.3442016 2.510738e-06
Nausea     0.2562007 8.062777e-05
Cheese     0.1944181 7.534834e-04

Link between variable and the categories of the categorical variables
================================================================
                      Estimate      p.value
Abdominals=Abdo_n    0.5671866 4.055640e-23
Diarrhae=Diarrhea_n  0.5380920 3.910776e-20
Fever=Fever_n        0.5330918 2.600566e-19
Mayo=Mayo_n          0.4644981 4.756234e-07
Vomiting=Vomit_n     0.3466915 2.510738e-06
Nausea=Nausea_n      0.3547892 8.062777e-05
Cheese=Cheese_n      0.3830043 7.534834e-04
Cheese=Cheese_y     -0.3830043 7.534834e-04
Nausea=Nausea_y     -0.3547892 8.062777e-05
Vomiting=Vomit_y    -0.3466915 2.510738e-06
Mayo=Mayo_y         -0.4644981 4.756234e-07
Fever=Fever_y       -0.5330918 2.600566e-19
Diarrhae=Diarrhea_y -0.5380920 3.910776e-20
Abdominals=Abdo_y   -0.5671866 4.055640e-23

Le tableau $quali classe les variables les plus associées à l’axe : Abdominals (R² = 0.85), Diarrhae (0.80) et Fever (0.78) — les questions sur les symptômes — arrivent en tête. Le tableau $category montre ensuite les catégories sans symptôme (Abdominals=Abdo_n, Diarrhae=Diarrhea_n, Fever_n) du côté positif. La dimension 1 est donc l’axe malade-vs-bien-portant — exactement ce que suggérait le biplot, maintenant confirmé statistiquement. Passez axes = 1:2 pour décrire les deux dimensions à la fois.

Graphique des individus

Extrayez les résultats au niveau des individus avec get_mca_ind() — les mêmes trois éléments (coord, cos2, contrib) que pour les variables. Tracez les enfants et colorez-les par cos2 pour voir qui est bien représenté :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_ind(res.mca, col.ind = "cos2",
             gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
             repel = TRUE,
             ggtheme = theme_minimal())

MCA map of the 55 individuals coloured by cos2, with well-represented children darker and far from the origin.

Les individus contribuent eux aussi aux axes. Le même fviz_contrib() classe quels enfants façonnent les deux premières dimensions, cette fois avec choice = "ind" :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_contrib(res.mca, choice = "ind", axes = 1:2)

Bar plot of the contribution of each of the 55 children to the first two MCA dimensions, ranked from highest to lowest, with a red dashed line at the expected-average contribution.

Les enfants au-dessus de la ligne rouge en tirets tirent le plus les deux premières dimensions — ceux dont les profils symptômes/aliments sont les plus distinctifs, situés loin de l’origine sur la carte ci-dessus. (fviz_cos2(res.mca, choice = "ind", axes = 1:2) montre de la même façon la qualité de représentation des individus.)

Colorer les individus par groupe

Le véritable intérêt de l’ACM sur des données d’enquête est le regroupement : colorez les individus par n’importe quelle variable qualitative et voyez si les profils de réponses se séparent. L’argument habillage nomme le facteur de regroupement ; addEllipses = TRUE trace une ellipse de concentration autour de chaque groupe. Ici, nous regroupons par Vomiting :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_mca_ind(res.mca,
             label = "none",                 # hide individual labels
             habillage = "Vomiting",         # colour by groups
             palette = "jco",                # colourblind-safe journal palette
             addEllipses = TRUE, ellipse.type = "confidence",
             ggtheme = theme_minimal())

MCA individuals map coloured by the Vomiting variable, with two confidence ellipses separating children who vomited from those who did not.

Les deux ellipses se situent à l’écart l’une de l’autre le long de l’axe vertical — les enfants qui ont vomi ont un profil global symptômes/aliments différent de ceux qui ne l’ont pas fait, ce qui est exactement le type de structure que l’ACM est conçue pour faire ressortir. Pour comparer plusieurs variables de regroupement à la fois, utilisez fviz_ellipses() :

library("FactoMineR")
library("factoextra")
data(poison)
poison.active <- poison[1:55, 5:15]
res.mca <- MCA(poison.active, graph = FALSE)

fviz_ellipses(res.mca, c("Vomiting", "Fever"), geom = "point")

MCA ellipse plot comparing the Vomiting and Fever groupings of individuals on the same factor map.

Variables supplémentaires

Jusqu’ici, chaque variable était active. En pratique, vous avez souvent des variables que vous voulez projeter sur la carte sans les laisser la construire — étiquettes de résultat, données démographiques ou mesures quantitatives. Marquez-les comme supplémentaires : leurs coordonnées sont prédites à partir de l’analyse active.

Le tableau poison a des candidates naturelles : Age et Time sont quantitatives (quanti.sup), Sick et Sex sont des étiquettes qualitatives (quali.sup). Nous traitons aussi les individus 53:55 comme supplémentaires, à titre d’illustration :

library("FactoMineR")
data(poison)

res.mca.sup <- MCA(poison, ind.sup = 53:55,
                   quanti.sup = 1:2, quali.sup = 3:4, graph = FALSE)

Le biplot distingue désormais les éléments actifs des supplémentaires — les individus actifs en bleu, les supplémentaires en bleu foncé ; les catégories actives en rouge, les supplémentaires en vert foncé :

library("FactoMineR")
library("factoextra")
data(poison)
res.mca.sup <- MCA(poison, ind.sup = 53:55,
                   quanti.sup = 1:2, quali.sup = 3:4, graph = FALSE)

fviz_mca_biplot(res.mca.sup, repel = TRUE,
                ggtheme = theme_minimal())

MCA biplot with supplementary elements, showing active individuals and categories alongside projected supplementary Sick and Sex categories.

Les étiquettes supplémentaires Sick_y/Sick_n atterrissent exactement là où on s’y attend — Sick_y près du pôle des symptômes — ce qui valide la lecture de la dimension 1 sans que ces étiquettes aient façonné les axes le moins du monde.

L’ACM est une analyse des correspondances appliquée à une version recodée de votre tableau. Partez de la matrice indicatrice \(Z\) : une ligne par individu, une colonne par catégorie, avec un 1 là où l’individu possède cette catégorie et 0 sinon (un encodage one-hot complet de chaque variable). Pour \(n\) individus, \(p\) variables et \(J\) catégories au total, \(Z\) est \(n \times J\).

L’ACM est alors l’analyse des correspondances simple de \(Z\) — une décomposition en valeurs singulières du \(Z\) standardisé, donnant les dimensions, les coordonnées et l’inertie. Une voie équivalente analyse la matrice de Burt \(B = Z^{\top} Z\), le tableau symétrique \(J \times J\) de tous les croisements de catégories deux à deux.

Parce que chaque variable contribue à plusieurs colonnes indicatrices, les valeurs propres brutes sous-estiment la variance expliquée. Les pourcentages ci-dessus correspondent à l’inertie standard (non corrigée) de FactoMineR ; pour le compte rendu, les ajustements de Benzécri ou de Greenacre les ré-échelonnent à la hausse. Les règles d’interprétation — proximité = similarité, cos2 = qualité, contrib = importance — sont héritées telles quelles de l’AC.

Essayez en direct

Modifiez et exécutez l’analyse dans votre navigateur — aucune installation nécessaire. Essayez de colorer les individus par une variable différente (remplacez habillage = "Vomiting" par "Fever" ou "Diarrhae"), ou basculez le graphique des variables sur choice = "mca.cor", puis relancez.

🟢 Avec un agent IA

Vous travaillez sur une ACM avec votre propre enquête ? Demandez à Prova « comment exécuter une ACM sur mes données catégorielles et lire la carte factorielle ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre tableau, vous aide à définir les variables actives et supplémentaires, et lit avec vous les contributions et le cos2. The runtime is the judge. Demander à Prova →

Problèmes courants

  • « All variables must be categorical / factor. » L’ACM n’accepte que des facteurs. Si une colonne est numérique (âge, score, comptage), soit catégorisez-la d’abord (cut(age, breaks = ...)), soit passez-la comme variable quantitative supplémentaire (quanti.sup = ...) afin qu’elle soit projetée mais non utilisée pour construire les axes. Vérifiez avec str(poison.active) — chaque colonne active doit être un facteur.
  • Une catégorie à très peu d’effectifs fausse la carte. Une catégorie rare (un ou deux individus) peut tirer un axe vers elle et dominer l’inertie. Inspectez les fréquences avec summary() ; envisagez de fusionner ou de supprimer les catégories ultra-rares avant l’analyse.
  • Confondre les rôles actif et supplémentaire. Seules les variables actives construisent les dimensions ; les supplémentaires (quanti.sup/quali.sup/ind.sup) sont projetées ensuite et n’affectent jamais les axes. Mettez les étiquettes de résultat et les données démographiques dans l’ensemble supplémentaire pour qu’elles vous aident à interpréter la carte plutôt qu’à la façonner.
  • Mal lire la proximité des catégories. Deux catégories proches signifient qu’elles co-occurrent chez les individus, et non qu’elles sont « corrélées » au sens numérique. Et un point près de l’origine est simplement mal représenté sur ces deux axes (faible cos2) — ne sur-interprétez pas sa position exacte.

Questions fréquentes

L’ACM est une technique de réduction de dimension pour plusieurs variables catégorielles. Elle résume un tableau de réponses qualitatives (typiquement des données d’enquête) en quelques dimensions que vous pouvez tracer, révélant quels individus ont des profils similaires et quelles catégories de variables tendent à survenir ensemble. C’est l’ équivalent de l’ACP pour les données qualitatives et une généralisation de l’analyse des correspondances simple à plus de deux variables.

Utilisez MCA() du package FactoMineR : assurez-vous que chaque colonne active est un facteur, puis appelez res.mca <- MCA(my_data, graph = FALSE). Visualisez-la avec factoextrafviz_screeplot() pour les valeurs propres, fviz_mca_var() pour les catégories de variables et fviz_mca_ind() pour les individus. Marquez les colonnes non actives avec quanti.sup, quali.sup ou ind.sup.

L’ACP travaille sur des variables quantitatives (numériques) ; l’ACM travaille sur des variables catégorielles (facteurs). Elles partagent le même objectif — réduire de nombreuses variables à quelques dimensions interprétables et tracer le résultat — et le même vocabulaire (coordonnées, cos2, contributions), mais l’ACM commence par encoder en one-hot les catégories. Si vos données sont un mélange de variables numériques et catégorielles, utilisez plutôt l’analyse factorielle de données mixtes (FAMD).

L’analyse des correspondances (AC) simple analyse un tableau de contingence à deux entrées (deux variables catégorielles). L’ACM l’étend à trois variables catégorielles ou plus en analysant la matrice indicatrice (ou de Burt). L’interprétation est identique — proximité signifie similarité — donc l’ACM est essentiellement l’AC généralisée à de nombreuses variables.

Lisez-la en trois étapes : (1) les catégories ou individus qui sont proches ont un profil similaire ; (2) la distance à l’origine plus un cos2 élevé signifient qu’un point est bien représenté — les points près du centre ne le sont pas ; (3) les contributions (fviz_contrib) vous indiquent quelles catégories construisent réellement chaque axe, ce qui vous permet de nommer les dimensions (« symptômes » vs « aliments » ici).

Testez vos connaissances

Exécutez une ACM sur le jeu de données intégré tea de FactoMineR (une enquête sur les habitudes de consommation de thé). Utilisez les 18 premières colonnes comme variables actives, exécutez MCA(), affichez les trois premières valeurs propres et tracez la carte des catégories de variables colorée par contribution.

data(tea) ; les variables actives sont tea[, 1:18]. Exécutez MCA(..., graph = FALSE), puis utilisez get_eigenvalue() et fviz_mca_var(res, col.var = "contrib", repel = TRUE).

library(FactoMineR)
library(factoextra)

data(tea)
tea.active <- tea[, 1:18]

res.mca <- MCA(tea.active, graph = FALSE)
get_eigenvalue(res.mca)[1:3, ]

fviz_mca_var(res.mca, col.var = "contrib",
             gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
             repel = TRUE, ggtheme = theme_minimal())

Les valeurs propres sont petites (beaucoup de variables, beaucoup de catégories), et la carte des contributions montre quelles catégories d’habitudes de thé définissent les deux premières dimensions.

Vérification rapide. Vous avez une enquête avec cinq questions oui/non plus l’âge en années du répondant. Vous voulez que l’âge apparaisse sur la carte d’ACM mais sans influencer les dimensions. Que faites-vous ?

Passez l’âge comme variable quantitative supplémentaire : MCA(data, quanti.sup = <indice de la colonne d'âge>). Il sera projeté sur la carte factorielle sous forme de flèche pour aider l’interprétation, mais il ne contribuera pas à construire les axes (seules les cinq questions catégorielles actives le font).

Conclusion

Vous avez chargé un tableau d’enquête catégoriel, choisi les variables actives et supplémentaires, exécuté MCA(), lu les valeurs propres (46 % d’inertie sur les deux premiers axes) et visualisé le résultat avec factoextra — le biplot, la carte des catégories de variables colorée par cos2 et contrib, la carte des individus regroupée par un résultat, et le graphique de corrélation variables–dimensions. L’ACM a transformé onze questions oui/non en une histoire à deux axes : un axe sur le fait d’être malade, un sur ce qui a été mangé. Quand vos variables sont numériques, tournez-vous vers l’ACP ; quand vous n’avez que deux variables catégorielles, utilisez l’analyse des correspondances ; quand le tableau mêle les types, utilisez l’analyse factorielle de données mixtes (FAMD).

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-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 = {Analyse des correspondances multiples (ACM) en R},
  date = {2026-06-24},
  url = {https://www.datanovia.com/learn/machine-learning/dimension-reduction/multiple-correspondence-analysis},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Analyse des correspondances multiples (ACM) en R.” 2026. June 24. https://www.datanovia.com/learn/machine-learning/dimension-reduction/multiple-correspondence-analysis.