L'analyse en composantes principales résume plusieurs variables corrélées en quelques axes qui gardent l'essentiel de l'information. On l'utilise pour voir une base d'un coup d'œil, comprendre quelles variables vont ensemble et préparer un clustering ou un modèle.
Photographier une théière en 2D. Selon l'angle, on reconnaît tout de suite l'objet ou on ne voit qu'un disque. L'ACP cherche l'angle de vue qui montre le plus de relief.
Chaque variable est centrée et réduite (moyenne 0, écart-type 1). Sinon, celle qui a les plus grands chiffres, comme la récence en jours, impose sa direction.
Le premier axe est la combinaison des variables qui résume le plus de variance. Le deuxième fait de même avec ce qui reste, en étant perpendiculaire au premier, donc sans redire la même chose.
La variance expliquée dit combien d'information chaque axe conserve. Les corrélations entre variables et axes disent ce que chaque axe représente.
Panier moyen, achats par mois, jours depuis le dernier achat, nombre de catégories achetées, part des achats en promotion. Cinq colonnes difficiles à regarder ensemble.
Sur ce jeu, le premier axe garde environ 77 % de l'information. Il oppose les clients qui achètent souvent, cher et dans beaucoup de rayons à ceux qui achètent peu, en promo, et pas récemment. C'est un axe d'engagement, qui peut servir de score unique. Le second axe, environ 13 %, apporte une nuance secondaire.
Les deux premiers axes gardent ici environ 90 % de l'information : la carte est fidèle. Sous 60 à 70 %, une carte en 2D déforme trop la base et il faut regarder plus d'axes avant de conclure.
L'ACP n'a pas d'hyperparamètre à optimiser, mais trois décisions changent la lecture. Noms donnés pour R (prcomp) et Python (scikit-learn).
Standardiser avant l'ACP. Sans cela, les variables aux grands nombres dominent les axes. On ne s'en passe que si toutes les variables sont dans la même unité.
On garde les axes jusqu'à 70 à 90 % de variance cumulée, ou ceux dont la valeur propre dépasse 1 (critère de Kaiser). On regarde aussi où la courbe des variances fait un coude.
Les corrélations variable/axe donnent le sens de l'axe. Les contributions disent quelles variables l'ont construit. Le signe d'un axe est arbitraire : R et Python peuvent donner des axes inversés, la lecture reste la même.
# Profil clients : ACP en R
clients <- read.csv("clients_segmentation.csv")
vars <- c("panier_moyen", "achats_par_mois", "recence_jours", "nb_categories", "part_promo")
# ACP sur variables standardisées (scale. = TRUE)
acp <- prcomp(clients[, vars], scale. = TRUE)
# Variance expliquée par axe, et cumulée
print(round(summary(acp)$importance, 3))
# Corrélations entre variables et axes : ce qui donne son sens à chaque axe
print(round(cor(clients[, vars], acp$x[, 1:2]), 2))
# Contribution de chaque variable à la construction des axes (en %)
print(round(100 * acp$rotation[, 1:2]^2, 1))
# Coordonnées des clients sur les 2 axes, réutilisables comme scores
clients$axe1 <- acp$x[, 1]
clients$axe2 <- acp$x[, 2]
print(head(clients))
# Profil clients : ACP en Python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
clients = pd.read_csv("clients_segmentation.csv")
variables = ["panier_moyen", "achats_par_mois", "recence_jours", "nb_categories", "part_promo"]
# ACP sur variables standardisées
X = StandardScaler().fit_transform(clients[variables])
acp = PCA().fit(X)
coord = acp.transform(X)
# Variance expliquée par axe, et cumulée
print("Variance expliquée :", acp.explained_variance_ratio_.round(3))
print("Cumulée :", acp.explained_variance_ratio_.cumsum().round(3))
# Corrélations entre variables et axes : ce qui donne son sens à chaque axe
corr = np.corrcoef(X.T, coord[:, :2].T)[:5, 5:]
print(pd.DataFrame(corr, index=variables, columns=["axe1", "axe2"]).round(2))
# Contribution de chaque variable à la construction des axes (en %)
contrib = 100 * acp.components_[:2].T ** 2
print(pd.DataFrame(contrib, index=variables, columns=["axe1", "axe2"]).round(1))
# Coordonnées des clients sur les 2 axes, réutilisables comme scores
clients["axe1"], clients["axe2"] = coord[:, 0], coord[:, 1]
On regarde la corrélation de chaque variable avec l'axe. Les variables fortement corrélées, positivement ou négativement, donnent son sens à l'axe. Si le panier et la fréquence sont à +0,9 et la récence à -0,9, l'axe mesure l'engagement du client.
Assez pour conserver l'essentiel de l'information, souvent 70 à 90 % de variance cumulée. Le critère de Kaiser garde les axes dont la valeur propre dépasse 1 sur données standardisées. Un axe qu'on ne sait pas interpréter n'aide pas à décider.
Oui dès que les variables ont des unités différentes, ce qui est le cas le plus courant. En R, prcomp(scale. = TRUE). En Python, StandardScaler avant PCA, qui ne fait que centrer les données.
Le même principe appliqué aux tableaux de catégories. L'outil de référence des enquêtes et questionnaires.
Voir la fiche → pour les structures non linéairesUne carte 2D qui garde les voisinages même quand les données sont enroulées. Plus puissante pour voir des groupes, mais ses axes n'ont pas de sens.
Voir la fiche → l'étape suivanteOn segmente souvent sur les premiers axes de l'ACP : moins de bruit, pas de variables en double.
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