Introduction

L’affirmation souvent répétée selon laquelle « nous vivons dans un monde connecté » reflète peut-être le mieux : dans sa simplicité, pourquoi les réseaux ont suscité un tel intérêt ces dernières années. Depuis des réseaux sociaux en ligne comme Facebook au World Wide Web et à Internet lui-même, nous sommes entourés d’exemples de façons dont nous interagissons les uns avec les autres. De la même manière, nous sommes également connectés au niveau de diverses institutions humaines (par exemple le gouvernements), les processus (par exemple, les économies) et les infrastructures (par exemple, le transport aérien mondial) . Et bien sûr, les humains ne sont certainement pas les seuls à être membres de diverses systèmes complexes et interconnectés. En regardant le monde naturel qui nous entoure, nous voyons une multitude d’exemples de tels systèmes, depuis des écosystèmes entiers jusqu’à l’alimentation biologique des toiles, à des collections de gènes en interaction ou de neurones communicants.

les types de neurone : Visualiser et caractériser les réseaux, Modélisation et inférence de réseau,Processus réseau.

Différents outils sont disponibles pour l’analyse du réseau. Certains d’entre eux sont autonomes programmes, comme l’outil Pajek basé sur Windows ou Gephi basé sur Java, tandis que d’autres sont intégrés dans un environnement de programmation et sont essentiellement utilisés comme bibliothèque de programmation. Quelques exemples de ces derniers sont NetworkX en Python et igraph dans R. Dans notre cas nous allons utilisé R.

Le code R nécessite un certain nombre d’ensembles de données et de packages R. Nous avons collecté les ensembles de données dans un package R autonome appelé sand (c’est-à-dire pour « statistiques » analyse des données du réseau’).

Nous allons installe le package Sand en excécutant le codé install package(sand)

Manipulation des données réseau

Création de graphiques de réseau

Graphiques non orientés et dirigés

Formellement, un graphe \(G =(V, E)\) est une structure mathématique constituée d’un ensemble V de sommets (également appelés nœuds) et un ensemble E d’arêtes (également appelés liens), où les éléments de E sont des paires non ordonnées \({u, v}\) de sommets distincts \(u\), \(v ∈ V\). Le nombre de sommets \(N_v = |V|\) et le nombre d’arêtes \(N_e = |E|\) sont parfois appelé l’ordre et la taille du graphe G, respectivement. Souvent, et sans perte de généralité2, nous étiqueterons les sommets simplement avec les entiers \(1,..., Nv\), et les bords, de manière analogue.

Dans igraph, il existe une classe « igraph » pour les graphiques. Dans cette section, nous verrons un nombre de façons de créer un objet de la classe igraph dans R, et diverses façons d’extraire et résumer les informations contenues dans cet objet.

library(igraph)
## Warning: package 'igraph' was built under R version 4.2.3
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
g <- graph_from_literal(1-2, 1-3, 2-3, 2-4, 3-5, 4-5,4-6, 4-7, 5-6, 6-7)

crée un objet graphique g avec \(N_v = 7\) sommets et Ne = 10 arêtes

V(g)
## + 7/7 vertices, named, from 173165f:
## [1] 1 2 3 4 5 6 7
E(g)
## + 10/10 edges from 173165f (vertex names):
##  [1] 1--2 1--3 2--3 2--4 3--5 4--5 4--6 4--7 5--6 6--7

Ces mêmes informations, combinées et sous un format légèrement différent, sont récupérées facilement en utilisant la fonction print_all.

 print_all(g)
## IGRAPH 173165f UN-- 7 10 -- 
## + attr: name (v/c)
## + edges (vertex names):
## 1 -- 2, 3
## 2 -- 1, 3, 4
## 3 -- 1, 2, 5
## 4 -- 2, 5, 6, 7
## 5 -- 3, 4, 6
## 6 -- 4, 5, 7
## 7 -- 4, 6

Une représentation visuelle de ce graphique, générée simplement via la commande plot

plot(g)

Le caractère \(U\) vu accompagnant le résumé de \(g\) ci-dessus indique que notre le graphe n’est pas orienté, en ce sens qu’il n’y a pas d’ordre dans les sommets définissant une arête.Un graphe G pour lequel chaque arête de \(E\) a un ordre à ses sommets (c’est-à-dire de sorte que \({u, v}\) est distinct de \({v, u}\), car u, v ∈ V) est appelé graphe orienté ou digraphe. De tels bords sont appelés arêtes ou arcs dirigés, avec la direction d’un arc \({u, v}\) lue de gauche à droite, de la queue u à la tête \(v\)

