Quand plusieurs questions d'une enquête varient ensemble, c'est souvent qu'elles mesurent une même chose que personne n'a posée directement : la qualité du management, la satisfaction salariale. L'analyse factorielle retrouve ces facteurs cachés et dit quelle question mesure lequel, avec quelle force.
Trois thermomètres dans la même pièce donnent trois chiffres différents mais qui montent et descendent ensemble. On en déduit une seule chose réelle à mesurer : la température de la pièce.
On calcule les corrélations entre toutes les questions. Des blocs de questions très corrélées entre elles signalent un facteur commun.
Chaque réponse est modélisée comme une somme : une part due aux facteurs communs, une part propre à la question (sa formulation, le bruit). C'est la différence de fond avec l'ACP, qui ne fait pas cette séparation.
Une rotation, souvent varimax, réoriente les facteurs pour que chaque question pèse fortement sur un seul d'entre eux. On nomme alors chaque facteur d'après ses questions.
800 salariés répondent sur l'écoute du manager, la reconnaissance, la clarté des objectifs, le salaire, les primes, les avantages, la charge de travail, les horaires et les locaux. Les données sont simulées avec 3 facteurs cachés, pour vérifier que la méthode les retrouve.
Sur l'exemple simulé, chaque question pèse autour de 0,75 sur un seul facteur et presque 0 sur les autres. On nomme les facteurs management, rémunération et conditions de travail. Le baromètre peut alors suivre 3 scores au lieu de 9 questions.
Une saturation mesure le lien entre une question et un facteur : au-dessus de 0,4 en valeur absolue, la question contribue clairement. La part propre (uniqueness) dit ce que les facteurs n'expliquent pas : proche de 1, la question mesure autre chose. En R, un test indique aussi si le nombre de facteurs suffit.
Noms donnés pour R (factanal, package stats) et Python (scikit-learn). Pour des analyses plus poussées (rotations obliques, corrélations polychoriques), le package R psych est la référence.
Nombre de facteurs. On s'appuie sur les valeurs propres (critère de Kaiser, éboulis), sur le test de factanal en R, et surtout sur la lisibilité : chaque facteur doit se nommer.
Varimax garde des facteurs non corrélés et donne des saturations tranchées. Une rotation oblique (promax, oblimin) les autorise à être corrélés, ce qui est souvent plus réaliste en RH. scikit-learn propose varimax et quartimax.
On masque les saturations faibles, souvent sous 0,3 ou 0,4, pour lire la structure. Une question qui pèse sur deux facteurs est ambiguë : on la reformule ou on la retire.
# Baromètre salariés : analyse factorielle en R
set.seed(42)
n <- 800
# Simulation : 3 facteurs cachés (management, rémunération, conditions de travail)
facteurs <- matrix(rnorm(n * 3), ncol = 3)
facteur_de <- c(q1_manager_ecoute = 1, q2_manager_reconnait = 1, q3_manager_clair = 1,
q4_salaire_juste = 2, q5_primes = 2, q6_avantages = 2,
q7_charge_travail = 3, q8_horaires = 3, q9_locaux = 3)
latent <- sapply(facteur_de, function(f) 0.8 * facteurs[, f] + 0.6 * rnorm(n))
# Réponses sur une échelle de 1 (pas du tout d'accord) à 5 (tout à fait d'accord)
reponses <- apply(latent, 2, function(x) findInterval(x, c(-1.2, -0.4, 0.4, 1.2)) + 1)
fa <- factanal(reponses, factors = 3, rotation = "varimax")
# Saturations (poids faibles masqués) et part propre à chaque question
print(fa$loadings, cutoff = 0.3)
print(round(fa$uniquenesses, 2))
cat("Test : 3 facteurs suffisent-ils ? p =", round(fa$PVAL, 3), "\n")
# Baromètre salariés : analyse factorielle en Python
import numpy as np
import pandas as pd
from sklearn.decomposition import FactorAnalysis
rng = np.random.default_rng(42)
n = 800
# Simulation : 3 facteurs cachés (management, rémunération, conditions de travail)
facteurs = rng.normal(size=(n, 3))
questions = {"q1_manager_ecoute": 0, "q2_manager_reconnait": 0, "q3_manager_clair": 0,
"q4_salaire_juste": 1, "q5_primes": 1, "q6_avantages": 1,
"q7_charge_travail": 2, "q8_horaires": 2, "q9_locaux": 2}
latent = pd.DataFrame({q: 0.8 * facteurs[:, f] + 0.6 * rng.normal(size=n) for q, f in questions.items()})
# Réponses sur une échelle de 1 (pas du tout d'accord) à 5 (tout à fait d'accord)
reponses = latent.apply(lambda c: pd.cut(c, [-np.inf, -1.2, -0.4, 0.4, 1.2, np.inf], labels=False) + 1)
Z = (reponses - reponses.mean()) / reponses.std()
fa = FactorAnalysis(n_components=3, rotation="varimax", random_state=42).fit(Z)
# Saturations : poids de chaque question sur chaque facteur (le signe d'un facteur est arbitraire)
print(pd.DataFrame(fa.components_.T, index=reponses.columns, columns=["F1", "F2", "F3"]).round(2))
# Variance propre à chaque question, non expliquée par les facteurs
print(pd.Series(fa.noise_variance_, index=reponses.columns).round(2))
L'ACP résume toute la variance des variables en axes, sans hypothèse. L'analyse factorielle suppose que les réponses sont causées par quelques facteurs cachés plus une part propre à chaque question, et n'explique que la part commune. Les résultats se ressemblent souvent, mais l'analyse factorielle est la bonne méthode pour interpréter un questionnaire.
Une rotation des facteurs qui maximise la dispersion des saturations : chaque question pèse fortement sur un facteur et faiblement sur les autres. Elle ne change pas la qualité d'ajustement du modèle, seulement sa lisibilité. Les facteurs restent non corrélés entre eux.
Il n'y a pas de seuil universel. Les repères courants vont de 5 à 10 répondants par question, avec un minimum de 100 à 200. Plus les facteurs sont nets et les saturations fortes, moins il en faut.
Résume toute la variance sans modéliser de facteurs cachés. Plus simple pour compresser, moins juste pour interpréter un questionnaire.
Voir la fiche → l'autre modèle de sources cachéesCherche des sources statistiquement indépendantes plutôt que décorrélées. Adaptée aux signaux, rarement aux enquêtes.
Voir la fiche → pour les questions qualitativesLe bon outil quand les réponses sont des catégories non ordonnées plutôt que des échelles de notes.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus