L’analyse de réseaux avec R, les premiers pas (deuxième partie)

Un premier billet publié début avril a présenté l’installation de R et de RStudio, le fonctionnement général du logiciel et a montré comment effectuer des mesures basiques sur un graphe à l’aide des packages statnet et igraph. L’objectif de ce billet est d’expliquer le plus simplement possible comment importer et transformer ses propres données et comment les visualiser. L’objectif de l’exercice est le suivant : importer un jeu de données comportant des attributs sur les liens et sur les sommets, puis de représenter le graphe en faisant dépendre la taille et la couleur des sommets de deux attributs et l’épaisseur des liens d’un troisième attribut.

Importer ses données

Les données proposées en exemple représentent un graphe fictif de relations entre enfants. Elles comportent deux fichiers : un fichier de type origine – destination – intensité concernant les liens non orientés existants, un fichier de type individus – variables qui précise les attributs de chacun des sommets (genre et âge). Pour télécharger le jeu de données et le script commenté dans ce billet, cliquer ici (les fichiers sont encodés en utf-8). En  règle générale, avec R, il est préférable pour limiter les risques d’erreurs d’importer des fichiers de format texte (.txt ou .csv).

La démarche à suivre est la même avec les deux packages : mettre en forme ses données, les importer dans R puis les transformer en un objet que statnet et igraph sont capables d’analyser. Détail important : ces deux packages ne permettent pas d’analyser des graphes valués (i.e. l’intensité des liens n’est pas prise en compte pour le calcul des indicateurs) mais, dans la représentation graphique, il est possible de faire varier l’épaisseur des liens en fonction de leur intensité.

Une fois vos fichiers placés dans un dossier, créez dans ce même dossier un fichier script.txt et changez l’extension pour obtenir script.R. Ouvrez-le ensuite avec RStudio.

Le début du script est le suivant :

rm(list=ls())
l <- read.table(« liens.txt », sep= »; », header=TRUE)
s <- read.table(« sommets.txt », sep= »; », header=TRUE, stringsAsFactors=FALSE)

La première ligne supprime tout les objets précédemment créés dans R, les deux lignes suivantes permettent l’importation des fichiers. Il convient de préciser leur nom, le caractère utilisé pour séparer les colonnes (sep= » »), éventuellement le caractère utilisé pour les décimales (dec= » ») et header=TRUE informe R que la première ligne contient les étiquettes de colonnes. L’option stringsAsFactors permet d’éviter que R ne transforme les caractères de la variable qualitative GENRE en facteur. Une fois les fichiers importés, vous pouvez les visualiser en cliquant sur eux dans la fenêtre Workspace. Il est toujours prudent, surtout lorsque l’on débute avec R, mais la règle reste valable ensuite, de vérifier avant toute opération que l’importation s’est bien déroulée.

Avec igraph

La transformation des données est relativement simple  avec igraph : la fonction graph.data.frame prend comme premier argument une liste de liens dont les deux premières colonnes doivent être les origines et les destinations. Les éventuelles colonnes supplémentaires seront considérées comme des attributs des liens. Les arguments suivants concernent la nature du graphe (orienté ou non notamment). Enfin, un argument vertices = permet d’importer les attributs des sommets. La ligne de code suivante permet donc de transformer nos deux fichiers en un objet igraph.

g <- graph.data.frame(l, directed=FALSE, vertices = s)

Pour la représentation, il faut d’abord définir les différents paramètres nécessaires et préciser les couleurs à utiliser, à quelle variable les attribuer, à quoi correspond la taille des sommets, l’épaisseur des liens etc. etc. Le code ci-dessous devrait vous donner la figure suivante – l’orientation des sommets pouvant être différente.

vertexCol <- get.vertex.attribute(g, »GENRE »)
colors = c(« Pink », »Blue »)
vertexCol[vertexCol == « F »] = colors[1]
vertexCol[vertexCol == « M »] = colors[2]

vertexSiz <- get.vertex.attribute(g, « AGE »)

edgeW <- get.edge.attribute(g, « INT »)

plot(g, vertex.color= vertexCol, vertex.size = vertexSiz,
      edge.width = edgeW)

Visualisation avec igraph

Avec statnet

La transformation en objet network analysable par statnet se fait à l’aide des commande as.matrix et as.network. Les noms sont explicites : as.matrix transforme une liste de liens en matrice ; as.network transforme la matrice en objet network. Donc, si vos données de départ sont au format matriciel, vous n’aurez pas besoin d’utiliser as.matrix… Dans la mesure où mes liens ne sont pas orientés, je le précise lors de la transformation avec l’option directed=FALSE. Je ne dois par contre prendre que les deux premières colonnes d’où les crochets et les parenthèses.

library(statnet)
ls <- as.network(as.matrix(l[,c(1:2)], directed=FALSE)
ls
gplot(ls)

La dernière étape consiste à transformer la dernière colonne du fichier l (intensité de la relation) et le fichier s (sommets) en données attributaires pour l’objet network ls créé à l’étape précédente. Cela se fait avec l’assignation %v% pour les sommets (v comme vertex) et %e% pour les liens (e comme edge).

ls %v% « GENRE » <- s$GENRE  
ls %v% « AGE » <- s$AGE
ls %e% « int » <- l$INT

Pour la  représentation graphique, il faut d’abord définir les couleurs à utiliser puis visualiser avec la fonction gplot. Cette fonction propose un très grand nombre d’options, le plus simple est de taper ?gplot puis de tester les différents scripts d’exemple. Bizarrement, il faut faire appel aux tableaux de départ et non à l’objet network pour personnaliser la visualisation. Les options utilisées ici sont les suivantes : gmode = « graph » signale que le graphe est non orienté ( = « digraph » dans le cas contraire) ; displaylabels permet d’afficher ou non les labels des sommets, vertex.col et vertex.cex permettent de choisir couleur et taille des sommets et enfin edge.lwd permet de moduler l’épaisseur des liens.

nodeColors <- ifelse(s$GENRE== »F », »Pink », »Blue »)

gplot(ls, gmode= »graph », displaylabels=TRUE, vertex.col=nodeColors,
      vertex.cex= s$AGE/4, edge.lwd = l$INT)

Le résultat obtenu ressemble – à l’orientation générale de la figure près – à ceci :

 Visualisation avec statnet

En guise de conclusion

Le premier billet vous a – théoriquement – permis d’installer R, RStudio et de tester différente mesures de graphe à l’aide des packages statnet et igraph. Vous savez maintenant importer vos données (liens et attributs) et visualiser vos graphes en fonction des attributs importés, vous êtes donc quasi autonomes. Un dernier conseil pour finir : prenez toujours le temps de bien parcourir les rubriques d’aide des fonctions.


4 réflexions au sujet de « L’analyse de réseaux avec R, les premiers pas (deuxième partie) »

  1. bonjour,
    j’ai fait une formation sur l’analyse des réseaux sociaux pour des données de la mobilité animale (mouvement , origine et destination)
    j’ai fait la recherche et j’ai trouvé plusieurs méthodes mais dans notre formation on a utilisé le contenu ci-dessous :
    #######################
    # La première et une seule fois installer le package. menu Tools/Install Packages/SNA

    [la suite du script a été coupée]

    j'ai utilisé le script mais ça bloque , prière de m'aider à résoudre le blocage. merci

    • Bonjour,
      je vous suggère de contacter plutôt la personne ayant effectué la formation.
      Très cordialement

    • Bonjour,
      avec un retard impardonnable, merci beaucoup pour cette ressource que je ne connaissais pas.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *