You are on page 1of 63

MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


sous R
AFC simple
Introduction 2
Variables qualitatives 3
Tableau de contingence 6
Premier traitement 8
Caractristiques de l'AFC 9
Les tableaux de donnes intermdiaires 11
Principe de lquivalence distributionnelle 13
Mtrique du Khi 2 17
Principe barycentrique 20
Analyse des rsultats et calcul des contributions 22
Analyses des graphiques 28
Exemple 2 : tableau de dnombrements 32
Exemple 3 : tableau de mesures 37
Elments supplmentaires 38
AFC multiple (AFCM)
Principe 43
Exemple 1 : data (ours) 44
AFC du tableau de Burt 49
Tableau variables qualitatives et quantitatives
Dcoupage des variables quantitatives : cut () 50
AFCM exemple 2 : data (Cars93) 53
Recodage des variables : recode () 57
Cas des donnes manquantes 59
Analyse des rsultats 61
Variables illustratives 62
25/02/2013
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Introduction aux Analyses des Correspondances


(AFC, AFCM)

Buts :
- dtermination des lments structurant les donnes (axes de projection)
- rduire les dimensions de lespace de reprsentation des donnes
(slection des p premiers axes)

Sur quels types de donnes ?


- tableaux de contingence
- tableaux de variables continues (valeurs 0)
- tableaux logiques (prsence-absence)
- autres

2 mthodes :
AFC : Analyse factorielle des correspondances simples pour un ensemble homogne
de valeurs assimilable un tableau de contingence entre 2 variables.
AFCM : Analyse factorielle des correspondances multiples pour un tableau de
modalits de q (q>2) variables qualitatives ou un ensemble non homogne de donnes.
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Rappel sur les variables qualitatives

Une variable qualitative est une variable pour laquelle la valeur observe sur chaque individu
reprsente une qualit (ou tat) nomm modalit (ou catgorie) et non une quantit.

Une variable qualitative est :

Nominale quand ses modalits sont des lments sans relation hirarchique.
Exemples :
la variable Sexe avec les modalits Masculin, Fminin
la variable Couleur avec les modalits jaune, vert, rouge, bleu

Ordinale quand ses modalits admettent une relation d'ordre.


Exemples :
Niveau de scolarit : primaire, secondaire, universitaire
Apprciation : jamais, rarement, frquemment, toujours

Dans R :
Une variable qualitative est reprsente par un objet de classe "factor" sex <- as.factor(c("M","F"))
Les modalits correspondants aux "levels" str(sex)
Factor w/ 2 levels "F","M": 2 1
Utiliser la fonction ou le paramtre "ordered" pour crer une variable ordinale
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Les donnes : 1 - Les variables qualitatives

Lpreuve :
200 juges
5 vins : "Cru_Bourgeois","Grand_Cru_classe","Vin_de_table","Bordeaux_d_origine","Vin_de_marque"
4 qualificatifs : "excellent","good","mediocre","boring"

test <- read.table (file.choose(), header = TRUE) juge vin qual


1 Cru_Bourgeois mediocre
Choisir le fichier testBordeaux.txt
1 Grand_Cru_classe mediocre
1 Vin_de_table boring
1 Bordeaux_d_origine boring
1 Vin_de_marque boring
Soit 2 variables qualitatives 2 Cru_Bourgeois good
Variable vin : variable nominale 5 modalits 2 Grand_Cru_classe good
Variable qual : variable ordinale 4 modalits 2 Vin_de_table boring
2 Bordeaux_d_origine mediocre
...
200 Cru_Bourgeois good
dim (test) 200 Grand_Cru_classe good
200 Vin_de_table boring
[1] 1000 3 200 Bordeaux_d_origine mediocre
200 Vin_de_marque boring

Tableau des modalits


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Donnes qualitatives : codage binaire disjonctif
Tableau des modalits
library (ade4) juge vin qual
dim (test) 1 Cru_Bourgeois mediocre
bd <- acm.disjonctif (test[,2:3])
[1] 1000 3 1 Grand_Cru_classe mediocre
bd [c(1:5,996:1000),] 1 Vin_de_table boring
Principe : une variable p modalits est clate en p 1 Bordeaux_d_origine boring
variables binaires 1 Vin_de_marque boring
La valeur 1 pour nouvelle variable vn indique lappartenance de la valeur prise par la variable ...
dorigine v la classe n correspondante. Dans le tableau disjonctif, chaque individu est 200 Cru_Bourgeois good
caractris par une suite de 0 ou de 1. Les valeurs marginales des lignes seront toutes 200 Grand_Cru_classe good
identiques et gales au nombre de variables initiales (sauf si donnes manquantes).
200 Vin_de_table boring
200 Bordeaux_d_origine mediocre
dim (bd) 200 Vin_de_marque boring
Tableau binaire disjonctif [1] 1000 9

vin. vin. vin. vin. vin. qual. qual. qual. qual.


Bordeaux_d_origine Cru_Bourgeois Grand_Cru_classe Vin_de_marque Vin_de_table boring excellent good mediocre

1 0 1 0 0 0 0 0 0 1
2 0 0 1 0 0 0 0 0 1
3 0 0 0 0 1 1 0 0 0
4 1 0 0 0 0 1 0 0 0
5 0 0 0 1 0 1 0 0 0
996 0 1 0 0 0 0 0 1 0
997 0 0 1 0 0 0 0 1 0
998 0 0 0 0 1 1 0 0 0
999 1 0 0 0 0 0 0 0 1
1000 0 0 0 1 0 1 0 0 0
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Rappel sur le tableau de contingence
Un tableau de contingence regroupe le nombre de co-occurrences entre
les modalits de deux variables qualitatives.

I et J : deux variables qualitatives Sommes des i lignes


=
j1, j2 : modalits de la variable J Effectifs marginaux des lignes
Variable J
i1, i2 : modalits de la variable I
j1 j2
n : effectif

i1 n n n
i1 j1 i1 j2 i1 .
Variable I
i2 n n n
i2 j1 i2 j2 i2 .

Sommes des j colonnes n n n


. j1 . j2 I J
= Effectif
Effectifs marginaux des colonnes total
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Les donnes : 2 - Le tableau de contingence

La fonction table() calcule le tableau de contingence entre les 2 variables (facteurs)


test[,2] <- factor(test[,2],levels=c("Cru_Bourgeois","Grand_Cru_classe","Vin_de_table","Bordeaux_d_origine","Vin_de_marque" ))
test[,3] <- factor(test[,3],levels=c("excellent","good","mediocre","boring"))

table (test$vin, test$qual)


excellent good mediocre boring Pour l'utilisation du tableau de contingence issu
Cru_Bourgeois 45 126 24 5 d'un objet de classe table :
Grand_Cru_classe 87 93 19 1 as.data.frame.matrix (table (test$vin, test$qual))
Vin_de_table 0 0 52 148
Bordeaux_d_origine 36 68 74 22 transforme en classe "matrix"
puis en data frame
Vin_de_marque 0 30 111 59

Si les variables sont sous forme d'un tableau binaire disjonctif :


le produit matriciel (T'*T) tableau de contingence
bd <- as.matrix(bd)
t (bd[, 1:5]) %*% bd[, 6:9]
qual.excellent qual.good qual.mediocre qual.boring
vin.Cru_Bourgeois 45 126 24 5
vin.Grand_Cru_classe 87 93 19 1 library(ade4)
vin.Vin_de_table 0 0 52 148
vin.Bordeaux_d_origine 36 68 74 22
data(bordeaux)
vin.Vin_de_marque 0 30 111 59 bordeaux
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Avec la librairie ade4
Exemple 1 : la mthode
d = 0.5
Eboulement des
Axe 2
library(ade4) valeurs propres

# Les donnes
data(bordeaux)
bordeaux
excellent good mediocre boring mediocre
Vin_de_marque

Cru_Bourgeois 45 126 24 5
Grand_Cru_class 87 93 19 1 Bordeaux_d_origine Axe 1
Vin_de_table 0 0 52 148
Bordeaux_d_origine 36 68 74 22
Vin_de_marque 0 30 111 59 good
Cru_Bourgeois

Point ligne
# Le traitement Grand_Cru_class
excellent
boring
Vin_de_table
afc <-dudi.coa(bordeaux, scannf=FALSE)
Donnes (data.frame)
Point colonne
Fonction ade4 de classe dudi

# Coordonnes factorielles des points lignes


afc$li
# Coordonnes factorielles des points colonnes # Affichage du plan factoriel 1 * 2
afc$co scatter(afc)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Les caractristiques de l'AFC

- tableau n lignes et p colonnes de valeurs positives ou nulles

- mesure de lintensit de la relation (correspondance) entre deux ensembles,


lun en lignes, lautre en colonnes

- utilise une distance euclidienne spcifique :


la distance du Khi2 sur les profils
(distance pondre par les effectifs des lignes et des colonnes)

- fait jouer un rle symtrique aux lignes et aux colonnes

- repose sur 2 principes :


lquivalence distributionnelle
le principe barycentrique
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


La dmarche compare l'ACP

Donnes Donnes
"brutes" "brutes"
AFC ACP
Tableau des
frquences
mtrique du 2
matrice matrice
var/covar var/covar

Diagonalisation Diagonalisation

vecteurs valeurs vecteurs valeurs


propres propres propres propres

profils

coordonnes coordonnes
factorielles factorielles
Donnes
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1) "brutes"

Tableau des
frquences
Analyse Factorielle des Correspondances mtrique du 2

Calcul des tableaux intermdiaires (1/2) Diagonalisation


matrice
var/covar

vecteurs valeurs
propres propres
1 - tableau des frquences profils

A partir du tableau des donnes = tableau des effectifs


coordonnes
factorielles

excellent good mediocre boring ni.


ni1j1 ni1j2 n i1 .
bordeaux Cru_Bourgeois 45 126 24 5 200
n i2j1 ni2j2 n i2 . n.j <- colSums(bordeaux) Grand_Cru_class 87 93 19 1 200
ni. <- rowSums(bordeaux) Vin_de_table 0 0 52 148 200
nIJ <- sum(bordeaux) Bordeaux_d_origine 36 68 74 22 200
n. j 1 n. j 2 nIJ Vin_de_marque 0 30 111 59 200

