MIAGE

Plateforme

Master 1 MIAGE

Analyse de Données

Comprendre l'ACP, l'AFC, l'ACM et la Classification sans prérequis. L'accent est sur l'interprétation des résultats.

Stats Descriptives

Moyenne, variance, corrélation, Chi-Deux

ACP

Cercle des corrélations, inertie, cos²

AFC & ACM

Variables qualitatives, barycentres

Classification

K-Means, CAH, dendrogramme

Les 4 étapes d'une bonne interprétation

1

L'Inertie

% de variance capté par les axes. Les axes résument-ils bien les données ?

2

La Contribution (CTR)

Qui fabrique l'axe ? Quelles variables tirent le graphique ?

3

La Qualité ($Cos^2$)

Le point est-il vraiment sur ce plan 2D ou illusion d'optique ?

4

Conclusion Métier

Traduire la proximité géométrique en phrase claire.

Piège fréquent

Ne dites jamais : "La variable est sur l'axe 1". Dites : "La variable X contribue fortement à l'axe 1 (CTR = 32%) et est très bien représentée (Cos² = 0.89), donc l'axe 1 oppose les individus ayant de fortes valeurs de X à ceux ayant de faibles valeurs."

Chapitre 0 : Premiers pas avec R

Avant d'analyser, il faut savoir charger des données et les manipuler.

Charger un fichier de données

# Charger un fichier texte (fichiers du cours préchargés) data <- read.table("StateFacts.txt", header = TRUE, row.names = 1)
data <- read.table("Jussac.txt", header = TRUE)
data <- read.table("Menages.txt", header = TRUE, row.names = 1)

# Vérifier ce qu'on a chargé head(data) # 6 premières lignes
dim(data) # Dimensions n x p
str(data) # Structure : num ? factor ?
summary(data) # Résumé rapide

str() est indispensable : vérifiez que vos variables quantitatives sont bien num et vos qualitatives Factor.

# Corriger le type data$age <- as.numeric(data$age)
data$sexe <- as.factor(data$sexe)

Les 4 objets de base en R

1. Le vecteur

Suite de valeurs de même type.

v <- c(1, 5, 8)
v[2] # 5

2. La matrice

Tableau 2D, même type partout.

m <- matrix(1:6, nrow=2)
m[1,2]

3. La liste

Sac qui contient n'importe quoi.

L <- list(a=1:3, b="x")
L$a

4. Le data.frame

L'objet roi ! Types différents par colonne.

df <- data.frame(nom=c("A"), age=c(25))
df$age

Manipulations indispensables

# Statistiques de base mean(data$revenu) # Moyenne
sd(data$revenu) # Écart-type
median(data$revenu) # Médiane

# Sélectionner data[1:10, ] # 10 premières lignes
data[data$age > 50, ] # Filtre

# Statistiques par groupe tapply(data$revenu, data$region, mean)
À retenir : summary(), str() et head() sont vos trois premières commandes obligatoires après avoir chargé un fichier.

Pièges fréquents en R

Le piège attach()

attach(data) semble pratique mais crée des conflits si vous modifiez le data.frame. Préférez la syntaxe data$variable ou with(data, ...). Si vous utilisez attach, pensez systématiquement à detach(data).

Variables qualitatives mal codées

Après chaque read.table(), faites str(data). Si une variable qualitative apparaît en chr ou int au lieu de Factor, corrigez avec data$var <- as.factor(data$var).

Valeurs manquantes silencieuses

mean(x) renvoie NA si une seule valeur manque. Utilisez mean(x, na.rm = TRUE) ou repérez-les avec any(is.na(data)) et which(is.na(data$var), arr.ind = TRUE).

Bonne pratique

Trois commandes obligatoires après chaque import : head(data), str(data), summary(data). Cela détecte 90% des problèmes avant même de commencer l'analyse.

Chapitre 1 : Statistiques Descriptives

Le socle de tout le cours : décrire ses données avant d'analyser.

Le vocabulaire à maîtriser

Population

L'ensemble étudié. On note n le nombre d'individus.

Individu

Chaque "ligne" du tableau. Une unité statistique.

Variable

Chaque "colonne". Une information recueillie.

Qualitative (Catégorielle)

Valeur = catégorie. Pas de moyenne !

  • Nominale : pas d'ordre (Sexe, Région)
  • Ordinale : avec ordre (Petit/Moyen/Grand)

Quantitative (Numérique)

Valeur = nombre calculable.

  • Discrète : entières (Nb enfants)
  • Continue : réelles (Taille, Poids)

Piège : Un code postal est un nombre (49000) mais c'est une variable qualitative ! On ne calcule pas la moyenne des codes postaux.

Variables Qualitatives

Table de fréquences

ModalitéEffectifFréquence
Féminin741.2%
Masculin1058.8%
Total17100%

Barplot

F M
Phrase type : "La variable Sexe présente deux modalités. La distribution montre une légère surreprésentation des individus masculins (58.8%)."

