tnet : package R pour l’analyse de réseaux valués

La plupart des packages disponibles dans R permettent l’analyse de réseaux booléens (1 s’il existe une relation entre deux sommets i et j, 0 sinon) mais, si l’on souhaite étudier des réseaux valués (l’intensité des liens est variable entre les sommets), le choix est plus restreint. tnet est un package R maintenu par Tore Opsahl permettant l’analyse de réseaux valués simples et celle de réseaux bipartis et longitudinaux non valués. Le package est bien documenté, le site de Tore Opsahl est riche (http://toreopsahl.com/tnet/), cela méritait donc un billet un peu détaillé. Précision liminaire : tnet permet l’analyse mais non la visualisation des graphes, en effet, les objets manipulés par tnet sont de simples data.frame.

Je suppose pour la suite que R et le package tnet sont installés sur vos machines (voir les billets consacrés à R sur ce blog ou la foultitude de documentation disponible en français et en ligne sur le sujet).

Format des données et importation

Plusieurs jeux de données, classiques (le fameux Davis’ Southern Women Club) ou plus récents, sont disponibles dans tnet (voir la description détaillée sur la page http://toreopsahl.com/datasets/). Qu’on souhaite s’entraîner avec ou pas, il est intéressant d’y jeter un œil pour comprendre la structure des données. Elle est on ne peut plus simple : 3 colonnes origine – destination – intensité. Les attributs des sommets seront importés dans un fichier séparé. Si le réseau one-mode est non orienté, les liens devront être entrés deux fois (i-j et j-i). Les codes des sommets doivent être numériques et commencer par 1. La fonction as.tnet(jeu-de-données) permet de contrôler que la structure des données est correcte. Enfin, pour éviter la prise en compte des sommets isolés, la fonction compress_ids les supprime avant calcul.

Les fonctions se terminant par _w permettent l’analyse des réseaux valués (weighted), celles se terminant par _tm l’analyse des graphes bipartis (two-mode) et celles terminées par _l l’étude des réseaux longitudinaux.

Analyse des graphes valués one-mode

Le principe des mesures disponibles est simple : on fait varier un paramètre entre 0 – pas de prise en compte de l’intensité des liens – et 1 – prise en compte complète de l’intensité des liens. Il n’y a pas de recette miracle pour choisir le bon seuil et tout dépend de l’étendue des intensités : plus celle-ci  est grande, plus le paramètre devra être proche de zéro. Le petit graphe ci-dessous servira d’exemple pour cette partie :

tnet1

Pour le créer directement dans R :

rm(list=ls())
 library(tnet)
g <- rbind(c(1,2,3), c(2,1,3),
           c(1,3,4), c(3,1,4),
           c(2,3,1), c(3,2,1),
           c(3,4,2), c(4,3,2),
           c(4,5,1), c(5,4,1))

En pratique, mieux vaut évidemment importer ses données…

Les principales fonctions disponibles sont les suivantes :

degree_w(g) fournit un tableau à 3 colonnes : identifiant du sommet, degré et sommes des intensités des liens adjacents. Si je contrôle sur la figure, je vois par exemple que le sommet 3 a trois liens adjacents (degré) et que la somme des valeurs de ces trois liens est bien égale à 7 (4 + 2 + 1).

node degree output
 [1,] 1    2    7
 [2,] 2    2    4
 [3,] 3    3    7
 [4,] 4    2    3
 [5,] 5    1    1

closeness_w fournit un tableau de 3 colonnes : identifiant du sommet, centralité de proximité et centralité de proximité normalisée. La centralité mesurée ne repose pas sur le nombre de liens comme c’est le cas habituellement en analyse de réseau mais sur la somme des valeurs des liens parcourus. En d’autres termes, chaque intensité est assimilée à un coût et l’objectif est de trouver les chemins entre sommets minimisant ces coûts.

clustering_local_w et clustering_w fournissent les clustering coefficients locaux et globaux. Plusieurs prises en compte des intensités sont possibles avec l’argument measure = » ». Les principales options sont « am » (moyenne arithmétique, valeur par défaut de l’argument), « gm » (moyenne géométrique), « mi » et « ma » (respectivement minimum et maximum) et enfin « bi » (binaire). Dans ce dernier cas, l’intensité des liens n’est pas  utilisée.

D’autres fonctions et mesures sont disponibles (rich club coefficient global et local) mais il est fortement conseillé de relire attentivement les billets et articles de Tore Opsahl pour les utiliser à bon escient.

Analyse des graphes bipartis…

La structure des données est la même : origine – destination – intensité et, là encore, les deux ensembles de sommets doivent être numérotés de 1 à n. Attention donc à ne pas s’emmêler les pinceaux lors de la mise en forme… L’option type de la fonction as.tnet as.tnet(jeu-de-données, type= »weighted two-mode tnet ») – permet de contrôler la structure des données.

Les principales mesures disponibles sont la mesure de la distance (distance_tm()), le clustering coefficient global (clustering_tm()) et le clustering coefficient local (clustering_local-tm()). Là encore, mieux vaut relire d’abord ses articles et billets : ces mesures sont des propositions a priori pertinentes, ce ne sont pas (pas encore ?) des mesures communément utilisées.

… et analyse des réseaux longitudinaux

 Le package propose en tout en pour tout deux fonctions dont l’une (growth_l) qui prétend identifier les mécanismes responsables de l’apparition de liens entre  les sommets. Ayant à ce jour une connaissance fort limitée de l’analyse des réseaux longitudinaux,  je préfère ne pas m’avancer plus avant…

Dernier point : je déconseille en temps normal l’utilisation de packages développés et maintenus par une seule personne, le risque est en effet grand qu’il cesse brusquement d’être mis à jour avant de disparaître… Si je fais une exception pour celui-ci, c’est en grande partie due à la très grande qualité du site de Tore Opshal. Mais ce jeune homme (cf sa photo ici) travaillant dans le secteur privé, ne vous attachez quand même pas trop à son package….

 

 


Laisser un commentaire

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