n.j 168 317 280 235 1000

Calcul du tableau des frquences

excellent good mediocre boring fi.


f i1j1 f i1j2 fi1. fij = nij / nIJ Cru_Bourgeois 0,045 0,126 0,024 0,005 0,2
Grand_Cru_class 0,087 0,093 0,019 0,001 0,2
f i2j1 f i2j2 fi2. bordeaux / sum(bordeaux) 0,000 0,000 0,052 0,148
Vin_de_table 0,2
Bordeaux_d_origine 0,036 0,068 0,074 0,022 0,2
f.j1 f.j2 1 Vin_de_marque 0,000 0,030 0,111 0,059 0,2

frquence marginale pour un i : fi. = ni. / nIJ f.j 0,168 0,317 0,280 0,235 1
frquence marginale pour un j : f.j= n.j / nIJ
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)
Donnes
"brutes"

Analyse Factorielle des Correspondances Tableau des


frquences
mtrique du 2
Calcul des tableaux intermdiaires (1/2) matrice
var/covar

Diagonalisation

2 - tableaux des profils vecteurs


propres
valeurs
propres

ou tableaux des frquences conditionnelles profils

coordonnes
factorielles

des lignes = profils des i


fiJ = { fij ; jJ} avec fij = fij / fi. et fi. 0 excellent good mediocre boring
Cru_Bourgeois 0,225 0,630 0,120 0,025 1
i
soit f j = nij / ni. et ni. 0 Grand_Cru_class 0,435 0,465 0,095 0,005 1
i1 i1 Vin_de_table 0,000 0,000 0,260 0,740 1
f j1
f j2
1 df <- bordeaux / sum(bordeaux) Bordeaux_d_origine 0,180 0,340 0,370 0,110 1
row.w <- rowSums( df) Vin_de_marque 0,000 0,150 0,555 0,295 1
i2 i2
f j1
f j2
1 profil.i <- df/row.w
cbind(profil.i,rowSums( profil.i))

des colonnes = profils des j


fjI = { fji ; iI} avec fji = fij / f.j et f.j 0 Cru_Bourgeois 0,268 0,398 0,086 0,021
Grand_Cru_class 0,518 0,293 0,068 0,004
j1 j2
soit fji = nij / n.j et n.j 0 Vin_de_table 0,000 0,000 0,186 0,630
fi1 fi1 Bordeaux_d_origine 0,095 0,215 0,264 0,094
df <- bordeaux / sum(bordeaux) Vin_de_marque 0,000 0,095 0,396 0,251
fi2j1 fi2j2 col.w <- colSums(df) 1 1 1 1
profil.j <- t(t(df)/col.w)
rbind(profil.j,colSums( profil.j))
1 1
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances

Principe de lquivalence distributionnelle (1/3)

Le principe : si deux points i et i ont le mme profil (confondus) et si on les regroupe un


seul point i dont les nij = nij + nij, les distances entre les points i sont inchanges .
Il en est de mme des points j dans lespace des n individus.

Les conditions du principe

# tableaux des donnes avec i et i # tableaux des donnes avec i" (regroupement de i et i)
t2 <- rbind(bordeaux[1,]*10, bordeaux) t1 <- rbind( t2[1,] + t2[2,], t2[3:6,])

i i

> t2 > t1
i excellent good mediocre boring i excellent good mediocre boring

Cru_Bourgeois 450 1260 240 50 Cru_Bourgeois 495 1386 264 55


Cru_Bourgeois1 45 126 24 5 Grand_Cru_class 87 93 19 1
Grand_Cru_class 87 93 19 1 Vin_de_table 0 0 52 148
i Vin_de_table 0 0 52 148 Bordeaux_d_origine 36 68 74 22
Bordeaux_d_origine 36 68 74 22 Vin_de_marque 0 30 111 59
Vin_de_marque 0 30 111 59

i, i' + i''
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances

Principe de lquivalence distributionnelle (2/3)


# Ecriture dune fonction
pour le calcul des
Vrification que les points lignes i, i, i ont le mme profil profils lignes
profili <- function(df) {
profili(bordeaux) p.i <- df / rowSums( df)
excellent good mediocre boring rowSums(p.i) cbind(p.i, rowSums(p.i)) }
Cru_Bourgeois 0.225 0.630 0.120 0.025 1
Grand_Cru_class 0.435 0.465 0.095 0.005 1
Vin_de_table 0.000 0.000 0.260 0.740 1 i
Bordeaux_d_origine 0.180 0.340 0.370 0.110 1
Vin_de_marque 0.000 0.150 0.555 0.295 1

profili(t2)
excellent good mediocre boring rowSums(p.i) i
Cru_Bourgeois 0.225 0.630 0.120 0.025 1
Cru_Bourgeois1 0.225 0.630 0.120 0.025 1
Grand_Cru_class 0.435 0.465 0.095 0.005 1
Vin_de_table 0.000 0.000 0.260 0.740 1 i
Bordeaux_d_origine 0.180 0.340 0.370 0.110 1
Vin_de_marque 0.000 0.150 0.555 0.295 1

profili(t1)

Cru_Bourgeois
excellent
0.225
good mediocre boring rowSums(p.i)
0.630 0.120 0.025 1
i
Grand_Cru_class 0.435 0.465 0.095 0.005 1
Vin_de_table 0.000 0.000 0.260 0.740 1
Bordeaux_d_origine 0.180 0.340 0.370 0.110 1
Vin_de_marque 0.000 0.150 0.555 0.295 1
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances

Principe de lquivalence distributionnelle (3/3)


Rows Vin_de_table
Vin_de_marque
Vrification graphique du principe i Bordeaux_d_origine
Cru_Bourgeois
Cru_Bourgeois1
i Grand_Cru_class
par(mfrow=c(2,1))
score (dudi.coa (t2, scannf=F))
score (dudi.coa (t1, scannf=F)) boring
par(mfrow=c(1,1))
mediocre
good
dudi.coa (t2, scannf=F)$li
excellent
Axis1 Axis2
Cru_Bourgeois -0.2926881 0.04688171 d=1 Columns
Cru_Bourgeois1 -0.2926881 0.04688171 Rows Vin_de_table
Grand_Cru_class -0.3991920 0.12413410 Vin_de_marque
Vin_de_table 2.2147901 0.49885003
Bordeaux_d_origine 0.2853378 -0.44331555 i Bordeaux_d_origine
Cru_Bourgeois
Vin_de_marque 1.1186333 -0.69536740
Grand_Cru_class

dudi.coa (t1, scannf=F)$li


Axis1 Axis2 boring
Cru_Bourgeois -0.2926881 -0.04688171 mediocre
Grand_Cru_class -0.3991920 -0.12413410 good
Vin_de_table 2.2147901 -0.49885003
excellent
Bordeaux_d_origine 0.2853378 0.44331555
Vin_de_marque 1.1186333 0.69536740
d=1 Columns
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Comparaison avec l'ACP

Traitement de t1 et t2 avec l'ACP bordeaux d=1

boring
par(mfrow=c(2,2)) Vin_de_table
plot.new()
scatter (dudi.pca (bordeaux, scannf=F))
scatter (dudi.pca (t2, scannf=F)) Grand_Cru_class
excellent
i
scatter( dudi.pca (t1, scannf=F)) Cru_Bourgeois

par(mfrow=c(1,1))
good
Bordeaux_d_origine

dudi.pca (t2,scannf=F)$li Vin_de_marque

Axis1 Axis2
Cru_Bourgeois -3.731748 -0.085358
Cru_Bourgeois1 0.847585 0.934466 mediocre
Grand_Cru_class 0.772267 1.052014 d=1 d=1

Vin_de_table 1.010357 -1.980904 t2 t1


Bordeaux_d_origine 0.591455 0.463464 Grand_Cru_class Grand_Cru_class

i
Cru_Bourgeois1
Vin_de_marque 0.510082 -0.383682
Bordeaux_d_origine Bordeaux_d_origine
excellent
dudi.pca (t1,scannf=F)$li Cru_Bourgeois
good
excellent
good Vin_de_marque
Axis1 Axis2 mediocre
Vin_de_marque Cru_Bourgeois
mediocre
Cru_Bourgeois -3.369709 -0.156047
Grand_Cru_class 0.848453 1.240747 i
Vin_de_table 1.175680 -1.725019 i
Bordeaux_d_origine 0.696214 0.719769 Vin_de_table Vin_de_table

Vin_de_marque 0.649362 -0.079449


boring boring
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Mtrique du Khi2 (1/2)

Rappel sur la distance euclidienne : D (i, i ' ) xij xi ' j 2

jJ
ou D2(i , i) = (xij xij)2 | jJ
excellent good
Exemple : Cru_Bourgeois 0.225 0.630
Soit le plan form par les variables excellent et good Grand_Cru_class 0.435 0.465
i
et les 5 points i de coordonnes f j
Vin_de_table 0.000 0.000
Bordeaux_d_origine 0.180 0.340
plot (range(profil.i[,1])+ c(-.1,.1), range(profil.i[,2]), type="n",xlab=colnames(profil.i)[1],ylab=colnames(profil.i)[2]) Vin_de_marque 0.000 0.150
text (profil.i[,1:2], labels = rownames(profil.i))

Calcul de la distance entre Vin de table et Grand cru class


Cru_Bourgeois

0.6
x <- profil.i[2:3,1] # abscisses des 2 vins

0.5
y <- profil.i[2:3,2] # ordonnes des 2 vins Grand_Cru_class
points (x,y,col=2, pch=19, cex=2)
lines (x, y, col=2)

0.4
segments (x[1], 0, x[2], 0, lty=2)
segments (x[1], y[1], x[1], y[2], lty=2) Bordeaux_d_origine

good

0.3
d2 <- (x[1] - x[2])^2 + (y[1] - y[2])^2

0.2
D <- sqrt(d2) Vin_de_marque

0.1
0.0 Vin_de_table
La fonction dist() permet de calculer cette distance :
-0.1 0.0 0.1 0.2 0.3 0.4 0.5
dist (profil.i[2:3,1:2]) excellent
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances

Mtrique du Khi2 (2/2)

C'est le choix de la mtrique du Khi2 qui permet le principe de


lquivalence distributionnelle
i
Dans lespace des p variables, les n points i ont pour coordonnes les f j et comme masse fi.

Soit D la distance euclidienne entre i et i caractriss par leurs profils f iJ et f iJ :


D2(i , i) = j (f ij f ij)2 | jJ

Le principe est ralis si j = 1/ f.j on a ainsi :


D2(i , i) = (f ij f ij)2 / f.j | jJ (rappel f ij = fij / fi.)

Cette distance est appele distance du Khi 2 entre lois conditionnelles de centre fJ
ou distance distributionnelle entre i et i

On dmontrerait de mme que la distance euclidienne entre deux colonnes j et j ayant


comme profils f jI et f jI doit satisfaire un i = 1 / fi.

Et la distance au centre du nuage : 2(i) = (f ij f.j)2 / f.j | jJ


Donnes
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1) "brutes"