Les arêtes dirigées dans graph_from_literal sont indiquées à l’aide d’un moins/plus convention. Sur la figure , à droite, est montré un exemple de digraphe composé de trois sommets, avec deux arêtes dirigées et une arête mutuelle.

dg <- graph_from_literal(1-+2, 1-+3, 2++3)
 plot(dg)

Nous notons qu’en définissant les deux graphiques ci-dessus, nous avons utilisé la convention standard consistant à étiqueter les sommets avec les nombres de \(1\) à \(N_v\), qui est également la convention par défaut en igraph. Dans la pratique, cependant, nous disposons peut-être déjà de labels naturels, tels que noms de personnes dans un réseau social ou de gènes dans un réseau de régulation génétique. Tel les étiquettes peuvent être utilisées à la place du choix par défaut en générant le graphique avec elles explicitement.

dg <- graph_from_literal(Sam-+Mary, Sam-+Tom, Mary++Tom)
 print_all(dg)
## IGRAPH 1b65c85 DN-- 3 4 -- 
## + attr: name (v/c)
## + edges from 1b65c85 (vertex names):
## [1] Sam ->Mary Sam ->Tom  Mary->Tom  Tom ->Mary
 plot(dg)

Représentations pour les graphiques

En réalité, nous ne nous attendons généralement pas à saisir un graphique à la main, puisque la plupart des réseaux rencontrés en pratique ont au moins des dizaines de sommets et d’arêtes, voire des dizaines de milliers (voire des millions !). Au lieu de cela, les informations permettant de construire un graphe de réseau sont généralement sera stocké dans un fichier de données. Au niveau le plus élémentaire, il existe trois formats de base : listes de contiguïté, listes de contours et matrices de contiguïté.

Une représentation en liste d’adjacence d’un graphe \(G\) est simplement un tableau de taille \(N_v\),ordonné par rapport à l’ordre des sommets de \(V\), dont chaque élément est une liste, où la ième liste contient l’ensemble de tous les sommets \(j\) pour lesquels il y a une arêtede \(i\) à \(j\). C’est la représentation habituellement utilisée par igraph, évidente dans la sortie à partir de la fonction print_all dans les exemples ci-dessus.

Une liste d’arêtes est une simple liste à deux colonnes de toutes les paires de sommets jointes par unbord. Dans igraph, les listes d’arêtes sont implicites, par exemple, dans le renvoi de l’ensemble d’arêtes \(E\).

 E(dg)
## + 4/4 edges from 1b65c85 (vertex names):
## [1] Sam ->Mary Sam ->Tom  Mary->Tom  Tom ->Mary
as_adjacency_matrix(g)
## 7 x 7 sparse Matrix of class "dgCMatrix"
##   1 2 3 4 5 6 7
## 1 . 1 1 . . . .
## 2 1 . 1 1 . . .
## 3 1 1 . . 1 . .
## 4 . 1 . . 1 1 1
## 5 . . 1 1 . 1 .
## 6 . . . 1 1 . 1
## 7 . . . 1 . 1 .

Opérations sur le graphique

Un ou plusieurs graphiques dans lesquels nous sommes capables de charger peuvent ne pas être le graphique que nous souhaitons finalement. Diverses opérations sur le(s) graphique(s) dont nous disposons peuvent être nécessaires, notamment extraire une partie d’un graphique, supprimer des sommets, ajouter des arêtes ou même combiner plusieurs graphiques.

 h <- induced_subgraph(g, 1:5)
 print_all(h)
## IGRAPH 258bc3a UN-- 5 6 -- 
## + attr: name (v/c)
## + edges from 258bc3a (vertex names):
## [1] 1--2 1--3 2--3 2--4 3--5 4--5

L’inclusion ou l’exclusion de sommets ou d’arêtes dans un graphe \(G = (V, E)\) peut être conçue comme l’application d’opérateurs d’addition ou de soustraction, respectivement, au définit \(V\) et \(E\). Par exemple, le sous-graphe h généré juste au-dessus pourrait également avoir été créé à partir de \(g\) en supprimant les sommets 6 et 7.

 h <- g - vertices(c(6,7))

De même, g peut être récupéré à partir de h en ajoutant d’abord ces deux sommets, et puis, en ajoutant les bords appropriés.

 h <- h + vertices(c(6,7))
g <- h + edges(c(4,6),c(4,7),c(5,6),c(6,7))

