Classification ascendante hiérarchique (CAH) après une Analyse des correspondances multiples (ACM) avec R et FactoMineR sur une vectorisation de la photointerprétation d’une composition colorée en RVB TM543 de la région des Howe Hills à l’ouest de Worcester, Massachusetts (Sources : https://clarklabs.org/download/terrset-tutorial-data/ paquet Images Processing)
Pour aller plus loin :
http://factominer.free.fr/factomethods/classification-hierarchique-sur-composantes-principales.html
http://factominer.free.fr/factomethods/analyse-des-correspondances-multiples.html
Avec mes fichiers exemples, préférez les paramètres nord-américains (“.” séparateur de décimales, “,” séparateur de miliers).
Salle C210, identifiant => “geographie2” !
### setwd("D:/Users/geographie2/votre nom/TD/teled/TD42/R")
### respecter ce cheminement si "geographie2"
### getwd()
### setwd("D:\\3VG\\UP8\\enseignement\\teled\\TD42\\R")
# Remove all objects
rm(list = ls() )
zea06 <- read.csv("zea06.csv",
sep = ";",
) # si stringsAsFactors = FALSE on perd les modalités si qualitative
head(zea06[, 1:4], 5) # pour voir les 5 premières lignes et 4 variables du tableau
## zea couleur texture structure
## 1 1 Col_Noir Tex_Liss Str_Homo
## 2 2 Col_Noir Tex_Liss Str_Homo
## 3 3 Col_Noir Tex_Liss Str_Homo
## 4 4 Col_Noir Tex_Liss Str_Hete
## 5 5 Col_BlVe Tex_Ponct Str_Hete
zea06.active <- zea06[1:29, 2:4] # on élimine l'identifiant pour le moment
head(zea06.active[, 1:3], 5)
## couleur texture structure
## 1 Col_Noir Tex_Liss Str_Homo
## 2 Col_Noir Tex_Liss Str_Homo
## 3 Col_Noir Tex_Liss Str_Homo
## 4 Col_Noir Tex_Liss Str_Hete
## 5 Col_BlVe Tex_Ponct Str_Hete
summary(zea06.active)[, 1:3]
## couleur texture structure
## Length:29 Length:29 Length:29
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
Ce fait sur le tableau des variables actives à la suite d’une ACP, AFC, ACM…
Nota bene : pour un descritif plus complet de l’ACM sur l’analyse des données qualitatives, voir le script “en travaux” au chapitre [http://margaux.ipt.univ-paris8.fr/vgodard/enseigne/dea/memodea/mem03mas.htm].
Installer et exécuter préalablement les librairies “FactoMineR”, “factoextra”, puis les charger
- Si le nom des polygones est en première colonne :
le tableau “utile” va de la deuxième colonne à la 4ème [,2:4] ;
les variables quantitatives (appelées fréquences en ACM) supplémentaires ne sont pas présentes ici ;
les variables qualitatives (appelées modalités en ACM) supplémentaires ne sont pas présentes ici.
Ces variables supplémentaires ne sont pas utilisées pour calculer le nombre optimal de classes de la partition.
### Avec la librairie FactoMineR et factoextra
## install.packages(c("FactoMineR", "factoextra")) ## si pas déjà installés !
library("FactoMineR")
## Warning: package 'FactoMineR' was built under R version 4.0.4
library("factoextra")
## Warning: package 'factoextra' was built under R version 4.0.4
res.mca <- MCA (zea06.active, graph = TRUE) # format simplifié
print(res.mca) # liste des résultats possibles de l'ACM
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 29 individuals, described by 3 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. of the categories"
## 4 "$var$cos2" "cos2 for the categories"
## 5 "$var$contrib" "contributions of the categories"
## 6 "$var$v.test" "v-test for the categories"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "intermediate results"
## 12 "$call$marge.col" "weights of columns"
## 13 "$call$marge.li" "weights of rows"
eig.val <- get_eigenvalue(res.mca)
head(eig.val)
## eigenvalue variance.percent cumulative.variance.percent
## Dim.1 0.6181262 26.491121 26.49112
## Dim.2 0.4207053 18.030225 44.52135
## Dim.3 0.3333333 14.285714 58.80706
## Dim.4 0.3333333 14.285714 73.09278
## Dim.5 0.3333333 14.285714 87.37849
## Dim.6 0.1676202 7.183724 94.56221
fviz_screeplot (res.mca, addlabels = TRUE, ylim = c (0, 45))
La CAH avec tous les éléments actifs (29 lignes et 3 variables)
- HCPC est le nom de la CAH dans Factominer
- HCPC fonctionne sur une analyse précédente du type :
Variables continues : ACP (tableau de mesure), AFC (tableau de contingence) ;
variables catégorielles : ACM (tableau disjonctif complet) ;
Données mixtes : AFM (analyse factorielle multiple sur des données continues et des données catégorielles).
- La méthode HCPC de Factominer requiert :
x : le fichier résultats de l’étape précédente (ACP, CAH, AFM…) ;
ncp : nb de dimensions gardé pour calculer les partitions (si on ne précise pas, par défaut 5) ;
++ Si ncp = -1 => 3 graphiques (dendrogramme en 2D, en 3D, carte factorielle en 2D) avec nb de classes fixes ;
++ Si ncp = 0 ou 1 => 1 graphiques (dendrogramme en 2D) pour déterminer la “hauteur de coupe” ;
++ Si ncp = 2 ou + => 3 graphiques (dendrogramme en 2D, en 3D, carte factorielle en 2D) avec nb de classes fixes = à ncp.;
## library("FactoMineR)
## recherche des sauts d'inertie pour déterminer le nombre de classes
res.mca.hcpc <- HCPC(res.mca, graph = TRUE, nb.clust = -1) ## modifier "nb.clust = 4," si on en veut 4, etc. !
print(res.mca.hcpc)
## **Results for the Hierarchical Clustering on Principal Components**
## name
## 1 "$data.clust"
## 2 "$desc.var"
## 3 "$desc.var$test.chi2"
## 4 "$desc.axes$category"
## 5 "$desc.axes"
## 6 "$desc.axes$quanti.var"
## 7 "$desc.axes$quanti"
## 8 "$desc.ind"
## 9 "$desc.ind$para"
## 10 "$desc.ind$dist"
## 11 "$call"
## 12 "$call$t"
## description
## 1 "dataset with the cluster of the individuals"
## 2 "description of the clusters by the variables"
## 3 "description of the cluster var. by the categorical var."
## 4 "description of the clusters by the categories."
## 5 "description of the clusters by the dimensions"
## 6 "description of the cluster var. by the axes"
## 7 "description of the clusters by the axes"
## 8 "description of the clusters by the individuals"
## 9 "parangons of each clusters"
## 10 "specific individuals"
## 11 "summary statistics"
## 12 "description of the tree"
- affichage de l’appartenance des individus à chaque cluster avec “data.clust” en dernière colonnne
res.mca.hcpc$data.clust
## couleur texture structure clust
## 1 Col_Noir Tex_Liss Str_Homo 1
## 2 Col_Noir Tex_Liss Str_Homo 1
## 3 Col_Noir Tex_Liss Str_Homo 1
## 4 Col_Noir Tex_Liss Str_Hete 1
## 5 Col_BlVe Tex_Ponct Str_Hete 4
## 6 Col_BlVe Tex_Ponct Str_Hete 4
## 7 Col_JaOr Tex_Ponct Str_Homo 5
## 8 Col_MaVe Tex_Ponct Str_Homo 3
## 9 Col_BrRo Tex_Ponct Str_Hete 6
## 10 Col_JaOr Tex_Ponct Str_Hete 5
## 11 Col_BlVe Tex_Ponct Str_Hete 4
## 12 Col_Jaune Tex_Liss Str_Homo 2
## 13 Col_Jaune Tex_Liss Str_Homo 2
## 14 Col_Jaune Tex_Ponct Str_Hete 2
## 15 Col_BlVe Tex_Liss Str_Homo 4
## 16 Col_BlVe Tex_Liss Str_Homo 4
## 17 Col_BrRo Tex_Ponct Str_Hete 6
## 18 Col_BlVe Tex_Ponct Str_Hete 4
## 19 Col_MaVe Tex_Ponct Str_Homo 3
## 20 Col_MaVe Tex_Ponct Str_Homo 3
## 21 Col_MaVe Tex_Ponct Str_Homo 3
## 22 Col_BlVe Tex_Ponct Str_Homo 4
## 23 Col_BlVe Tex_Ponct Str_Homo 4
## 24 Col_Noir Tex_Ponct Str_Homo 1
## 25 Col_Noir Tex_Ponct Str_Homo 1
## 26 Col_MaVe Tex_Liss Str_Homo 3
## 27 Col_JaOr Tex_Liss Str_Hete 5
## 28 Col_Jaune Tex_Liss Str_Homo 2
## 29 Col_JaOr Tex_Ponct Str_Hete 5
- description des classes par les variables quantitatives (appelées fréquences en ACM) actives (quelles sont les sur ou sous rerésentations significatives ?)
Intern % => % de la fréquence dans la classe ;
glob % => % de la fréquence dans l’échantillon ;
++ Calculer ligne à ligne [(Intern % - glob %) / glob %] donne la sur ou la sous représentation de la fréquence dans la classe
Intern freq => Somme de la fréquence dans la classe
Glob freq => Somme de la fréquence dans l’échantillon
++ Calculer ligne à ligne (Intern freq - Glob freq) donne le % de la classe dans la fréquence
Cla/Mod % de la modalité dans la classe Mod/Cla % de la classe dans la modalité Global % de la modalité dans l’échantillon
res.mca.hcpc$desc.var ## faire un copier-coller dans un bloc note avant import dans tableur [tableau non compatible avec write.table()])
##
## Link between the cluster variable and the categorical variables (chi-square test)
## =================================================================================
## p.value df
## couleur 6.998911e-19 25
##
## Description of each cluster by the categories
## =============================================
## $`1`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_Noir 100 100 20.68966 2.105175e-06 4.743057
##
## $`2`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_Jaune 100 100 13.7931 4.210349e-05 4.095623
##
## $`3`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_MaVe 100 100 17.24138 8.420698e-06 4.454199
##
## $`4`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_BlVe 100 100 27.58621 2.329837e-07 5.170888
##
## $`5`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_JaOr 100 100 13.7931 4.210349e-05 4.095623
##
## $`6`
## Cla/Mod Mod/Cla Global p.value v.test
## couleur=Col_BrRo 100 100 6.896552 0.002463054 3.027844
fviz_dend(res.mca.hcpc,
palette = "jco",
main = "Regroupements des classes",
ylab = "Inertie")
## Sources : https://rpkgs.datanovia.com/factoextra/reference/fviz_dend.html
fviz_cluster(res.mca.hcpc,
repel = TRUE, # Evite le chevauchement des textes
show.clust.cent = TRUE, # Montre le centre des clusters
palette = "jco", # Palette de couleurs, voir ?ggpubr::ggpar
ggtheme = theme_minimal(),
main = "1er plan factoriel"
)
## Sources : http://www.sthda.com/french/articles/38-methodes-des-composantes-principales-dans-r-guide-pratique/78-classification-hierarchique-sur-composantes-principales-l-essentiel/
– En premier, exemple de création de graphes
# Dendrogramme
fviz_dend <- fviz_dend(res.mca.hcpc,
palette = "jco",
main = "Regroupements des classes",
ylab = "Inertie")
# Clusters sur le plan factoriel
fviz_cluster <- fviz_cluster(res.mca.hcpc,
repel = TRUE, # Evite le chevauchement des textes
show.clust.cent = TRUE, # Montre le centre des clusters
palette = "jco", # Palette de couleurs, voir ?ggpubr::ggpar
ggtheme = theme_minimal(),
main = "1er plan factoriel"
)
– En second, export des graphes
library("ggpubr")
## Export d'un pdf (un graphe par page)
ggexport(plotlist = list(fviz_dend, fviz_cluster),
filename = "res.mca.hcpc.pdf")
## Export d'un png par graphe
ggexport(plotlist = list(fviz_dend, fviz_cluster),
filename = "res.mca.hcpc.png")
## [1] "res.mca.hcpc%03d.png"
A l’aide de write.table() [package FactoMineR], write.infile semble inaccessible à la date de rédaction !
# Export d'un fichier CSV avec les affectations des individus aux classes
write.table(res.mca.hcpc$data.clust, file="res.mca.hcpc$data.clust.csv", col.names=TRUE, sep = ";")
Le package FactoInvestigate décrit et interprète automatiquement les résultats de votre analyse factorielle (ACP, AFC ou ACM) en choisissant les graphes les plus appropriés pour le rapport (sources : http://factominer.free.fr/reporting/index_fr.html, mais ce package semble inaccessible à la date de rédaction !)
## install.packages("FactoInvestigate")
library(FactoInvestigate)
Investigate(res.mca.hcpc)
## -- création du fichier .Rmd (temps écoulé : 0s) --
##
## -- sauvegarde des données (temps écoulé : 0.03s) --
##
## -- compilation des documents (temps écoulé : 0.03s) --
## -- tâche terminée (temps écoulé : 1.03s) --
## Cette interprétation des résultats a été réalisée de façon automatique,
## elle ne peut en aucun cas égaler la qualité d'une interprétation personnalisée