Vous êtes sur la page 1sur 31

L'analyse des données multivariées à l'aide du logiciel

des données multivariées à l'aide du logiciel L'analyse factorielle des correspondances multiples
des données multivariées à l'aide du logiciel L'analyse factorielle des correspondances multiples

L'analyse factorielle des correspondances multiples (A.F.C.m.)

Montpellier

2 mars 2010

André Bouchier

2010, André Bouchier (2 Mars 2010)http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ Le document « L'analyse factorielle des correspondances

http://creativecommons.org/licenses/by-nc-sa/2.0/fr/2010, André Bouchier (2 Mars 2010) Le document « L'analyse factorielle des correspondances multiples » by

Le document « L'analyse factorielle des correspondances multiples » by A.Bouchier est mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique 2.0 France.

1.Avant propos :

l Pré-recquis

On suppose connues les bases du logiciel R ainsi que quelques notions de statistiques concernant les analyses factorielles.

l Les fonctions utilisées :

Les fonctions utilisées pour cette analyse sont disponibles dans les bibliothèques standard de R et dans la bibliothèque ade4. Pour aider à la compréhension, l'écriture des «programmes» sera détaillée. Par la suite, vous pourrez condenser cette écriture. Mais n'oubliez pas de les commenter abondamment.

2.La méthode (1):

l Lorsque les variables sont quantitatives et les relations linéaires, la

méthode appropriée est l'analyse en composantes principales.

l Lorsque le tableau de données croise 2 variables qualitatives, c'est un

tableau de contingence . La méthode d'analyse appropriée est l'analyse des correspondances simples.

l Mais lorsque les données sont un mélange de variables qualitatives et

quantitatives, ou contenant des relations non linéaires, il n'existe pas de méthode spécifique.

3.La méthode (2):

l Dans un premier temps, les données quantitatives sont découpées en

classes. L'objectif est d'obtenir un tableau de données qualitatives.

l Puis on transforme les données de façon à obtenir un tableau disjonctif.

Ce tableau disjonctif peut-être considéré comme un tableau de fréquence. On peut alors le soumettre à l'analyse factorielle des correspondances.

l L'analyse factorielle des correspondances multiples permet d'obtenir un

résumé pertinent d'un tableau de données disjonctif. Ce résumé peut-être projeté sur un plan. On visualise ainsi les relations les plus marquantes du tableau de données.

4.Exemple de préparation de données

Un extrait de tableau de données :

Numéro

Culture

Surface

Durée

Année

Parcelle

Précédent

01

Blé

5.3

2

1987

02

Blé

8.2

1

1996

03

Riz

2.0

3

1988

04

Jachère

1.5

1

1988

05

Riz

3.4

2

1988

5.Codage des données

l L'AFC ne peut traiter que des tableaux de nombres. L'opération de codage va permettre de transformer les données pour rendre le traitement par l'AFC possible. données brutes

Parcelle

Culture

Surface

Précédent

Année

01

Blé

5.3

2

1987

02

Blé

8.2

1

1996

03

Riz

2.0

3

1988

04

Jachère

1.5

1

1988

05

Riz

3.4

2

1988

Parcelle

données codées

Culture

Surface

Précédent

Année

01

1

2

2

1

02

1

3

1

3

03

2

1

3

2

04

3

1

1

2

05

2

2

2

2

6.Le tableau disjonctif

l Transformation des modalités du tableau codé en variable disjonctives.

Parcelle

Les données brutes

Culture

Surface

Précédent

Année

01

 

1

2

2

1

02

1

3

1

3

 

03

2

1

3

2

04

3

1

1

2

05

2

2

2

2

Tableau disjonctif complet

 
 

Culture

Surface

Précéd.

Année

 

Blé

Riz

Jach

Faible

Moy

Elevée

1

2

3

87

88

96

01

1

0

0

0

1

0

0

1

0

1

0

0

02

1

0

0

0

0

1

1

0

0

0

0

1

03

0

1

0

1

0

0

0

0

1

0

1

0

04

0

0

1

1

0

0

1

0

0

0

1

0

05

0

1

0