Variables Quantitatives

Moyenne $\bar{X}$

Centre de gravité. Sensible aux extrêmes. mean(x)

Médiane

Coupe en deux parties égales. median(x)

Variance $\sigma^2$

Dispersion autour de la moyenne. var(x)

Écart-type $\sigma$

Racine carrée de la variance. sd(x)

Centrer-Réduire : $Z_i = \frac{X_i - \bar{X}}{\sigma(X)}$ → moyenne = 0, écart-type = 1. Indispensable quand les unités diffèrent !
Corrélation : $r = \frac{Cov(X,Y)}{\sigma(X)\sigma(Y)}$ entre -1 et 1. $R^2 = r^2$ = % de variance expliquée.
cor(data$x, data$y) # Corrélation
reg <- lm(y ~ x, data=data)
summary(reg) # R² dans la sortie

Croisement & Test du Chi-Deux

Tableau brut

FumeurNon-FumeurTotal
Sportif104050
Non-Sportif302050
Total4060100

Profils-Lignes

FumeurNon-FumeurTotal
Sportif20%80%100%
Non-Sportif60%40%100%
$H_0$ : X et Y sont indépendantes. Règle : Si p-value < 0.05, on rejette $H_0$.
Phrase type : "La p-value du $\chi^2$ étant inférieure à 0.05 (p = 0.003), on rejette l'indépendance. Les profils-lignes montrent une forte attraction entre être non-sportif et fumer (60% contre 20%)."
tab <- table(data$Sport, data$Fumeur)
prop.table(tab, 1) # Profils-lignes
chisq.test(tab) # Test du Chi-Deux

Visualisations indispensables

Histogramme

Montre la forme de la distribution et permet de détecter visuellement les valeurs extrêmes.

hist(data$Criminalite) # par défaut
hist(data$Criminalite, freq = FALSE) # densité
hist(data$Criminalite, breaks = c(0, 2, 4, 6, 8, 10, 15)) # classes manuelles

Boxplot

Médiane, quartiles, et outliers en un coup d'œil. Essentiel pour comparer des sous-populations.

boxplot(data$Criminalite) # une variable
boxplot(Criminalite ~ Region, data = data) # par groupe
boxplot(data, notch = TRUE, varwidth = TRUE) # toutes

Nuage de points (Scatterplot)

Pour croiser deux variables quantitatives et visualiser une éventuelle relation linéaire.

plot(data$Analphabetisme, data$Criminalite)
plot(data$Analphabetisme, data$Criminalite, col = as.numeric(data$Region)) # couleur par région
text(data$Analphabetisme, data$Criminalite, labels = row.names(data), pos = 3) # labels
À retenir : Un scatterplot avec coloration par facteur qualitative remplace avantageusement plusieurs graphiques séparés. Il révèle immédiatement si la relation entre X et Y dépend d'une 3ème variable.

Boucle graphique : Pour inspecter toutes les variables quantitatives d'un coup : par(mfrow = c(2, 3)) puis une boucle for(i in 1:6) hist(data[,i], main = names(data)[i]).

Matrice des corrélations

Quand on a p variables quantitatives, il faut une vision globale des liens linéaires deux-à-deux avant de se lancer dans une ACP.

# Matrice complète M <- cor(data[, c("Pop", "Revenu", "Analphabetisme", "Criminalite", "Diplome")])
round(M, 2) # arrondi pour lisibilité

# Corrélations avec une variable cible M[, "Criminalite"] # quelles variables expliquent la criminalité ?

r > 0.7

Corrélation forte. Risque de redondance. Ces variables vont probablement s'aligner sur le même axe en ACP.

r < 0

Corrélation négative. Les variables seront opposées sur le cercle des corrélations (angle ~180°).

Attention : cor() calcule les corrélations de Pearson (linéaire) par défaut. Si la relation est courbe, la corrélation peut être proche de 0 malgré un lien fort. D'où l'intérêt de toujours visualiser avant de calculer.

Interpréter les graphiques

Lire un histogramme

Médiane Moyenne Queue à droite Outlier Valeurs croissantes →
Mode

Classe la plus haute (pic central).

Asymétrie →

Moyenne tirée vers la queue. Médiane plus robuste.

Outliers

Barres isolées aux extrémités à vérifier.

Trous

Classe vide = sous-populations mélangées ?

Phrase type : "L'histogramme de la criminalité présente une asymétrie à droite : la majorité des États ont un taux faible à modéré, mais quelques États affichent des valeurs très élevées qui tirent la moyenne vers le haut."

Lire un boxplot

Médiane (Q2) Q3 (75%) Q1 (25%) Moustille haut Moustille bas Outliers (> 1.5×IQR) IQR Comparaison de 2 groupes Nord-Est Sud Médiane ↑ Dispersion ↑
Médiane

Vers Q1 = asymétrie à droite. Vers Q3 = asymétrie à gauche.

IQR

Boîte large = forte dispersion. Boîte étroite = concentré.

