L’analyse de réseaux avec R, les premiers pas

R est un logiciel libre, multiplateforme et qui permet de réaliser à peu près tous les traitements de données possibles dont, bien entendu, l’analyse de réseaux. Seul inconvénient, il fonctionne à l’aide de scripts et nécessite donc l’apprentissage d’un langage particulier. Pourquoi alors l’utiliser ? Parce qu’il s’agit d’un logiciel très puissant, qu’il permet de tout faire, et surtout parce que, une fois le langage maîtrisé, il permet de gagner un temps fou. Une fois le script écrit, obtenir toute une série de mesures sur un graphe prend quelques secondes alors que la même opération avec un logiciel presse boutons nécessite quelques dizaines de clics… Ce billet s’adresse aux personnes tentées par R mais qui n’osent pas encore franchir le pas.

La première partie explique comment installer R, l’interface RStudio (et son utilité), comment charger les modules (packages) d’analyse de réseaux et le fonctionnement de l’aide. La deuxième partie montre quelques manipulations basiques sur les graphes fournis en exemple avec les modules. Un second billet détaillera les procédures d’importation de ses propres données (sommets, liens et attributs) et les possibilités graphiques du logiciel (mise en ligne prévue pour fin avril).

Installer R et RStudio

Première étape : se rendre sur le site http://cran.r-project.org/ et télécharger la version de R compatible avec votre système d’exploitation. Puis se rendre sur le site http://www.rstudio.com/ et télécharger la dernière version de RStudio. RStudio est une interface graphique qui facilite l’utilisation de R en rendant un certain nombre de fonctions (rubriques d’aide, actualisation des modules etc.) beaucoup plus simples à utiliser. Elle n’est pas indispensable mais elle est fortement recommandée quand on débute avec R.

Une fois les deux logiciels téléchargés, installez-les (sous Windows, clic droit et exécuter en temps qu’administrateur). Les choix proposés par défaut sont généralement pertinents, vous pouvez donc les laisser. Lancer ensuite RStudio et vous obtenez une fenêtre de ce type (la capture a été effectuée sous environnement Windows 7, RStudio version 0.97.336). Quatre fenêtres sont ouvertes : celle en haut à gauche accueille les scripts, c’est-à-dire la suite d’instructions que vous allez exécuter ; les résultats apparaîtront dans la fenêtre en bas à gauche appelée la console. La fenêtre en haut à droite liste les jeux de données utilisés et l’historique des manipulations effectuées. Enfin, la fenêtre en bas à droite héberge les rubriques d’aide, les sorties graphiques et la liste des packages installés.

Interface de RStudio

Charger un package

R est un logiciel modulaire. Certains modules sont inclus par défaut lors de l’installation du logiciel, d’autres plus spécifiques doivent être installés. Pour débuter en analyse de réseaux, deux modules sont indispensables : le package statnet (qui est en réalité un ensemble de packages dépendants les uns des autres) et le package igraph. D’autres packages existent et plusieurs billets de ce blog en présentent certains (voir les billets sur le module intergraph, le module bipartite, le module QuACN ou le module qgraph).

statnet et igraph sont des packages inclus dans la version de base de R mais ils ne sont pas actifs au démarrage. Il convient donc de les charger à l’aide des fonctions library(statnet) et library(igraph). Attention, mais j’y reviendrai pas la suite, ces deux packages ne peuvent pas fonctionner ensemble. Pour exécuter une fonction, deux possibilités existent : la taper directement dans la console puis taper Entrée ; la taper dans un script et taper Ctrl + Entrée pour l’exécuter. Le résultat est exactement le même. Mais tout l’intérêt de R est de créer des scripts (des suites de commandes) qui peuvent être sauvegardés (ce sont de simples fichiers texte ayant l’extension .R) et réutilisés ensuite. Une bonne habitude est donc, à l’ouverture de RStudio, de créer un nouveau script à l’aide des menus déroulants File > Create new R script. Le menu File permet de créer les scripts, de les sauvegarder à l’endroit de son choix, de les ouvrir etc.

Créer un script avec RStudio