Tableau des
frquences
Analyse Factorielle des Correspondances mtrique du 2
matrice

La matrice des covariances Diagonalisation


var/covar

vecteurs valeurs
propres propres

profils

Analyse du nuage I coordonnes


factorielles

Recherche des composantes principales du nuage de points ayant pour coordonnes : f ij / f.j
Terme gnral de la matrice Y servant au calcul de la matrice var-covar T (T = Y Y) :
Calcul 1 yij = (fij - fi.* f.j) / (fi.* f.j)
frquence thorique
2
k
Oi Ei 2
frquence observe i 1 Ei
nIJ * yij2
nIJ * trace de T
= 2 de nij (n-1)(p-1) ddl

Comme pour lACP :


- diagonalisation de T
- extraction des valeurs propres : variance de chacun des axes
vecteurs propres : permettent de calculer les quations des axes

Diffrences avec l ACP :


- yij symtrique en i et j rle symtrique des lignes et des colonnes
- nombre de valeurs propres = minimum (n, p) 1 minimum de (n-1, p-1) axes
T admet au moins une valeur propre nulle (0)

Calcul 2 : simplification possible de yij = fij / (fi.* f.j) ici 1re valeur propre 0 = 1 (premier vecteur propre v0 = (f.1, f.2,..)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1) Donnes
"brutes"

Tableau des
Analyse Factorielle des Correspondances frquences
mtrique du 2

2 me principe : Principe barycentrique (1/2) matrice


var/covar

Diagonalisation

vecteurs valeurs
propres propres

Calcul des projections (coordonnes) des points (lignes & colonnes) profils

sur les axes factoriels coordonnes

Fi = j=1, p (f ij /f.j) * vj
factorielles

i i me Rappel fij = fij / fi.


avec f j = fij / fi. (f J = profil de i) et vj= composante du vecteur propre ou fij = nij / ni.

Plus le poids du point i (fi.) est faible plus il est loign de lorigine

Axis1 Axis2
Coordonnes des points i Cru_Bourgeois -0.7134347 -0.06256333
Grand_Cru_class -0.8461787 -0.26380501
afc$li Vin_de_table 1.1821197 -0.41671099
Bordeaux_d_origine -0.1713729 0.25423507
Vin_de_marque 0.5488665 0.48884427

De mme, les coordonnes des points j sur les axes factoriels : Gj = i=1,n (f ji /f.i) * ui

Formules de transition : passage de lespace I lespace J et inversement


Fi = -1/2 j=1, p (f ij) *Gj et Gj = -1/2 i=1, n (f ji ) *Fi

Le principe : tout point i se trouve au pseudo-barycentre des coordonnes des points j


affects des masses qui sont les composantes du profil fij et inversement
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Principe barycentrique (2/2)

Reconstitution des donnes

A partir des facteurs F1, F2, F3...(respectivement G1, G2, G3...) dont les valeurs propres (variances)
sont respectivement 1, 2, 3...., il est possible de reconstituer le tableau initial suivant la formule :
nij = (ni.* n.j) / nIJ (1 +1 F1 (i)*G1 (j) + 2 F2 (i)*G2(j) + ...)

se dcompose en :

nij = (ni. * n.j)) / nIJ correspond lhypothse dindpendance des variables (cf. test du Khi2).
(se vrifie si toutes les lignes ont le mme profil).
et

1 F1 (i)*G1 (j) + 2 F2 (i)*G2(j) + ... reprsente donc lcart du rapport cette indpendance.

Ainsi lAFC revient ltude de lcart lindpendance


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 1 : l'analyse des rsultats (1/5)

afc <- dudi.coa (bordeaux) # paramtre scannf = TRUE par dfaut

Select the number of axes: 3 Affiche

# identique :
afc <- dudi.coa (bordeaux, scannf = FALSE, nf = 3) Histogramme des
valeurs propres
Nombre daxes factoriels slectionns

names (afc)
[1] "tab" "cw" "lw" "eig" "rank" "nf" "c1" "l1" "co" "li" "call" "N"

afc$eig # valeurs propres ( variances)


[1] 0.59060749 0.11015190 0.03108562
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

La classe d'objets dudi de la librairie ade4

Un objet de la classe dudi est une liste qui comprend :