Outliers

Au-delà des moustilles (> 1.5×IQR).

Comparaison

Comparez d'abord les médianes, puis les dispersions.

Phrase type : "Le boxplot de la criminalité par région montre que le Sud a une médiane nettement supérieure à celle du Nord-Est, avec plusieurs outliers (États très criminels). La boîte du Sud est aussi plus large, indiquant une plus grande hétérogénéité intra-régionale."

Lire un scatterplot

Analphabétisme (%) Criminalité Droite de régression (r = 0.82) Point atypique Région Sud Région Nord-Est Relation positive Effet groupe
Direction

↗ = positive. ↘ = négative. → = nulle.

Effet groupe

Deux nuages séparés = 3ème variable qualitative cache.

Outlier

Point isolé qui influencerait fortement r.

Causalité

Corrélation ≠ causalité. Ne pas conclure trop vite.

Phrase type : "Le nuage de points criminalité/analphabétisme montre une relation linéaire positive modérément forte (r = 0.70). Les points ne sont pas parfaitement alignés, ce qui suggère que d'autres facteurs interviennent. Un point isolé en haut à droite mérite une attention particulière."
summary(data) # Résumé général
mean(x), sd(x), var(x) # Stats de base
hist(x), boxplot(x) # Graphiques
cor(x, y); lm(y ~ x, data=data) # Régression
table(x, y); chisq.test(tab) # Chi-Deux
tapply(x, facteur, mean) # Moyenne par groupe

Chapitre 2 : L'ACP

La méthode phare pour résumer un tableau de chiffres en graphique 2D. C'est l'examen !

Pourquoi l'ACP ?

Imaginez un fichier avec 500 voitures et 10 caractéristiques. L'ACP trouve les 2 directions les plus importantes et projette tout sur ces 2 axes.

Analogie : La photo

L'ACP choisit le meilleur angle pour voir le maximum de détails.

Analogie : L'ombre

L'ACP oriente la lumière pour que l'ombre soit la plus ressemblante.

Données exemple : StateFacts

ÉtatPopRevenuAnalphabMeurtreDiplôme
AL361536242.115.141.3
AK36563151.511.366.7
AZ221245301.87.858.1

n=50 états, p=5 variables. But : résumer en 2 axes.

Condition : L'ACP ne s'applique qu'aux variables quantitatives. Les qualitatives vont en variables supplémentaires.

Métrique et Inertie

Le problème

Écart-type de Pop = 4464, de Analphab = 0.61. La population domine totalement !

VariableÉcart-type
Pop4464
Revenu614
Analphab0.61

La solution

Centrer-réduire : même importance pour toutes (moyenne=0, écart-type=1).

$$Z_{ij} = \frac{X_{ij} - \bar{X}_j}{\sigma_j}$$

En R : scale.unit = TRUE

Règle : ACP non normée = même unité + écarts comparables. ACP normée (par défaut) = unités différentes. Cas le plus fréquent.

Inertie totale : ACP normée → $I = p$ (nombre de variables). ACP non normée → $I = \sum \sigma_j^2$. Chaque axe emporte une partie de cette inertie.

Éboulis des Valeurs Propres

Valeurs propres

AxeVal. propre% Inertie% Cumulé
12.4849.6%49.6%
21.4328.5%78.1%
30.5210.4%88.5%
40.336.6%95.1%
50.244.9%100%

Éboulis

λ=1 1 2 3 4 5

Règle de Kaiser : On conserve les axes de valeur propre > 1. Un axe < 1 apporte moins qu'une variable seule.

Phrase type : "D'après le diagramme des valeurs propres et la règle de Kaiser, on retient les deux premiers axes (λ = 2.48 et 1.43). Le plan 1-2 conserve 78.1% de l'inertie, la synthèse est de bonne qualité."

Le Cercle des Corrélations

Données brutes

VoitureCylindréePoidsVit. Max
Ferrari50001200320
Twingo1200900150
Camion60005000110
Dim 1 Dim 2 Poids Cylindrée Vit. Max

1. Longueur = Cos²

Plus la flèche touche le cercle, mieux la variable est représentée.

2. Angle = Corrélation

0° = positive. 90° = indépendante. 180° = négative.

3. Position = Signe

Droite = valeur positive sur l'axe. Gauche = négative.

Comment rédiger :

"Les flèches Poids et Vitesse Max touchent le bord du cercle (Cos² proche de 1). Elles sont presque opposées (angle ~180°), donc fortement anti-corrélées. L'Axe 1 oppose les véhicules lourds et puissants (à droite) aux véhicules rapides et légers (à gauche)."

Le Nuage des Individus

Camion Ferrari Twingo

Le Lien Brut → Graphique

Le nuage se lit en surimpression du cercle des variables. Mêmes axes !

  • "Poids" tirait vers la droite → "Camion" est à droite (logique).
  • "Vitesse Max" tirait vers la gauche → "Ferrari" est à gauche.
  • "Twingo" au centre = valeurs moyennes.