Enfin, les concepts fondamentaux de la théorie des ensembles d’union, d’union disjointe, d’intersection, de différence et de complément s’étendent tous de façon naturelle aux graphes. Par exemple, le l’union de deux graphes, disons \(H_1\) et \(H_2\), est un graphe G dans lequel les sommets et les arêtes sont inclus si et seulement s’ils sont inclus dans au moins l’un des \(H_1\) ou \(H_2\). Par exemple, notre Le graphe jouet g peut être créé par l’union du sous-graphe (induit) h défini ci-dessus et un deuxième sous-graphe correctement défini

 h1 <- h
 h2 <- graph_from_literal(4-6, 4-7, 5-6, 6-7)
 g <- union(h1,h2)
 plot(g)

Décoration de graphiques de réseau

Attributs de sommet, d’arête et de graphique

Au cœur d’une représentation en réseau des données d’un système complexe se trouvera être un graphique. Mais il arrive souvent que d’autres données pertinentes soient également disponibles. Dans une perspective centrée sur le réseau, ces autres données peuvent être considérées comme des attributs, c’est-à-dire valeurs associées au graphe de réseau correspondant. Equiper un graphique avec ces attributs sont appelés décoration du graphique.

V(dg)$name
## [1] "Sam"  "Mary" "Tom"
V(dg)$gender <- c("M","F","M")

A noter que la notion d’attributs de sommet peut également être utilisée avantageusement pour équiper sommets avec des propriétés au cours d’une analyse, soit en entrée, soit en sortie à partir de calculs dans R. Par exemple, cela pourrait signifier associer la couleur rouge avec nos sommets. De la même manière, les attributs de bord sont des valeurs de variables indexées par des paires de sommets adjacents et, comme pour les attributs de sommet, ils peuvent être à la fois de type discret ou continu.

V(g)$color <- "red"
is_weighted(g)
## [1] FALSE
wg <- g
plot(wg)

 E(wg)$weight <- runif(ecount(wg))
 is_weighted(wg)
## [1] TRUE
 g$name <- "Toy Graph"

Using Data Frames

Tout comme les graphiques de réseau ne sont généralement pas saisis à la main pour les graphiques de toute nature non triviale, mais sont plutôt codés dans des trames de données et des fichiers, de même les attributs ont tendance àêtre codés de la même manière.

Considérons, par exemple, l’ensemble de données avocat de Lazega [5]. Collecter des informations sur les relations de travail collaboratives, sous forme d’une liste d’arêtes, dans le bloc de données elist.lazega, et les différents attributs de sommet variables, dans la trame de données v.attr.lazega, elles peuvent être combinées en une seule objet graphique dans igraph comme.

 library(sand)
## Warning: package 'sand' was built under R version 4.2.3
## Loading required package: igraphdata
## Warning: package 'igraphdata' was built under R version 4.2.3
## 
## Statistical Analysis of Network Data with R, 2nd Edition
## Type in C2 (+ENTER) to start with Chapter 2.
g.lazega <- graph_from_data_frame(elist.lazega,directed="FALSE",vertices=v.attr.lazega)
 g.lazega$name <- "Lazega Lawyers"

Notre ensemble complet d’informations sur le réseau à ce sujet et les avocats se composent désormais. Paires qui ont déclaré travailler ensemble, ainsi que les huit attributs de sommet.

vcount(g.lazega)
## [1] 36
ecount(g.lazega)
## [1] 115
vertex_attr_names(g.lazega)
## [1] "name"      "Seniority" "Status"    "Gender"    "Office"    "Years"    
## [7] "Age"       "Practice"  "School"
plot(g.lazega)

Parler de graphiques

Concepts de base des graphiques

Avec l’adoption d’un cadre basé sur des graphiques pour représenter les données relationnelles dans l’analyse de réseau, nous héritons d’un vocabulaire riche pour discuter de divers concepts importants liés aux graphiques. Nous passons brièvement en revue et démontrons ici quelques-uns d’entre eux, comme ils sont nécessaires pour effectuer même les analyses de réseau les plus élémentaires.

is_simple(g)
## [1] TRUE

Mais dupliquer l’arête entre les sommets 2 et 3, par exemple, donne un multi-graphe.

mg <- g + edge(2,3)
 print_all(mg)
## IGRAPH 310868c UN-- 7 11 -- Toy Graph
## + attr: name (g/c), name (v/c), color (v/c)
## + edges (vertex names):
## 1 -- 2, 3
## 2 -- 1, 3, 3, 4
## 3 -- 1, 2, 2, 5
## 4 -- 2, 5, 6, 7
## 5 -- 3, 4, 6
## 6 -- 4, 5, 7
## 7 -- 4, 6

Vérifier si un graphe de réseau est simple ou non est une étape préliminaire quelque peu triviale mais néanmoins importante dans une analyse de réseau typique, comme de nombreux les modèles et les méthodes supposent que le graphe d’entrée est simple ou se comporte différemment s’il n’est pas.