le triplet (X, Q, D) sur lequel repose le schma de dualit
tab : un data frame avec n lignes et p colonnes (X) considr comme p points de Rn (vecteurs colonnes) ou n points de Rp
(vecteurs lignes)
cw : les poids des colonnes, vecteur p composantes (Q), matrice diagonale de dimension p p utilise comme produit
scalaire dans Rp
lw : les poids des lignes, vecteurs n composantes (D), matrice diagonale de dimension n n utilise comme produit
scalaire dans Rn
puis les drivs de la diagonalisation du schma
eig : les valeurs propres dans u vecteur d'au plus min (n,p) composantes
nf : le nombre d'axes conservs (impos ou introduit aprs jugement sur le graphe des valeurs propres)
c1 : les axes principaux placs en colonnes dans un data frame avec p lignes et nf colonnes (CS veut dire Column Score,
appels aussi loadings ou poids des variables)
l1 : les composantes principales places en colonnes dans un data frame avec n lignes et nf colonnes (RS veut Row Score,
appel aussi coordonne normalise ou coordonne de norme 1
co : les coordonnes des colonnes places dans un data frame avec p lignes et nf colonnes (chaque ligne de ce tableau
dsigne une colonne du tableau de dpart, chaque colonne est une composante principale, chaque valeur est une
coordonne de la projection de la colonne du tableau de dpart sur une composante principale)
li : les coordonnes des lignes places en colonnes dans un data frame avec n lignes et nf colonnes (chaque ligne de ce
tableau dsigne une ligne du tableau de dpart, chaque colonne est un axe principal, chaque valeur est une
coordonne de la projection de la ligne du tableau de dpart sur un axe principal) appeles aussi scores de variance
lambda, ou score norm la valeur propre, ou coordonne de variance lambda

http://pbil.univ-lyon1.fr/R/cours/stage3.pdf
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 1 : l'analyse des rsultats (2/5)

Plus concrtement
> afc
Duality diagramm
class: coa dudi
$call: dudi.coa(df = bordeaux) rappel des paramtres dappel de la fonction

$nf: 3 axis-components saved au maximum valeur de $rank


$rank: 3 minimum (n-1, p-1) soit minimum de (5-1, 4-1)
eigen values: 0.5906 0.1102 0.03109 avec = 1 minimum (n-1, p-1)
vector length mode content
1 $cw 4 numeric column weights f.j , length = p
2 $lw 5 numeric row weights fi. , length = n
3 $eig 3 numeric eigen values avec = 1 length, length = minimum (n-1, p-1)

data.frame nrow ncol content


1 $tab 5 4 modified array yij / (fi.* f.j) cf. calcul 1 de Y soit aussi fij / (fi.*f.j) 1
2 $li 5 3 row coordinates coordonnes sur les axes ( = $l1 * )
3 $l1 5 3 row normed scores composantes principales ( coordonnes normes )
4 $co 4 3 column coordinates coordonnes sur les axes ( = $c1 * )
5 $c1 4 3 column normed scores composantes principales ( coordonnes normes )

other elements: N somme de toutes les valeurs du tableau initial ( nIJ )


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 1 : l'analyse des rsultats (3/5)

Calcul des contributions : la fonction inertia.dudi()


(contri <- inertia.dudi(afc, col=TRUE, row =TRUE) )

Analyse des valeurs propres (inertie)


$TOT
inertia cum ratio
1 0.59060749 0.5906075 0.8070117 inertia : variance de l'axe
2 0.11015190 0.7007594 0.9575243 cum : variance cumule
3 0.03108562 0.7318450 1.0000000 ratio : % de la variance cumule par rapport la variance totale

Informations sur le rle des variables lignes et colonnes : les contributions


1 re contribution : contribution du point linertie de l'axe
Mise en vidence des points (lignes et colonnes) importants pour l'axe
$row.abs
Axis1 Axis2 Axis3
Cru_Bourgeois 1724 71 6085 Contribution dite absolue (note aussi CTR)
Grand_Cru_class 2425 1264 3549 exprime ici en pour 10 000 de l'inertie de l'axe
Vin_de_table 4732 3153 38
Bordeaux_d_origine 99 1174 253
Vin_de_marque 1020 4339 75
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 1 : l'analyse des rsultats (4/5)

A
2 me contribution : corrlation entre axes et points (cosinus carrs)
dite relative (note aussi COR) car contribution relative de l'axe l'inertie totale du point

exprime ici en pour 10 000 O

mesure la qualit de la reprsentation du point sur un axe


FA
cos = OFA / OA

pour mettre en vidence les axes importants pour le point Projection plus ou moins
dformante selon langle
des points / axe

$row.rel cos2 * 10 000 sign (signe de Fi)


Axis1 Axis2 Axis3 con.tra
Cru_Bourgeois -8379 -64 -1557 1660
Grand_Cru_class -8516 -828 656 2298
Vin_de_table 8891 -1105 -4 4295 Inertie totale du point / inertie totale
Bordeaux_d_origine -2999 6599 402 268 exprime en pour 10 000
Vin_de_marque 5564 4414 21 1480

$row.cum Qualit de la reprsentation dans le repre


Axis1 Axis2 Axis3 remain des axes demands (nf)
Cru_Bourgeois 8379 8443 10000 0 = (cos2 1 + cos2 2 +...+ cos2 nf ) * 10000
Grand_Cru_class 8516 9344 10000 0
Vin_de_table 8891 9996 10000 0
Bordeaux_d_origine 2999 9598 10000 0 reprsentation non exprime par les nf axes
Vin_de_marque 5564 9979 10000 0 = somme des cos2 pour les axes nf+1 afc$rank
= 10000 - (cos2 1 + cos2 2 +...+ cos2 nf ) * 10000
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 1 : l'analyse des rsultats (5/5)

Utilisation des contributions pour l'interprtation des cartes factorielles


AFC bordeaux Axe 1 Axe 2

F1 abs rel F2 abs rel


0.4

Vin_de_table
boring Cru_Bourgeois -0.713 1724 -8379 0.063 71 64
excellent Grand_Cru_classe -0.846 2425 -8516 0.264 1264 828
Grand_Cru_classe Vin_de_table 1.182 4732 8891 0.417 3153 1105
0.2

Bordeaux_d_origine -0.171 99 -2999 -0.254 1174 -6599


Vin_de_marque 0.549 1020 5564 -0.489 4339 -4414
axe 2 (15.1 %)

Cru_Bourgeois
excellent -0.867 2136 -8083 0.298 1354 955
0.0

good
good -0.672 2426 -9127 0.004 1 0
mediocre 0.356 599 3443 -0.483 5932 -6355
boring 1.103 4838 9044 0.357 2713 946
-0.2

Bordeaux_d_origine Principe
Ne prendre en compte que les points dont la
contribution > contribution moyenne
-0.4

mediocre
Vin_de_marque contribution abs. moy = 10000 * 1 / nb points
soit pour l'axe 1 :
- pour les vins : 10000 / 5 = 2000
I <- cbind(round(afc$li[,1:2],3),contri$row.abs[,1:2],contri$row.rel[,1:2])[,c(1,3,5,2,4,6)]
names(I) <- c("F1","F1-abs","F1-rel","F2","F2-abs","F2-rel")
cI <- rep(1,nrow(I))
cI[which.max(I[,2]*sign(I[,1]))]=5 -1.0 -0.5 0.0 0.5 1.0
- pour les qualificatifs : 10000 / 4 = 2500
cI[which.max(I[,5]*sign(I[,4]))]=3
cI[which.min(I[,2]*sign(I[,1]))]=4
cI[which.min(I[,5]*sign(I[,4]))]=2
J <- cbind(round(afc$co[,1:2],3),contri$col.abs[,1:2],contri$col.rel[,1:2])[,c(1,3,5,2,4,6)]
names(J) <- c("F1","F1-abs","F1-rel","F2","F2-abs","F2-rel")
cJ <- rep(1,nrow(J))
cJ[which.max(J[,2]*sign(J[,1]))]=5 axe 1 (80.7 %)
contribution rel. moy = 10000 * 1 / nb de valeurs propres (axes)
cJ[which.max(J[,5]*sign(J[,4]))]=3
cJ[which.min(J[,2]*sign(J[,1]))]=4
cJ[which.min(J[,5]*sign(J[,4]))]=2
contri$TOT <- cbind(contri$TOT,round(contri$TOT[,1]/sum(contri$TOT[,1])*100,1))
names(contri$TOT)[4] <- "i%"

soit pour l'axe 1 : 10000 / 3 = 3333


ax <- paste("axe 1 (",contri$TOT[1,4]," %)",sep="")
ay <- paste("axe 2 (",contri$TOT[2,4]," %)",sep="")
plot(range(afc$li[,1],afc$co[,1])+c(-.2,.2),range(afc$li[,2],afc$co[,2])+c(-.03,.0)
,type="n", main= "AFC bordeaux", xlab=ax, ylab=ay)
text(afc$li[,1:2],labels=rownames(afc$li),col=cI,pos=1,offset = 0.2)
text(afc$co[,1:2],labels=rownames(afc$co),col=cJ)
abline(v=0,h=0)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Analyse graphique (1/4)
d = 0.5 d = 0.5

1 - Les cartes factorielles 1 2

mediocre
Vin_de_marque

fonction ade4 : scatter () Bordeaux_d_origine


excellent
rand_Cru_class

Bordeaux_d_origine mediocre
Vin_de_marque
par (mfrow= c(2,2)) good
Cru_Bourgeois
boring
Vin_de_table

good
rand_Cru_class Cru_Bourgeois
excellent
Utilisation : boring
Vin_de_table

des coordonnes : li, co


scatter (afc) # graphe 1
scatter (afc, xax=1, yax=3) # graphe 2 d = 0.5 d = 0.5
mediocre Vin_de_marque

des scores pour les colonnes : li, c1 3 4


scatter (afc, met=2) # graphe 3 Bordeaux_d_origine
Points lignes aux barycentres des points colonnes mediocre
Vin_de_marque

Bordeaux_d_origine

des scores pour les lignes : l1, co good


Cru_Bourgeois
good

Cru_Bourgeois
scatter (afc, met=3) # graphe 4 Grand_Cru_class
excellent
boring

Points colonnes aux barycentres des points lignes


Vin_de_table

nd_Cru_class

par (mfrow= c(1,1)) excellent


boring Vin_de_tabl

Fonction : scatter (dfxy, xax=1, yax=2, xlim, ylim, met=1, grid=TRUE)


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Analyse graphique (2/4)

fonction ade4 : s.label ()


d = 0.5 d = 0.5

s.label (afc$li, sub = "Bordeaux") colnames (afc$co) <- colnames(afc$li)


s.label (afc$co, clabel = 0 , pch = 20, s.label (rbind(afc$li, afc$co), clabel = 0.8)
cpoint = 2, add.plot = TRUE)

Vin_de_marque Vin_de_marque
mediocre

Bordeaux_d_origine Bordeaux_d_origine

good
Cru_Bourgeois Cru_Bourgeois

rand_Cru_class Grand_Cru_class
excellent
boring
Vin_de_table Vin_de_table

Bordeaux

Fonction : s.label (dfxy, xax = 1, yax = 2, label = row.names(dfxy), clabel = 1, pch = 20,
cpoint = if (clabel == 0) 1 else 0, , add.plot = FALSE)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


AFC bordeaux
Analyse graphique (3/4)

1.5
Vin_de_marque
mediocre

Utilisation des scores $l1 et $c1

1.0
Bordeaux_d_origine

fonction plot ()

0.5
Axe 2

0.0
good

plot (c(afc$l1[,1],afc$c1[,1]), c(afc$l1[,2],afc$c1[,2]), type="n", Cru_Bourgeois

asp=1, main= "AFC bordeaux", xlab="Axe 1", ylab="Axe 2")

-0.5
text (afc$l1[,1:2], labels=rownames(afc$l1), col=2)
rand_Cru_class
excellent

-1.0
text (afc$c1[,1:2], labels=rownames(afc$c1), col=3)
boring
Vin_de_table

abline (v=0, h=0) -1.0 -0.5 0.0 0.5 1.0 1.5

lines (afc$c1[,1:2], lty=2) Axe 1

AFC bordeaux

excellent

1.5
Grand_Cru_class

1.0
plot (c(afc$l1[,1],afc$c1[,1]),c(afc$l1[,3],afc$c1[,3]),type="n",

0.5
asp=1,main= "AFC bordeaux", xlab="Axe 1", ylab="Axe 3")
mediocre
Bordeaux_d_origine
Vin_de_marque
text (afc$l1[,c(1,3)], labels=rownames(afc$l1), col=2)

Axe 3

0.0
Vin_de_table
text (afc$c1[,c(1,3)], labels=rownames(afc$c1), col=3)
boring

-0.5
abline (v=0, h=0)
lines ( afc$c1[,c(1,3)], lty=2)
-1.0
good
-1.5

Cru_Bourgeois

-1 0 1 2
Aussi : points () Axe 1
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Analyse graphique (4/4)

2 - Reprsentation sur un axe Rows Vin_de_table

fonction ade4 : score () Vin_de_marque

score(afc) Bordeaux_d_origine

afc$l1 row scores


Cru_Bourgeois
RS1
Cru_Bourgeois -0.9283350 -1,5 +1,5
Grand_Cru_class
Grand_Cru_class -1.1010641
Vin_de_table 1.5381971
Bordeaux_d_origine -0.2229937
Vin_de_marque 0.7141957

afc$c1 CS1
excellent -1.1276880 boring
good -0.8747596
mediocre 0.4626773
mediocre
boring 1.4348968

good

excellent

d = 0.5 Columns

Les 17 nij 0 axe 1


- +
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 2 : analyse d'un tableau de dnombrements (1/5)

library (ade4)
data (santacatalina)

santacatalina # Densit lhectare de 11 sp darbres selon un gradient dhumidit du sol


v1 v2 v3 v4 v5 v6 v7 v8 v9 v10

Pinus.ponderosa 36 646 472 212 48 4 4 0 0 0


Quecus.hypoleucoides 4 450 670 820 1304 724 248 106 124 22
Pinus.cembroides 0 0 0 6 26 58 186 322 156 242
Arctostaphylos.pringlei 0 0 0 12 42 268 108 308 438 68
Quercus.arizonaca 0 94 18 36 218 186 74 226 50 38
Quercus.rugosa 252 136 170 22 50 24 32 20 36 22
Garrya.wrightii 0 0 0 8 28 0 26 232 18 20
Pseudostuga.menziesii 88 156 28 0 0 0 0 0 0 0
Quercus.emoryi 0 0 0 0 0 26 0 36 28 152
Pinus.chihuahuana 0 2 2 6 84 86 0 0 0 0
Arbutus.arizonaca 0 4 16 54 34 16 0 0 0 0

coa <- dudi.coa (santacatalina, scannf=FALSE)


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 2 : analyse d'un tableau de dnombrements (2/5)
Eboulement des valeurs propres

Nombre d'axes retenir

0.6
coa$eig

0.5
[1] 0.6045948913 0.3440317070 0.1627327315 0.1300140906 0.0894258099
0.0342412610 0.0157494017 0.0081980480 0.0008699014

0.4
barplot (coa$eig, names.arg= 1: coa$rank, main= "Eboulement des valeurs propres") coude

0.3
Mthode du coude : saut dans l'boulement des valeurs propres
Retenir les valeurs propres > moyenne les valeurs propres

0.2
coude
mean (coa$eig) # 0.1544286

0.1
utilis dans l'AFCM

0.0
Contributions
1 2 3 4 5 6 7 8 9

inercoa <- inertia.dudi (coa,row=TRUE, col=TRUE)


ax = 1 # choix de l'axe
which(inercoa$row.abs[,ax]> 10000/nrow(inercoa$col.abs)) # % inertie
Pinus.ponderosa Pinus.cembroides Arctostaphylos.pringlei
which(abs(inercoa$row.rel[,ax])> 10000/coa$rank) # cos2
Pinus.ponderosa Quecus.hypoleucoides Pinus.cembroides Arctostaphylos.pringlei Quercus.arizonaca
Quercus.rugosa Garrya.wrightii Pseudostuga.menziesii Quercus.emoryi Arbutus.arizonaca

which(inercoa$col.abs[,ax]> 10000/nrow(inercoa$col.abs)) # % inertie


v2 v3 v8 v9 v10
which(abs(inercoa$col.rel[,ax])> 10000/coa$rank) # cos2
v1 v2 v3 v4 v7 v8 v9 v10
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances (exemple 2) (3/5)

scatter (coa) par(mfrow = c(1,2))


for (i in 1:9) arrows (coa$co[i,1],coa$co[i,2], s.label(coa$li, lab = rownames(coa$li)) #1
coa$co[i+1,1],coa$co[i+1,2], col=2, length=.1) s.label(coa$co, lab = rownames(coa$co)) #2

d = 0.5 d = 0.5 d = 0.5

Pinus.chihuahuana

Arbutus.arizonaca
v5
v4
v6 Quecus.hypoleucoides
Quercus.arizonaca v5
v6 v4
Pinus.chihuahuana
v7 Arbutus.arizonaca
Arctostaphylos.pringlei v3
Quecus.hypoleucoides v7 v3
v8v9
Garrya.wrightii Pinus.ponderosa Quercus.arizonaca v8v9
Pinus.cembroides v2 rctostaphylos.pringlei v2
Garrya.wrightii Pinus.ponderosav10
nus.cembroides
v10
Quercus.emoryi
rcus.emoryi

Quercus.rugosa
Quercus.rugosa Pseudostuga.menziesii
v1
Pseudostuga.menziesii

v1 1 2
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances (exemple 2) (4/5)

g <- t ( santacatalina[order (coa$li[,1]),] )


# tri des espces suivant F1 et transposition
score (coa) par (mfrow=c(3,4), mar=c(5,3,.5,1))
palette (rainbow (ncol (g))) # choix des couleurs
for (i in 1: ncol(g)) barplot (g[,i], xlab=colnames(g)[i], col=i)
Rows Pseudostuga.menziesii palette ("default")
Pinus.ponderosa
Quercus.rugosa
Arbutus.arizonaca
Quecus.hypoleucoides
Pinus.chihuahuana
Quercus.arizonaca
Arctostaphylos.pringlei
Garrya.wrightii
Pinus.cembroides
Quercus.emoryi

v1
v2
v3
v4
v5
v6
v7
v9
v8
v10

d=1 Columns
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances (exemple 2) (5/5)

par(mfrow=c(1,2))
table.value (santacatalina, grid=TRUE) # 1 Tableau des donnes
table.value (santacatalina[order(coa$li[,1]), order(coa$co[,1])], grid=TRUE) # 2
par(mfrow=c(1,1)) Tri suivant F1 Tri suivant F1

Tableau "diagonalis"

v10

v10
1 2
v1

v2
v3

v4

v5

v6
v7

v8

v9

v8

v9

v7
v6

v5

v4

v3
v2

v1
Pinus.ponderosa Quercus.emoryi

Quecus.hypoleucoides Pinus.cembroides

Pinus.cembroides Garrya.wrightii

Arctostaphylos.pringlei Arctostaphylos.pringlei

Quercus.arizonaca Quercus.arizonaca

Quercus.rugosa Pinus.chihuahuana

Garrya.wrightii Quecus.hypoleucoides

Pseudostuga.menziesii Arbutus.arizonaca

Quercus.emoryi Quercus.rugosa

Pinus.chihuahuana Pinus.ponderosa

Arbutus.arizonaca Pseudostuga.menziesii

250 750 1250 250 750 1250


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


exemple 3 : tableau de mesures (variables quantitatives)

0.04
library (ade4)
OM

BD
OM OM
library (MASS) OF FL
OF
OF
OF OF
OM OF
data (crabs) OM OM OM OFOF OF
OF OF OF OF OF
OM OM OMOM OF OF
OF OF OF
gr <- as.factor (paste(crabs[,1], crabs[,2], sep=""))
OM OM OM OF

0.02
OM OM OF OF OF OF
OF OF OF
OM OF OF
OM OM OF
OFOF OF OF
OM OM OM OF
OF
OM OM OM OF
OM OM OM OM OM OF
OMOM OM OM OFOF
OM OM OF OF OF
OM OM OM OF OF
OM OMOM OF OF OF
OM
OMOM
OM
OM
OM
OF OF RW

0.00
OM

Axis2
OM

BM BF BF
BF
CL BF
BF BF

afcrab <- dudi.coa (crabs[, 4:8], scannf=FALSE)


BM BF BF BF BFBF
BF
BF BF BF
BFBF BF BF
BM
BF BF BFBF BF
BM BF BF BF

-0.02
BM BM BF
BFBF
BM BM BMBF BF
BM BF
BF BF BF BF
BMBM BM BMBM BM BFBFBF BF
BM BM
BM
BM
BM BM
BM BM CW BM
BM
BF BF
BF
BF
BMBM BMBM
BM BM
BM BM BM BM BF BF
BM BM
BM
BM BM BF BF BF
BM BM
BM BM
BM BM
-0.04

BM
BM

BM

names(afcrab$co) <- names(afcrab$li)


-0.06 -0.04 -0.02 0.00 0.02 0.04 0.06 0.08
plot (rbind(afcrab$li[,1:2], afcrab$co[,1:2]), type="n")
abline (v=0, h=0) Axis1
text (afcrab$co[,1:2], labels=rownames(afcrab$co), cex=1.2)
text (afcrab$li[,1:2],cex=.6, labels=gr, col=as.numeric(gr))
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Elments supplmentaires (1/5)

Elments supplmentaires = illustratifs


lments qui peuvent tre ajouts aux donnes initiales sans intervenir
dans le calcul des axes factoriels (leur contribution est nulle)

(rappel : Fi = -1/2 j=1,p (f ij) Gj )


Principales utilisations :
ajouter de nouvelles lignes (ou colonnes) lanalyse :
introduire des variables pour aider l interprtation des axes
traiter des donnes manquantes (individus et/ou variables)
permet de comparer des rsultats dorigine diffrente

liminer des lignes (ou colonnes) qui par leur forte contribution sur un axe
masquent plus ou moins les correspondances entre les autres lments de
lanalyse (tirement excessif des axes)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Elments supplmentaires (2/5)
Exemple : ajout crabs [,4:8]
des points moyens des couples espce-sexe en lignes supplmentaires
des variables "sp" et "sex" en colonnes supplmentaires

colonnes supplmentaires

crabs [,4:8] sp.B sp.O sex.F sex.M


tableau binaire disjonctif des
1
FL
8.1
RW
6.7
CL
16.1
CW
19.0
BD
7.0
1 1 0 0 1 facteurs sp et sex
2 1 0 0 1
2 8.8 7.7 18.1 20.8 7.4
3 1 0 0 1
3
4
9.2
9.6
7.8
7.9
19.0
20.1
22.4
23.1
7.7
8.2
4 1 0 0 1 vdis <- acm.disjonctif (crabs[,1:2])
5 1 0 0 1
5 9.8 8.0 20.3 23.0 8.2
. . .
. . .
195 0 1 1 0
195 21.3 18.4 43.8 48.4 20.0
196 0 1 1 0
196 21.4 18.0 41.2 46.2 18.7
197 0 1 1 0
197 21.7 17.1 41.7 47.2 19.6
198 0 1 1 0
198 21.9 17.2 42.6 47.4 19.5
199 0 1 1 0
199 22.5 17.2 43.0 48.7 19.8
200 0 1 1 0
200 23.1 20.2 46.2 52.5 21.1

FL RW CL CW BD
points moyens BF
BM
13.3
14.8
12.1
11.7
28.1
32.0
32.6
36.8
11.8
13.3 lignes
Espce*Sexe OF 17.6 14.8 34.6 39.0 15.6 supplmentaires
OM 16.6 12.3 33.7 37.2 15.3

mgr <- aggregate (crabs[,4:8], by=list(gr), mean)


rownames(mgr)<- mgr[,1]
mgr[,2:6]
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Elments supplmentaires : Points lignes (3/5)
# points moyens Espce*Sexe

0.04
mgr <- aggregate(crabs[,4:8], by=list(gr),mean)
rownames(mgr)<- mgr[,1]
BD

Fonction suprow ()
FL

# calcul des coordonnes des points OF

0.02
# lignes supplmentaires OM
smgr <- suprow (afcrab, mgr[,-1])
RW
names(casup)
[1] "tabsup" "lisup"

0.00
Axis2
# coordonnes des points supplmentaires CL
smgr$lisup
Axis1 Axis2 BF
-0.02
BF 0.03121187 -0.01649751
CW
BM -0.01838406 -0.02680493
OF 0.01958921 0.02134331 BM
OM -0.02991233 0.01679338
-0.04

plot (rbind (afcrab$li[,1:2], afcrab$co[,1:2]), type="n")


abline (v=0, h=0)
text (afcrab$co[,1:2], labels=rownames(afcrab$co), cex=1)
points (afcrab$li[,1:2], cex=.8, pch=20, col=as.numeric(gr)) -0.06 -0.04 -0.02 0.00 0.02 0.04 0.06 0.08
# affichage des points supplmentaires
Axis1

text (smgr$lisup, cex=2, labels=mgr[,1], col=1:nrow(mgr))


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances


Elments supplmentaires : Points colonnes (4/5)
sp.O

# tableau binaire disjonctif des facteurs sp & sex


vdis <- acm.disjonctif(crabs[,1:2])

0.5
Fonction supcol ()
# calcul des coordonnes des points
# colonnes supplmentaires
csup <- supcol (afcrab, vdis) sex.F
BD

0.0
FL

Axis2
RW

names(csup)
CL
CW

[1] "tabsup" "cosup" sex.M

# coordonnes des points supplmentaires


csup$cosup

-0.5
Axis1 Axis2 colnames de co
sp.B 0.2997822 -0.9723478
sp.O -0.1045915 0.8863265
sex.F 0.8904758 0.1020459
sex.M -0.6952851 -0.1880672
sp.B
-1.0

plot (rbind (afcrab$li, afcrab$co, csup$cosup), type="n")


-0.5 0.0 0.5
abline (v=0, h=0) Axis1
points (afcrab$li, cex=.5, pch=20, col=as.numeric(gr))
text (afcrab$co, labels=rownames(afcrab$co), cex=.6) rappel : Gj= -1/2 i=1,n (f ji) Fi
# affichage des points supplmentaires avec : -1/2 *Fi = RS ou Row Score (l1)
text (csup$cosup, labels=rownames(csup$cosup)) et f ji = tableau des profils des colonnes supplmentaires
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Elments supplmentaires
Remarque sur l'utilisation de variables binaires disjonctives
supplmentaires dans une AFC simple (5/5)
head (csup$tabsup) head (sweep(crabs[,4:8], 2, colSums(crabs[,4:8]), "/"))
sp.B sp.O sex.F sex.M FL RW CL CW BD
fonction : supcol.coa () 1 0.01 0 0 0.01 1 0.002598986 0.002629823 0.002507359 0.002608851 0.002494565
2 0.01 0 0 0.01 2 0.002823590 0.003022334 0.002818832 0.002856005 0.002637112
3 0.01 0 0 0.01 3 0.002951935 0.003061585 0.002958995 0.003075698 0.002744022

Comparaison des profils colonnes


4 0.01 0 0 0.01 4 0.003080280 0.003100836 0.003130305 0.003171813 0.002922205
5 0.01 0 0 0.01 5 0.003144452 0.003140087 0.003161452 0.003158083 0.002922205
6 0.01 0 0 0.01 6 0.003465315 0.003532598 0.003581941 0.003638660 0.003492392
colSums (csup$tabsup) colSums (sweep(crabs[,4:8], 2, colSums(crabs[,4:8]), "/"))
sp.B sp.O sex.F sex.M FL RW CL CW BD
1 1 1 1 1 1 1 1 1

variable sp variable sex OM

OMBD OM
OF
OF
OF OF
FL OF
Placer ces modalits aux barycentres des points lignes OM OM OF
OM OM OFOF OF OF
OM OM OMOM OF OF OF
OF
OF OF OF
OF

par projection des scores des points lignes et coordonnes des colonnes OMOF
OM OM OF OF
OF

1
OM OM OM OF OF OF
OFOF OFOF
OM OF
supplmentaires OM
OM OM
OM OM
OM
sp.O OF
OF OF
OF
OF
OF
OM
OM OM OF
OM OM OM OF
OMOM OM OFOF
OM OM OM OF OF OF

names(afcrab$c1) <- names(afcrab$l1) <- names(afcrab$li) OM OM OM OF OF


OM OM OM OF OF OF
OMOM OM
OM RW
OF
plot (rbind (afcrab$l1[,1:2], afcrab$c1[,1:2], csup$cosup[,1:2]), type="n")
OM OM OF

abline (v=0, h=0) OM sex.F

0
Axis2
OM

text (afcrab$l1[,1:2], cex=.5, labels=gr, col=as.numeric(gr)) sex.M BF BM


BF
BF BF
BF
CL
text (afcrab$c1[,1:2], labels=rownames(afcrab$co), cex=.6) BF
BM BFBF BF
BF BF BFBF

text (csup$cosup[,1:2], labels=rownames(csup$cosup), font=2, col=6)


BF BF
BF BF BF BF
BF BF BFBM BF
BF BF
BM BM BF BF
BM BM BM BM BF BFBF
BF
BF
BM BF BF BF BF BF
sp.B

-1
BMBM BM BM BM BM BF BFBFBF
BM BM BM BM CW BF BF
BM BM BM BM BF BF
BM
BM BM BMBM BM
BM

Vrification : calcul des scores moyens BM BM BM BF BF


BM BM
BM BM BM
BM BM BF BF BF
BM BM
BM
aggregate(afcrab$l1[,1:2],by=list(crabs[,1]),mean) BM
BM
BM BM

Group.1 Axis1 Axis2 csup$cosup BM


-2

1 B 0.2997822 -0.9723478 Axis1 Axis2


2 O -0.1045915 0.8863265 sp.B 0.2997822 -0.9723478 BM

aggregate(afcrab$l1[,1:2],by=list(crabs[,2]),mean) sp.O -0.1045915 0.8863265


Group.1 Axis1 Axis2 sex.F 0.8904758 0.1020459 -2 -1 0 1 2
1 F 0.8904758 0.1020459 sex.M -0.6952851 -0.1880672
2 M -0.6952851 -0.1880672 Axis1
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


Principe

AFCM
Pour lanalyse dun tableau dont les q variables (q>2) sont exprimes en modalits
Sous R : data.frame de facteurs
data.frame': 38 obs. of 8 variables:

Exemple : data (ours)


$ altit : Factor w/ 3 levels "1","2","3": 2 1 3 3 3 3 2 1 2 2 ...
$ deniv : Factor w/ 3 levels "1","2","3": 3 2 3 3 3 3 2 1 3 2 ...
ur <- ours [, 1:8] $ cloiso: Factor w/ 3 levels "1","2","3": 3 1 3 3 1 3 3 2 1 3 ...
$ domain: Factor w/ 3 levels "1","2","3": 2 2 2 1 2 1 2 2 2 1 ...
$ boise : Factor w/ 3 levels "1","2","3": 2 1 2 3 2 3 2 1 3 3 ...
$ hetra : Factor w/ 3 levels "1","2","3": 3 1 2 3 3 3 1 1 2 3 ...
$ favor : Factor w/ 3 levels "1","2","3": 3 2 3 3 2 3 2 3 3 2 ...
str (ur) $ inexp : Factor w/ 3 levels "1","2","3": 2 2 3 2 3 3 3 2 3 3 ...

altit deniv cloiso domain boise hetra favor inexp


Numro de la modalit 1 2 3 3 2 2 3 3 2
"more than 70%" 2 1 2 1 2 1 1 2 2
de la variable altit 3 3 3 3 2 2 2 3 3
4 3 3 3 1 3 3 3 2
5 3 3 1 2 2 3 2 3
head (ur) 6 3 3 3 1 3 3 3 3

Principe : faire une AFC simple du tableau binaire disjonctif


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple) (1/4)
Eigenvalues d = 0.5
dim(ur) hetra.2