Proximité = Ressemblance : deux individus proches ont des profils similaires.

$Cos^2$ (Qualité)

Proche de 1 = l'individu est fidèlement représenté sur le plan.

CTR (Contribution)

Au-delà de $1/n$ = l'individu participe fortement à la construction de l'axe.

Phrase type : "L'individu 'Camion' a une forte coordonnée positive sur l'axe 1. Sa CTR est largement supérieure à la moyenne ($1/n$), il participe donc fortement à sa création."

Méthode d'Interprétation en 5 Étapes

1

Valeurs propres

Combien d'axes ? Règle de Kaiser + coude. Citer le % cumulé.

2

Qualité (Cos²)

Quelles flèches touchent le bord ? On n'interprète que celles bien représentées.

3

Corrélations (Angles)

Groupes de variables corrélées positivement, négativement, ou indépendantes.

4

Nommer les axes

Utiliser les CTR. Ex: "Axe 1 = niveau d'instruction (Diplôme + vs Analphab -)".

5

Individus

Positionner les extrêmes. Vérifier leur Cos². Relier aux variables.

Synthèse type examen

"L'ACP normée retient les deux premiers axes (78% d'inertie). L'axe 1 oppose Diplôme (+) à Analphabétisme et Meurtre (-). C'est l'axe du niveau d'instruction. Les États du Sud (LA, MS, AL) sont à gauche : faible diplomation, forte criminalité. Les États de la côte Ouest (CA, NY) sont à droite."

Fiche de lecture rapide — Cercle des corrélations

Dim 1 Dim 2 Poids Cos² = 0.95 Cylindrée Cos² = 0.88 Vit. Max Cos² = 0.91 Conso (Cos²=0.2) Angle ~180° = anti-corrélées Proches = corrélées Touche le cercle = bien représentée
Ce que je vois
  • Une flèche proche du cercle → bien représentée (Cos² élevé).
  • Deux flèches proches l'une de l'autre → variables corrélées positivement.
  • Deux flèches opposées → corrélées négativement.
  • Deux flèches à 90° → indépendantes.
  • Une flèche au centre → mal représentée, ne pas interpréter.
Ce que je dis
  • "La variable X est très bien représentée sur ce plan (Cos² = 0.92)."
  • "Les variables X et Y sont fortement corrélées positivement (angle faible)."
  • "L'axe 1 oppose X (à droite) à Y (à gauche), c'est l'axe du..."
  • "La variable Z est proche du centre, elle n'interprète pas ce plan."

Fiche de lecture rapide — Nuage des individus

Ce que je vois
  • Deux individus proches → profils similaires.
  • Un individu extrême → fortement contributeur (vérifier CTR).
  • Un individu isolé → outlier, vérifier son Cos².
  • Individus proches d'une flèche → forte valeur pour cette variable.
  • Individus opposés à une flèche → faible valeur pour cette variable.
Ce que je dis
  • "L'individu A est proche de l'individu B, ils partagent un profil similaire."
  • "L'individu C est extrême sur l'axe 1 (CTR = 8%), il participe fortement à sa construction."
  • "L'individu D est mal représenté (Cos² = 0.3), sa position sur ce plan est peu fiable."

Variables supplémentaires

Les variables supplémentaires sont projetées sur les axes sans participer à leur construction. C'est l'outil idéal pour interpréter l'ACP sans fausser le calcul.

Quantitatives supplémentaires

Corrélation avec les composantes principales. Se lit comme une flèche sur le cercle, mais calculée a posteriori.

cor(acp$li, data.sup) # corrélations CP / var. supp

Qualitatives supplémentaires

On calcule les barycentres des individus par modalité. La fonction s.class du package ade4 superpose ces barycentres sur le plan des individus.

s.class(acp$li, fac = data$Region, cstar = 0, cpoint = 0, add = TRUE)

Quand les utiliser ? Si vous avez une variable qualitative qui structure vos données (ex: Région, Sexe, CSP) mais qui n'est pas quantitative, ne la mettez jamais dans l'ACP active. Faites-en une variable supplémentaire.

Phrase type : "Le facteur Région, utilisé comme variable illustrative, montre que les États du Sud se regroupent à gauche de l'axe 1, tandis que les États de la côte Ouest se situent à droite. Cela confirme l'interprétation de l'axe 1 comme axe de développement socio-économique."

Cas pratiques détaillés

Étude des habitudes de consommation (12 ménages)

7 postes de dépenses alimentaires pour 12 ménages caractérisés par CSP et nombre d'enfants. Toutes les variables sont exprimées dans la même unité (francs).

  • Métrique : comme les unités sont identiques, on peut envisager une ACP non normée (scale = FALSE). Les variables avec les plus grandes variances (Viandes, Vin) pèseront plus lourd.
  • Interprétation : l'axe 1 oppose souvent les ménages à gros budget alimentaire (nombreux enfants, cadres) aux ménages plus modestes.
  • Variables supplémentaires : CSP et nombre d'enfants projetés en supplémentaires pour comprendre la structuration sans influencer les axes.