0

1

0

0

1

0

0

1

0

7.Nommer les modalités

l

Chaque modalité disjonctive va recevoir un nom

 
   

Cu1

Cu2

Cu3

Surf1

Surf2

Surf3

Pr1

Pr2

Pr3

A1

A2

A3

 

01

1

0

0

0

1

0

0

1

0

1

0

0

02

1

0

0

0

0

1

1

0

0

0

0

1

03

0

1

0

1

0

0

0

0

1

0

1

0

04

0

0

1

1

0

0

1

0

0

0

1

0

05

0

1

0

0

1

0

0

1

0

0

1

0

l

Le nom des modalités doit être choisi afin de rester lisible une fois projeté sur le

plan factoriel

8.La préparation des données

l

1 ère étape : les données sont codées

Ü Les données quantitatives sont découpées en classes

Ü Les données qualitatives sont conservée sans modification. Pour éviter des

effectifs de classe trop faibles, on peut aussi regrouper des modalités

Ü

Dans cette étape, les logiciels demande souvent de nommer les différentes

modalités

l

2 ème étape : le tableau codé est transformé en tableau disjonctif

Ü

Cette étape est souvent effectuée par les logiciels sans intervention de

l'utilisateur

l

3 ème étape : une analyse des correspondances est effectuée sur le tableau

disjonctif

9.Codage des données, en résumé :

9.Codage des données, en résumé : Tableau des données Brutes Tableau des données codées Tableau
9.Codage des données, en résumé : Tableau des données Brutes Tableau des données codées Tableau
9.Codage des données, en résumé : Tableau des données Brutes Tableau des données codées Tableau

Tableau

des

données

Brutes

Tableau

des

données

codées

Tableau disjonctif complet

AFC multiple

10.Les données d'exemple :

l Le tableau des données bledur.txt contient 50 observations et 11 variables. Il contient les résultats d'un suivi agronomique sur 50 parcelles de blé dur.

RDT

Rendement en grains

PLM

Nb de plantes par m²

ZON

Zone géographique

ARG

Taux d'argile de la parcelle

LIM

Taux de limon de la parcelle

SAB

Taux de sable de la parcelle

VRT

Variété cultivée

PGM

Poids de 1000 grains

MST

Matière sèche totale à la récolte

AZP

Azote dans la plante à la récolte

VRTC

Variété cultivée (codée en 3 classes)

11.Lecture des données :

don<-read.table(file.choose(), sep=" ", header=T, dec=",")

Numero

RDT PLM ZON

ARG

LIM

SAB VRT

PGM

MST AZP VRTC

1 1

6.490 84

1 21.5 60.6 17.9

3 43.10 34.49 3.82

2

2 2 15.580 112

1 21.0 58.3 20.7

3 38.30 39.18 3.78

2

3 3

7.290 68

1 26.2 47.6 26.2

3 45.30 26.89 2.61

2

4 4

1.090 88

1 29.7 54.5 15.8

3 29.09 23.09 3.78

2

5 5

5.100 174

1 22.8 59.0 18.2

3 42.80 18.10 3.41

2

6 6

2.030 63

1 19.6 68.0 12.4

3 41.26 20.43 3.04

2

7 7

6.330 92

1 26.7 53.7 19.6

3 38.57 20.93 2.26

2

8 8 17.300 117

1 34.0 44.9 21.1

1 31.80 40.70 3.85

1

9 9

6.970 58

1 16.7 57.6 25.7

4 42.40 29.97 2.69

3

/

12.Codage des données (1):

l Ce tableau de données contient des valeurs quantitatives et qualitatives. Il faut, dans un premier temps, le transformer en données uniquement qualitatives.

l Chaque variable quantitative sera découpée en 3 classes d'effectifs égaux. Pour cela, nous utiliserons la fonction codage() - (voir annexe)

source("K:/R/r/Rwindows/data/FonctionsR/codage.R")

RDT<-codage(don$RDT)

PLM<-codage(don$PLM)

ARG<-codage(don$ARG)

LIM<-codage(don$LIM)

SAB<-codage(don$SAB)