[1] 38 8 8 variables
9

acm <- dudi.acm (ur)


Select the number of axes: 3 3
domain.2
dim(acm$li) 21
20
[1] 38 3 inexp.3

dim(acm$co) deniv.3
5
[1] 24 3 24 modalits 1 cloiso.1 14

aprs la transformation binaire 15


altit.2
boise.2
cloiso.2
disjonctive des 8 variables 7
29
favor.3
rownames(acm$co) 8
25
[1] "altit.1" "altit.2" "altit.3" "deniv.1" 23
[5] "deniv.2" "deniv.3" "cloiso.1" "cloiso.2"
6 13 26 2 22
[9] "cloiso.3" "domain.1" "domain.2" "domain.3" inexp.2 38
16
[13] "boise.1" "boise.2" "boise.3" "hetra.1" 19
favor.1
[17] "hetra.2" "hetra.3" "favor.1" "favor.2" 4 10
12 deniv.1 hetra.1
[21] "favor.3" "inexp.1" "inexp.2" "inexp.3" hetra.3 11 boise.1
altit.1
boise.3 domain.1 favor.2 36

altit.3 deniv.2 inexp.127


acm$eig[1] cloiso.3
28 33
[1] 0.4283099 17
31
32
34
acm$rank 18
domain.3
37 30 35
24

