install.packages(c("FactoMineR", "factoextra"))Analyse factorielle multiple (AFM) en R : analyser des groupes de variables
Résumer des observations décrites par plusieurs ensembles de variables, équilibrées pour qu’aucun groupe ne domine
Un guide pratique de l’analyse factorielle multiple (AFM) en R : exécuter MFA() de FactoMineR sur les données sensorielles wine avec ses groupes de variables, lire les valeurs propres et le graphique des éboulis, et visualiser les groupes de variables, le cercle des corrélations, les individus ainsi que les individus partiels et les axes partiels avec factoextra. Inclut comment définir des groupes actifs et supplémentaires et comment interpréter chaque graphique.
- L’analyse factorielle multiple (AFM) résume des observations décrites par plusieurs groupes de variables — panels sensoriels, thèmes d’enquête, blocs omiques — et équilibre les groupes pour qu’aucun groupe ne domine l’analyse à lui seul.
- Le nombre de variables par groupe peut différer, et les groupes peuvent être quantitatifs ou qualitatifs, mais les variables à l’intérieur d’un groupe partagent un même type.
- Exécutez-la avec
MFA()de FactoMineR : passezgroup =(variables par groupe),type =("s"standardisé,"c"centré,"n"catégoriel) etname.group =; signalez les groupes que vous souhaitez seulement projeter avecnum.group.sup =. - Lisez combien d’axes conserver à partir des valeurs propres / du graphique des éboulis (
fviz_eig()) ; sur les données wine, les deux premières dimensions capturent environ 69 % de la variance. - Visualisez avec factoextra : la carte des groupes (
fviz_mfa_var(., "group")), le cercle des corrélations (fviz_mfa_var(., "quanti.var")), les individus (fviz_mfa_ind()) et les individus partiels / axes partiels (fviz_mfa_ind(., partial = ...),fviz_mfa_axes()).
Introduction
L’analyse factorielle multiple (AFM) est une méthode multivariée pour résumer et visualiser un tableau de données dans lequel les mêmes individus sont décrits par plusieurs ensembles (groupes) de variables. Ces groupes peuvent être quantitatifs, qualitatifs ou un mélange — mais les variables au sein d’un groupe sont de même nature. L’AFM tient compte de la contribution de chaque groupe actif lorsqu’elle mesure la distance entre les individus, de sorte que le tableau global n’est pas détourné par le groupe qui se trouve avoir le plus de variables ou la plus grande dispersion.
Voyez-la comme une analyse factorielle générale. En coulisse, l’AFM exécute :
- une analyse en composantes principales (ACP) sur chaque groupe quantitatif, et
- une analyse des correspondances multiples (ACM) sur chaque groupe qualitatif,
puis les combine. L’idée clé est l’équilibrage : chaque groupe est pondéré pour qu’aucun groupe ne domine la première dimension simplement parce qu’il a plus de variables ou de plus grandes unités. Techniquement, l’AFM divise chaque variable d’un groupe par la première valeur propre de l’ACP (ou de la ACM) propre à ce groupe — une normalisation qui rend les groupes comparables.
Quand l’utiliser. Faites appel à l’AFM dès que vos colonnes se présentent en blocs naturels :
- Analyse d’enquête — un individu est une personne ; les questions sont organisées en thèmes (groupes de questions).
- Analyse sensorielle — un individu est un produit alimentaire ; un groupe rassemble les scores sensoriels (douceur, amertume…), un autre les mesures chimiques (pH, glucose…).
- Écologie — un individu est un site ; un groupe décrit le sol, un autre la flore.
- Séries temporelles / omiques — les mêmes variables mesurées à plusieurs dates, ou plusieurs plateformes omiques (génomique, protéomique…) sur les mêmes échantillons.
Cette leçon fait partie de la série Réduction de dimension en R. Nous calculons l’analyse avec FactoMineR et la visualisons avec factoextra, en lisant chaque graphique en langage clair. Si toutes vos variables forment un unique bloc quantitatif, utilisez l’ACP ; si elles sont toutes catégorielles, utilisez la ACM ; l’AFM est la méthode adaptée lorsqu’elles se présentent en groupes.
Chaque graphique ci-dessous se lit avec les règles que vous connaissez déjà de l’ACP (cercle des corrélations, cos2, contributions) et de la ACM (carte factorielle des individus, ellipses). L’AFM ajoute deux éléments par-dessus : une carte des groupes et les vues partielles. Si ces méthodes prérequises sont nouvelles pour vous, parcourez-les d’abord — tout se transpose.
Packages R requis
Nous utilisons FactoMineR pour l’analyse et factoextra pour une visualisation élégante, fondée sur ggplot2.
library("FactoMineR")
library("factoextra")Les données
Nous utiliserons le jeu de données wine fourni avec FactoMineR. Il provient d’une évaluation sensorielle de vins par un panel de juges : chaque vin est noté sur de nombreuses caractéristiques sensorielles, et ces scores sont la moyenne sur l’ensemble des juges.
library("FactoMineR")
data(wine)
colnames(wine) [1] "Label" "Soil"
[3] "Odor.Intensity.before.shaking" "Aroma.quality.before.shaking"
[5] "Fruity.before.shaking" "Flower.before.shaking"
[7] "Spice.before.shaking" "Visual.intensity"
[9] "Nuance" "Surface.feeling"
[11] "Odor.Intensity" "Quality.of.odour"
[13] "Fruity" "Flower"
[15] "Spice" "Plante"
[17] "Phenolic" "Aroma.intensity"
[19] "Aroma.persistency" "Aroma.quality"
[21] "Attack.intensity" "Acidity"
[23] "Astringency" "Alcohol"
[25] "Balance" "Smooth"
[27] "Bitterness" "Intensity"
[29] "Harmony" "Overall.quality"
[31] "Typical"
Le tableau comporte 21 lignes (les vins, les individus) et 31 colonnes (les variables) :
- Les deux premières colonnes sont catégorielles :
Label(Saumur, Bourgueil ou Chinon) etSoil(Reference, Env1, Env2 ou Env4). - Les 29 colonnes restantes sont des variables sensorielles continues — le score moyen sur l’ensemble des juges.
L’objectif de l’étude est d’analyser les caractéristiques des vins — ce qui les distingue, et comment les différentes familles de descripteurs sensoriels se rapportent les unes aux autres.
Définir les groupes de variables
C’est le cœur de l’AFM : vous indiquez à MFA() comment les colonnes sont regroupées en blocs. Les colonnes de wine se répartissent en six groupes, dans l’ordre :
origin— catégoriel :LabeletSoil— les 2 premières colonnes.odor— continu : odeur des vins avant agitation (intensité, qualité aromatique, fruité, fleur, épice) — les 5 colonnes suivantes.visual— continu : inspection visuelle (intensité, nuance, impression de surface) — les 3 colonnes suivantes.odor.after.shaking— continu : odeur après agitation — les 10 colonnes suivantes.taste— continu : goût des vins — les 9 colonnes suivantes.overall— continu : jugement global (qualité globale, typicité) — les 2 dernières colonnes.
En termes FactoMineR, les tailles des groupes deviennent group = c(2, 5, 3, 10, 9, 2) (leur somme vaut 31), les noms deviennent name.group = c("origin", "odor", "visual", "odor.after.shaking", "taste", "overall"), et les types deviennent type = c("n", "s", "s", "s", "s", "s") — "n" pour le groupe origin catégoriel, "s" pour standardiser chaque groupe continu (recommandé, afin que les variables mesurées sur des échelles différentes soient comparables ; utilisez "c" pour centrer sans réduire).
Exécuter l’AFM
La fonction MFA() fait le travail. Un appel simplifié est MFA(base, group, type = rep("s", length(group)), ind.sup = NULL, name.group = NULL, num.group.sup = NULL, graph = TRUE) :
base— le data frame (nindividus ×pvariables).group— le nombre de variables dans chaque groupe.type— le type par groupe :"c"/"s"quantitatif ("s"= réduit à variance unitaire),"n"catégoriel,"f"fréquences.ind.sup— les indices des individus supplémentaires (projetés, non utilisés pour construire les axes).name.group— un nom par groupe.num.group.sup— les indices des groupes supplémentaires : projetés sur la carte mais non utilisés pour la construire.graph— mettezFALSE; nous traçons les graphiques nous-mêmes avec factoextra pour un contrôle total.
Ici, nous gardons odor, visual, odor.after.shaking et taste comme groupes actifs, et marquons origin (groupe 1) et overall (groupe 6) comme supplémentaires avec num.group.sup = c(1, 6) — ainsi l’analyse est construite à partir de la façon dont les vins sentent, paraissent et goûtent, puis nous projetons l’origine et le jugement global sur cette carte pour l’interpréter :
library(FactoMineR)
data(wine)
res.mfa <- MFA(wine,
group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6),
graph = FALSE)L’objet renvoyé est une liste. L’imprimer dresse la liste de tout ce que l’AFM a calculé — valeurs propres, les analyses séparées par groupe, les résultats des groupes, les axes partiels, et les résultats pour les individus et les variables :
library(FactoMineR)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
print(res.mfa)**Results of the Multiple Factor Analysis (MFA)**
The analysis was performed on 21 individuals, described by 31 variables
*Results are available in the following objects :
name description
1 "$eig" "eigenvalues"
2 "$separate.analyses" "separate analyses for each group of variables"
3 "$group" "results for all the groups"
4 "$partial.axes" "results for the partial axes"
5 "$inertia.ratio" "inertia ratio"
6 "$ind" "results for the individuals"
7 "$quanti.var" "results for the quantitative variables"
8 "$quanti.var.sup" "results for the quantitative supplementary variables"
9 "$quali.var.sup" "results for the categorical supplementary variables"
10 "$summary.quanti" "summary for the quantitative variables"
11 "$summary.quali" "summary for the categorical variables"
12 "$global.pca" "results for the global PCA"
Les fonctions auxiliaires de factoextra ci-dessous extraient exactement ce dont vous avez besoin :
get_eigenvalue(res.mfa)/fviz_eig(res.mfa)— la variance retenue par chaque axe.get_mfa_var(res.mfa, "group")/fviz_mfa_var(res.mfa, "group")— les résultats pour les groupes de variables.get_mfa_var(res.mfa, "quanti.var")/fviz_mfa_var(res.mfa, "quanti.var")— les résultats pour les variables quantitatives.get_mfa_ind(res.mfa)/fviz_mfa_ind(res.mfa)— les résultats pour les individus.fviz_mfa_axes(res.mfa)— les axes partiels.
Valeurs propres et graphique des éboulis
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 la variance totale. Extrayez la répartition avec get_eigenvalue() :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
eig.val <- get_eigenvalue(res.mfa)
head(eig.val) eigenvalue variance.percent cumulative.variance.percent
Dim.1 3.4619504 49.378382 49.37838
Dim.2 1.3667683 19.494446 68.87283
Dim.3 0.6154291 8.777969 77.65080
Dim.4 0.3721997 5.308747 82.95954
Dim.5 0.2703825 3.856511 86.81605
Dim.6 0.2024033 2.886912 89.70297
La dimension 1 à elle seule capture environ 49 % de la variance et la dimension 2 19 % de plus, de sorte que les deux premiers axes ensemble retiennent à peu près 69 % — suffisant pour que les cartes en 2-D ci-dessous racontent l’essentiel de l’histoire, tandis que les éboulis montrent la variance décroître rapidement ensuite.
fviz_eig() (alias fviz_screeplot()) montre les mêmes nombres sous forme de diagramme en barres, ce qui rend la décroissance facile à lire :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_screeplot(res.mfa, addlabels = TRUE,
barfill = "#3a86d4", barcolor = "#3a86d4")
Graphique des variables
Groupes de variables
La vue propre à l’AFM : où se situent les groupes entiers par rapport aux dimensions ? Extrayez-les avec get_mfa_var(res.mfa, "group") — il renvoie les coordonnées, le cos2, la contribution et la corrélation de chaque groupe avec les dimensions principales :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
group <- get_mfa_var(res.mfa, "group")
# Coordinates of the groups
head(round(group$coord, 3)) Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
odor 0.782 0.620 0.374 0.173 0.086
visual 0.855 0.040 0.014 0.046 0.030
odor.after.shaking 0.925 0.469 0.180 0.101 0.116
taste 0.900 0.238 0.047 0.053 0.039
Tracez les groupes avec fviz_mfa_var(res.mfa, "group") — les groupes actifs sont en rouge, les groupes supplémentaires en vert :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_var(res.mfa, "group")
Lisez-le ainsi : le graphique montre la corrélation entre chaque groupe et les dimensions. Les quatre groupes actifs ont des coordonnées presque identiques sur la dimension 1 — ils contribuent de façon similaire au premier axe, qui est l’axe de « consensus » commun à l’odeur, l’aspect et le goût. Sur la dimension 2, les deux groupes d’odeur (odor et odor.after.shaking) se situent le plus haut, donc cet axe est principalement porté par l’olfaction.
Un diagramme en barres rend la contribution explicite — fviz_contrib(res.mfa, "group", axes = ...) :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
# Contribution of groups to dimensions 1 and 2
fviz_contrib(res.mfa, "group", axes = 1)
fviz_contrib(res.mfa, "group", axes = 2)
La ligne pointillée rouge marque la contribution attendue si chaque groupe était d’égale importance. Sur la dimension 1, les groupes actifs se situent tous près d’elle (un consensus équilibré) ; sur la dimension 2, les groupes d’odeur s’élèvent bien au-dessus.
Variables quantitatives (cercle des corrélations)
Zoomons maintenant sur les variables continues individuelles. Extrayez-les avec get_mfa_var(res.mfa, "quanti.var") (coordonnées, cos2, contribution), puis tracez le cercle des corrélations, en colorant les flèches par groupe. Les variables quantitatives supplémentaires sont affichées en flèches violettes pointillées ; repel = TRUE empêche les étiquettes de se chevaucher :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_var(res.mfa, "quanti.var", palette = "jco",
col.var.sup = "violet", repel = TRUE)
Lisez le cercle des corrélations de la même façon que dans l’ACP :
- Les variables corrélées positivement pointent dans la même direction ; celles qui sont corrélées négativement pointent vers des côtés opposés de l’origine.
- La distance à l’origine mesure la qualité de représentation d’une variable — les flèches atteignant le cercle sont bien affichées.
- Une variable s’aligne sur la dimension vers laquelle elle pointe.
Ici, la dimension 1 capture le sentiment positif à l’égard des vins — Intensity et Harmony — partagé entre l’odeur, l’aspect et le goût. La dimension 2 correspond essentiellement au caractère olfactif épicé / végétal : Spice.before.shaking et Odor.Intensity.before.shaking (groupe odor), Spice, Plante et Odor.Intensity (groupe odor-après-agitation), et Bitterness (groupe taste).
Lorsque les flèches s’entassent, passez aux points + texte et déplacez la légende vers le bas :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_var(res.mfa, "quanti.var", palette = "jco",
col.var.sup = "violet", repel = TRUE,
geom = c("point", "text"), legend = "bottom")
Pour classer les variables qui construisent réellement chaque axe, utilisez fviz_contrib() (variables colorées par groupe). Les variables les plus contributives aux dimensions 1 et 2 sont les plus importantes pour expliquer la variation dans les données :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
# Top 20 contributors to dimensions 1 and 2
fviz_contrib(res.mfa, choice = "quanti.var", axes = 1, top = 20, palette = "jco")
fviz_contrib(res.mfa, choice = "quanti.var", axes = 2, top = 20, palette = "jco")
Vous pouvez aussi colorer le cercle des corrélations par contrib (un gradient) pour voir où sur la carte se situent les variables importantes :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_var(res.mfa, "quanti.var", col.var = "contrib",
gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
col.var.sup = "violet", repel = TRUE,
geom = c("point", "text"))
Graphique des individus
Extrayez les résultats au niveau des individus avec get_mfa_ind(), puis tracez les vins avec fviz_mfa_ind(). Colorez-les par cos2 pour voir quels vins sont bien représentés sur ces deux axes :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_ind(res.mfa, col.ind = "cos2",
gradient.cols = c("#dbe9f6", "#3a86d4", "#08306b"),
repel = TRUE)
Les étiquettes noires sont les catégories des variables qualitatives supplémentaires (Label et Soil, qui résident dans le groupe supplémentaire origin) — Saumur, Bourgueil, Chinon et Reference, Env1, Env2, Env4. Masquez-les avec invisible = "quali.var" si vous ne voulez que les vins.
Les vins aux profils similaires se situent proches les uns des autres. Le premier axe oppose le vin 1DAM (coordonnée positive élevée) à 1VAU et 2ING (négative) : puisque la dimension 1 est l’axe d’intensité / harmonie, 1DAM a été jugé le plus intense et harmonieux, 1VAU et 2ING les moins. Le deuxième axe est associé à T1 et T2, marqués par de fortes Spice.before.shaking et Odor.Intensity.before.shaking. Parmi les catégories supplémentaires, Reference — un sol connu pour d’excellents vins — se place haut sur le premier axe, exactement là où se trouvent les vins intenses et harmonieux, ce qui valide joliment la lecture.
Colorer les individus par groupe
Vous pouvez colorer les vins par n’importe quelle variable qualitative du tableau d’origine avec habillage, et tracer une ellipse de concentration par groupe avec addEllipses = TRUE. Ici, nous colorons par Label :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_ind(res.mfa,
habillage = "Label", # colour by groups
palette = "jco", # colourblind-safe journal palette
addEllipses = TRUE, ellipse.type = "confidence",
repel = TRUE)
Pour comparer plusieurs variables de regroupement à la fois, utilisez fviz_ellipses() :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_ellipses(res.mfa, c("Label", "Soil"), repel = TRUE)
Graphique des individus partiels
C’est la deuxième vue propre à l’AFM. Le résultat pour un individu vu à travers un seul groupe est appelé un individu partiel. Dans le graphique fviz_mfa_ind() par défaut, le point de chaque vin est l’individu moyen — le centre de gravité de ses points partiels, c’est-à-dire le vin tel que vu par tous les groupes ensemble. Pour un vin donné, il y a autant de points partiels que de groupes de variables.
fviz_mfa_ind(res.mfa, partial = ...) trace ces points partiels. Ne demander que quelques vins d’intérêt garde le graphique lisible :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_ind(res.mfa, partial = c("1DAM", "1VAU", "2ING"))
Chaque couleur est la vue d’un groupe sur le vin — le point partiel montre où ce seul groupe le placerait. Vous pouvez ainsi lire le désaccord entre groupes : 1DAM a une coordonnée élevée sur l’axe 1 du point de vue du groupe odor, c’est-à-dire qu’il est particulièrement intense et harmonieux à l’odeur. Et du point de vue du groupe odor, 2ING paraissait plus intense/harmonieux que 1VAU, tandis que du point de vue du groupe taste, c’était l’inverse — une nuance que le point moyen seul masque. (Utilisez partial = "all" pour afficher les points partiels de tous les vins à la fois.)
Graphique des axes partiels
Le graphique des axes partiels montre comment les axes principaux de l’AFM globale se rapportent aux axes obtenus en analysant chaque groupe séparément (une ACP par groupe quantitatif, une ACM par groupe qualitatif). Il vous indique si les groupes « s’accordent » sur ce que sont les principales directions de variation :
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = c(1, 6), graph = FALSE)
fviz_mfa_axes(res.mfa)
La première dimension de chaque groupe est fortement corrélée à la première dimension de l’AFM — les groupes s’accordent largement sur l’axe principal de variation (intensité / harmonie). La deuxième dimension de l’AFM est essentiellement corrélée à la deuxième dimension des groupes olfactifs, confirmant que l’axe 2 est une histoire d’odeur.
L’AFM se déroule en deux passes. D’abord, elle analyse chaque groupe \(j\) séparément : une ACP pour un groupe quantitatif, une ACM pour un groupe qualitatif. Soit \(\lambda_1^{(j)}\) la première valeur propre de l’analyse de ce groupe — une mesure de l’ampleur avec laquelle ce seul groupe « s’étire » le long de sa direction dominante.
Ensuite, l’AFM réalise une ACP globale du tableau entier, mais elle repondère d’abord chaque variable du groupe \(j\) par \(1 / \lambda_1^{(j)}\). Cette seule astuce est l’équilibrage : diviser par la valeur propre dominante du groupe met le premier axe de chaque groupe à la même longueur, de sorte qu’un groupe comportant de nombreuses variables ou de grandes unités ne peut dominer le consensus simplement parce qu’il est plus volumineux. Après la repondération, l’analyse globale est une décomposition en valeurs singulières ordinaire, donnant les dimensions, les coordonnées, le cos2 et les contributions — à lire exactement comme dans l’ACP / la ACM.
Les coordonnées partielles d’un individu sont ses projections lorsque seules les variables repondérées d’un seul groupe sont utilisées ; le point moyen tracé par fviz_mfa_ind() est la moyenne de ces points partiels. Le graphique des axes partiels corrèle alors les axes principaux propres à chaque groupe avec les axes globaux.
Essayez en direct
Modifiez et exécutez l’analyse dans votre navigateur — aucune installation nécessaire. Essayez de déplacer un groupe entre actif et supplémentaire (modifiez num.group.sup), de basculer le graphique des variables en points (geom = c("point", "text")), ou de demander les points partiels de différents vins, puis ré-exécutez.
Vous avez des observations réparties sur plusieurs blocs de variables — panels sensoriels, thèmes d’enquête, couches omiques ? Demandez à Prova « comment exécuter une analyse factorielle multiple sur mes variables groupées et interpréter les groupes et les graphiques partiels ? » — elle répond avec du code R que vous pouvez exécuter sur votre propre tableau, vous aide à régler les arguments group, type et num.group.sup, et lit avec vous la carte des groupes, le cercle des corrélations et les vues partielles. The runtime is the judge. Demander à Prova →
Problèmes courants
- Comment définir les groupes de variables ? Ordonnez les colonnes pour que chaque groupe soit contigu, puis passez
group =comme le vecteur des tailles de groupe dans cet ordre — sa somme doit égaler le nombre de colonnes. Nommez-les avecname.group =et fixez untypepar groupe ("s"/"c"quantitatif,"n"catégoriel,"f"fréquences). Une erreur fréquente est un vecteurgroupdont le total ne correspond pas àncol(); vérifiez avecsum(group) == ncol(your_data). - Groupes de types mixtes. Un groupe doit être d’un seul type, mais différents groupes peuvent avoir différents types — c’est exactement à cela que sert l’AFM. Placez vos colonnes catégorielles dans leur propre groupe avec
type = "n"et vos colonnes numériques dans des groupes quantitatifs avectype = "s". (Si, à l’inverse, chaque ligne mélange des colonnes numériques et catégorielles sans structure de groupe, la méthode est l’analyse factorielle de données mixtes (FAMD), pas l’AFM.) - AFM ou simplement ACP / ACM ? Si toutes vos variables forment un unique bloc d’un seul type, vous n’avez pas besoin de l’AFM — utilisez l’ACP (tout numérique) ou la ACM (tout catégoriel). L’AFM ne se justifie que lorsque les colonnes se présentent en plusieurs groupes que vous voulez équilibrer les uns par rapport aux autres.
- Un groupe domine quand même la carte. L’AFM équilibre déjà les groupes par la première valeur propre, mais un groupe que vous ne voulez pas voir piloter les axes du tout devrait être supplémentaire (
num.group.sup =) : il est alors projeté pour l’interprétation sans façonner les dimensions — comme nous l’avons fait avecoriginetoverall.
Questions fréquentes
L’AFM est une méthode de réduction de dimension pour des individus décrits par plusieurs groupes de variables. Elle exécute une ACP (pour les groupes quantitatifs) ou une ACM (pour les groupes qualitatifs) sur chaque groupe, équilibre les groupes pour qu’aucun ne domine (en divisant les variables de chaque groupe par la première valeur propre de ce groupe), puis réalise une analyse globale. Elle résume le tableau en quelques dimensions et vous permet de visualiser les groupes, les variables, les individus et la façon dont chaque groupe « voit » chaque individu.
Utilisez MFA() de FactoMineR. Disposez les colonnes pour que chaque groupe soit contigu, puis appelez MFA(data, group = c(...), type = c(...), name.group = c(...), num.group.sup = ..., graph = FALSE), où group donne le nombre de variables par groupe, type vaut "s"/"c" pour les groupes quantitatifs et "n" pour les groupes catégoriels, et num.group.sup signale les groupes supplémentaires. Visualisez avec factoextra — fviz_eig(), fviz_mfa_var(., "group"), fviz_mfa_var(., "quanti.var") et fviz_mfa_ind().
L’ACP analyse un unique bloc de variables quantitatives. L’AFM est conçue pour des variables qui se présentent en plusieurs groupes (éventuellement de types différents) : elle exécute une ACP/ACM par groupe et les équilibre pour qu’un groupe plus grand ou plus dispersé ne puisse dominer le résultat. Si vos variables forment un seul bloc quantitatif, l’ACP simple suffit ; utilisez l’AFM quand vous avez des blocs groupés — panels sensoriels, thèmes d’enquête, couches omiques — que vous voulez pondérer équitablement les uns par rapport aux autres.
Définissez les groupes avec les arguments group, type et name.group de MFA(), exécutez l’analyse, puis lisez la carte des groupes avec fviz_mfa_var(res.mfa, "group") et get_mfa_var(res.mfa, "group"). La carte des groupes montre comment chaque groupe corrèle avec chaque dimension ; fviz_contrib(res.mfa, "group", axes = k) classe les contributions des groupes à la dimension k. Les graphiques des individus partiels et des axes partiels montrent ensuite comment chaque groupe voit les individus et les axes.
Un individu partiel est une observation vue à travers un seul groupe de variables. Le point que fviz_mfa_ind() trace pour un individu est la moyenne de ses points partiels (l’individu vu par tous les groupes) ; fviz_mfa_ind(res.mfa, partial = "all") (ou un vecteur de noms) ajoute les points partiels par groupe, de sorte que vous pouvez repérer où les groupes sont en désaccord — par ex. un vin jugé intense à l’odeur mais moyen au goût.
Testez vos connaissances
Ré-exécutez l’AFM sur wine, mais cette fois rendez origin un groupe actif et gardez seulement overall supplémentaire (num.group.sup = 6). Imprimez les trois premières valeurs propres et tracez la carte des groupes de variables. Le fait de rendre origin actif change-t-il quel axe les groupes d’odeur pilotent ?
Gardez group = c(2, 5, 3, 10, 9, 2) et type = c("n", "s", "s", "s", "s", "s"), mais fixez num.group.sup = 6. Puis utilisez get_eigenvalue() et fviz_mfa_var(res, "group").
library(FactoMineR)
library(factoextra)
data(wine)
res.mfa <- MFA(wine,
group = c(2, 5, 3, 10, 9, 2),
type = c("n", "s", "s", "s", "s", "s"),
name.group = c("origin", "odor", "visual",
"odor.after.shaking", "taste", "overall"),
num.group.sup = 6,
graph = FALSE)
get_eigenvalue(res.mfa)[1:3, ]
fviz_mfa_var(res.mfa, "group")Avec origin désormais actif (rouge), le groupe catégoriel participe à la construction des axes, mais la structure sensorielle — les quatre groupes odor/visual/taste s’accordant sur la dimension 1 et les groupes d’odeur pilotant la dimension 2 — est essentiellement inchangée.
Vérification rapide. Vous avez des répondants décrits par trois blocs de questions d’enquête (démographie, attitudes, comportement). Vous voulez que les trois blocs construisent l’analyse mais soient pondérés pour que le plus grand bloc ne domine pas. Quelle méthode et quel argument ?
Utilisez l’AFM (MFA() de FactoMineR), en passant les trois tailles de bloc dans group = et un type par bloc. L’AFM équilibre automatiquement les blocs par la première valeur propre de chaque bloc, de sorte que le plus grand bloc ne peut dominer. Laissez num.group.sup = NULL pour que les trois blocs soient actifs (utilisés pour construire les dimensions).
Conclusion
Vous avez chargé un tableau dont les colonnes se présentaient en six groupes, les avez définis avec group, type et name.group, choisi quels groupes étaient actifs ou supplémentaires, exécuté MFA(), lu les valeurs propres (environ 69 % de la variance sur les deux premiers axes), et visualisé le résultat avec factoextra — la carte des groupes, le cercle des corrélations coloré par groupe et par contribution, la carte factorielle des individus regroupés par appellation, et les vues des individus partiels et des axes partiels propres à l’AFM. L’AFM a transformé cinq familles de descripteurs sensoriels en une histoire à deux axes : un axe de consensus d’intensité et d’harmonie, un axe olfactif de caractère épicé / végétal. Lorsque vos variables forment un unique bloc quantitatif, faites appel à l’ACP ; lorsqu’elles forment un unique bloc catégoriel, utilisez la ACM ; lorsque chaque ligne mélange des colonnes numériques et catégorielles sans structure de groupe, utilisez l’analyse factorielle de données mixtes (FAMD).
Leçons connexes
- Analyse en composantes principales (ACP) — le moteur que l’AFM exécute sur chaque groupe quantitatif, et la source de la lecture du cercle des corrélations. · Analyse des correspondances multiples (ACM) — le moteur que l’AFM exécute sur chaque groupe qualitatif. · Analyse des correspondances (CA) — le cas catégoriel à deux variables que la ACM généralise.
- Pour aller plus loin : ACP · ACM · analyse des correspondances · prcomp vs princomp. · Réduction de dimension — la série complète. · Machine Learning — le pilier.
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.
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.
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
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
Cette leçon est reproductible : chaque figure a été produite par le code montré — modifiez n’importe quel bloc et exécutez (Run), et le bac à sable + le quiz se ré-exécutent en direct dans votre navigateur. The runtime is the judge.
Réutilisation
Citation
@online{2026,
author = {},
title = {Analyse factorielle multiple (AFM) en R : analyser des
groupes de variables},
date = {2026-06-24},
url = {https://www.datanovia.com/learn/machine-learning/dimension-reduction/multiple-factor-analysis},
langid = {fr}
}