L’analyse factorielle des correspondances, souvent abrégée en AFC, fait partie des méthodes les plus utiles lorsqu’on travaille sur des données qualitatives. Elle permet de transformer un tableau de contingence parfois lourd à lire en une représentation beaucoup plus claire, plus visuelle et plus facile à interpréter.
Autrement dit, au lieu de rester bloqué devant une matrice de chiffres, on cherche à comprendre quelles catégories se rapprochent, lesquelles s’opposent, et comment se structure l’ensemble des relations entre deux variables qualitatives.
En Python, cette méthode devient très accessible grâce à quelques bibliothèques simples à utiliser. Avec une bonne préparation des données et quelques lignes de code, on peut produire une analyse propre, lisible et exploitable dans un rapport, un mémoire, une étude de marché ou un projet académique.
L’analyse factorielle des correspondances sert avant tout à étudier les liens entre les lignes et les colonnes d’un tableau croisé.
Imaginons un tableau qui croise :
Ou encore :
Ou bien :
Dans ce type de tableau, les chiffres bruts donnent déjà une première idée. Pourtant, dès que le nombre de catégories augmente, la lecture devient vite fatigante. On finit par voir des effectifs, mais on distingue mal les structures profondes. C’est justement là que l’AFC devient précieuse. Elle résume les informations essentielles sous forme d’axes, puis place les modalités sur un plan factoriel. On obtient alors une carte qui aide à lire les proximités, les oppositions et les regroupements.
L’intérêt de cette méthode tient à sa capacité à rendre visible ce qui restait dispersé dans le tableau.
L’AFC s’utilise lorsque l’on dispose de deux variables qualitatives. Ces variables sont croisées pour produire un tableau d’effectifs.
Par exemple :
Elle convient donc parfaitement aux études descriptives, aux enquêtes, aux questionnaires, aux analyses marketing, aux travaux en sciences sociales ou encore aux projets pédagogiques autour de données catégorielles.
Lorsque l’on a plus de deux variables qualitatives, on se tourne généralement vers une méthode voisine : l’analyse des correspondances multiples. L’AFC, elle, reste centrée sur le croisement entre deux dimensions qualitatives.
Derrière son nom un peu technique, l’AFC repose sur une idée simple. Elle cherche à mesurer la manière dont les catégories s’écartent d’une situation d’indépendance.
Si deux variables étaient totalement indépendantes, les distributions observées suivraient une logique attendue. Or, dans la réalité, certaines modalités apparaissent plus souvent ensemble que prévu, tandis que d’autres se rencontrent beaucoup moins. L’AFC met précisément en lumière cette structure.
Elle ne se contente donc pas de dire qu’il y a des différences. Elle aide à voir où se trouvent ces différences, quelles modalités portent le plus la structure du tableau, et comment les interpréter visuellement.
Python offre un environnement très confortable pour mener une AFC. Il permet :
Cette souplesse fait de Python un très bon choix pour les étudiants, les chercheurs, les analystes de données et les professionnels qui souhaitent automatiser leurs traitements.
Dans la pratique, trois outils suffisent souvent :
Avant de commencer, il faut installer les bibliothèques utiles. La commande suivante suffit en général :
pip install pandas matplotlib prince
Une fois cette étape terminée, vous pouvez importer les modules dans votre script Python.
import pandas as pd
import matplotlib.pyplot as plt
import prince
Pour bien comprendre la logique, prenons un petit exemple fictif. Imaginons un ensemble d’observations contenant deux variables :
SexeBoissonVoici un jeu de données très simple :
import pandas as pd
df = pd.DataFrame({
"Sexe": [
"F", "F", "F", "F", "H", "H", "H", "H", "F", "H",
"F", "H", "F", "H", "F", "H", "F", "H", "F", "H"
],
"Boisson": [
"Thé", "Café", "Thé", "Jus", "Café", "Café", "Soda", "Jus", "Thé", "Soda",
"Jus", "Café", "Thé", "Soda", "Jus", "Café", "Thé", "Soda", "Jus", "Café"
]
})
print(df)
À ce stade, les données sont encore sous forme brute. Chaque ligne représente une observation.
L’étape suivante consiste à transformer ces données en tableau croisé. C’est ce tableau que l’AFC va analyser.
table = pd.crosstab(df["Sexe"], df["Boisson"])
print(table)
On peut obtenir un résultat de ce type :
Boisson Café Jus Soda Thé
Sexe
F 1 4 0 5
H 5 1 4 0
Ce tableau montre combien de fois chaque modalité de la variable Sexe apparaît avec chaque modalité de la variable Boisson.
C’est le point de départ concret de l’analyse factorielle des correspondances.
Une fois le tableau construit, il devient possible de lancer l’analyse avec la bibliothèque prince.
import prince
ca = prince.CA(
n_components=2,
n_iter=10,
copy=True,
check_input=True,
engine="sklearn",
random_state=42
)
ca = ca.fit(table)
Ici, n_components=2 indique que l’on souhaite résumer la structure sur deux axes principaux. Ce choix est courant, car il permet de représenter les résultats sur un graphique à deux dimensions.
Après l’ajustement du modèle, on peut extraire les coordonnées factorielles des lignes et des colonnes.
row_coords = ca.row_coordinates(table)
col_coords = ca.column_coordinates(table)
print("Coordonnées des lignes :")
print(row_coords)
print("\nCoordonnées des colonnes :")
print(col_coords)
Ces coordonnées correspondent à la position des modalités dans l’espace factoriel. Ce sont elles qui permettront de tracer la carte de l’analyse.
Dans une AFC, on ne parle pas exactement de variance expliquée comme dans une ACP. On parle plutôt d’inertie. Cette inertie indique la part de structure résumée par chaque axe.
print("Valeurs propres :")
print(ca.eigenvalues_)
print("\nPourcentage d'inertie :")
print(ca.percentage_of_variance_)
print("\nPourcentage cumulé :")
print(ca.cumulative_percentage_of_variance_)
L’idée générale reste simple : plus les deux premiers axes concentrent une part importante de l’inertie, plus la représentation sur un plan 2D est fidèle à la structure du tableau.
L’une des grandes forces de l’AFC réside dans sa représentation graphique. On peut tracer un plan factoriel avec matplotlib.
fig, ax = plt.subplots(figsize=(8, 6))
# Points lignes
ax.scatter(row_coords[0], row_coords[1], label="Lignes")
for i, txt in enumerate(row_coords.index):
ax.annotate(txt, (row_coords.iloc[i, 0], row_coords.iloc[i, 1]))
# Points colonnes
ax.scatter(col_coords[0], col_coords[1], label="Colonnes")
for i, txt in enumerate(col_coords.index):
ax.annotate(txt, (col_coords.iloc[i, 0], col_coords.iloc[i, 1]))
ax.axhline(0)
ax.axvline(0)
ax.set_xlabel("Axe 1")
ax.set_ylabel("Axe 2")
ax.set_title("Carte factorielle AFC")
ax.legend()
plt.show()
Ce graphique place les modalités des lignes et des colonnes sur un même plan. C’est à partir de cette carte que l’on commence réellement l’interprétation.
Voici maintenant un script complet, propre et réutilisable.
import pandas as pd
import matplotlib.pyplot as plt
import prince
# 1. Données
df = pd.DataFrame({
"Sexe": [
"F", "F", "F", "F", "H", "H", "H", "H", "F", "H",
"F", "H", "F", "H", "F", "H", "F", "H", "F", "H"
],
"Boisson": [
"Thé", "Café", "Thé", "Jus", "Café", "Café", "Soda", "Jus", "Thé", "Soda",
"Jus", "Café", "Thé", "Soda", "Jus", "Café", "Thé", "Soda", "Jus", "Café"
]
})
# 2. Tableau croisé
table = pd.crosstab(df["Sexe"], df["Boisson"])
print("Tableau de contingence :")
print(table)
# 3. AFC
ca = prince.CA(
n_components=2,
n_iter=10,
copy=True,
check_input=True,
engine="sklearn",
random_state=42
)
ca = ca.fit(table)
# 4. Coordonnées
row_coords = ca.row_coordinates(table)
col_coords = ca.column_coordinates(table)
print("\nCoordonnées des lignes :")
print(row_coords)
print("\nCoordonnées des colonnes :")
print(col_coords)
# 5. Inertie
print("\nValeurs propres :")
print(ca.eigenvalues_)
print("\nPourcentage d'inertie :")
print(ca.percentage_of_variance_)
# 6. Graphique
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(row_coords[0], row_coords[1], label="Lignes")
for i, txt in enumerate(row_coords.index):
ax.annotate(txt, (row_coords.iloc[i, 0], row_coords.iloc[i, 1]))
ax.scatter(col_coords[0], col_coords[1], label="Colonnes")
for i, txt in enumerate(col_coords.index):
ax.annotate(txt, (col_coords.iloc[i, 0], col_coords.iloc[i, 1]))
ax.axhline(0)
ax.axvline(0)
ax.set_xlabel("Axe 1")
ax.set_ylabel("Axe 2")
ax.set_title("Analyse factorielle des correspondances")
ax.legend()
plt.show()
C’est souvent à ce moment que les utilisateurs se sentent un peu perdus. Pourtant, la logique de lecture reste assez intuitive dès qu’on prend un peu de recul.
Lorsque deux modalités sont proches sur le plan, cela suggère qu’elles ont un profil voisin dans la structure du tableau. Elles se comportent donc de manière assez similaire vis-à-vis de l’autre variable.
Plus un point est éloigné du centre, plus il contribue à la structuration de l’analyse. Les modalités très proches de l’origine sont souvent moins marquantes dans l’interprétation.
Si deux modalités apparaissent de part et d’autre d’un axe, cela peut traduire une opposition de profils. L’axe représente alors une ligne de contraste.
L’origine du plan correspond à une situation plus neutre. Les modalités qui y restent proches se distinguent moins nettement.
Supposons que l’analyse fasse apparaître :
F proche de Thé et Jus ;H proche de Café et Soda.Une interprétation possible serait la suivante :
L’analyse met en évidence une structuration claire des préférences dans le tableau observé. La modalité F se situe dans une zone proche du Thé et du Jus, ce qui suggère un profil davantage associé à ces boissons. À l’inverse, la modalité H se rapproche du Café et du Soda, signalant une tendance différente. Le premier axe semble donc opposer deux profils de consommation nettement distincts.
Cette manière de rédiger reste plus rigoureuse qu’une affirmation brutale ou généralisante. L’AFC décrit une structure observée dans les données étudiées. Elle ne transforme pas automatiquement cette structure en loi universelle.
Dans un vrai projet, les données proviennent souvent d’un fichier CSV. La logique reste exactement la même.
Imaginons un fichier donnees.csv contenant deux colonnes :
RegionProduitLe code peut alors s’écrire ainsi :
import pandas as pd
import prince
df = pd.read_csv("donnees.csv")
table = pd.crosstab(df["Region"], df["Produit"])
ca = prince.CA(
n_components=2,
n_iter=10,
copy=True,
check_input=True,
engine="sklearn",
random_state=42
)
ca = ca.fit(table)
row_coords = ca.row_coordinates(table)
col_coords = ca.column_coordinates(table)
print(row_coords)
print(col_coords)
Cette version fonctionne très bien dans un contexte d’étude marketing, d’enquête territoriale, de questionnaire client ou de mémoire académique.
La confusion entre ces deux méthodes est fréquente. Pourtant, elles ne répondent pas au même besoin.
L’analyse en composantes principales s’utilise pour des variables quantitatives. Elle résume les corrélations et la variabilité entre des mesures numériques.
L’analyse factorielle des correspondances s’utilise pour des variables qualitatives croisées sous forme de tableau d’effectifs.
L’analyse des correspondances multiples prolonge l’AFC lorsque plusieurs variables qualitatives sont étudiées ensemble.
En résumé, l’AFC est le bon outil dès que l’on cherche à analyser un tableau croisé entre deux variables catégorielles.
Certaines erreurs reviennent souvent chez les débutants. Les connaître fait gagner beaucoup de temps.
L’AFC ne s’applique pas directement à des variables quantitatives continues. Elle suppose un tableau de contingence construit à partir de catégories.
Il vaut mieux construire l’analyse à partir des effectifs bruts. Les pourcentages servent ensuite à compléter l’interprétation, mais ils ne remplacent pas la structure initiale du tableau.
Le graphique aide énormément, mais il ne faut pas lui demander plus qu’il ne peut donner. Une proximité visible constitue une piste d’interprétation, pas une preuve absolue.
Un tableau rempli de cases nulles ou de très faibles effectifs peut rendre l’analyse instable ou peu parlante.
L’AFC met en évidence des associations et des structures. Elle ne démontre pas à elle seule une relation de cause à effet.
Une fois les premières coordonnées obtenues, il devient intéressant d’examiner d’autres indicateurs, comme les contributions des modalités aux axes.
Selon la version de la bibliothèque installée, certains attributs peuvent être disponibles pour approfondir l’analyse.
Par exemple :
print(dir(ca))
Cette commande permet de repérer les éléments supplémentaires proposés par l’objet AFC. Dans certaines situations, on peut retrouver des informations utiles sur les contributions ou la qualité de représentation.
L’objectif reste toujours le même : comprendre quelles modalités portent réellement la structure de l’analyse.
Une bonne AFC repose rarement sur le code seul. Elle dépend surtout d’une démarche claire.
Commencez par vérifier la qualité de vos données. Assurez-vous que les catégories sont bien homogènes, que les libellés sont propres, et que les regroupements ont du sens.
Ensuite, construisez votre tableau croisé avec soin. Observez déjà les effectifs bruts avant de lancer l’analyse. Ce premier regard est très utile. Il vous donne souvent une intuition qui facilitera la lecture du plan factoriel.
Après cela, lancez l’AFC, récupérez les coordonnées, puis regardez la part d’inertie des axes. Ce point compte beaucoup, car il indique si la représentation en deux dimensions est réellement parlante.
Enfin, interprétez avec mesure. Une bonne lecture de l’AFC ne cherche pas à forcer les résultats. Elle décrit la structure observée avec précision, sobriété et logique.
Lorsque vient le moment de rédiger, vous pouvez adopter une formulation de ce type :
L’analyse factorielle des correspondances appliquée au tableau croisé met en évidence une structuration claire des modalités selon les deux premiers axes. Le premier axe traduit principalement une opposition entre certains profils, tandis que le second affine la lecture en révélant des nuances complémentaires. Les proximités observées sur le plan factoriel suggèrent des associations entre plusieurs catégories, qu’il convient d’interpréter comme une synthèse descriptive des écarts à l’indépendance.
Cette formulation fonctionne bien dans un devoir, un rapport professionnel ou une étude universitaire.
L’analyse factorielle des correspondances en Python permet de transformer un simple tableau croisé en une lecture plus intelligente, plus synthétique et plus visuelle des relations entre deux variables qualitatives.
La démarche suit généralement ce chemin :
Avec pandas, prince et matplotlib, cette méthode devient accessible même à ceux qui débutent. Elle offre une vraie valeur ajoutée dès qu’il s’agit d’explorer des données qualitatives avec plus de finesse qu’un simple tableau de fréquences.
Dans de nombreuses PME industrielles, la maintenance préventive repose encore sur des fichiers dispersés, des…
Le calcul du PGCD en ligne répond à quelque chose de très concret. Quand on…
Dans beaucoup d’organisations, le compte de résultat garde une image austère. On le consulte en…
Télécharger un modèle de compte de résultat dans Excel ( modèle réutilisable version automatisée) ⬇️…
Introduction Les Contes de Terremer occupent une place à part dans la littérature de l’imaginaire.…
Une manière plus claire, plus visuelle et plus intelligente de piloter un projet Lorsqu’on parle…
This website uses cookies.