PGM<-codage(don$PGM)

MST<-codage(don$MST)

AZP<-codage(don$AZP)

13.Codage des données (1):

l Les variables qualitatives seront transformées en facteurs

ZON<-as.factor(don$ZON)

VRTC<-as.factor(don$VRTC)

14.Mise en forme des données codées :

l Le tableau des données codées :

doncd<-data.frame(RDT,PLM,ARG,LIM,SAB,PGM,MST,AZP,ZON,VRTC)

row.names(doncd)<-don$Numero

doncd

RDT PLM ARG LIM SAB PGM MST AZP ZON VRTC

1 1

1

2

3

1

3

2

3

1

2

2 3

2

2

3

1

2

3

3

1

2

3 1

1

2

3

1

3

1

1

1

2

4 1

1

3

3

1

1

1

3

1

2

5 1

3

2

3

1

3

1

2

1

2

6 1

1

2

3

1

2

1

2

1

2

7 1

1

2

3

1

2

1

1

1

2

8 3

2

3

3

1

1

3

3

1

1

9 1

1

1

3

1

3

2

1

1

3

10 3

2

3

3

1

3

3

3

1

3

 

/

15.Vérification du codage des données :

summary(doncd)

RDT

PLM

ARG

LIM

SAB

PGM

MST

AZP

ZON

VRTC

1:17

1:17

1:17

1:17

1:17

1:17

1:17

1:17

1:17

1:24

2:16

2:16

2:16

2:16

2:16

2:16

2:16

2:16

2:15

2:21

3:17

3:17

3:17

3:17

3:17

3:17

3:17

3:17

3:18

3: 5

l Pour être pertinent, un découpage en classes doit respecter 3 principes :

1) Pas d'effectifs de classes trop déséquilibrés 2) Des nombres de classes semblables pour toutes les variables 3) Des découpages ayant une signification pour le chercheur

16.Transformation des données en tableau disjonctif :

l

Utilisation de la library ade4 :

library(ade4)

l

Création du tableau disjonctif :

disj<-acm.disjonctif(doncd)

l

Un extrait du tableau disjonctif :

RDT.1 RDT.2 RDT.3 PLM.1 PLM.2 PLM.3 ARG.1 ARG.2 ARG.3 LIM.1 LIM.2 LIM.3 SAB.1 SAB.2

1 1

0

0

1

0

0

0

1

0

0

0

1

1

0

2 0

0

1

0

1

0

0

1

0

0

0

1

1

0

3 1

0

0

1

0

0

0

1

0

0

0

1

1

0

4 1

0

0

1

0

0

0

0

1

0

0

1

1

0

5 1

0

0

0

0

1

0

1

0

0

0

1

1

0

6 1

0

0

1

0

0

0

1

0

0

0

1

1

0

7 1

0

0

1

0

0

0

1

0

0

0

1

1

0

8 0

0

1

0

1

0

0

0

1

0

0

1

1

0

9 1

0

0

1

0

0

1

0

0

0

0

1

1

0

10 0

0

1

0

1

0

0

0

1

0

0

1

1

0

11 1

0

0

1

0

0

0

0

1

0

0

1

1

0

12 0

1

0

1

0

0

0

0

1

0

0

1

0

1

/

17.L'A.F.C.m. - fonction dudi.coa() de la bibliothèque ade4 :

l Les résultats de l'AFC sont stockés dans la variable z

z<-dudi.coa(df = disj, scannf = FALSE, nf = 3)

l L'éboulis des valeurs propres

inertie<-z$eig/sum(z$eig)*100

barplot(inertie,ylab="% d'inertie",names.arg=round(inertie,2)) title("Eboulis des valeurs propres en %")

l

Les valeurs propres

round(z$eig,3)

[1] 0.369 0.277 0.204 0.185 0.159

l

Les valeurs propres en %

round(z$eig/sum(z$eig)*100,2)

[1]

18.45 13.86 10.18 9.26 7.96

Eboulis des valeurs propres en %