data <- read.table("menages.txt", header = TRUE, row.names = 1)
acp <- dudi.pca(data[, 3:9], scale = FALSE, scannf = FALSE, nf = 3)

Le Canidé de Jussac (individu supplémentaire)

6 mesures sur des crânes de chiens et de loups. Un crâne inconnu (Jussac) doit être classé. Les variables ont des unités différentes (longueurs vs largeurs).

  • Métrique : unités différentes → ACP normée obligatoire (scale = TRUE).
  • Jussac en supplémentaire : on calcule ses coordonnées à partir des axes construits sur chiens+loups uniquement. S'il tombe dans le nuage des chiens, c'est un chien (et vice-versa).
  • Règle d'affectation : calculer les distances de Jussac aux barycentres Chiens et Loups sur le plan factoriel. La classe la plus proche l'emporte.
# Construire l'ACP sans Jussac
acp <- dudi.pca(chiens.loups, scale = TRUE, scannf = FALSE, nf = 5)
# Coordonnées de Jussac sur les axes
jussac.scale <- scale(jussac, center = acp$cent, scale = acp$norm)
coord.jussac <- as.matrix(jussac.scale) %*% as.matrix(acp$c1)
library(ade4)

# Calcul acp <- dudi.pca(data, scale = TRUE, scannf = FALSE, nf = 3)

# Valeurs propres acp$eig
barplot(acp$eig)

# Inertie, cos² et contributions Imen <- inertia.dudi(acp, col.inertia = TRUE, row.inertia = TRUE)
Imen$tot.inertia
Imen$row.rel # cos² individus
Imen$col.abs # contributions variables

# Cercle et plans s.corcircle(acp$co, clabel = 0.8)
s.class(acp$li, fac = quali, cstar = 0, cpoint = 0, add.plot = TRUE)

Chapitre 3 : L'AFC et l'ACM

Pour les variables qualitatives : l'AFC (2 variables) et l'ACM (plusieurs variables).

Analyse Factorielle des Correspondances

L'AFC s'applique à une table de contingence croisant deux variables qualitatives. Elle généralise le test du $\chi^2$ en fournissant une représentation graphique.

Table de contingence

Yeux \ CheveuxBlondsBrunsNoirs
Bleus944626
Verts477641
Marrons3111984

Profils-Lignes

Yeux \ CheveuxBlondsBrunsNoirs
Bleus55.3%27.1%15.3%
Verts27.8%44.9%24.3%
Marrons12.4%47.6%33.6%
Distance du $\chi^2$ : $$\chi^2(Y_i, \bar{Y}) = \sum_{j=1}^{L} \frac{(Y_{ij} - \bar{Y}_j)^2}{\bar{Y}_j}$$
Lien : Inertie totale = $\frac{\chi^2_{obs}}{n}$. Plus l'inertie est grande, plus les variables sont liées.

Intuition : Si X et Y sont indépendantes, tous les profils sont identiques au profil moyen. Le nuage est réduit à un point, l'inertie est nulle.

Le Principe Barycentrique

En AFC, on trace les Lignes et Colonnes sur le même graphique. Un point-ligne se place au barycentre des points-colonnes qu'il a le plus choisis.

ParisLyonMarseille
Cadre801010
Ouvrier102070

Cadres à Paris, Ouvriers à Marseille.

Paris Lyon Marseille Cadre Ouvrier

Règles sur la carte simultanée

  • Proximité Ligne-Colonne = Attraction : effectif supérieur à l'indépendance.
  • Proximité Ligne-Ligne = Profils similaires : même répartition sur les colonnes.
  • Éloignement = Répulsion : points opposés sur un axe se repoussent.
Phrase type : "La proximité entre 'Cadre' et 'Paris' traduit une forte attraction : la proportion de Cadres à Paris est supérieure à ce qu'on attendrait en cas d'indépendance."

Analyse des Correspondances Multiples

L'ACM s'applique à plusieurs variables qualitatives. R transforme silencieusement le tableau en Tableau Disjonctif Complet (TDC) binaire.

Tableau fourni

IndSexeTaille
Id_1HGrand
Id_2FPetit

TDC généré

IndS_HS_FT_GT_P
Id_11010
Id_20101

Important : Chaque ligne contient autant de "1" que de variables. Cette structure creuse fait que l'inertie des premiers axes est toujours très faible.

Inertie faible en ACM

Ne paniquez pas : Si vous voyez "12% sur l'axe 1" en ACM, ce n'est pas une erreur. C'est normal à cause de la structure du TDC.

Correction de Benzécri

Modifie le calcul des % d'inertie pour ne garder que les axes "informatifs" (dont la valeur propre dépasse 1/s, où s = nombre de variables).

Proximité modalités

Deux modalités de variables différentes proches = coexistent fréquemment.

Proximité individus

