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.