18.45 9.26 7.29 5.05 3.65 2.39 1.64 1.06 0.65 0.19 % d'inertie 0 5 10
18.45 9.26
7.29
5.05
3.65
2.39
1.64
1.06
0.65
0.19
% d'inertie
0
5
10
15

18.Une représentation graphique du plan factoriel :

scatter.coa(z, method = 1, sub = "Blé dur", posieig = "none")

d = 0.5 7 6 3 RDT.1 PLM.1 11 4 MST.1 ZON.1 5 1 LIM.3
d = 0.5
7
6
3
RDT.1
PLM.1
11
4
MST.1
ZON.1
5
1
LIM.3
SAB.1
9
20
19
33
36
44
18
VRTC.2
PGM.2
12
2
AZP.2
ARG.2
46
37
AZP.1
ARG.1
SAB.3
LIM.1
14
15
43
28
30
39
17
50
8
35
10
34
MST.2 PGM.1
PGM.3
VRTC.1
27
26
VRTC.3
16
ZON.3
AZP.3
ARG.3
41
23
RDT.2
40
13
45
PLM.2
38
22
49
PLM.3
42
ZON.2
29
21
48
47
24
RDT.3 MST.3
25
31
LIM.2 SAB.2
32
Blé dur

19.Une autre représentation du plan factoriel, les variables :

plot(z$co[,1],z$co[,2],type="n",xlab="Axe 1",ylab="Axe 2",

xlim=c(-1.4,1.4))

text(z$co[,1], z$co[,2], label= colnames(disj)) title("Blé dur - plan des variables")

abline(h=0,v=0)

Blé dur - plan des variables

RDT.1 PLM.1 MST.1 ZON.1 LIM.3 SAB.1 VRTC.2 PGM.2 ARG.2 AZP.2 AZP.1 ARG.1 SAB.3 LIM.1 MST.2
RDT.1
PLM.1
MST.1
ZON.1 LIM.3 SAB.1
VRTC.2 PGM.2
ARG.2
AZP.2
AZP.1
ARG.1
SAB.3
LIM.1
MST.2 PGM.1
PGM.3
VRTC.1
VRTC.3
ZON.3
AZP.3 ARG.3
RDT.2
PLM.2
PLM.3
ZON.2
RDT.3
MST.3
LIM.2 SAB.2
-1.5
-1.0
-0.5
0.0
0.5
1.0
1.5
Axe 2
-0.5
0.0
0.5
1.0

Axe 1

20.Une autre représentation du plan factoriel, les individus :

plot(z$li[,1],z$li[,2],type="n",xlab="Axe 1",ylab="Axe 2",

xlim=c(-1.4,1.4))

text(z$li[,1], z$li[,2], label=row.names(disj)) title("Blé dur - Plan des individus")

abline(h=0,v=0)

Blé dur - Plan des individus

76 3 11 4 5 1 9 1920 33 44 36 18 12 2 46
76
3
11
4
5
1
9
1920
33
44
36
18
12
2
46 37
14
15
43
28
30
39
17
50
35
8
10
34
27
26
16
41
23
40
45
13
38
22
49
42
21
47 29
48
24
25
31
32
-1.5
-1.0
-0.5
0.0
0.5
1.0
1.5
Axe 2
-1.0
-0.5
0.0
0.5
1.0

Axe 1

21.Interprétation des facteurs : contributions des variables :

l Contributions des variables à la construction des axes :

inertia.dudi(z,col.inertia = T)$col.abs Comp1 Comp2 Comp3

RDT.1

52

1178

122

RDT.2

265

128

125

RDT.3

528

544

0

PLM.1

76

966

305

PLM.2

29

188

80

PLM.3

12

317

683

/

ZON.1

803

783

1

ZON.2

25

367

1101

ZON.3

528

94

873

VRTC.1

123

52

3

VRTC.2

30

96

270

VRTC.3

169

19

882

------------------------

Somme 10000 10000 10000

22.Interprétation des facteurs : contributions des individus :

l Contributions des lignes à la construction des axes :

inertia.dudi(z,row.inertia = T)$row.abs

Axis1 Axis2 Axis3

1

151

444

159

2

511

25

67

3

51

774

136

4

173

555