Deux individus proches = ont répondu de la même manière.

Exemples détaillés

AFC : Structure d'âge des cadres de l'agriculture

Tableau croisant 10 secteurs d'activité et 5 tranches d'âge (76 155 cadres). Les questions typiques sont : y a-t-il des secteurs "jeunes" ? Des secteurs "vieux" ? Où les départs à la retraite seront-ils massifs ?

  • Profils-lignes : la distribution d'âge au sein de chaque secteur. On compare chaque secteur au profil moyen global.
  • Interprétation : les secteurs proches sur la carte ont des structures d'âge similaires. Les secteurs éloignés du centre ont une structure très différente de la moyenne.
  • Lien Chi-Deux : l'inertie totale du nuage est égale à χ²/n. Plus l'inertie est élevée, plus les deux variables sont liées.
data <- read.table("agriculture.txt", header = TRUE, row.names = 1)
afc <- dudi.coa(data, scan = FALSE, nf = 3)
scatter(afc, method = 1, posieig = "none")

ACM : Données "Ours" (38 individus, 10 variables)

Réponses de 38 individus sur 10 questions qualitatives concernant l'ours brun dans les Alpes. C'est le cas-type pour apprendre l'ACM.

  • TDC : 10 questions, 35 modalités au total. Chaque ligne contient exactement 10 "1".
  • Inertie faible : le plan principal ne conserve que ~31% de l'inertie. C'est normal en ACM.
  • Cos² cumulés : avec inertia.dudi, on obtient les cos² cumulés sur le plan. Les modalités mal représentées (cos² faible) ne doivent pas être interprétées.
  • Tailles des points : sur le graphique, la taille des labels doit être proportionnelle aux cos² pour ne pas sur-interpréter des modalités mal projetées.

ACM : Données bancaires (810 individus, 21 variables)

21 variables qualitatives sur 810 clients bancaires. Beaucoup de variables = beaucoup de modalités = graphiques denses.

  • Sélection de variables : quand il y a trop de modalités, on restreint l'analyse aux variables les plus pertinentes. Ex: CSP, opposition, âge, sexe, interdit bancaire, solde...
  • Sélection d'individus : on peut restreindre à une sous-population (ex: 35-55 ans) pour une analyse ciblée avant de faire la CAH.
  • Dimension du nuage : p - s = 35 - 10 = 25 axes non triviaux pour "Ours". Pour la banque, c'est encore plus élevé.
Conseil pratique : En ACM, commencez toujours par summary(acm) et screeplot(acm) pour voir l'allure de l'éboulis. Si les premières valeurs propres sont très proches de 1/s, elles n'apportent aucune information.

Lecture des plans factoriels

Carte AFC simultanée

En AFC, lignes et colonnes sont sur le même graphique. Chaque point se lit par rapport au centre et aux autres points.

Dim 1 Dim 2 Cadre Ouvrier Paris Marseille Centre Attraction = effectif ↑ Attraction Centre = profil moyen Opposition axe 1 Éloigné = atypique
Distance au centre

Proche = profil moyen. Éloigné = atypique.

Ligne-Colonne

Proches = attraction (effectif > attendu).

Ligne-Ligne

Proches = profils similaires.

Opposition

De part et d'autre = profils inversés.

Phrase type : "La modalité 'Secteur public' est proche de la tranche '20-29 ans' sur le plan 1 : il y a attraction entre ces deux modalités (plus de jeunes dans le secteur public que prévu sous l'indépendance). À l'opposé, 'Exploitations' est proche de '60-65 ans', traduisant le vieillissement de ce secteur."

Plan factoriel ACM

En ACM, on peut lire trois cartes : individus, modalités, et les deux superposées. Chaque carte a ses propres règles.

Dim 1 Dim 2 Oui_cable Cos²=0.85, CTR=18% Non_cable Cos²=0.82, CTR=15% 35-50 ans Cadre >50 ans ? (Cos²=0.2) Mal représentée Individus proches = même profil de réponse Modalités proches = coexistent Opposition axe 1
Modalités

Proches = coexistent fréquemment chez les mêmes individus.

Individus

Proches = ont répondu de manière identique.

Cos²

Point petit ou gris = mal représenté, ne pas interpréter.

Opposition

De part et d'autre = comportements opposés.

Piège fréquent : Ne dites jamais "La modalité A est sur l'axe 1". Dites : "La modalité A est bien représentée sur le plan 1-2 (cos² = 0.85) et contribue fortement à l'axe 1 (CTR = 18%). Elle s'oppose à la modalité B sur cet axe."

Phrase type : "Sur le plan principal, la modalité 'Oui_cable' est proche de '35-50 ans' et 'Cadre' : les cadres de 35-50 ans sont ceux qui utilisent le plus la carte bancaire à distance. Cette modalité est bien représentée (cos² = 0.78) et fortement contributive (CTR = 12%)."
library(ade4)

# AFC (2 var quali) tYC <- as.table(as.matrix(df))
afc <- dudi.coa(df, scan = FALSE)

