Tag Archives: CAH

Analyse des Données et Cartes

Vendredi, on continuera en cours la classification (non supervisée) et en particulier les méthodes hiérarchiques, et les arbres. On va utiliser la base suivante, avec les résultats des élections présidentielles (premier tour) de 2012,

elections2012 <- read.csv("http://komodo.regardscitoyens.org/public/presidentielles2012/resultats/resultats_departements_final_T1.csv",
sep=";",header=TRUE,dec=",")

La base qu’on garde contient juste les voix exprimées, en pourcentage

voix <- which(substr(names(elections2012),1,12)=="X..Voix.Exp.")
X <- as.matrix(elections2012[,voix])
colnames(X) <- substr(names(elections2012)[voix],13,nchar(names(elections2012)[voix]))
rownames(X) <- elections2012[,3]

Parfois, il convient de normaliser les données. Ici, sur les département, ça n’est pas nécessaire. Par contre, sur les candidats, ça le serait (comme pour l’ACP en fait).  Pour visualiser les distances (entre départements), on peut utiliser

heatmap(X)

On peut faire une CAH, sur notre matrice de distance entre rangs

cah <- hclust(dist(X))
plot(cah,cex=.6)

et si on souhaite garder 5 groupes (par exemple) on utilise

rect.hclust(cah,k=5)
groups.5 <- cutree(cah,5)

On peut aussi visualiser les classes avec la fonction

library(dendroextras)
plot(colour_clusters(cah,k=5))

Pour comprendre qui se trouve dans nos groupes, on peut utiliser

aggregate(X,list(groups.5),mean)

qui va nous renvoyer les “votes  moyens” pour chaque candidat, dans chaque groupe. Maintenant, pour en finir avec la visualisation, on peut utiliser le code suivant (un peu long, certes) qui permettra de visualiser sur un carte les différents groupes

carte_classe <- function(groupes){
library(stringr)
elections2012$dep <- elections2012$Libellé.du.département
elections2012$dep <- tolower(elections2012$dep)
elections2012$dep <- str_replace_all(elections2012$dep, pattern = " |-|'|/", replacement = "")
library(maps)
france<-map(database="france")
france$dep <- france$names
france$dep <- tolower(france$dep)
france$dep <- str_replace_all(france$dep, pattern = " |-|'|/", replacement = "")
corresp_noms <- elections2012[, c("Libellé.du.département", "dep")]
corresp_noms$dep[which(corresp_noms$dep %in% "corsesud")] <- "corsedusud"
col2001<-groupes+1
names(col2001) <- corresp_noms$dep[match(names(col2001), corresp_noms$Libellé.du.département)]
color <- col2001[match(france$dep, names(col2001))]
map(database="france", fill=TRUE, col=color)
}

carte_classe(groups.5)

Avec ces fonctions, on devrait pouvoir tester différentes méthodes pour constituer des groupes.

CAH (et kmeans) avec XLstat

Sur la CAH, nous avons vu que l’on a deux degrés de liberté, fondamentaux pour l’analyse

  • le choix de la distance (min, max, euclidienne, minkowski…)
  • le choix de la méthode de regroupement, ou d’agrégation (ward, single, complete…)

Ces deux degrés de libertés sont les deux paramètres qu’il convient de sélectionner lors de l’analyse,


Sinon pour les kmeans, il y a un peu moins de choix,

En cours, j’ai insisté sur l’idée de l’algorithme, plus que sur les critères de classification. Tous sont basés sur W, la matrice d’inertie intra-classe commune (pooled SSPC matrix)

  • Minimiser la trace de W pour un nombre de classes donné, revient à minimiser la variance intra-classe totale, c’est à dire minimiser l’hétérogénéité des groupes.
  • L’utilisation du déterminant de W permet de construire un critère nettement moins sensible aux effets d’échelle.
  • Le critère du lambda de Wilks correspond à la division du déterminant(W) par le déterminant(T) où T est la matrice d’inertie totale: aussi, la division par le déterminant de T permet d’avoir un critère toujours compris entre 0 et 1. Mais sinon les résultats donnés par la minimisation de ce critère sont identiques à ceux donnés par le déterminant de W.
  • enfin le dernier critère est plus long (mais plus robuste) car au lieu d’utiliser le barycentre d’une classe (i.e. la moyenne) on utilise un point médian.