76

5

98

434

9

6

72

900

0

7

53

891

3

8

476

2

88

9

31

413

832

10

770

3

55

11

174

546

66

 

/

---------------------

Somme 10000 10000 10000

23.Une aides à l'interprétation - axe 1 :

modal<-as.data.frame(z$co)

modal<-modal[sort.list(modal$Comp1),]

dotchart(modal[,1],labels = row.names(modal),cex=0.8) title(sub="Répartition des modalités sur l'axe 1")

abline(v=0)

des modalités sur l'axe 1") abline(v=0) SAB.1 LIM.3 ZON.1 ARG.3 MST.3 VRTC.3 RDT.3 AZP.3 PLM.2 PGM.2
des modalités sur l'axe 1") abline(v=0) SAB.1 LIM.3 ZON.1 ARG.3 MST.3 VRTC.3 RDT.3 AZP.3 PLM.2 PGM.2
des modalités sur l'axe 1") abline(v=0) SAB.1 LIM.3 ZON.1 ARG.3 MST.3 VRTC.3 RDT.3 AZP.3 PLM.2 PGM.2
des modalités sur l'axe 1") abline(v=0) SAB.1 LIM.3 ZON.1 ARG.3 MST.3 VRTC.3 RDT.3 AZP.3 PLM.2 PGM.2
des modalités sur l'axe 1") abline(v=0) SAB.1 LIM.3 ZON.1 ARG.3 MST.3 VRTC.3 RDT.3 AZP.3 PLM.2 PGM.2

SAB.1

LIM.3

ZON.1

ARG.3

MST.3

VRTC.3

RDT.3

AZP.3

PLM.2

PGM.2

VRTC.2

PGM.3

ARG.2

PLM.3

SAB.2

LIM.2

ZON.2

AZP.2

RDT.1

PLM.1

PGM.1

VRTC.1

MST.2

MST.1

AZP.1

RDT.2

ZON.3

ARG.1

LIM.1

SAB.3

-1.0

-0.5

0.0

0.5

1.0

Répartition des modalités sur l'axe 1

24.Une aides à l'interprétation - axe 2 :

modal<-as.data.frame(z$co)

modal<-modal[sort.list(modal$Comp2),]

dotchart(modal[,2],labels = row.names(modal),cex=0.8) title(sub="Répartition des modalités sur l'axe 2")

abline(v=0)

des modalités sur l'axe 2") abline(v=0) RDT.1 PLM.1 MST.1 ZON.1 LIM.3 SAB.1 PGM.2 VRTC.2 ARG.2 AZP.2
des modalités sur l'axe 2") abline(v=0) RDT.1 PLM.1 MST.1 ZON.1 LIM.3 SAB.1 PGM.2 VRTC.2 ARG.2 AZP.2
des modalités sur l'axe 2") abline(v=0) RDT.1 PLM.1 MST.1 ZON.1 LIM.3 SAB.1 PGM.2 VRTC.2 ARG.2 AZP.2
des modalités sur l'axe 2") abline(v=0) RDT.1 PLM.1 MST.1 ZON.1 LIM.3 SAB.1 PGM.2 VRTC.2 ARG.2 AZP.2

RDT.1

PLM.1

MST.1

ZON.1

LIM.3

SAB.1

PGM.2

VRTC.2

ARG.2

AZP.2

AZP.1

ARG.1

LIM.1

SAB.3

MST.2

PGM.1

PGM.3

VRTC.1

VRTC.3

ZON.3

ARG.3

AZP.3

RDT.2

PLM.2

PLM.3

ZON.2

RDT.3

MST.3

SAB.2

LIM.2

-0.5

0.0

0.5

1.0

Répartition des modalités sur l'axe 2

25.Le programme complet :

#lecture des données don<-read.table(file.choose(),sep=" ",header=T,dec=",") #bledur.txt

#codage des données quantitatives source("K:/R/r/Rwindows/data/FonctionsR/codage.R") RDT<-codage(don$RDT) PLM<-codage(don$PLM) ARG<-codage(don$ARG) LIM<-codage(don$LIM) SAB<-codage(don$SAB) PGM<-codage(don$PGM) MST<-codage(don$MST) AZP<-codage(don$AZP)