[1] 16 infrieur 23 attendu

scatter.dudi (acm)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples CTRabsF1


altit.1 836
(exemple) (2/4) altit.2
altit.3
2
583
deniv.1 220
Interprtation des rsultats en terme de variables deniv.2 28
deniv.3 489
ineracm <- inertia.dudi (acm, col=TRUE) cloiso.1 115
modalits de la variable cloiso cloiso.2 380
ax <- 1 # choix de l'axe 1 cloiso.3 263
cbind( CTRabsF1=ineracm$col.abs[, ax] ) domain.1 320
domain.2 204
domain.3 0
Modalits contribuant le plus l'axe 1 boise.1 1006
boise.2 25
i= which (ineracm$col.abs[, ax] > 10000/nrow(ineracm$col.abs))# slection des valeurs > moyenne
boise.3 1105
sort (ineracm$col.abs[i, ax], dec=TRUE) hetra.1 896
hetra.2 0
hetra.3 boise.3 boise.1 hetra.1 favor.3 altit.1 favor.1 altit.3 deniv.3 hetra.3 1215
1215 1105 1006 896 856 836 703 583 489 favor.1 703
favor.2 3
Group.1 x favor.3 856
Contribution des variables l'axe 1 1 altit 1421 inexp.1 334
2 boise 2136 inexp.2 97
Somme des contributions des modalits de chacune des variables 3 cloiso 758 inexp.3 319
gvar <- rep (colnames(ur), sapply(ur, nlevels)) 4 deniv 737
aggregate (ineracm$col.abs[, ax], by=list(factor(gvar)), FUN=sum) 5 domain 524
6 favor 1562
7 hetra 2111
RS1 RS2 RS3
8 inexp 750
altit 0.4867906 0.1893131 0.3876253
deniv 0.2528392 0.2325247 0.1260940
Utilisation des rapports de corrlations cloiso 0.2598395 0.2724303 0.2356382
CTR par variables ramens entre 0 et 1 domain 0.1796741 0.6002266 0.1483924
boise 0.7317972
acm$cr 0.1429825 0.5564289
hetra 0.7233694 0.4699515 0.1274654
favor 0.5352790 0.0682467 0.1534055
inexp 0.2568897 0.2505504 0.2658320
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple) (3/4)