Au fait, pourquoi deux packages ? statnet est développé par des sociologues férus de modèles statistiques (ERGM) ; igraph est développé par des physiciens et des informaticiens. On trouve dans les deux les mesures les plus communes en analyse de réseaux mais certaines ne sont proposées que dans l’un de ces deux packages. Par ailleurs, la simplicité des commandes et la clarté des résultats varie d’un package à l’autre. A titre personnel, l’importation des données attributaires me semble beaucoup plus simple avec igraph mais je préfère les visualisations proposées par statnet. Mais ceci est affaire de goût… Autre avantage d’utiliser deux packages, ce qu’on ne parvient pas à faire avec l’un,  on réussit généralement à le faire avec l’autre.

Les rubriques d’aide

Dans RStudio, lorsque que vous chargez un package à l’aide de la commande library(nom_du_package), l’aide s’affiche dans un onglet de la fenêtre Help. Si vous avez besoin de savoir comment fonctionne une instruction, il suffit de la taper dans la console, de taper Ctrl + Entrée et la rubrique s’affiche alors dans la fenêtre Help. Quand les créateurs et/ou créatrices du package ont fait du bon boulot, vous trouvez une définition de la fonction, sa structure (éléments indispensables et optionnels), les éléments pris en entrée et ceux fournis en sortie et enfin un exemple d’utilisation. La rédaction de la documentation étant en grande partie normée, ces rubriques sont généralement de bonne qualité (mais en anglais évidemment…).

Aide d'igraph dans RStudio

Les rubriques d’aide sont  – avec les forums et listes de diffusion consacrés à R – sont vos meilleurs alliés pour progresser rapidement. Lorsque que vous utilisez un package pour la première fois, prendre le temps de regarder les différentes fonctions, d’examiner les jeux de données disponibles, de tester les scripts d’exemple proposés vous fera gagner un temps précieux.

Mais il est temps d’entrer dans le vif du sujet… La suite du billet suppose que vous avez installé R et RStudio… et c’est tout.

Pour les deux packages, les manipulations proposées sont les suivantes : chargement d’un jeu de données, calcul de la densité du graphe, du nombre et de la taille des composantes connexes, et enfin calcul de deux mesures de centralités des sommets (degré et intermédiarité, soit en bon anglais degree et betweenness). Comme indiqué plus haut, les aspects liés à la visualisation et à l’importation de ses propres billets seront abordés dans un second billet.

Manipulations basiques avec statnet

Le petit texte qui suit est un script, c’est-à-dire une liste d’instructions. Les étapes sont toujours les mêmes : nettoyer l’espace de travail (rm = remove), charger le package, charger un jeu de données puis effectuer les opérations souhaitées sur ce jeu de données. Quand on débute (et même après), il est vivement conseillé de commenter ses scripts : il suffit de placer un croisillon (AltGr + 3 sur Windows, Maj + @ sur Mac). Et c’est bien un croisillon et non un dièse1…) et ce qui est tapé ensuite n’est pas pris en compte par le logiciel.

Plusieurs jeux de données sont fournis avec statnet et l’exemple proposé ici utilise le jeu de données nommé faux.magnolia.high. Ce graphe simule les liens d’amitiés sur un campus américain (pour obtenir plus d’informations, taper ?faux.magnolia.high dans la console, Entrée et les détails s’affichent dans la fenêtre Help).

rm(list=ls()) #supprimer tous les objets importés ou créés auparavant
library(statnet) #chargement du package  statnet
data(« faux.magnolia.high ») #chargement du jeu de données
g <- faux.magnolia.high #attribution d’un nom court (facilite la saisie)
g  #informations de base sur le graphe

Taper le nom de l’objet g permet d’obtenir les informations suivantes : nombre de sommets (vertices = 1461), caractéristiques du graphe (ici on apprend qu’il est non-orienté, non multiple, ne comprend pas de boucles et qu’il ne s’agit pas d’un hypergraphe : directed = FALSE hyper = FALSE loops = FALSE multiple = FALSE bipartite = FALSE). On apprend enfin qu’il comprend 974 liens et qu’il n’y a pas de données manquantes (total edges= 974 missing edges= 0 non-missing edges= 974). Dernier point, mais qui ne sera pas utilisé dans ce billet, l’existence d’attributs (sur les sommets et/ou les liens) est indiqué : chaque sommet comprend un nom et des indications portant sur le niveau scolaire, le genre et l’ethnie (Vertex attribute names: Grade Race Sex vertex.names).