Notez qu’il est simple, et en fait pas rare en pratique, de transformer un multi-graphe en un graphe pondéré, dans lequel chaque arête propre résultante est équipée avec un poids égal à la multiplicité de cette arête dans le multi-graphe original. Par exemple, la conversion de notre mg multi-graphique jouet en un graphique pondéré donne un simple graphique.

E(mg)$weight <- 1
 wg2 <- simplify(mg)
is_simple(wg2)
## [1] TRUE
 print_all(wg2)
## IGRAPH 3146108 UNW- 7 10 -- Toy Graph
## + attr: name (g/c), name (v/c), color (v/c), weight (e/n)
## + edges (vertex names):
## 1 -- 2, 3
## 2 -- 1, 3, 4
## 3 -- 1, 2, 5
## 4 -- 2, 5, 6, 7
## 5 -- 3, 4, 6
## 6 -- 4, 5, 7
## 7 -- 4, 6
 E(wg2)$weight
##  [1] 1 1 2 1 1 1 1 1 1 1
 plot(wg2)

Au-delà de ces préoccupations fondamentales concernant la nature des arêtes d’un graphique,il est nécessaire d’avoir un langage pour discuter de la connectivité d’un graphe. La notion fondamentale de connectivité est celle de contiguïté. Deux sommets \(u\), \(v ∈ V\) sont dits adjacent s’il est rejoint par une arête dans \(E\). De tels sommets sont également appelés voisins.

 neighbors(g,5)
## + 3/7 vertices, named, from 27bbd11:
## [1] 3 4 6
plot(g)

De même, deux arêtes \(e_1,e_2 ∈ E\) sont adjacentes si elles sont jointes par une extrémité commune dans \(V\). Un sommet v ∈ V est incident sur une arête e ∈ E si \(v\) est une extrémité de e. De ceci suit la notion de degré d’un sommet \(v\), disons \(dv\), défini comme le nombre d’arêtes incident sur le \(v\).

 degree(g)
## 1 2 3 4 5 6 7 
## 2 3 3 4 3 3 2
 degree(dg, mode="in")
##  Sam Mary  Tom 
##    0    2    2
 is_connected(g)
## [1] TRUE
 clusters(g)
## $membership
## 1 2 3 4 5 6 7 
## 1 1 1 1 1 1 1 
## 
## $csize
## [1] 7
## 
## $no
## [1] 1
 is_connected(dg,mode="weak")
## [1] TRUE
  is_connected(dg,mode="strong")
## [1] FALSE
   diameter(g, weights=NA)
## [1] 3
   plot(g)

Types spéciaux de graphiques

Les graphiques sont pour ainsi dire de toutes « formes et tailles », mais il existe un certain nombre de familles de graphiques couramment rencontrés dans la pratique.

 g.full <- make_full_graph(7)
 g.ring <- make_ring(7)
 g.tree <- make_tree(7, children=2, mode="undirected")
 g.star <- make_star(7, mode="undirected")
 par(mfrow=c(2, 2), mai = c(0.2, 0.2, 0.2, 0.2))
 plot(g.full)
 plot(g.ring)
 plot(g.tree)
 plot(g.star)

Enfin, un graphe biparti est un graphe \(G = (V, E)\) tel que l’ensemble de sommets \(V\) peut être divisé en deux ensembles disjoints, disons \(V_1\) et \(V_2\), et chaque arête de E en a une point final dans \(V_1\) et l’autre dans \(V_2\). De tels graphiques sont généralement utilisés pour représenter des réseaux « d’appartenance », par exemple, avec des « membres » désignés par des sommets dans \(V_1\), et les «organisations» correspondantes, par sommets dans V2. Par exemple, ils sont populaires dans l’étude de la relation entre les acteurs et les films, où les acteurs et les films jouent respectivement le rôle de membres et d’organisations.

 g.bip <- graph_from_literal(actor1:actor2:actor3,
 movie1:movie2, actor1:actor2 - movie1,
 actor2:actor3 - movie2)
 V(g.bip)$type <- grepl("ˆmovie", V(g.bip)$name)
 print_all(g.bip, v=T)
## IGRAPH 349dd79 UN-B 5 4 -- 
## + attr: name (v/c), type (v/l)
## + vertex attributes:
## |       name  type
## | [1] actor1 FALSE
## | [2] actor2 FALSE
## | [3] actor3 FALSE
## | [4] movie1 FALSE
## | [5] movie2 FALSE
## + edges from 349dd79 (vertex names):
## [1] actor1--movie1 actor2--movie1 actor2--movie2 actor3--movie2
 plot(g.bip)