Reprsentations graphiques dcrivant les variables


altit deniv cloiso
3 3

2 2

1 1
3
1 2
2
domain inexp 1
1 2
3 3

3 3

2 2
domain boise hetra
1 1

cloiso favor 2

2
3 3
2
2 2
1 3 1 3 1
1 1 3

deniv hetra
favor inexp
3 3

2 2

1 1
3

3
altit boise 1 2
2 1
d=1 d=1

boxplot.acm (acm, xax=1) scatter (acm)


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple) (4/4) hetra

hetra.2

1.5
Reprsentations graphiques 9

caractrisant les points lignes (sites) par


3 domain.2

1.0
inexp.3 21
20

deniv.3

les modalits d'une variable initiale


5

Axis2
cloiso.1
1 14 cloiso.2

0.5
altit.2
15
boise.2
29
favor.3 7

25 8
23

13 2

0.0
6 inexp.2 26 22
38
16
19
favor.1

v=6 choix de la variable


4 10
12 deniv.1
11 hetra.1
hetra.3 favor.2 36 boise.1
altit.1
boise.3 domain.1
deniv.2 inexp.1
27

colnames (ur)[v] # "hetra"

-0.5
altit.3 cloiso.3
28 33
31
17 32
34 24
18 37
domain.3 30 35

-1.0 -0.5 0.0 0.5 1.0

names(acm$co) <- names(acm$li) Axis1

plot (rbind(acm$li, acm$co)[,1:2], type="n", asp=1, main=colnames(ur)[v]) d = 0.5

abline (v=0, h=0)


text (acm$co, labels=rownames(acm$co), cex=.8)
text (acm$li, labels=rownames(acm$li), cex=.6, col=3)
domain.2

s.chull
inexp.3 2
(acm$li, fac=ur[,v], op=1, clabel=0, col=1:3, add.plot=TRUE) deniv.3

cloiso.1
cloiso

variable affiche
altit.2
boise.2
favor.3

inexp.2

s.class (acm$li, fac=ur[,v], clabel=1, col=1:3, sub=colnames(ur)[v]) 3 1


deniv.1
favor.1

text (acm$co, labels=rownames(acm$co), cex=.8)


hetra.1
hetra.3 favor.2 bois
alt
boise.3 domain.1
deniv.2 inexp.1
altit.3 cloiso.3

hetra
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


Cas particulier de l'inertie dans l'AFCM Eboulement des valeurs propres

0.4
0.3
barplot (acm$eig, names.arg= 1:acm$rank, xlab="Axes",
ylab="Inertie", main= "Eboulement des valeurs propres")

Inertie

0.2
ineracm$TOT [c(1:4, 13:16),]

0.1
inertia cum ratio
1 0.428309854 0.4283099 0.2141549
2 0.278278207 0.7065881 0.3532940

0.0
3 0.250110212 0.9566983 0.4783491 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Axes
4 0.188768008 1.1454663 0.5727331
. . . L'inertie totale ne dpend que
13 0.028391037 1.9500283 0.9750141 du nombre de variables et
14 0.026236575 1.9762649 0.9881324 de modalits.
15 0.016874373 1.9931392 0.9965696
16 0.006860761 2.0000000 1.0000000
L'inertie moyenne ne dpend
que du nombre de
Somme des valeurs propres
variables.
= (nombre de modalits - nombre de variables) / nombre de variables
(nrow (acm$co) - ncol (ur)) / ncol(ur)
[1] 2 Eviter :
des nombres de modalits trs dissemblables
Valeurs propres moyenne = 1/ nombre de variables des modalits faiblement reprsentes (<5%)
1/ncol(ur) # mean (ineracm$TOT [,1])
[1] 0.125 Remde :
Tenter des regroupements
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


Comparaison avec l'AFC du tableau de Burt

Tableau de Burt = tableau de contingence multiple


Calcul des tableaux de contingence entre les couples de variables qualitatives (facteurs)
urb <- acm.burt (ur, ur) altit.1 altit.2 altit.3 deniv.1 deniv.2 deniv.3 cloiso.1 cloiso.2 cloiso.3
altit.1 8 0 0 5 2 1 3 2 3
altit.2 0 17 0 4 8 5 7 2 8
dim(urb) # 24 24 altit.3
deniv.1
0
5
0
4
13
4
4
13
4
0
5
0
2
6
0
1
11
6
urb [1:9,1:9] deniv.2 2 8 4 0 14 0 4 1 9
deniv.3 1 5 5 0 0 11 2 2 7
cloiso.1 3 7 2 6 4 2 12 0 0
cloiso.2 2 2 0 1 1 2 0 4 0
cloiso.3 3 8 11 6 9 7 0 0 22

AFC simple du tableau de Burt


acmb <- dudi.coa (urb, scannf=FALSE)
acmb$eig[1] # 0.1834493
acm$eig[1]^2 # 0.1834493

Conclusions :
LAFC du tableau de Burt est quivalente lAFCM des variables qualitatives :
Les valeurs propres de lAFCM sont gales la racine carre des valeurs propres trouves par lAFC du tableau
de Burt ;
La reprsentation des variables est la mme ( un facteur multiplicatif prs) ;
La reprsentation des individus de lAFC est la mme en les mettant en individus supplmentaires.
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (1/11)

Principe : navoir quun tableau de variables qualitatives


Stratgie : dcouper en classes les variables quantitatives

Soit V lensemble des variables quantitatives. Chaque variable v est transforme en n variables
qualitatives par dcoupage en n classes et chacune tant repre par le numro de la classe.

Deux choix raliser :


1. le nombre de classes
2. les bornes des classes

Deux stratgies :
1. avoir globalement le mme nombre de classes par variable
2. dfinir plutt des classes deffectifs gaux des classes damplitude gale.

Deux fonctions :
1. cut () pour dcouper une variable continue en classes
2. recode() pour regrouper des classes [librairie car]

Remarque : si variable avec NA, crer une classe NA regroupant les donnes manquantes
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (2/11)

Dcoupage en classes des variables quantitatives (continues) 1/2


fonction : cut () Histogram of x

20
Exemple

15
x <- rnorm(100,5)

Frequency
range(x) # 2.689071 6.973328

10
r <- hist (x)
r$breaks # 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0

5
r$counts # 1 5 13 16 20 19 17 4 5
$equidist # TRUE

0
3 4 5 6 7

# Avec indication du nombre de classes : breaks = nombre de classes


r1 <- cut (x, breaks = 4)
table (r1)
(2.68,3.76] (3.76,4.83] (4.83,5.9] (5.9,6.98] Paramtre
8 36 43 13 labels = NULL -> bornes (dfaut)
labels = FALSE -> n des classes
( r1 <- cut (x, breaks = 4, labels = FALSE) )
[1] 3 1 2 3 3 4 2 3 2 2 2 3 4 3 2 3 3 4 4 3 4 3 3 2 3 2 4 3 3 2 3 2 2 2 3 3 3 2 1 4 3 2 2 3 2 2 2 3 4 3 1 3
[53] 2 1 3 3 3 4 1 3 3 3 2 3 2 2 2 3 2 2 2 2 4 1 3 3 3 4 3 3 2 3 4 2 3 2 2 1 2 2 3 2 2 3 1 3 3 2 4 3
table (r1)
1 2 3 4
8 36 43 13
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (3/11)

Dcoupage en classes des variables quantitatives : cut () 2/2

# Avec indication des limites des classes : breaks = bornes


r2 <- cut (x, breaks = c(min(x), 4, mean(x), 6, max(x)), include.lowest = TRUE)
table (r2)
[2.69,4] (4,4.89] (4.89,6] (6,6.97]
Refaire avec include.lowest = FALSE
19 28 44 9

# Avec des classes deffectifs gaux : breaks = quantile ()


r3 <- cut (x, breaks = quantile(x), include.lowest = TRUE)
table (r3)
[2.69,4.13] (4.13,4.91] (4.91,5.51] (5.51,6.97]
25 25 25 25
summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.689 4.134 4.911 4.895 5.513 6.973

Fonction quantile ()
quantile (x, probs = seq (0, 1, 1 / n), na.rm = FALSE) # donne par dfaut les quartiles
n tant le nombre souhait de classes # par dfaut n = 4
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (4/11)

Exemple : library (MASS)


data (Cars93)

names(Cars93); ?(Cars93)
car <- Cars93 [,c(5,13,17,19,24,18,3,9,10)]
dim (car)
[1] 93 9

summary(car)
Price Horsepower Fuel.tank.capacity Length Luggage.room
Min. : 7.40 Min. : 55.0 Min. : 9.20 Min. :141.0 Min. : 6.00
1st Qu.:12.20 1st Qu.:103.0 1st Qu.:14.50 1st Qu.:174.0 1st Qu.:12.00
Median :17.70 Median :140.0 Median :16.40 Median :183.0 Median :14.00
Mean :19.51 Mean :143.8 Mean :16.66 Mean :183.2 Mean :13.89
3rd Qu.:23.30 3rd Qu.:170.0 3rd Qu.:18.80 3rd Qu.:192.0 3rd Qu.:15.00
Max. :61.90 Max. :300.0 Max. :27.00 Max. :219.0 Max. :22.00
NA's :11.00
Passengers Type AirBags DriveTrain
Min. :2.000 Compact:16 Driver & Passenger:16 4WD :10
1st Qu.:4.000 Large :11 Driver only :43 Front:67
Median :5.000 Midsize:22 None :34 Rear :16
Mean :5.086 Small :21
3rd Qu.:6.000 Sporty :14
Max. :8.000 Van : 9
5 quantitatives
1 discrte
3 qualitatives
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (5/11)

# Changement didentificateur des colonnes


names (car) <- c("prix","PU","tank","L","coffr","pers","type","Rbag","trac")
prix PU tank
# Histogrammes
30

