Correction ACPClassif
Correction ACPClassif
Correction ACPClassif
Master 2 Nutrition
Présentation du problème
La composition chimique des six éléments les plus importants (bicarbonates HCO3, sulfates SO4, chlorure
Cl, calcium Ca, magnésium Mg, sodium Na) a été relevée sur 20 bouteilles d’eau minérale. L’objectif est de
Questions
1. Charger les données Eaux.txt puis les packages FactoMineR et factoextra avec les commandes
library(FactoMineR) et library(FactoMineR).
2. Calculer quelques statistiques simples sur les variables (moyennes, écart-types, corrélations).
apply(eaux[,1:6],2,mean)
apply(eaux[,1:6],2,sd)
cor(eaux[,1:6])
1
## HCO3 SO4 CL CA MG
## HCO3 1.00000000 0.0530771356 0.75991803 0.06016449 0.10805261
## SO4 0.05307714 1.0000000000 -0.01112288 0.95508574 0.81424692
## CL 0.75991803 -0.0111228812 1.00000000 -0.04532338 -0.09274089
## CA 0.06016449 0.9550857402 -0.04532338 1.00000000 0.88686404
## MG 0.10805261 0.8142469206 -0.09274089 0.88686404 1.00000000
## NA. 0.77751167 -0.0004516221 0.99297333 -0.04576128 -0.07878847
## NA.
## HCO3 0.7775116724
## SO4 -0.0004516221
## CL 0.9929733306
## CA -0.0457612773
## MG -0.0787884696
## NA. 1.0000000000
Les variables actives en ACP sont quantitatives. Pour réaliser une ACP sur les eaux, nous utiliserons les
6 teneurs mesurées sur les différents échantillons d’eau (bicarbonates HCO3, sulfates SO4, chlorure Cl,
calcium Ca, magnésium Mg, sodium Na). Les statistiques simples (moyennes et écart-types) calculées
à la question 2 montrent que les ordres de grandeur des différentes teneurs sont très différents avec
une variabilité différente sur chaque variable. En effet, la teneur en magnésium est la variable qui a le
plus faible écart-type (environ 29) alors que la teneur en bicarbonate présente l’écart-type le plus élevé
(environ 845 soit près de 30 fois plus que pour le magnésium). Si les variables n’étaient pas normées,
l’ACP ne tiendrait quasiment pas compte des deux teneurs les moins variables (Mg et CL). En normant
les variables, un même poids (une même importance) sera accordé aux 6 teneurs.
library(FactoMineR)
library(factoextra)
2
## comp 4 99.34845
## comp 5 99.91836
## comp 6 100.00000
fviz_eig(acp.res)
Scree plot
40
Percentage of explained variances
30
20
10
1 2 3 4 5 6
Dimensions
D’après les valeurs des inerties cumulées, les deux premières composantes principales portent à elles seules
91.26% de la variabilité totale des données. Conserver les deux premières composantes principales suffit donc
largement pour l’interprétation. La représentation graphique des inerties portées par les 6 composantes de
l’ACP mène au même choix. On représente donc les variables et les eaux sur le premier plan factoriel.
fviz_pca_var(acp.res,axes=c(1,2))
3
Variables − PCA
1.0 NA.
CL
HCO3
0.5
SO4
CA
MG
Dim2 (44.8%)
0.0
−0.5
−1.0
fviz_pca_ind(acp.res,axes=c(1,2))
4
Individuals − PCA
St_Yorre
5.0
Dim2 (44.8%)
Vichy_Celestins
2.5
Badoit Hepar
Contrex
Vittel
0.0 Perrier Ondine
Ogeu
Ferita
Chambon
St_Hyppo
Thonon
St_Cyr Aix
Evian
Cayranne
Beckeris
Laurier
Veri
Cristalline
Ribes
Volvic
Spa
Viladrea
−2 0 2 4 6
Dim1 (46.5%)
4. Pourquoi serait-il judicieux de faire une ACP sur le logarithme des différentes variables? Réaliser cette
ACP.
Le graphe des individus est peu lisible. Ceci est dû à la présence dans l’échantillon de quelques eaux (Hépar
et Contrex en particulier) très différentes des autres du point de vue de leur composition. Ceci a pour effet
d’“écraser” le reste du nuage. La transformation logarithmique permettra de représenter de façon plus dilatée
les autres eaux et de mettre en évidence des différences plus fines entre leurs compositions.
# ACP normée
acp.res.log<-PCA(log(eaux[,1:6]),graph=F)
# Valeurs propres de l'ACP
acp.res.log$eig
5
## comp 1 3.09276595 51.546099 51.54610
## comp 2 1.57902121 26.317020 77.86312
## comp 3 0.59150386 9.858398 87.72152
## comp 4 0.35035819 5.839303 93.56082
## comp 5 0.30606497 5.101083 98.66190
## comp 6 0.08028581 1.338097 100.00000
fviz_eig(acp.res.log)
Scree plot
50
Percentage of explained variances
40
30
20
10
1 2 3 4 5 6
Dimensions
6
# Projection des variables et des individus sur le premier plan factoriel.
# Ne sont représentées ici que les eaux dont le cos2 (qui mesure la qualité de
# représentation sur le plan factoriel) est supérieur à 0.5.
fviz_pca_var(acp.res.log,axes=c(1,2),repel=T)
Variables − PCA
1.0
NA.
CL
0.5
Dim2 (26.3%)
0.0
HCO3
SO4
CA
−0.5
MG
−1.0
7
Individuals − PCA
St_Yorre
3
Vichy_Celestins
Ogeu
St_Hyppo
Dim2 (26.3%)
1
Viladrea
Spa Volvic Laurier Badoit
Cristalline
Ribes
Veri
0
Beckeris
Thonon
−1 Ondine
Evian
Vittel
Aix
−2 Hepar
Contrex
−2 0 2 4
Dim1 (51.5%)
D’après le critère de Kaiser qui nous indiquerait de conserver les composantes portant plus de 1/6=16% de la
variabilité totale des données, nous choisirions deux composantes. D’après le critère du coude appliqué à la
représentation graphique des inerties portées par chaque axe, nous pourrions choisir trois composantes. Dans
la mesure où les deux premières composantes principales portent une part très importante de la variabilité
totale des données (77.86%), conserver deux axes semble raisonnable.
6. En quoi la représentation des variables sur le cercle des corrélations illustre-t-elle la matrice des cor-
rélations?
Toutes les variables sont bien représentées sur le cercle des corrélations ce qui autorise à utiliser les positions
des variables les unes par rapport aux autres pour décrire les liens qui existent entre elles. On distingue
trois groupes de variables : i) log(NA) et log(CL), ii) log(HCO3) et iii) les trois autres log-teneurs. Les
groupes i) et iii) sont peu liés. En effet, les coefficients de corrélations entre log(NA) et log(SO4), log(CA)
et log(MG) sont très faibles (moins de 0.2 dans les trois cas). De même, les coefficients de corrélations
entre log(CL) et log(SO4), log(CA) et log(MG) sont très faibles variables (moins de 0.3). log(HCO3) est
modérément corrélé aux variables des groupes i) et iii) (coefficients de corrélations de l’ordre de 0.4 ou 0.5).
Dans i), log(NA) et log(CL) sont très fortement et positivement corrélées entre elles(0.86). De même dans
iii) les trois log-teneurs sont corrélées positivement.
On utilise la position des variables (bien représentées) par rapport aux axes. L’axe 1 oppose des eaux riches
en MG, CA, HCO3 à des eaux plus pauvres en ces trois éléments. L’axe 2 oppose des eau riches en sel (NA
et CL) à des eaux moins riches en sel.
8
8. Interprétez la position des eaux sur le premier plan factoriel.
On prend soin de n’interpréter que les positions des eaux les mieux représentées sur le plan (cf calcul des
cos2). On utilise la signification de chaque composante principale pour interpréter la position des eaux. St
Yorre, Vichy-Célestins, Badoit sont des eaux très riches en bicarbonates de sodium et fortement minéralisées
d’où leur position sur le quart supérieur droit du premier plan factoriel. Ondine, Vittel, Contrex et Hépar
sont très fortement minéralisées et sont en particulier riches en calcium et magnésium mais sont pauvres
en sodium ce qui explique leur représentation dans le quart inférieur droit du premier plan factoriel. Très à
gauche du plan sont représentées trois eaux dont Volvic qui sont toutes les trois très faiblement minéralisées.
Les autres eaux, plus proches de l’origine du repère, ont un profil plutôt intermédiaire, ni très riches, ni très
pauvres en les 6 éléments mesurés.
9. Proposez une classification des eaux par la méthode de classification ascendante hiérarchique (CAH).
#centrer-reduire
tab<-scale(eaux[,1:6], center=TRUE,scale=TRUE)
# Calcul des distances entre individus (au carré)
data.dist <- dist(tab,method = "euclidean")
#---------------------------------------------
# CAH avec distance de Ward
data.ward <- hclust(data.dist,method="ward.D2")
#---------------------------------------------
# Representation graphique
plot(data.ward,hang=-1)
# hang pour aligner les identifiants
# on choisit de distinguer 3 groupes:
rect.hclust(data.ward,k=3)
9
Cluster Dendrogram
8
4
Height
Contrex
Hepar
Ferita
Thonon
Cayranne
Aix
Evian
Spa
Viladrea
Volvic
Perrier
Ogeu
Beckeris
Chambon
St_Hyppo
Laurier
St_Cyr
Cristalline
Ribes
Veri
Badoit
Ondine
Vittel
St_Yorre
Vichy_Celestins
data.dist
hclust (*, "ward.D2")
#---------------------------------------------
# Representation des individus avec classif cah
# assignation classes sur vecteur individus :
cluster <- cutree(data.ward, k = 3)
eaux$ClassesCAH <- cluster
10
Individuals − PCA
St_Yorre
3
Vichy_Celestins
Ogeu
Dim2 (26.3%)
1 Groups
Viladrea
Spa Volvic Laurier Badoit a 1
Cristalline
Ribes a 2
0 Veri
a 3
−1 Ondine
Vittel
Aix
−2 Hepar
Contrex
−2 0 2 4
Dim1 (51.5%)
by(eaux$HCO3,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
## [1] 300.4286
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 403
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 2253
by(eaux$SO4,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
## [1] 42.28571
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 1333
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 156
by(eaux$CL,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
11
## [1] 14.90476
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 10.5
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 278.5
by(eaux$CA,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
## [1] 82.85714
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 520.5
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 96.5
by(eaux$MG,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
## [1] 15.33333
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 97
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 10.5
by(eaux$NA.,eaux$ClassesCAH,mean)
## eaux$ClassesCAH: 1
## [1] 16.7619
## --------------------------------------------------------
## eaux$ClassesCAH: 2
## [1] 11.5
## --------------------------------------------------------
## eaux$ClassesCAH: 3
## [1] 1437.5
Pour interpréter les classes obtenues par classification ascendante hiérarchique, on peut représenter les classes
sur le premier plan factoriel de l’ACP et utiliser les positions des eaux dans chaque classe. On peut également
calculer les teneurs moyennes en chacun des 6 éléments dans chaque classe. Ici le groupe 3 comprend les
eaux les plus riches en bicarbonate et sodium. Le groupe 2 correspond aux eaux les plus minéralisées, ie
riches en calcium et magnésium. Le groupe 1 correspond aux autres eaux.
10. Proposez une classification des eaux par la méthode des k-means en utilisant le même nombre de classes
qu’avec la CAH.
12
res.k.means <- kmeans(eaux[,1:6],centers=3)
fviz_pca_ind(acp.res.log,axes=c(1,2),select.ind = list(cos2 = 0.6),
habillage=as.factor(res.k.means$cluster))
Individuals − PCA
St_Yorre
3
Vichy_Celestins
Ogeu
Dim2 (26.3%)
1 Groups
Viladrea
Spa Volvic Laurier Badoit a 1
Cristalline
Ribes a 2
0 Veri
a 3
−1 Ondine
Vittel
Aix
−2 Hepar
Contrex
−2 0 2 4
Dim1 (51.5%)
##
## cluster 1 2 3
## 1 0 0 21
## 2 0 2 0
## 3 1 0 1
Les k-means définissent ici trois classes très proches de celles obtenues par classification ascendante hiérar-
chique. La seule différence porte sur le classement de l’eau Vichy-Célestins. On interprète donc les trois
classes de la même façon que précédement.
# Caractérisation de la classification
res.k.means$totss
## [1] 24808384
res.k.means$withinss
13
res.k.means$tot.withinss
## [1] 2850413
res.k.means$betweenss
## [1] 21957971
On peut récupérer (cf script ci-dessus) la répartition de l’inertie correspondant à cette classification. Avec
une inertie inter-classes de 21957971 pour une inertie totale de 24808384, cette classification explique 89%
de la variabilité des données. D’autre part, nous aurions pu nous servir du graphe suivant pour choisir un
nombre de classes en recherchant un coude dans la représentation du rapport inertie inter-classes/inertie
totale en fonction du nombre de classes. Ce critère nous aurait amené à choisir 3 classes.
0.6
0.4
0.2
0.0
2 4 6 8 10
Nb. de groupes
Remarque : il aurait été possible d’utiliser le logarithme des 6 teneurs pour construire les deux classifications.
En utilisant le logarithme des 6 teneurs, nous aurions eu plus de facilité à distinguer les eaux faiblement
minéralisées des autres eaux (pour les mêmes raisons que pour l’ACP). Nous aurions obtenu les résultats
ci-dessous (seuls les résultats de la CAH sont fournis).
tab<-scale(log(eaux[,1:6]), center=TRUE,scale=TRUE)
data.dist <- dist(tab,method = "euclidean")
data.ward <- hclust(data.dist,method="ward.D2")
plot(data.ward,hang=-1)
rect.hclust(data.ward,k=4)
14
Cluster Dendrogram
0 2 4 6 8
Height
Spa
Viladrea
Volvic
Aix
Evian
Cayranne
Ferita
Thonon
Ribes
Veri
Beckeris
Cristalline
Perrier
Ogeu
Laurier
St_Hyppo
Chambon
St_Cyr
Contrex
Hepar
Ondine
Vittel
Vichy_Celestins
Badoit
St_Yorre
data.dist
hclust (*, "ward.D2")
15
Individuals − PCA
St_Yorre
3
Vichy_Celestins
Ogeu Groups
Dim2 (26.3%)
1
Viladrea
Spa a 1
Volvic Laurier Badoit a 2
Cristalline
Ribes
Veri a 3
0
a 4
−1 Ondine
Vittel
Aix
−2 Hepar
Contrex
−2 0 2 4
Dim1 (51.5%)
16