Bonjour Pierre Anthony, bonjour tout le monde,
Comme l'explique François Husson dans ses excellentes vidéos pédagogiques sur la CAH (encore un grand merci ! -
https://www.youtube.com/watch?v=SE_4dLh5vXY), l'algorithme sera trop long, impossible ou fonctionnera mal sur des tableaux avec de nombreux individus. Aussi, dans ces cas-là, François Husson évoque la possibilité de faire une partition (par k-means) en une centaine de classes, puis de réaliser une CAH sur ces classes.
Voilà comment je procèderais dans deux cas (cas 1 : CAH sur un tableau "initial" de variables quantitatives /cas 2 : CAH sur les résultats d'une ACM)
# CAS 1 : CAH sur un tableau "initial" de variables quantitatives ----
Imaginons un dataframe d comprenant des variables de pourcentages (exemple : parts en % des différentes PCS parmi les actifs, dans les communes françaises) :
1/ je réalise une partition en 500 classes sur mon tableau de données
res.kmeans <- kmeans(d,centers=500,nstart=5)
2/ je construis ensuite une table "groupes.kmeans" qui indique, pour
chacune des 500 classes, les parts moyennes des PCS :
groupes.kmeans <- d %>%
mutate(clust.kmeans=res.kmeans$cluster) %>%
group_by(clust.kmeans) %>% summarise_all(.,mean) %>%
column_to_rownames(var="clust.kmeans")
3/ je réalise la CAH sur le tableau des classes kmeans
res.cah <- HCPC(groupes.kmeans,nb.clust=-1,graph=F)
4/ et voilà ce que je fais pour associer ces classes CAH au tableau initial :
groupes.kmeans <- groupes.kmeans %>%
mutate(clust.cah=res.cah$data.clust$clust) %>%
rownames_to_column(var="clust.kmeans")
d <- d %>%
mutate(clust.kmeans=as.character(res.kmeans$cluster)) %>%
left_join(groupes.kmeans %>% select(clust.kmeans,clust.cah),by="clust.kmeans")
# CAS 2 : CAH sur les résultats d'une ACM ----
Je prends le tableau "loisirs" (données d'enquête) extrait des supports pédagogiques de François Husson.
loisirs <- loisirs %>% select(1:18) %>% mutate(TV=as.factor(TV))
res.acm <- MCA(loisirs, graph=F)
C'est la même démarche que précédemment, mais le dataframe "d" est composé des coordonnées des individus sur les plans de l'ACM.
1/ je réalise une partition en N classes (ici 20 - c'est surtout pour des fins "didactiques" !)
d <- as.data.frame(res.acm$ind$coord)
res.kmeans <- kmeans(d,centers=20,nstart=5)
2/
je construis ensuite une table "groupes.kmeans" qui compte les effectifs de chaque modalité pour chacune des classes kmeans :
groupes.kmeans <- loisirs %>%
mutate(clust.kmeans=res.kmeans$cluster) %>%
pivot_longer(-clust.kmeans,names_to="variable",values_to="modalite") %>%
count(clust.kmeans,variable,modalite) %>%
mutate(var_mod=str_c(variable,modalite)) %>%
select(-variable,-modalite) %>%
pivot_wider(names_from=var_mod,values_from=n) %>%
mutate_if(is.integer,replace_na,0) %>%
column_to_rownames(var="clust.kmeans")
3/ je réalise la CAH sur le tableau groupes.kmeans
res.cah <- HCPC(groupes.kmeans,nb.clust=-1,graph=F)
4/
et voilà ce que je fais pour associer ces classes CAH au tableau initial (loisirs) :
groupes.kmeans <- groupes.kmeans %>%
mutate(clust.cah=res.cah$data.clust$clust) %>%
rownames_to_column(var="clust.kmeans")
loisirs <- loisirs %>%
mutate(clust.kmeans=as.character(res.kmeans$cluster)) %>%
left_join(groupes.kmeans %>% select(clust.kmeans,clust.cah),by="clust.kmeans")
En espérant ne pas faire d'erreurs, et que ça puisse vous aider !
Aliette Roux, ingénieure PROGEDO-Loire, MSH Ange-Guépin