Clusterisation en réseau avec R
L'essentiel de cette page
J'ai des individus que je souhaite regrouper. Il existe de nombreuses méthodes de regroupements, certaines basées sur la distance. Souvent, on affiche ces groupes sur des graphiques, des ACP et des dendrogrammes.
Pourquoi ne pas faire appel aux réseaux ?
1- Les données
Voici des données qui décrivent des voitures.
data(mtcars) ; View(mtcars)
La question se pose : est-ce que les voitures suivent toutes les mêmes règles où est-ce que je distingue des catégories de voitures ?
2- Créer une matrice de distance
Je vais mesurer la distance entre toutes les voitures puis (ligne marquée d'un #) je vais inverser ma distance pour traduire plutôt la proximité entre les voitures que la distance. Je me retrouve ainsi avec une matrice mymat qui traduit la proximité entre les véhicule de 0 à 1.
matrice <- as.matrix(scale(mtcars))
rownames(matrice) <- rownames(mtcars)
mydi = dist(matrice,upper=TRUE,diag=TRUE,method="euclidean")
mymat <- as.matrix(mydi)
mymat <- abs(( mymat - max(mymat) ) / max(mymat) )
colnames(mymat) <-rownames(mtcars)
rownames(mymat) <- rownames(mtcars)
summary(as.vector(mymat))
3- Tracer le réseau
require(igraph)
net <- graph_from_adjacency_matrix(mymat, weighted=T,mode="lower")
net <- simplify(net, remove.multiple = T, remove.loops = TRUE) # élaguer les liens redondants
net <- delete.edges(net, E(net)[ abs(E(net)$weight) < 0.51]) # Ne pas tenir compte des proximités insuffisantes (seuil arbitraire de 0,51)
E(net)$colour <- "red"
E(net)$weight <- abs(E(net)$weight)
# Clusterisation
clp <- cluster_optimal(net)
class(clp)
l <- layout_with_fr(net)
# Affichage
plot(clp, net, layout = l,vertex.size=sqrt(betweenness(net))*4+10,vertex.color="yellow",
arrow.mode=0,edge.width=((E(net)$weight)*2)^2,
edge.color =E(net)$colour,edge.arrow.size=0)
On voit ainsi 3 catégories de voitures ressortir. La Maserati Bora semble bien à part.