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 :

Résumé des principales étapes du code R

1. Import des données

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() )

2. Lecture des données

2.1 Toutes les données

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

2.2 Sélection des variables actives

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

2.3 Résumé des données actives

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

3. Déterminer le nombre de classes de la partition

Ce fait sur le tableau des variables actives à la suite d’une ACP, AFC, ACM…

3.1 Le module ACM sur des données nominales

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é

3.2 Part de l’information portée par les axes de l’ACM

  • Liste des résultats possibles de l’ACM
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"
  • La valeur propre de chaque axe
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
  • Combien d’axes retenir pour l’étude ?
fviz_screeplot (res.mca, addlabels = TRUE, ylim = c (0, 45))

4. Le module Classification Ascendante Hiérarchique (CAH)

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 :

- La méthode HCPC de Factominer requiert :

++ 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.;

4.1 Choisir le nombre de classes pour la future légende

## 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. !

4.2 Listage des résultats possibles

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"

4.3 Les sorties de la fonction HCPC

- 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

4.4 Description des classes

- 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

5. Aide à l’interprétation

5.1 Dendrogramme avec fviz_dend

  • version sobre
fviz_dend(res.mca.hcpc,
          palette = "jco",
          main = "Regroupements des classes",
          ylab = "Inertie") 

## Sources : https://rpkgs.datanovia.com/factoextra/reference/fviz_dend.html

5.2 Visualisation des individus coloriés par groupe avec fviz_cluster() [factoextra].

          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/

5.3 Exporter des résultats

  • Exporter des pdf ou des png

– 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"
  • Exporter des résultats en csv

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 = ";")

7. Le couteau suisse

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