# ACM (>2 var quali) acm <- dudi.acm(data, scan = FALSE, nf = 3)

# Sorties acm$eig
i <- inertia.dudi(acm, col.inertia = TRUE, row.inertia = FALSE)
i$col.cum # cos² cumulés modalités

# Plans factoriels scatter(afc, method = 1, posieig = "none")
plot(acm$c1$CS1, acm$c1$CS2, type = "n"); text(acm$c1$CS1, acm$c1$CS2, row.names(acm$c1))

Chapitre 4 : La Classification

Regrouper automatiquement les individus qui se ressemblent.

Supervisé vs Non Supervisé

Supervisé

On connaît les groupes. On veut prédire de nouveaux individus.

Non Supervisé

On ne sait rien à l'avance. L'algorithme découvre les groupes.

Ce cours se concentre sur le non supervisé : K-Means et CAH. Souvent utilisé après une ACP ou ACM.

K-Means (Centres Mobiles)

On fixe le nombre de classes $k$. L'algorithme itère : affectation au centre le plus proche, recalcul des centres, jusqu'à convergence.

Points faibles : Il faut choisir $k$ à l'avance. Initialisation aléatoire (résultats différents). Sensible aux outliers. Formes sphériques uniquement.

Quand l'utiliser ? Rapide et efficace quand on a une idée du nombre de classes et que les groupes sont compacts.

Classification Ascendante Hiérarchique

Part de $n$ classes et fusionne progressivement les plus proches jusqu'à n'en former qu'une. Le résultat = le dendrogramme.

Single

Distance min. Chaînes allongées.

Complete

Distance max. Classes compactes.

Average

Moyenne. Compromis.

Ward (Reco)

Minimise la perte d'inertie inter-classe. Classes homogènes.

2 classes I1 I2 I3 I4

Lire le dendrogramme

L'axe vertical = perte d'inertie inter-classe lors de la fusion.

  • Barre verticale longue = l'algorithme a dû "forcer".
  • C'est le "saut d'inertie".
  • On coupe là où se trouve la branche la plus longue.

Ici, le plus grand saut est avant la fusion en 1 classe. On retient 2 classes.

Phrase type : "Le dendrogramme basé sur le critère de Ward montre un saut d'inertie majeur avant la fusion en 1 classe. La coupure optimale suggère une partition en 2 classes homogènes."

Fiche de lecture rapide — Dendrogramme

Ce que je vois
  • Deux branches fusionnent très haut → elles sont très différentes.
  • Deux branches fusionnent très bas → elles se ressemblent beaucoup.
  • Une branche verticale très longue = saut d'inertie = bon candidat pour la coupure.
  • Un individu isolé qui fusionne tard = outlier.
Ce que je dis
  • "Le saut d'inertie avant la fusion des deux derniers groupes est le plus important, ce qui justifie une coupure en 2 classes."
  • "La hauteur de fusion des classes 1 et 2 est faible, ce qui indique une forte homogénéité interne."
  • "L'individu X fusionne très tard, c'est un cas atypique."

Faire parler les classes

Parangon

Individu le plus proche du centre de sa classe. L'exemple type.

Variables caractéristiques

Variables qui prennent des valeurs significativement différentes.

"La classe 1 regroupe 12 États du Sud. Elle se caractérise par un taux d'analphabétisme élevé (2.5% vs 1.2%) et une faible proportion de diplômés (42% vs 54%). Le parangon est la Louisiane (LA). C'est la classe des 'États défavorisés sur le plan éducatif'."

Fiche de lecture rapide — Interpréter une classe

1
Taille et composition

Commencez par indiquer combien d'individus contient la classe et s'il y a une dominante géographique, temporelle, ou catégorielle évidente.

2
Variables caractéristiques

Pour chaque variable, comparez la moyenne (ou fréquence) de la classe à celle de la population totale. Soulignez les écarts significatifs avec des chiffres.

3
Parangon et outliers

Nommez le parangon : c'est l'individu le plus représentatif. Mentionnez aussi les individus atypiques au sein de la classe.

4
Nommer la classe

Donnez un nom explicite en français, pas en jargon statistique. Ex: "États défavorisés sur le plan éducatif" plutôt que "Classe 1".

Structure type : "La classe k regroupe n individus. Elle se caractérise par [variable 1] élevée (x% vs y%) et [variable 2] faible (a vs b). Le parangon est [individu]. C'est la classe des [nom explicite]."

Enchaînement ACM → CAH

Quand on a des variables qualitatives, on fait d'abord une ACM pour obtenir des coordonnées quantitatives, puis une CAH sur ces coordonnées. C'est la méthodologie standard en Data Mining.

1. ACM

On part de n individus et s variables qualitatives. Le TDC a p modalités et (p - s) dimensions non triviales.

2. Sélection de q axes

On conserve assez de composantes principales pour atteindre ~90% d'inertie. Cela réduit le bruit et la dimension.