5 10 15 20
25
Frequency

Frequency

Frequency
20

15
0 5 10

0 5

0
10 20 30 40 50 60 50 100 150 200 250 300 10 15 20 25

L coffr pers

40
20

30
20
Frequency

Frequency

Frequency

20
5 10
5 10

10
0

0
140 160 180 200 220 10 15 20 2 3 4 5 6 7 8

par (mfrow=c(3,3))
for (i in 1:6) hist (car[,i], main = colnames(car)[i], xlab="", col=i)
par (mfrow=c(1,1))
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (6/11)
Prparation des donnes
Dcoupage en classes des variables quantitatives (continues)
Fonction cut ()

Recodage avec des classes deffectifs gaux (br=quantile)


x <- car$prix
# dcoupage en n classes quiprobables
n <- 4 # nombre de classes souhait (ici n=4 soit effectif/classe de 25%)
car[,1] <- as.factor (cut (x, br=quantile(x, probs=c(seq(0,1,1/n))), inc = TRUE, lab = FALSE))

Recodage avec indication des limites des classes (br=bornes)


# variable "PU" (Horsepower)
x <- car$PU
car$PU <- as.factor ( cut (x, br = c(min(x),100,150,200,max(x)), inc = TRUE, lab = NULL))

Recodage avec indication du nombre de classes (br=nombre de classes)


# variables : "tank" , "L" , "coffr"
numv <- 3:5 # numro des variables recoder
cl <- c(4,5,6) # nombre de classes par variable
for ( i in 1:length(numv) ) {
car[,numv[i]] <- as.factor (cut (car[,numv[i]], br = cl[i], inc = TRUE, lab = NULL)) }
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (7/11)

Prparation des donnes


Transformation des variables discrtes (quantitatives)

Fonction as.factor ()

# pers (Passengers)

is.vector (car[,6])
[1] TRUE

summary (car[,6])
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.000 4.000 5.000 5.086 6.000 8.000

car[,6] <- as.factor (car[,6])

summary (car[,6])

2 4 5 6 7 8
2 23 41 18 8 1
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (8/11)
Prparation des donnes
Recodage des variables 1/3

Fonction recode () dans library (car)

x <- car[,6] # variable "pers"


table (x)
2 4 5 6 7 8
2 23 41 18 8 1

library (car)

# regroupement des 2 premires et des 2 dernires classes

car[,6] <- recode (x,"c(2,4) = '2-4'; c(7,8) = '7-8' ")

table (car[,6])
2-4 5 6 7-8 nouvelles valeurs
25 41 18 9
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (9/11)
Prparation des donnes
Recodage des variables 2/3
x <- car[,5] # variable "coffr"
table (x)
[5.98,8.66] (8.66,11.3] (11.3,14] (14,16.7] (16.7,19.3] (19.3,22]
3 14 35 16 10 4
( n <- levels(x) )
[1] "[5.98,8.66]" "(8.66,11.3]" "(11.3,14]" "(14,16.7]" "(16.7,19.3]" "(19.3,22]"
car[,5] <- recode (x,"c(n[1], n[2])=1 ; n[3]=3 ; n[4]=4 ; c(n[5], n[6])=6")
table (car[,5] )
1 3 4 6
17 35 16 14

Autre syntaxe de recodage :


y <- recode (car[,5], "1:4='A'; else ='B'")
table(y)
A B
68 25
sum(table(y)) Pourquoi cette
[1] 93 diffrence ?
sum(table(car[,5]))
[1] 82
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (10/11)

Recodage des variables 3/3 Prparation des donnes

cas des donnes manquantes


car[,5] # variable "coffr"
[1] 1 4 4 6 3 4 6 6 4 6 4 # recherche donnes manquantes
[12] 3 4 3 4 <NA> <NA> 6 <NA> 4 4 6 which (is.na(car), arr.ind=TRUE)
[23] 1 3 4 <NA> 4 1 1 4 3 3 3
row col
[34] 3 6 <NA> 6 6 1 1 1 3 4 1
[45] 3 1 4 4 4 1 6 6 4 3 4
16 16 5
[56] <NA> <NA> 3 4 1 4 1 4 3 4 <NA> 17 17 5
[67] 4 4 4 <NA> 6 1 6 3 3 4 6 19 19 5
[78] 4 3 1 4 4 1 1 3 4 <NA> 1 26 26 5
[89] <NA> 4 4 4 4 36 36 5
Levels: 1 3 4 6 56 56 5
57 57 5
table (car[5])
1 3 4 6 66 66 5
17 35 16 14 70 70 5
87 87 5
89 89 5
# utilisation de la fonction recode()
car[,5] <- recode (car[,5], "NA = 0")
table (car[,5])
0 1 3 4 6
11 17 35 16 14
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Traitement des tableaux ayant des


variables quantitatives et qualitatives (11/11)
Fin de la prparation des donnes

Rsum du tableau soumis lanalyse

summary(car)

prix PU tank L coffr pers


1:24 [55,100] :22 [9.18,13.6]:20 [141,157]: 3 0:11 2-4:25
2:23 (100,150]:32 (13.6,18.1]:42 (157,172]:16 1:17 5 :41
3:23 (150,200]:28 (18.1,22.6]:28 (172,188]:38 3:35 6 :18
4:23 (200,300]:11 (22.6,27] : 3 (188,203]:29 4:16 7-8: 9
(203,219]: 7 6:14

type Rbag trac


Compact:16 Driver & Passenger:16 4WD :10
Large :11 Driver only :43 Front:67
Midsize:22 None :34 Rear :16
Small :21
Sporty :14
Van : 9
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple 2) (1/3)
AFCM sans la variable Prix
Elimination de Prix d=1

ty
pers.7.8
pe.Van

carm <- dudi.acm(car[,-1],scannf=FALSE)


cof f r.0

ctrs <- inertia.dudi (carm, r=F, c=T)


ctrs$TOT[1:5,]
inertia cum ratio
1 0.5522426 0.5522426 0.1699208 trac.4WD
2 0.4456002 0.9978428 0.3070285
3 0.3679968 1.3658395 0.4202583
4 0.2795575 1.6453970 0.5062760
5 0.2497128 1.8951098 0.5831107

barplot (ctrs$TOT[,1])
tank..18.1.22.6.
0.5

tank..22.6.27. Rbag.None
0.4

L..172.188.

PU..100.150.
0.3

PU..150.200.
L..188.203. ty pe.Sporty L..141.157.
Rbag.Driv er.only pers.2.4 cof f r.1
PU..200.300.
trac.Front ty pe.Small
0.2

pers.5 L..157.172.
PU..55.100.
tank..9.18.13.6.
cof f r.3
ty pe.Compact
ty pe.Midsize
trac.Rear
cof f r.4
tank..13.6.18.1.
0.1

Rbag.Driv er...Passenger
0.0

cof f r.6
pers.6
L..203.219.
ty pe.Large

s.label (carm$co[,1:2], clab = 0.6)


MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple 2) (2/3)

car93

3
Introduction de la variable Prix coffr.0

en variable illustrative

2
# Transformation de la variable Prix
csup <- acm.disjonctif (car[1])

Axe 2 (13.7%)
# Introduction dans lanalyse

1
carmsup <- supcol (carm, csup)
prix.3
Comp1 Comp2
prix.1 0.32748085 -0.05184403
carmsup$cosup prix.2 0.00445254 -0.01211915
prix.3 -0.14824019 0.14308666

0
prix.4 -0.18369320 -0.07912348 prix.2
coffr.1
prix.1
coffr.3
prix.4
coffr.4
Remarque :
Dans ce cas, supcol utilise supcol.default() faisant intervenir coffr.6
carm$l1 et carm$lw (ici constant) et non supcol.coa().
-1
Pour avoir des coordonnes identiques lAFC simple du
tableau disjonctif, il convient de pondrer ces valeurs par -1 0 1 2
le poids de ces points. Axe 1 (17%)

x <- paste("(",round(100*carm$eig[1:2]/sum(carm$eig),1),"%)",sep="")
(coosup <- carmsup$cosup / colMeans(csup) ) plot (c(carm$li[,1],carm$co[,1]), c(carm$li[,2],carm$co[,2]), type="n", asp=1,
main="car93", xlab=paste("Axe 1",x[1]), ylab=paste("Axe 2",x[2]))
Comp1 Comp2 abline (v=0, h=0)
prix.1 1.26898830 -0.20089561 points (carm$li[,1:2], pch=19, cex=.5, col=3) # Vhicules
prix.2 0.01800375 -0.04900353 s.label (coosup[,1:2], clab=.8, add.plot = TRUE ) # Prix
prix.3 -0.59940600 0.57856782 sel <- grep ("cof", rownames(carm$co), fixed=TRUE) # Choix colonne
prix.4 -0.74275945 -0.31993409 text (carm$co[sel,1:2], labels=rownames(carm$co)[sel], cex=.8, col=2)
MNHN Ecole doctorale - Module Analyse des donnes sous R (niveau 1)

Analyse Factorielle des Correspondances Multiples


(exemple 2) (3/3)

3
2
Autres reprsentations d'une variable
qualitative sur une carte factorielle

RS2
1
opar <- par()
par (mfrow = c(2, 2), mgp = c(1.5, .6, 0), mar = c(3, 2.5, 1, 1)) prix.3
plot.new()
plot (carm$l1[,1:2], type="n")

0
prix.2
prix.1
abline (v=0, h=0) prix.4
points (carm$l1[,1:2], pch=19, cex=.6, col=as.numeric(car[,1])) # scores
text (coosup[,1:2], labels=rownames(coosup), col=1: nrow(coosup), font=2) # coordonnes

-1
s.class (carm$l1[,1:2], fac=car[,1], col=1:4, label=names(csup))
s.chull (carm$l1[,1:2], fac=car[,1], col=1:4, optchull=1, cpoint=1, label=names(csup), clabel=1) -2 -1 0 1 2
RS1
par(opar)
d=1 d=1

Les points prix sont placs la


moyenne des scores des points lignes
qu'ils caractrisent
prix.3 prix.3

prix.2 prix.2
prix.1 prix.1
prix.4 prix.4