Analyse de réseaux avec R Julien Barnier Groupe de Recherche sur la Socialisation CNRS UMR 5040 julien.barnier@ens-lyon.fr 26 janvier 2011 Table des matières 1 Présentation 1 1.1 R.................................................. 1 1.2 Extensions statnet....................................... 2 1.3 Convention typographique.................................... 2 1.4 Chargement de l extension.................................... 2 2 Importer des données 3 2.1 Import de données externes................................... 3 2.2 Jeux de données d exemple................................... 4 3 Visualisation 5 4 Indicateurs 9 4.1 Au niveau du réseau....................................... 9 4.2 Au niveau des sommets..................................... 10 5 Extraction de réseaux égocentrés 13 6 Attributs associés 14 7 Génération aléatoire de réseaux 16 8 Équivalence structurale et block modelling 17 9 Conclusion 18 1 Présentation 1.1 R R est un langage orienté vers le traitement, la manipulation et l analyse de données. Il s agit d un logiciel libre, gratuit, multiplateforme (il fonctionne à la fois sous Windows, Mac OS X et Linux), non commercial et issu du monde universitaire. R bénéficie d un très grand nombre d extensions (plus de 1500 actuellement) développées par la communauté des utilisateurs et permettant d ajouter des fonctionnalités ou des méthodes d analyse à celles déjà proposées par le «noyau» de R. Il est de plus en plus utilisé dans de nombreuses disciplines (biologie, écologie, finances, sciences sociales... ).
2 Analyse de réseaux sous R Du côté des inconvénients, on pourra citer son caractère essentiellement anglophone, et surtout un temps d apprentissage non négligeable. L utilisation de R s apparente en effet à celle d un langage de programmation (à un niveau plus ou moins poussé) et on ne dispose pas d une interface graphique complète qui faciliterait son utilisation. Site officiel : http://www.r-project.org/ Ce document n a pas pour ambition de fournir une introduction à R. De nombreux documents en anglais existent à ce sujet. On pourra également trouver une introduction en français et des liens vers d autres ressources à l adresse suivante : http://alea.fr.eu.org/pages/intro-r 1.2 Extensions statnet Plusieurs extensions pour R ont été développées pour la manipulation, la visualisation et l analyse de réseaux : network, sna, ergm, latentnet, dynamicnetwork.... Elles ont été réunies sous l égide d une extension unique baptisée statnet. Site officiel : http://statnetproject.org/ Plusieurs articles publiés début 2008 dans un numéro de la revue Journal of Statistical Software présentent de manière détaillée les extensions du projet statnet : http://www.jstatsoft.org/v24/ Ce document en est très largement tiré ; il ne présente cependant qu une petite partie, la plus simple, des fonctionnalités offertes par ces outils. 1.3 Convention typographique Dans ce qui suit, les commandes saisies dans R sont indiquées dans une police à chasse fixe bleue et précédées de l invite R>. Le résultat éventuel renvoyé par R est indiqué dans une police à chasse fixe rouge inclinée : R> 24 + 12 [1] 36 1.4 Chargement de l extension Pour utiliser l extension statnet et les outils qui la composent, il suffit de l installer classiquement à l aide de : R> install.packages("statnet", dependencies = TRUE) Une fois nistallée, il suffit de la charger via : R> library(statnet)
2. Importer des données 3 2 Importer des données 2.1 Import de données externes L import des données d un réseau peut se faire de différentes manières. On peut réutiliser des données provenant d autres logiciels comme Pajek (via la fonction read.paj), ou bien utiliser des données saisies dans une application de type tableur. Dans ce cas les données peuvent se présenter sous plusieurs formes, soit comme une matrice d adjacence : Soit comme une liste d arêtes : Dans les deux cas on pourra enregistrer ces données au format CSV (séparé par des virgules par exemple) et les importer dans R via la fonction read.table ou l une de ses variantes, par exemple : R> net.mat <- read.csv(file = "matrice_adjacence.csv", header = TRUE, + row.names = 1) R> net.mat A B C D E A 0 1 0 1 1 B 0 0 0 0 0 C 0 1 0 0 1 D 1 1 0 0 0 E 1 0 1 0 0 R> net.liste <- read.csv(file = "liste_aretes.csv", header = FALSE) R> net.liste V1 V2 1 A B 2 A D 3 A E 4 C B 5 C E 6 D A 7 D B 8 E A 9 E C
4 Analyse de réseaux sous R On transforme ensuite les objets ainsi créés en objets de type network à l aide de la fonction as.network 1 : R> net.mat <- as.network(as.matrix(net.mat)) R> net.liste <- as.network(net.liste) R> net.mat Network attributes: vertices = 5 directed = TRUE hyper = FALSE loops = FALSE multiple = FALSE bipartite = FALSE total edges= 9 missing edges= 0 non-missing edges= 9 Vertex attribute names: vertex.names R> net.liste Network attributes: vertices = 5 directed = TRUE hyper = FALSE loops = FALSE multiple = FALSE bipartite = FALSE total edges= 9 missing edges= 0 non-missing edges= 9 Vertex attribute names: vertex.names Dans les deux cas le résultat est exactement le même : R> all(net.mat[, ] == net.liste[, ]) [1] TRUE À noter qu il également très simple d exporter des objets de type réseau dans des formats d autres logiciels, dont le format DL utilisé par Pajek et UCINET (via la fonction write.dl). 2.2 Jeux de données d exemple Dans ce qui suit nous utiliserons deux jeux de données inclus dans les extensions de statnet. Le premier est nommé samplk, il est tiré de la célèbre observation par Sampson des relations entre moines dans un monastère en 1969. On le charge dans R de la manière suivante : R> data(samplk) 1. Dans le cas de l import d une matrice d adjacence, celle-ci étant importée comme un objet de type data frame elle doit d abord être convertie en objet de type matrix
3. Visualisation 5 Le réseau qui nous intéresse (et qui a été automatiquement chargé par la commande précédente) se nomme samplk3 et contient le réseau des relations d appréciations lors de la troisième interrogation : chacun des 18 moines du monastère devait désigner les trois autres moines pour lesquels il avait l appréciation (liking) la plus positive 2. Le second, nommé faux.mesa.high, est la reconstruction par simulation (pour des raisons d anonymisation) d un réseau de sociabilité entre élèves d un groupes d écoles rurales de l ouest des États-Unis. Il comprend 205 sommets et 203 arêtes (non-orientées). On le charge de la manière suivante : R> data(faux.mesa.high) Pour économiser quelques touches de clavier, on donnera à ces réseaux des noms un peu plus courts : R> samp <- samplk3 R> fmh <- faux.mesa.high Les sommets d un réseau peuvent être munis d un nom permettant de les identifier. La liste des noms peut-être affichée ou modifiée avec la fonction network.vertex.names. R> network.vertex.names(samp) [1] "Romul_10" "Bonaven_5" "Ambrose_9" "Berth_6" "Peter_4" "Louis_11" [7] "Victor_8" "Winf_12" "John_1" "Greg_2" "Hugh_14" "Boni_15" [13] "Mark_7" "Albert_16" "Amand_13" "Basil_3" "Elias_17" "Simp_18" 3 Visualisation La fonction de base pour visualiser les objets de type réseau est la fonction gplot. Elle produit par défaut une représentation optimisée par l algorithme de Fruchterman et Reingold : R> gplot(samp) 2. En réalité dans cette vague de mesure quelques moines ont donné quatre préférences.
6 Analyse de réseaux sous R Pour les graphes non orientés, on peut supprimer l affichage des arcs sous forme de flèches avec l argument gmode="graph". R> gplot(fmh, gmode = "graph")
3. Visualisation 7 De nombreuses options permettent de personnaliser la sortie graphique. L option mode, notamment, permet de choisir le mode de placement des sommets. De nombreuses possibilités sont offertes, on pourra se reporter à l aide de la fonction gplot.layout pour une liste exhaustive. R> par(mfrow = c(2, 3), mar = c(1, 1, 1, 1), cex = 1.5) R> gplot(samp, mode = "fruchtermanreingold", main = "Fruchterman-Reingold") R> gplot(samp, mode = "circle", main = "Circulaire") R> gplot(samp, usecurve = TRUE, main = "Arêtes courbées") R> gplot(samp, mode = "mds", main = "Multidimensional scaling") R> gplot(samp, mode = "random", main = "Aléatoire") R> gplot(samp, mode = "kamadakawai", main = "Kamada-Kawai") Fruchterman Reingold Circulaire Arêtes courbées Multidimensional scaling Aléatoire Kamada Kawai L option interactive=true permet de modifier manuellement le placement de certains sommets. Lorsqu on a une présentation satisfaisante, on peut enregistrer le résultat sous forme d image à l aide de la fonction dev.print. R> gplot(samp, interactive = TRUE) R> dev.print(device = png, file = "graph.png", width = 700) statnet permet également une représentation d un réseau en 3 dimensions avec possibilités de zoom et de rotation interactives, ceci grâce à la fonction gplot3d : R> gplot3d(samp) Ce qui peut donner quelque chose comme l image suivante :
8 Analyse de réseaux sous R Enfin, de très nombreuses options permettent de personnaliser l affichage. Parmi celles-ci on notera displaylabels qui permet d afficher les noms des sommets, label.pos qui détermine leur position (une valeur de 5 remplace le sommet par son label), displayisolates qui détermine si on affiche ou non les sommets isolés, vertex.cex et vertex.col qui fixent la taille et la couleur des sommets, etc. R> gplot(samp, label = network.vertex.names(samp), boxed.labels = TRUE, + label.col = "blue", label.pos = 5, label.cex = 0.85) Basil_3 Elias_17 Simp_18 Amand_13 Romul_10 Bonaven_5 Peter_4 John_1 Berth_6 Greg_2 Ambrose_9 Mark_7 Winf_12 Louis_11 Victor_8 Albert_16 Boni_15 Hugh_14 Enfin, on peut représenter graphiquement le réseau sous la forme de sa matrice d adjacence : R> plot.sociomatrix(samp, diaglab = FALSE, cex.lab = 0.7, labels = list(1:18, + 1:18))
4. Indicateurs 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 4 Indicateurs statnet, via l extension sna, propose la plupart des indicateurs utilisés pour la description des réseaux et de ses éléments. On ne citera ici que certains des plus connus. 4.1 Au niveau du réseau La densité d un réseau peut être obtenue avec la fonction gden 3 : R> gden(samp) [1] 0.1830065 R> gden(fmh, mode = "graph") [1] 0.009708274 Une série de fonctions permettent de calculer des scores au niveau de l ensemble du réseau, comme son niveau de réciprocité (s il existe un arc de A vers B, il existe un arc de B vers A) avec la fonction grecip, de transitivité (si j ai un lien de A vers B et un lien de B vers C, alors j ai un lien de A vers C) à l aide de la fonction gtrans, ou de connexité (y a-t-il des sommets pour lesquels il n existe pas de chemin les reliant) avec connectedness : R> grecip(samp) Mut 0.8300654 R> grecip(fmh) 3. Par défaut la diagonale de la matrice d adjacence n est pas prise en compte pour le calcul de la densité. Ce comportement peut être modifié par l option diag.
10 Analyse de réseaux sous R Mut 1 R> gtrans(samp) [1] 0.3475177 R> gtrans(fmh) [1] 0.2822458 R> connectedness(samp) [1] 1 R> connectedness(fmh) [1] 0.3428025 4.2 Au niveau des sommets Les degrés des sommets d un réseau sont calculés par la fonction degree. L option cmode permet d indiquer si on souhaite les degrés entrants (indegree), sortants (outdegree), ou totaux (freeman). R> degree(samp, cmode = "indegree") [1] 0 6 4 2 4 2 2 6 4 6 2 2 5 1 2 3 2 3 R> degree(samp, cmode = "outdegree") [1] 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 R> degree(samp, cmode = "freeman") [1] 4 9 7 5 7 5 5 9 7 9 5 5 8 4 5 7 5 6 On peut faciliter la lecture des degrés en les triant et en en faisant une représentation graphique. R> in.degs <- degree(samp, cmode = "indegree") R> names(in.degs) <- network.vertex.names(samp) R> in.degs <- sort(in.degs) R> in.degs Romul_10 Albert_16 Berth_6 Louis_11 Victor_8 Hugh_14 Boni_15 Amand_13 0 1 2 2 2 2 2 2 Elias_17 Basil_3 Simp_18 Ambrose_9 Peter_4 John_1 Mark_7 Bonaven_5 2 3 3 4 4 4 5 6 Winf_12 Greg_2 6 6 R> dotchart(in.degs, main = "Degrés entrants")
4.2 Au niveau des sommets 11 Degrés entrants Greg_2 Winf_12 Bonaven_5 Mark_7 John_1 Peter_4 Ambrose_9 Simp_18 Basil_3 Elias_17 Amand_13 Boni_15 Hugh_14 Victor_8 Louis_11 Berth_6 Albert_16 Romul_10 0 1 2 3 4 5 6 Si on a un grand nombre de sommets, on peut étudier le tri à plat des degrés. R> table(degree(fmh)) 0 2 4 6 8 10 12 14 16 18 20 26 57 51 30 28 18 10 2 4 1 2 1 1 D autres fonctions calculent des caractéristiques ou des scores au niveau de chaque sommet. On citera notamment (mais de manière non exhaustive) closeness, qui indique le degré de proximité d un sommet par rapport à l ensemble des autres sommets, et betweenness, qui indique si le sommet se trouve sur un grand nombre de plus courts chemins non-redondants entre d autres sommets, ou infocent, qui donne une indication sur le niveau de centralité vis-à-vis de la circulation de l information. R> closeness(samp) [1] 0.4473684 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 [9] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 [17] 0.0000000 0.0000000 R> betweenness(samp) [1] 0.000000 63.750000 37.333333 1.916667 19.166667 27.833333 3.500000 52.500000 [9] 97.166667 34.166667 29.000000 4.083333 22.000000 4.333333 68.000000 97.916667 [17] 0.500000 5.833333 R> infocent(samp) [1] 1.607432 1.823694 1.750582 1.465169 1.602282 1.590275 1.464480 1.985122 [9] 1.659182 1.960935 1.694324 1.732413 1.778565 1.360643 1.908801 1.566943 [17] 1.337745 1.561809 R> par(mfrow = c(1, 3), cex = 1.5) R> gplot(samp, vertex.cex = closeness(samp) * 10, main = "closeness") R> gplot(samp, vertex.cex = betweenness(samp)/10, main = "betweenness") R> gplot(samp, vertex.cex = infocent(samp) * 2, main = "infocent")
12 Analyse de réseaux sous R closeness betweenness infocent Enfin, la fonction geodist donne, pour chaque paire de sommets du réseau, le nombre de chemins entre ces deux sommets et la longueur du chemin le plus court : R> geodist(samp) $counts [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [1,] 1 1 1 1 1 2 1 1 1 3 2 3 1 1 [2,] 0 1 1 1 1 1 2 1 2 1 1 1 1 1 [3,] 0 1 1 1 2 1 1 1 1 1 2 3 1 1 [4,] 0 1 1 1 1 2 1 1 1 1 2 2 1 1 [5,] 0 1 2 1 1 1 1 3 1 4 1 1 4 4 [,15] [,16] [,17] [,18] [1,] 1 1 1 1 [2,] 2 2 2 2 [3,] 1 1 1 1 [4,] 1 1 1 1 [5,] 1 1 1 1 [getoption("max.print") est atteint -- 13 lignes omises ]] $gdist [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [1,] 0 1 1 2 1 2 2 2 3 3 3 4 2 3 [2,] Inf 0 1 2 1 1 2 2 3 3 2 3 3 4 [3,] Inf 1 0 2 2 2 1 1 2 2 3 4 2 3 [4,] Inf 1 1 0 1 2 2 2 3 3 3 4 3 4 [5,] Inf 1 2 1 0 1 2 3 3 4 2 3 4 5 [,15] [,16] [,17] [,18] [1,] 1 3 3 2 [2,] 5 4 5 5 [3,] 4 3 4 4 [4,] 5 4 5 5 [5,] 5 4 5 5 [getoption("max.print") est atteint -- 13 lignes omises ]] Pour le détail du calcul de ces indicateurs on se référera à la page d aide de chaque fonction. De nombreuses autres fonctions sont disponibles, dont on pourra avoir une liste dans l aide de l extension sna ou en tapant : R> help(package = sna)
5. Extraction de réseaux égocentrés 13 5 Extraction de réseaux égocentrés La fonction ego.extract permet d extraire un réseau égocentré d un réseau complet. Par exemple : R> samp.1 <- ego.extract(samp, ego = 1) R> gplot(samp.1, displaylabels = TRUE, label = colnames(samp.1)) Peter_4 Romul_10 Ambrose_9 Bonaven_5 Amand_13 La fonction neighborhood permet de calculer les voisins de chaque sommet à différents ordres sous forme de matrice d adjacence. Pour avoir les voisins directs (d ordre 1) et les voisins d ordre 2, on peut faire : R> neighborhood(samp, 1) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [2,] 1 0 1 1 1 1 0 0 0 0 0 0 0 0 [3,] 1 1 0 1 0 0 1 0 0 0 0 0 0 0 [4,] 0 0 0 0 1 0 1 0 0 0 0 0 0 0 [5,] 1 1 0 1 0 0 1 0 0 0 0 0 0 0 [,15] [,16] [,17] [,18] [1,] 0 0 0 0 [2,] 1 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 [5,] 0 0 0 0 [getoption("max.print") est atteint -- 13 lignes omises ]] R> neighborhood(samp, 2) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14 Analyse de réseaux sous R [2,] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 [3,] 0 0 0 0 1 1 0 0 0 0 0 0 0 0 [4,] 1 1 1 0 0 1 0 0 0 0 0 0 0 0 [5,] 0 0 1 0 0 1 0 0 0 0 0 0 0 0 [,15] [,16] [,17] [,18] [1,] 0 0 0 0 [2,] 0 1 0 0 [3,] 1 0 0 0 [4,] 0 0 0 0 [5,] 1 0 0 0 [getoption("max.print") est atteint -- 13 lignes omises ]] 6 Attributs associés Des variables supplémentaires peuvent être associées aux sommets du réseau. C est le cas du réseau de sociabilité fmh, qui contient en données associées le sexe et la classe (grade) des enquêtés. On peut accéder à ces attributs via la fonction get.vertex.attribute. R> sexe <- get.vertex.attribute(fmh, "Sex") R> table(sexe) sexe F M 99 106 On peut ensuite représenter la valeur de ces attributs dans la représentation du réseau, par exemple en différenciant filles et garçons : R> sexe <- get.vertex.attribute(fmh, "Sex") R> sexe[sexe == "M"] <- "blue" R> sexe[sexe == "F"] <- "red" R> gplot(fmh, vertex.col = sexe, gmode = "graph") R> legend("topright", c("garçon", "Fille"), pch = 19, col = c("blue", + "red"))
6. Attributs associés 15 Garçon Fille Pour obtenir le nombre de relations en fonction des valeurs d un attribut, on peut utiliser la fonction mixingmatrix de la manière suivante : R> tab.sex <- mixingmatrix(fmh, "Sex") R> tab.sex Note: Marginal totals can be misleading for undirected mixing matrices. F M F 82 71 M 71 50 R> tab.grade <- mixingmatrix(fmh, "Grade") R> tab.grade Note: Marginal totals can be misleading for undirected mixing matrices. 7 8 9 10 11 12 7 75 0 0 1 1 1 8 0 33 2 4 2 1 9 0 2 23 7 6 4 10 1 4 7 9 1 5 11 1 2 6 1 17 5 12 1 1 4 5 5 6 Les valeurs plus importantes sur la diagonale du deuxième tableau montrent que les relations de sociabilité sont plus fréquentes entre élèves d un même niveau, ce qui paraît plutôt logique. On peut tester l hypothèse avec un classique test du χ 2 : R> chisq.test(tab.sex[[2]]) Pearson's Chi-squared test with Yates' continuity correction
16 Analyse de réseaux sous R data: tab.sex[[2]] X-squared = 0.5168, df = 1, p-value = 0.4722 R> chisq.test(tab.grade[[2]]) Pearson's Chi-squared test data: tab.grade[[2]] X-squared = 409.5596, df = 25, p-value < 2.2e-16 7 Génération aléatoire de réseaux On a vu précédemment que le niveau de réciprocité dans le cas du réseau de préférence des moines était de 0,83. Cette valeur est-elle particulièrement élevée ou non? R> grecip(samp) Mut 0.8300654 Pour le savoir, on peut utiliser des méthodes de simulation et générer aléatoirement un grand nombre de réseaux semblables : la fonction rgraph est faite pour cela. On peut ainsi générer 1000 réseaux de 18 sommets ayant la même densité que notre réseau d intérêt de la manière suivante : R> graphs <- rgraph(18, m = 1000, tprob = gden(samp)) Puis on peut calculer le niveau de réciprocité de chacun de ces réseaux et représenter leur répartition : R> recip <- apply(graphs, 1, grecip) R> mean(recip) [1] 0.7014837 R> hist(recip, main = "Niveaux de réciprocité", xlab = "grecip") Niveaux de réciprocité Frequency 0 50 100 150 200 0.55 0.60 0.65 0.70 0.75 0.80 grecip
8. Équivalence structurale et block modelling 17 Au final, sur 1000 réseaux générés aléatoirement, combien ont un niveau de réciprocité au moins égal à celui de notre réseau d intérêt? R> sum(recip >= grecip(samp)) [1] 0 On peut donc penser que le niveau de réciprocité observé est significativement élevé. 8 Équivalence structurale et block modelling La fonction equiv.clust calcule une matrice de scores de similarité entre sommets du réseau afin d essayer de mesurer leur équivalence structurale (deux sommets sont strictement équivalents structuralement s ils sont reliés de la même manière aux mêmes sommets). Plusieurs types de scores sont possibles, ceux-ci sont décrits dans l aide de la fonction sedist. Une classification hiérarchique est ensuite effectuée à partir de cette matrice. Cette classification peutêtre représentée sous forme de dendrogramme. R> eq <- equiv.clust(samp) R> plot(eq) Cluster Dendrogram 17 18 Height 0 5 10 15 6 3 5 2 7 1 4 15 16 9 11 12 14 8 10 13 as.dist(equiv.dist) hclust (*, "complete") L opération suivante consiste à choisir un nombre de groupes et à couper le dendrogramme au niveau désiré. Ceci se fait via la fonction blockmodel. R> nbgroups <- 3 R> bm <- blockmodel(samp, eq, k = nbgroups) On peut ensuite représenter graphiquement la répartition des groupes dans le réseau.
18 Analyse de réseaux sous R R> groupes <- bm$block.membership[order(bm$order.vector)] R> gplot(samp, vertex.col = groupes, vertex.cex = 1.5) R> legend("topright", legend = paste("bloc", 1:nbgroups), pch = 19, + col = 1:nbgroups) Bloc 1 Bloc 2 Bloc 3 Enfin, l objet résultant de l utilisation de la fonction blockmodel permet de visualiser le résultat de la réduction en blocs. Cette réduction peut être de différents types, par défaut blockmodel utilise la densité. On se réfèrera à l aide de la fonction pour une liste des réductions possible. R> bm$block.model Block 1 Block 2 Block 3 Block 1 0.45238095 0.04081633 0.03571429 Block 2 0.00000000 0.47619048 0.03571429 Block 3 0.03571429 0.14285714 0.66666667 Cette réduction montre une densité élevée à l intérieur de chaque bloc (sur la diagonale) : les individus de chaque groupe ont tendance à s apprécier mutuellement. Inversement, les densités entre les blocs sont faibles, voire nulle dans le cas du bloc 2 vers le bloc 1, ce qui signifie que les membres des différents blocs ont tendance à peu s apprécier, à l exception peut-être des membres du bloc 3 envers les membres du bloc 2. 9 Conclusion Ceci n est qu un petit aperçu des fonctionnalités les plus simples d analyse de réseaux sous R. De nombreuses possibilités n ont même pas été évoquées dans ce document, parmi lesquelles les techniques de comparaison de réseaux, la modélisation ou des outils permettant le traitement et l animation de réseaux longitudinaux.
9. Conclusion 19 Pour conclure, signalons que l utilisation des outils d analyse de réseaux sous R présente des avantages intéressants, notamment une grande souplesse dans son utilisation et une articulation simple et directe avec les autres méthodes d analyse de données fournies par R : tests, statistique multivariée, régressions, cartographie.... Enfin, les fonctions fournies par les extensions de statnet sont parfaitement évolutives, leur code source est disponible, et elles peuvent servir de base à de nouveaux développements, ceci permettant de s appuyer sur une base solide pour la production de nouveaux outils. Pour aller plus loin, de nombreuses ressources (en anglais) sont accessibles depuis le site officiel du projet statnet : http://statnetproject.org/ Et on consultera tout particulièrement l ensemble des articles du volume 24 du Journal of statistical software : http://www.jstatsoft.org/v24