3. CAH

On applique la CAH sur les coordonnées des individus dans l'espace des q axes retenus. Distance euclidienne + Ward recommandés.

4. Interprétation

On caractérise chaque classe par les modalités sur-représentées. On peut utiliser les parangons et les variables caractéristiques.

Exemple : ACM "Ours" → CAH

38 individus, 10 questions, 35 modalités. p - s = 25 axes. Le plan principal ne conserve que 31% d'inertie, ce n'est pas assez pour une classification fiable sur 2 axes seulement.

  • On conserve q axes pour atteindre ~90% d'inertie cumulée.
  • La CAH sur ces q axes regroupe les individus ayant des profils de réponse similaires.
  • On analyse la proximité des modalités de la variable à expliquer (ex: citat) avec les autres facteurs pour comprendre la structuration.
library(ade4); library(cluster)
acm <- dudi.acm(data, scan = FALSE, nf = 25)
# Sélection des axes pour 90% d'inertie
inertie <- inertia.dudi(acm, col.inertia = FALSE, row.inertia = TRUE)
cum <- cumsum(acm$eig) / sum(acm$eig)
q <- which(cum >= 0.90)[1]
# CAH sur les q premières composantes
ca <- agnes(acm$li[, 1:q], metric = "euclidean", method = "ward")
plot(ca, which = 2)

Pourquoi ne pas faire K-Means directement sur le TDC ? Le TDC est extrêmement creux (beaucoup de 0). La distance euclidienne n'est pas adaptée. L'ACM résout ce problème en projetant sur un espace de plus faible dimension où les distances sont pertinentes.

library(cluster)

# K-Means cl <- kmeans(data, centers = 3, nstart = 100)
cl$cluster # Classes
cl$centers # Centres

# CAH (agnes) ca1 <- agnes(data, metric = "euclidean", stand = TRUE, method = "ward")
hc <- as.hclust(ca1)
ctr <- cutree(hc, k = 3)

# Visualisation plot(ca1, which = 2) # Dendrogramme
table(ctr, cl$cluster) # Concordance

# Enchaînement ACM→CAH acm <- dudi.acm(data, scan = FALSE, nf = 5)
ca2 <- agnes(acm$co, metric = "euclidean", method = "ward")
plot(ca2, which = 2)

Console R Interactive

Testez votre code R directement dans le navigateur grâce à WebR.

WebR — R dans votre navigateur

Premier chargement : ~30-60s. Les packages ade4 et cluster s'installent à la volée (syntaxe du cours).

Chargement...
Éditeur R
1
Sortie

Astuce 1

Utilisez head(), summary() et str() après chaque import de données.

Limitation

Graphiques R supportés (plot, barplot, mosaicplot...). Les fichiers du cours (StateFacts, Jussac, Menages...) sont préchargés.

Performance

WebR est plus lent que RStudio. Les packages ade4 et cluster s'installent automatiquement au premier lancement.

Examen & Pipeline R

Votre trame algorithmique complète pour le jour J.

Le script "Copier-Coller"

# Étape 1 : Importation data <- read.csv("donnees.csv", sep=";", row.names=1)
summary(data); str(data)

# Étape 2 : ACP library(ade4)
acp <- dudi.pca(data, scale = TRUE, scannf = FALSE, nf = 5)
barplot(acp$eig) # Kaiser
Imen <- inertia.dudi(acp, col.inertia = TRUE, row.inertia = TRUE)

# Étape 3 : Graphes & Métriques s.corcircle(acp$co, clabel = 0.8) # Cercle
plot(acp$li$Axis1, acp$li$Axis2, type = "n"); text(acp$li$Axis1, acp$li$Axis2, row.names(data)) # Individus
Imen$col.rel; Imen$col.abs

# Étape 4 : Classification library(cluster)
ca1 <- agnes(acp$li, metric = "euclidean", method = "ward")
hc <- as.hclust(ca1)
ctr <- cutree(hc, k = 3)
plot(ca1, which = 2) # Dendrogramme

# Étape 5 : Interprétation res.classif$desc.var # Caractéristiques
res.classif$desc.ind # Parangons

Notation

La machine fait le calcul. Vous faites l'analyse. Regardez les proximités, vérifiez le Cos², et concluez concrètement avec les noms des variables.

Checklist

  • Valeurs manquantes vérifiées ?
  • Nombre d'axes justifié (Kaiser) ?
  • % d'inertie cumulé cité ?
  • Cos² vérifiés avant interprétation ?
  • Axes nommés avec du vocabulaire métier ?
  • Nombre de classes justifié (saut d'inertie) ?

Erreurs à éviter

  • "La variable est sur l'axe 1" → Non, c'est sa projection.
  • Interpréter un point avec Cos² < 0.5 → Illusion.
  • Oublier scale.unit=TRUE avec unités différentes.
  • Mettre des qualitatives dans l'ACP active.
  • Confondre corrélation et causalité.
Graphique plein écran
100%