Master 2 MIMSE 2015-2016 Analyse des données 2
TP2 : Analyse des Correspondences Multiples
1 ACM sur données fictives
Récupérer les jeux de données chiens.rda. Il s’agit de données fictives où 27 races de chiens sont décrites avec 7 variables qualitatives.
1. Charger le jeu de données chiens dans R avec la commande load. Afficher les données. Quelle est la classe de cet objet ?
load(file="chiens.rda") head(chiens)
## taille poids velocite intellig affect agress fonction
## beauceron T++ P+ V++ I+ Af+ Ag+ Utilite
## basset T- P- V- I- Af- Ag+ Chasse
## ber_allem T++ P+ V++ I++ Af+ Ag+ Utilite
## boxer T+ P+ V+ I+ Af+ Ag+ Compagnie
## bull-dog T- P- V- I+ Af+ Ag- Compagnie
## bull-mass T++ P++ V- I++ Af- Ag+ Utilite dim(chiens)
## [1] 27 7 class(chiens)
## [1] "data.frame"
2. Créez une matrice H contenant la description des n = 27 races canines sur uniquement les p = 6 premières variables.
H <- subset(chiens,select=-fonction)
3. On veut effectuer l’ACM de cette matrice H.
(a) Quelle décomposition en valeurs singulières généralisée (GSVD) faut-il faire ? Réaliser cette DSVG avec R.
library(FactoMineR)
K <- tab.disjonctif(H)
#---Calcul de la matrice R ---
F <- K/sum(K) #matrice des frequences
r<-apply(F,1,sum) #poids des lignes c<-apply(F,2,sum) #poids des colonnes
R <- diag(1/r)%*%(F-r%*%t(c))%*%diag(1/c)
source("gsvd.R")
(b) Montrer qu’en ACM, l’inertie totale des données vaut toujours m
p − 1 où m est le nombre total de modalités et p le nombre de variables qualitatives. Vérifiez ensuite avec R que la somme des valeurs singulières trouvées à la question précédente vaut bien m
p − 1.
sum(d^2) #somme des valeurs singulieres
## [1] 1.7
p <- ncol(H) #nb de variables qualitatives
q <- ncol(K) #nb de modalites
q/p-1
## [1] 1.7
(c) Vérifiez également que le nombre maximum de dimension de cette ACM vaut bien min(n − 1, m − p).
round(d^2,digit=3)
## [1] 0.482 0.385 0.211 0.158 0.150 0.123 0.081 0.046 0.024 0.008 length(d) #10 valeurs propres non nulles
## [1] 10 q-p #min(n-1,q-p)
## [1] 10
(d) Représenter dans un diagramme en barre les pourcentages d’inertie expliquée par les dimensions de l’ACM.
barplot(d^2/sum(d^2)*100,names.arg=1:length(d),xlab="dim",ylab="pourcentage d'inertie expliquée")
1 2 3 4 5 6 7 8 9 10
dim pourcentage d'inertie expliquée 0510152025
(e) Determiner les matrices X et Y des coordonnées factorielles des races de chiens et des modalités des variables qualitatives sur les k = 3 premières dimensions. Modifier les noms des lignes et des colonnes dans X et Y afin qu’ils soient parlants.
#coordonnees factorielles des races de chiens
X <- data.frame(U[,1:3]%*%diag(d[1:3]))
rownames(X) <- rownames(H)
colnames(X) <- paste("dim", 1:3, sep = "") round(X,digit=2)
## dim1 dim2 dim3
## beauceron -0.32 0.42 0.10
## basset 0.25 -1.10 0.19
## ber_allem -0.49 0.46 0.50
## boxer 0.45 0.88 -0.69
## bull-dog 1.01 -0.55 0.16
## bull-mass -0.75 -0.55 -0.50
## caniche 0.91 0.02 0.58
## chihuahua 0.84 -0.84 0.47
## cocker 0.73 -0.08 -0.66
## colley -0.12 0.53 0.33
## dalmatien 0.65 0.99 -0.46
## dobermann -0.87 0.32 0.45
## dogue_all -1.05 -0.51 -0.17
## epagn_bre 0.48 1.04 -0.06
## epagn_fra -0.14 0.52 -0.12
## fox_hound -0.88 -0.03 0.36
## fox_terri 0.88 -0.14 -0.05
## grand_ble -0.52 0.11 -0.04
## labrador 0.65 0.99 -0.46
## levrier -0.68 0.08 0.60
## mastiff -0.76 -0.89 -0.59
## pekinois 0.84 -0.84 0.47
## pointer -0.67 0.42 0.69
## saint_ber -0.58 -0.59 -0.89
## setter -0.50 0.38 0.29
## teckel 1.01 -0.55 0.16
## terre_neu -0.38 -0.49 -0.66
#coordonnees factorielles des modalités
Y <- data.frame(V[,1:3]%*%diag(d[1:3]))
rownames(Y) <- colnames(K)
colnames(Y) <- paste("dim", 1:3, sep = "") round(Y,digit=2)
## dim1 dim2 dim3
## T- 1.18 -0.92 0.62
## T+ 0.85 1.23 -1.02
## T++ -0.84 0.02 0.05
## P- 1.17 -0.82 0.36
## P+ -0.31 0.82 0.23
## P++ -1.02 -0.97 -1.22
## V- 0.32 -1.04 -0.40
## V+ 0.60 0.89 -0.36
## V++ -0.89 0.37 0.76
## I- -0.35 -0.81 0.35
## I+ 0.37 0.29 -0.49
## I++ -0.34 0.46 0.60
## Af- -0.84 -0.29 -0.07
## Af+ 0.78 0.27 0.06
## Ag- 0.40 0.19 0.31
## Ag+ -0.43 -0.21 -0.33
(f) Faire un plot des individus et des modalités dans le premier plan factoriel.
dim1 <- 1
dim2 <- 2
dim <- c(dim1,dim2)
pourc <- round(d[1:3]^2/sum(d^2)*100, digit = 2)
lab.x <- paste("Dim ", dim1, " (", pourc[dim1], "%)", sep = "") lab.y <- paste("Dim ", dim2, " (", pourc[dim2], "%)", sep = "")
#Plan factoriel des individus
xmin <- min(X[,dim1])
xmax <- max(X[,dim1])
xlim <- c(xmin, xmax)* 1.2
ymin <- min(X[,dim2])
ymax <- max(X[,dim2])
ylim <- c(ymin, ymax)* 1.2
plot(X[,dim],xlab=lab.x,ylab=lab.y,xlim=xlim,ylim=ylim,pch=20) abline(v = 0, lty = 2)
abline(h = 0, lty = 2)
text(X[,dim],labels=rownames(X),pos=3)
−1.0 −0.5 0.0 0.5 1.0
−1.0−0.50.00.51.0
Dim 1 (28.9%)
Dim 2 (23.08%)
beauceron
basset ber_allem
boxer
bull−dog bull−mass
caniche
chihuahua cocker colley
dalmatien
dobermann
dogue_all
epagn_bre
epagn_fra
fox_hound
fox_terri grand_ble
labrador
levrier
mastiff pekinois
pointer
saint_ber setter
teckel terre_neu
#Plan factoriel des modalites
xmin <- min(Y[,dim1])
xmax <- max(Y[,dim1])
xlim <- c(xmin, xmax)* 1.2
ymin <- min(Y[,dim2])
ymax <- max(Y[,dim2])
ylim <- c(ymin, ymax)* 1.2
plot(Y[,dim],xlab=lab.x,ylab=lab.y,xlim=xlim,ylim=ylim,pch=17) abline(v = 0, lty = 2)
abline(h = 0, lty = 2)
text(Y[,dim],labels=rownames(Y),pos=3)
−1.0 −0.5 0.0 0.5 1.0 1.5
−1.0−0.50.00.51.01.5
Dim 1 (28.9%)
Dim 2 (23.08%)
T−
T+
T++
P−
P+
P++ V−
V+
V++
I−
I+
I++
Af−
Ag− Af+
Ag+
(g) Utiliser la relation quasi-barycentrique pour retouver les coordonnées factorielles de la modalité T++ à partir des coordonnées factorielles des races de chiens.
which(K[,1]==1) #indice des lignes des chiens T++
## basset bull-dog caniche chihuahua fox_terri pekinois teckel
## 2 5 7 8 17 22 26
moy <- apply(X[which(K[,1]==1),],2,mean) #moyenne des coord. fact. des chiens T++
moy*(1/d[1:3]) #relation quasi-barycentrique
## dim1 dim2 dim3
## 1.18 -0.92 0.62 Y[1,] #coord. fact. de T++
## dim1 dim2 dim3
## T- 1.2 -0.92 0.62
(h) Quels est le rapport de corrélation entre la variable taille avec la première composante prin- cipale ? Entre la variable taille et la seconde composante principale ?
eta2 <- function(x, gpe) {
moyennes <- tapply(x, gpe, mean) effectifs <- tapply(x, gpe, length)
varinter <- (sum(effectifs* (moyennes - mean(x)) ^ 2)) vartot <- (var(x) * (length(x) - 1))
res <- varinter / vartot
return(res) }
eta2(X$dim1,chiens$taille)
## [1] 0.89
eta2(X$dim2,chiens$taille)
## [1] 0.5
4. On veut maintenant utiliser la fonction MCA du package FactoMineR.
(a) Faire l’ACM des données sur les races canines en mettant la variable fonction en illustratif.
res <- MCA(chiens, quali.sup = 7)
−1.5 −1.0 −0.5 0.0 0.5 1.0 1.5
−1.5−1.0−0.50.00.51.0
MCA factor map
Dim 1 (28.90%)
Dim 2 (23.08%)
T−
T+
T++
P−
P+
P++ V−
V+
V++
I−
I+
I++
Af−
Af+
Ag−
Ag+
Compagnie
Chasse Utilite
−1.5 −1.0 −0.5 0.0 0.5 1.0 1.5
−1.0−0.50.00.51.0
MCA factor map
Dim 1 (28.90%)
Dim 2 (23.08%)
beauceron basset
ber_allem
boxer
bull−dog bull−mass
caniche chihuahua
cocker
colley
dalmatien dobermann
dogue_all
epagn_bre epagn_fra fox_hound
fox_terri
grand_ble
labrador levrier
mastiff
pekinois
pointer saint_ber
setter
teckel terre_neu
0.0 0.2 0.4 0.6 0.8 1.0
0.00.20.40.60.81.0
Dim 1 (28.90%)
Dim 2 (23.08%)
taille poids velocite
intellig
affect agress
fonction
#print(res)
(b) Retrouvez les résulats numériques et les graphiques de la question 2.
head(X)
## dim1 dim2 dim3
## beauceron -0.32 0.42 0.10
## basset 0.25 -1.10 0.19
## ber_allem -0.49 0.46 0.50
## boxer 0.45 0.88 -0.69
## bull-dog 1.01 -0.55 0.16
## bull-mass -0.75 -0.55 -0.50 head(res$ind$coord)
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## beauceron -0.32 -0.42 -0.10 -0.21 -0.12
## basset 0.25 1.10 -0.19 0.29 -0.52
## ber_allem -0.49 -0.46 -0.50 0.58 0.28
## boxer 0.45 -0.88 0.69 0.26 -0.46
## bull-dog 1.01 0.55 -0.16 -0.35 0.33
## bull-mass -0.75 0.55 0.50 0.66 0.72 head(Y)
## dim1 dim2 dim3
## T- 1.18 -0.924 0.616
## T+ 0.85 1.232 -1.016
## T++ -0.84 0.021 0.051
## P- 1.17 -0.824 0.359
## P+ -0.31 0.819 0.231
## P++ -1.02 -0.974 -1.222 head(res$var$coord)
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## T- 1.18 0.924 -0.616 0.120 -0.020
## T+ 0.85 -1.232 1.016 0.342 -0.310
## T++ -0.84 -0.021 -0.051 -0.170 0.113
## P- 1.17 0.824 -0.359 0.165 -0.051
## P+ -0.31 -0.819 -0.231 -0.118 -0.190
## P++ -1.02 0.974 1.222 0.068 0.615
plot(res,choix="ind",invisible=c("var","quali.sup"))
−1.5 −1.0 −0.5 0.0 0.5 1.0 1.5
−1.0−0.50.00.51.0
MCA factor map
Dim 1 (28.90%)
Dim 2 (23.08%)
beauceron basset
ber_allem
boxer bull−dog bull−mass
caniche chihuahua
cocker
colley
dalmatien dobermann
dogue_all
epagn_bre epagn_fra fox_hound
fox_terri
grand_ble
labrador levrier
mastiff pekinois
pointer saint_ber
setter
teckel terre_neu
plot(res,choix="ind",invisible="ind")
−1.5 −1.0 −0.5 0.0 0.5 1.0 1.5
−1.5−1.0−0.50.00.51.0
MCA factor map
Dim 1 (28.90%)
Dim 2 (23.08%)
T−
T+
T++
P−
P+
P++ V−
V+
V++
I−
I+
I++
Af−
Af+
Ag−
Ag+
Compagnie
Chasse Utilite
(c) Retrouver les rapports de corrélations entre les variables qualitatives et les deux premières composantes principales. Faire le plot des variables en fonction de ces rapports de corrélation en utilisant la fonction plot.MCA.
res$var$eta2[,1:2]
## Dim 1 Dim 2
## taille 0.89 0.502
## poids 0.64 0.725
## velocite 0.41 0.684
## intellig 0.13 0.280
## affect 0.65 0.077
## agress 0.17 0.041
plot(res,choix="var",invisible=c("ind"))
0.0 0.2 0.4 0.6 0.8 1.0
0.00.20.40.60.81.0
Dim 1 (28.90%)
Dim 2 (23.08%)
taille poids velocite
intellig
affect agress
fonction
(d) Mettre des données manquantes dans les données avec le code suivant :
chiensNA <- H chiensNA[1,1] <-NA chiensNA[2,2] <-NA
(e) Faire l’ACM de chiensNA. Comment les données manquantes sont-elles prises en compte dans la fonction MCA du package FactoMineR ?
res2 <- MCA(chiensNA,graph=FALSE)
plot(res2,choix="ind",invisible="ind")
−2 −1 0 1 2
−10123
MCA factor map
Dim 1 (24.55%)
Dim 2 (19.96%)
T−
T+
T++
taille.NA
P−
P+
P++
poids.NA
V−
V+
V++
I−
I+
I++
Af−
Af+
Ag−
Ag+
5. On veut maintenant comparer l’ACM et l’AFC dans le cas particulier de deux variables qualitatives.
(a) Avec la fonction CA de FactoMineR, effectuer l’AFC du tableau de contingence croisant les variables taille et poids.
N <- table(H[,1:2])
resca<-CA(N,ncp=2,graph=FALSE) #AFC
(b) Avec la fonction MCA, effectuer l’ACM des deux premières colonnes des données chiens.
resmca<-MCA(H[,1:2],graph=FALSE) #ACM
(c) Comparez les valeurs propres des deux analyses et vérifiez que vous retrouvez les relations du cours.
resca$eig #valeurs propres de CA
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.861 91.7 92
## dim 2 0.077 8.3 100
resmca$eig # valeurs propres de MCA
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.964 48.2 48
## dim 2 0.639 32.0 80
## dim 3 0.361 18.0 98
## dim 4 0.036 1.8 100
#relation entre les valeurs propres des deux analyses
mu <- resca$eig[,1]
(1+sqrt(mu))/2 #on retrouve des deux premieres valeurs propres de MCA
## [1] 0.96 0.64
(1-sqrt(mu))/2 #on retrouve des deux dernieres valeurs de MCA
## [1] 0.036 0.361
2 ACM avec données manquantes et choix du nombre de composantes
Le package R missMDA permet de gérer les données manquantes en ACP et en ACM, et de choisir le nombre de composantes par validation croisée. Ce travail est à réaliser en binôme et à me rendre.
1. Regarder les vidéos concernant ce package : https://www.youtube.com/user/HussonFrancois 2. Préparer un document avec Rmardown qui décrit les principales fonctionnalités de ce package, avec
à chaque fois une explication de la méthode, des exemples et du code.
3 ACM et clustering
1. On reprend ici l’exercice 3 du devoir surveillé de décembre 2013.
(a) Répondre aux questions.
(b) Retrouver le code R de cet exercice.
load("credit.Rdata") library(FactoMineR)
#description des donnees str(credit)
## 'data.frame': 468 obs. of 7 variables:
## $ Type.de.client : Factor w/ 2 levels "bon client","mauvais client": 1 1 2 1 1 1 1 1 1 1 ...
## $ Age.du.client : Factor w/ 4 levels "de 23 à 40 ans",..: 4 3 1 1 3 1 4 4 2 4 ...
## $ Situation.familiale : Factor w/ 4 levels "célibataire",..: 1 1 4 2 1 1 3 3 1 1 ...
## $ Ancienneté : Factor w/ 5 levels "anc. 1 an ou moins",..: 5 1 4 2 4 1 4 5 2 3 ...
## $ Domiciliation.du.salaire: Factor w/ 2 levels "domicile salaire",..: 1 1 1 1 2 1 1 1 1 1 ...
## $ Profession : Factor w/ 3 levels "cadre","employé",..: 2 2 2 2 2 2 1 1 2 2 ...
## $ Moyenne.en.cours : Factor w/ 3 levels "de 2 à 5 KF encours",..: 1 1 1 3 1 1 1 1 2 1 ...
apply(credit,2,table)
## $Type.de.client
#### bon client mauvais client
## 237 231
#### $Age.du.client
#### de 23 à 40 ans de 40 à 50 ans moins de 23 ans plus de 50 ans
## 150 122 88 108
##
## $Ancienneté
#### anc. 1 an ou moins anc. de 1 à 4 ans anc. de 4 à 6 ans
## 199 47 69
## anc. de 6 à 12 ans anc. plus 12 ans
## 66 87
#### $Domiciliation.du.salaire
#### domicile salaire non domicile salaire
## 316 152
#### $Profession
#### cadre employé profession autre
## 77 237 154
#### $Moyenne.en.cours
#### de 2 à 5 KF encours moins de 2KF encours plus de 5 KF encours
## 308 98 62
#ACM sur les 7 variables qualitatives
res <- MCA(credit,graph=FALSE)
dim=c(1,2)
plot(res,axes=dim,choix="var",invisible="ind")
0.0 0.2 0.4 0.6 0.8 1.0
0.00.20.40.60.81.0
Dim 1 (14.39%)
Dim 2 (10.03%)
Type.de.client Age.du.client Situation.familiale
Ancienneté
Domiciliation.du.salaire Profession
Moyenne.en.cours
res$var$eta2
## Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
## Type.de.client 0.44 0.15 0.0013 0.0739 1.8e-08
## Age.du.client 0.40 0.31 0.5174 0.5053 6.5e-03
## Situation.familiale 0.24 0.40 0.2769 0.2753 3.6e-01
## Ancienneté 0.45 0.23 0.2504 0.1022 4.1e-01
## Domiciliation.du.salaire 0.32 0.11 0.0015 0.0031 1.3e-02
## Profession 0.27 0.26 0.1471 0.0957 1.3e-01
## Moyenne.en.cours 0.19 0.14 0.0704 0.1971 1.8e-01 plot(res,axes=dim,invisible="ind")
−2 −1 0 1 2
−10123
MCA factor map
Dim 1 (14.39%)
Dim 2 (10.03%)
bon client mauvais client
de 23 à 40 ans de 40 à 50 ans moins de 23 ans
plus de 50 ans
célibataire
divorcé marié veuf
anc. 1 an ou moins anc. de 1 à 4 ans
anc. de 4 à 6 ans
anc. de 6 à 12 ans
anc. plus 12 ans
domicile salaire non domicile salaire
cadre
employé profession autre
de 2 à 5 KF encours moins de 2KF encours
plus de 5 KF encours
plot(res,axes=dim,choix="ind",habillage=1,invisible="var")
−2 −1 0 1 2
−1.0−0.50.00.51.01.52.0
MCA factor map
Dim 1 (14.39%)
Dim 2 (10.03%)
bon client mauvais client
1
2 3
4
5 6
7 8
9 10
11 12
13 14 15
16 17 18
19 20 2221
23 25 24
26 27
28 29 31 30
32
33
34 35
36 37
38
39 4140
42 44 43
45
46
48 4947
50 51 52
53 54
55
56 57
58
59
60 61
62 63
64
65 66
67 68
69 70
71 72 73 74 75 7677 79 78
80 81
82 83 84 85
86 87 88 89
919290 93
94
95
96 97
98 99
100 101 102
103 104
105 106
107
108
109 110
111
112 113 114
115 116
117 118
119 120
122123121 124 125
126 127
128 129
130
131 133 132
134 135 136 137
138 139
140 141 142
144143 145
146
147 148
149 150
151 152
153
154 155 156 157
158 159160 161 162
163 164
165166
167 168
169 170
171 172 173 174 175
177 176
178 180179
181 182
183
184 185
186 187
188 189
190
191 192
193 194
195
196197 198 199
200
201 202 203
204 205
206 207 208
209210 211
212 213
214 215216
217 218
219
220 221
222
223 224
225 226
227 228 229
230 231
232 233
234
235 236
237
238 239 240
241 242 243
244
245 246
247
248 249
250
251 252
253 255 254
256
257 258
259 261260
262 263
264
266 265 267 268
269 270
271 272 273
274 275 276
277
278
279 280
281
282
283
284 285
286 287
288 289 290
291
292293
294 295
296
297 298
299
300
301 302 304 303
305 306 307
308 309
310 311
312 313
314 315
316 317
318
319 320
321
323 322 324
325 326 328327 330 329
331 333 332 334
335
336 337
338 339
340
341 342 343
344 345
346
347 348
349 351 350
352 353 354
355 356 357
358 359
360 361
362
363 364
365 366
367
368 369
370
371 372 373
374 375
376 377
379 378 380
381 383382 384
385 386
387 388
389 390 391
392
393
394 395
396 398 397
399 400 401
402
403 404
406 405
407 408
409 410
412 413411 414 415 416
417 418
419 421 420
422 423
424
425 426 427 429 428
430 431 432
433 434
435 436
437 438
439 440
441 442
443 444
445 446 447
448
449
450 451
452 453
454
455 457 456
458 459
460 462 461
463
464 465 466
467
468
#classification hiérarchique ascendante toutes les sur coordonnées de l'ACM
#HCPC Hierarchical Clustering on Principal Components res.hcpc <- HCPC(res,nb.clust=2,graph=FALSE)
res.hcpc$desc.var$test.chi2
## p.value df
## Type.de.client 4.6e-50 1
## Ancienneté 1.4e-32 4
## Domiciliation.du.salaire 5.6e-26 1
## Age.du.client 2.0e-19 3
## Situation.familiale 2.4e-14 3
## Moyenne.en.cours 2.5e-14 2
## Profession 3.1e-14 2
res.hcpc$desc.var$category$'1'[,1:3]
## Cla/Mod Mod/Cla Global
## Type.de.client=mauvais client 89.2 80.8 49
## Domiciliation.du.salaire=non domicile salaire 89.5 53.3 32
## Ancienneté=anc. 1 an ou moins 78.9 61.6 43
## Age.du.client=moins de 23 ans 90.9 31.4 19
## Situation.familiale=célibataire 75.9 50.6 36
## Profession=cadre 23.4 7.1 16
## Age.du.client=plus de 50 ans 25.0 10.6 23
## Moyenne.en.cours=plus de 5 KF encours 12.9 3.1 13
## Situation.familiale=marié 35.3 30.6 47
## Ancienneté=anc. plus 12 ans 4.6 1.6 19
## Domiciliation.du.salaire=domicile salaire 37.7 46.7 68
## Type.de.client=bon client 20.7 19.2 51
res.hcpc$desc.var$category$'2'[,1:3]
## Cla/Mod Mod/Cla Global
## Type.de.client=bon client 79.3 88.3 51
## Domiciliation.du.salaire=domicile salaire 62.3 92.5 68
## Ancienneté=anc. plus 12 ans 95.4 39.0 19
## Situation.familiale=marié 64.7 67.1 47
## Moyenne.en.cours=plus de 5 KF encours 87.1 25.4 13
## Age.du.client=plus de 50 ans 75.0 38.0 23
## Profession=cadre 76.6 27.7 16
## Ancienneté=anc. de 6 à 12 ans 62.1 19.2 14
## Age.du.client=de 40 à 50 ans 53.3 30.5 26
## Ancienneté=anc. de 1 à 4 ans 21.3 4.7 10
## Moyenne.en.cours=moins de 2KF encours 23.5 10.8 21
## Profession=profession autre 23.4 16.9 33
## Situation.familiale=célibataire 24.1 19.2 36
## Age.du.client=moins de 23 ans 9.1 3.8 19
## Ancienneté=anc. 1 an ou moins 21.1 19.7 43
## Domiciliation.du.salaire=non domicile salaire 10.5 7.5 32
## Type.de.client=mauvais client 10.8 11.7 49
#Scoring sur donnees qualitatives à la main
n <- nrow(credit)
set.seed(1)
test.sample <- sample(1:n,150) train.sample <- (1:n)[-test.sample]
mca <- MCA(credit,ncp=15,quali.sup=1,ind.sup=test.sample,graph=FALSE)
plot(mca,choix="ind",habillage=1,invisible="var")
−2 −1 0 1 2
−1012
MCA factor map
Dim 1 (13.59%)
Dim 2 (10.17%)
bon client mauvais client
1 2
3
4 7
8
9 13 11
14 15
16 17
18
19 21 20
22 24
25 27
28 31
32
33
35 36 38
39
40 41 44 43
46 45
48 49
50 51 52
54
58
61 59
62 63
64
65 66
67 68
69 70
72 73 74 75 76
77 79
80 83
85
86 87 88
89
90 93 92
96 97
98 100103101 105
106
107 108
109 110
111
112 114 113
115 116
117
118 121 122123 124
128 129
133 134
136 137
139 140141 142144 143 145
146 148
149 152 151
158 159160 161 162
163
164 165
166 171
176 178 179
180
181 182
184 185
186 189 190
191 192 194
196 198 199
203
204 205
206 207 208
209 210
211 213
217 218
219
220
221 222
223 227 228 229
230 232 233
234
235 238
239 243
244 245
246 247
248 249
250
251253 254 255
256
257 258
259 261 264
265 266 268
269 270
271 273 274
275 278
279 280
281
282
283
284 285
286 287 288
289 293
294 295
296 297
299
300
302 303 306 307
309
310
313 315
316 317
318
319 320
321
322 323
324
328327 330
331
332 335
336 337 338
341
343 345
347
353 354
355 356 357
358 359
361 364 362
366
367
368 370
371 372375
376 377
378 379
380
382 384
385 386
388
389 390
392 393
394 396 395
397
398 401
402
403 404
407 408
409 412411
413415 414
417 421
422 424 425
427 428 429
430 432
433
435 438
439 442
444
445 447
452 453
456 457
459
461
463
466 467
468
bon client mauvais client 125
174
267 423
94
416
437 305
290 29
95 314 81
175 350
226
325 448
172
454 419
458 291
56
119 450
6
169 383
150 263 212
216 82
360
460 344
47 312
177 277352 334
236
225 426
10 201
308
446 200
434 183
102 30
42
131 214 167 272
373
120 187
135 462
104 193
420
34
449
405 465
138 132 351 188
339
153 304
374 441
276
155 126
451 78
410
431 464
55
91
23 242
329 292
298 170 391
301 224
241
130 363 99
231 381440
173
333 215
399
262
127
154 53 5
252 37
157 369
346 443
168
60 260
156 455
71 202 365
195 26 436 12
311
418 406 342
326
348
349 197 340
84 237
147
57 240
400 387
y <- credit[,1]
train <- mca$ind$coord
test <- mca$ind.sup$coord
library(MASS)
m <- lda(train, y[-test.sample])
yhat <- predict(m, test)$class
table(y[test.sample],yhat)
## yhat
## bon client mauvais client
## bon client 54 16
## mauvais client 30 50 sum(yhat != y[test.sample])/length(yhat)
## [1] 0.31
#Scoring sur donnees qualitatives avec un package library(DiscriMiner)
?disqual
#Analyse Factorielle Discriminante (AFD) sur données qualitatives
disq <- disqual(credit[,-1],credit[,1],learn=train.sample,test=test.sample,validation="learntest")
disq$confusion
## predicted
## original bon client mauvais client
## bon client 58 12
## mauvais client 39 41
disq$error_rate
## [1] 0.34 head(disq$scores)
## bon client mauvais client
## [1,] 149 503
## [2,] 286 334
## [3,] 418 171
## [4,] 293 325
## [5,] 375 224
## [6,] 374 225
head(disq$classification)
## [1] mauvais client mauvais client bon client mauvais client
## [5] bon client bon client
## Levels: bon client mauvais client
disq <- disqual(credit[,-1],credit[,1],validation="crossval")
disq$error_rate
## [1] 0.31