gden(g) #calcul de la densité
component.dist(g) #nombre et compositions des composantes connexes

Cette dernière fonction crée trois objets différents : un objet membership qui précise pour chaque sommet la composante connexe à laquelle il appartient ; un objet csize (component size) qui donne la taille de chacune des composantes connexes ; un objet cdist qui décrit la distribution des tailles des composantes connexes. Si je souhaite utiliser ces résultats ensuite – et la remarque s’applique aux opérations suivantes – j’ai tout intérêt à créer un objet qui va stocker ces résultats et me permettre de les réutiliser ensuite. La procédure est simple, je fais précéder l’instruction d’un nom (prendre un nom explicite est recommandé) et du petit symbole <-, ce qui donne la ligne de commande suivante. Les résultats ne s’affichent pas dans la console mais sont stockés – et réutilisables – dans l’objet comp.connexe.

comp.connexe <- component.dist(g)
deg <- degree(g) #calcul des degrés
summary(deg) #informations sur les degrés (min, Q1, médiane, moyenne, Q3 et max)
bet <- betweenness(g) #calcul de la centralité d’intermédiarité
summary(bet) #informations sur la centralité d’intermédiarité
tab <- as.data.frame(cbind(g$vertex.names, deg, bet)) #création d’un tableau

Cette dernière ligne appelle un petit commentaire : je crée un tableau de données (as.data.frame) qui consiste à coller côte à côte 3 colonnes (cbind), ces 3 colonnes étant le nom des sommets (g$vertex.names), leur degré (deg) et leur centralité d’intermédiarité (bet). Cette étape n’est pas obligatoire mais on peut préférer stocker tous les résultats concernant les sommets dans un même tableau plutôt que de multiplier les objets à manipuler.

Manipulations basiques avec igraph

Le mini-script qui suit réplique la même suite d’opérations mais avec le package igraph (et avec un jeu de données différent, le fameux Zachary karate club dataset). Comme vous le verrez, les noms des fonctions se ressemblent parfois fortement. Mais, statnet et igraph ne pouvant être utilisés de façon simultanée, il convient tout d’abord de détacher le package statnet puis de charger le package igraph.

rm(list=ls()) #nettoyer l’espace de travail
detach(package:statnet) #détacher le package statnet
library(igraph) #charger le package igraph
library(igraphdata)#charger les jeux de données du package igraph
data(karate) #charger le jeu de données du Zachary karate club
g <- karate #lui donner un nom plus court
g #principales propriétés

Taper g donne le résultat suivant : IGRAPH U-W- 34 78 — Zachary’s karate club network + attr: name (g/c), Citation (g/c), Author (g/c), Faction (v/n), weight (e/n). Ce qui en termes compréhensibles se traduit de la manière suivante : le graphe est non-orienté (U undirected) et valué (W weighted), il comprend 34 sommets et 78 liens, son nom est Zachary’s karate club network et il comprend un certain nombre d’attributs : sur le graphe (g : nom, auteur et citation), sur les sommets (v comme vertex ) et sur les lien (e comme edge).

graph.density(g) #densité du graphe
comp.connexe <- clusters(g) # composantes connexes

La fonction clusters crée trois objets : un objet membership qui indique à quelle composante appartient chaque sommet ; un objet csize indiquant la taille des composantes connexes et enfin un objet no donnant le nombre de composantes connexes. Le graphe étant ici connexe, les résultats de cette commande sont d’un intérêt relatif.

deg <- degree(g) #degré des sommets
bet <- betweenness(g) #centralité d’intermédiarité
tab <- as.data.frame(cbind(deg, bet)) #création d’un tableau
head(tab,10) #examen des 10 premières lignes du tableau