#transformation des données qualitatives en facteur ZON<-as.factor(don$ZON) VRTC<-as.factor(don$VRTC)

#création du tableau codé doncd<-data.frame(RDT,PLM,ARG,LIM,SAB,PGM,MST,AZP,ZON,VRTC) row.names(doncd)<-don$Numero summary(doncd)

#appel de la bibliothèque de fonction ade4

library(ade4)

#création du tableau disjonctif disj<-acm.disjonctif (doncd)

#l'analyse factorielle z<-dudi.coa(df = disj, scannf = FALSE, nf = 3)

#l'éboulis des valeurs propres

inertie<-z$eig/sum(z$eig)*100

barplot(inertie,ylab="% d'inertie",names.arg=round(inertie,2)) title("Eboulis des valeurs propres en %")

#les valeurs propres

round(z$eig,3)

#les valeurs propres en %

round(z$eig/sum(z$eig)*100,2)

#plan factoriels scatter.coa(z, method = 1, sub = "Blé dur", posieig = "none")

#une autre représentation : les variables plot(z$co[,1],z$co[,2],type="n",xlab="Axe 1",ylab="Axe 2", xlim=c(-1.4,1.4)) text(z$co[,1], z$co[,2], label= colnames(disj)) title("Blé dur - plan des variables")

abline(h=0,v=0)

#une autre représentation : les individus plot(z$li[,1],z$li[,2],type="n",xlab="Axe 1",ylab="Axe 2", xlim=c(-1.4,1.4)) text(z$li[,1], z$li[,2], label=row.names(disj)) title("Blé dur - Plan des individus")

abline(h=0,v=0)

#contribution des variables à la construction de l'axe inertia.dudi(z,col.inertia = T)$col.abs

#contribution des individus à la construction de l'axe inertia.dudi(z,row.inertia = T)$row.abs

#aide à l'interprétation : axe 1 modal<-as.data.frame(z$co)

modal<-modal[sort.list(modal$Comp1),]

dotchart(modal[,1],labels = row.names(modal),cex=0.8) title(sub="Répartition des modalités sur l'axe 1")

abline(v=0)

#aide à l'interprétation : axe 2 modal<-as.data.frame(z$co)

modal<-modal[sort.list(modal$Comp2),]

dotchart(modal[,2],labels = row.names(modal),cex=0.8) title(sub="Répartition des modalités sur l'axe 2")

abline(v=0)

26.Quelques références :

l

Logiciel R :

R Development Core Team (2004). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL

http://www.R-project.org.

l

Bibliothèque ade4 :

Jean Thioulouse, Anne-Beatrice Dufour and Daniel Chessel (2004). ade4: Analysis of Environmental Data : Exploratory and Euclidean methods in Environmental sciences. R package version 1.3-3.

27.Annexes : la fonction codage()

codage<-function(nom)

#découpage en 3 classes d'effectifs égaux

{

#calcul des bornes bornes<-quantile(nom, probs = c(0, 1/3,2/3,1), na.rm = TRUE,names = TRUE) #description des bornes et effectifs Amax<-aggregate(nom,list(Nom=cut(nom,bornes,include.lowest=T,label=F)),max) Amin<-aggregate(nom,list(Nom=cut(nom,bornes,include.lowest=T,label=F)),min) Afreq<-as.matrix(summary(as.factor(cut(na.omit(nom),bornes, include.lowest=T, label=F))))

limites<-as.data.frame(cbind(Amin[,1],Amin[,2],Amax[,2],Afreq))

names(limites)<-c("Classe","Mini","Maxi","Effectif") #calcul du nombre de valeurs manquantes manques<-length(nom)-length(na.omit(nom)) #impression des bornes cat(paste("Découpage de la variable ",deparse(substitute(nom))," - Nb de valeurs manquantes : ", manques, "\n")) print(limites) #découpage de la variable varfac<-cut(nom,bornes,include.lowest=T,label=F) #transformation en facteur as.factor(varfac)

}