Et c’est tout pour aujourd’hui… Dernier conseil pour finir : avec R, il est important de prendre son temps et d’examiner les problèmes de manière séquentielle. Si vous abordez R pour la première fois, vous ne pouvez pas en deux heures apprendre à importer vos données, à lancer et interpréter un modèle ERGM puis à produire une superbe visualisation. Mais, avec des recours réguliers aux rubriques d’aide, de petits scripts (abondamment commentés) que vous enrichissez au fur et à mesure (j’ai créé un tableau avec 2 indicateurs, il est facile d’en ajouter…), votre progression sera rapide et efficace.

Ressources en ligne

Ayant déjà souvent écrit sur l’analyse de réseaux avec R – et je ne compte pas m’arrêter là -, je me permets de renvoyer à ce billet publié il y a quelques mois.

1 Robin Cura est la personne  qui m’a permis de comprendre l’étendue de mon ignorance sur cet aspect crucial. Et il a évidemment raison : ♯ est un dièse, # est un croisillon….


9 réflexions au sujet de « L’analyse de réseaux avec R, les premiers pas »

  1. Bonjour,

    Je suis une étudiante en magister, et je prépare un mémoire sur l’impact des réseaux sociaux dans la recherche d’information. Dans mon travail, j’ai à analyser les données de mon réseau social pondéré avec trois métriques, qui sont betweenness, closeness et pagerank.
    Pouvez vous m’aider et m’orienter pour avoir les scripts de ces mesures ainsi que la façon d’importer un fichier de liens avec des poids.

    Merci.

    • Bonjour,

      pour l’importation d’un fichier de liens avec des poids, le plus simple est d’utiliser igraph : les deux premières colonnes doivent contenir les codes origine-destination, les colonnes suivantes seront considérées comme des attributs des liens (fonction graph.data.frame(données). Et si je reste avec igraph, pour analyser un graphe nommé g, les commandes sont betweenness(g), closeness(g) et page.rank(g). Attention, igraph ne tient pas compte de la valuation des liens. Pour analyser un réseau valué, voir le package tnet qui a fait l’objet d’un billet récemment.

  2. Bonjour,

    Aucune des commandes à partir de gden(d) ne marche chez moi. Voici le message marqué:

    Erreur dans is.bipartite(x) : Not a graph object

    Sachant que j’ai R 3.0.0 et RStudio 0.97.248

    Merci d’avance pour les éléments de réponses

    • Le message d’erreur que vous indiquez apparaît quand on tente d’appliquer une commande du package igraph à un objet non adapté. Mais gden() est une commande du package statnet… Donc vérifiez bien les premières lignes de votre script et ajoutez une commande class(g) pour connaître la nature de l’objet g.
      Si vous obtenez network, c’est bon, vous pouvez utiliser la fonction gden().
      Sinon, il faut le transformer (voir le second billet).

  3. Ping : Baptiste Coulmont » Liste de liens intéressants

  4. Bonjour,
    J’utilise R version 2.15.3 et RStudio 0.97.311 et la commande de chargement des données faux.magnolia.high donnée en exemple n’a fonctionné qu’en retirant les guillemets :

    data(“faux.magnolia.high”) #le chargement ne fonctionne pas
    data(faux.magnolia.high) #le chargement fonctionne
    Bien cordialement,

    • Bonjour,
      pour moi, cela fonctionne avec ou sans guillemets (version de R identique et RStudio 0.97.336). Et je n’ai pas d’explication logique à fournir, désolé…

  5. bonjour,
    je viens de découvrir le langage R3.0.0 et Rstudio.097.336 que j’ai installé récemment sur ​​mon ordinateur (windows 7 64bits). J’ai réussi à configurer R3.0.0 mais je n’arrive pas à faire la même chose avec la console intégrée de Rstudio 0.97.336. Pouvez vous m’expliquer comment faire pour obtenir l’édition des textes en français dans la fenêtre console de RStudio ?
    Merci d’avance.

    • Bonjour,

      le problème vient sans doute de l’installation de R (et non de RStudio). J’ai trouvé le problème inverse sur certains forums (utilisateurs anglophones ayant un texte en français dans la console) mais rien sur celui-ci. Je continue à chercher et vous tiens au courant.

Laisser un commentaire

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