Sébastien Delarre-2012

Transcription

Sébastien Delarre-2012
Centre lillois d’études
et de recherche
sociologiques
et économiques
UMR 8019 du CNRS
Documents de travail
Quelques éléments didactiques pour l’analyse
de réseaux complets sous SAS-IML
Sébastien DELARRE
Maître de conférences au CLERSÉ
[email protected]
Document de travail n° 9
mai 2012
Université de Lille 1
Faculté des sciences
économiques et sociales
59655 Villeneuve d’Ascq cedex
03 20 43 66 40
Fax 03 20 43 66 35
[email protected]
www.univ-lille1.fr/clerse
Le CLERSE est une
composante de la MESHS
2 rue des Canonniers,
59800 Lille
Tous droits réservés aux auteurs.
Des versions finales des textes disponibles comme documents de travail du CLERSÉ
sont susceptibles d’avoir été publiées ou soumises à publication ultérieurement. Consultez la
bibliographie du CLERSÉ pour obtenir les références d’une éventuelle version publiée.
Quelques éléments didactiques pour l’analyse
de réseaux complets sous SAS-IML
Sébastien Delarre
Résumé : L’objectif de ce document est d’initier le lecteur à la manipulation de données
matricielles sous SAS, dans le but d’y appliquer les concepts et les méthodes de
l’analyse de réseaux complets. Ce document a une visée pratique : il explique à l’aide
d’exemples comment créer des matrices avec IML, comment importer des matrices à
partir de SDS (sas data sets) ou de fichiers externes, et surtout comment, après avoir
réalisé un exemple typique d’opération matricielle « réseau » sous IML, utiliser ces
résultats en les exportant à nouveau dans un SDS ou dans un fichier texte.
Mots clés : analyse quantitative – données matricielles – analyse de réseaux – SAS
Pour citer ce travail : Sébastien DELARRE, « Quelques éléments didactiques pour
l’analyse de réseaux complets sous SAS-IML », Documents de travail du CLERSÉ
(Working Papers), n° 9, mai 2012, <URL : http://clerse.univ-lille1.fr>.
2
Introduction
L’objectif de ce document est d’initier le lecteur à la manipulation de données matricielles
sous SAS, dans le but d’y appliquer les concepts et les méthodes de l’analyse de réseaux
complets. L’analyse de réseau sous SAS présente en effet un double avantage :
-
la possibilité d’aller et de revenir entre une matrice représentant un réseau et toute base
de données « attributaire » standard, en bénéficiant ainsi des capacités complètes du
logiciel lorsqu’il s’agira de traiter cette dernière ;
-
et surtout la possibilité de définir et de créer soi-même des métriques originales pour
l’analyse de réseaux, non disponibles dans les logiciels « presse-boutons » usuels (voir
par ex. Delarre 2011), qui ne mettent à la disposition de leurs usagers que les méthodes
les plus routinisées du domaine.
Ce document a donc une visée entièrement pratique. Il explique à l’aide d’exemples
comment créer des matrices avec IML, comment importer des matrices à partir de SDS (sas data
sets) ou de fichiers externes, et enfin, mais surtout, comment, après avoir réalisé un exemple
typique d’opération matricielle « réseau » sous IML, utiliser ces résultats en les exportant à
nouveau dans un SDS ou dans un fichier texte. L’export des matrices IML vers les logiciels
dédiés à l’analyse de réseaux n’est pas abordé, chacun ayant ses propres procédures d’import de
données.
Deux parties sont présentées, la première est consacrée à une introduction à l’analyse de
réseaux complets sous SAS-IML, la seconde délivre un exemple de métrique mis en œuvre en
langage matriciel : la score de centralité dit de Bonacich.
I. Le traitement et l’analyse de réseaux complets
Créer, importer et exporter les matrices
Créer manuellement une matrice complète
On peut écrire directement une matrice complète, puis la stocker en mémoire dans une
librairie SAS. Le stockage se fait à trois niveaux : on définit une ou plusieurs librairies SAS,
chacune contient un ou plusieurs catalogues propres à l’environnement IML (storage catalog),
qui eux-mêmes contiennent un ensemble de matrices (et/ou de modules, dont nous expliquerons
plus loin les fonctions).
proc iml;
reset storage=nom-de-librairie.nom-du-catalogue;
a={0 1 0 1,
1 0 0 0,
1 1 0 1,
1 1 0 0 } ;
store a;
quit;
Dans ce cas la matrice nommée a est stockée dans le catalogue spécifié par la commande
reset storage. Elle comprend quatre individus, chaque virgule représente un changement de
ligne. Toute matrice (ou vecteur) non stockée de cette manière est perdue après la commande
quit, qui indique la fin de la procédure. Pour revenir plus tard sur cette matrice, on peut alors la
remettre en mémoire de la façon suivante :
proc iml;
reset storage=nom-de-librairie.nom-du-catalogue;
3
load a;
quit;
De l’ensemble des éléments contenus dans le catalogue, seuls ceux qui suivent la commande
load seront chargés en mémoire et disponibles pour l’étape.
Il est souvent nécessaire de séparer les données matricielles de leurs identifiants, un storage
catalog peut contenir la matrice des relations, plus ses identifiants sous la forme d’un vecteur
ligne ou colonne indépendant. En reprenant le même exemple :
proc iml;
reset storage=nom-de-librairie.nom-du-catalogue;
a={0 1 0 1,
1 0 0 0,
1 1 0 1,
1 1 0 0};
id={w, x, y, z};
store a id;
quit;
Le catalogue contient désormais deux éléments : la matrice des relations, nommée a ; le
vecteur colonne des identifiants, nommé id.
Mais ce type de saisie peut être long, il existe diverses solutions pour le raccourcir. On peut
spécifier le nombre d’éléments identiques se suivant sur une même ligne de la matrice :
proc iml;
reset storage=nom-de-librairie.nom-de-catalogue;
a={[3] 0 1 [2] 0,
1 [5] 0,
[2] 1 [4] 0,
[6] 0,
[4] 1 0 1,
[3] 1 [3] 0 } ;
mattrib a format=2.0;
print a;
store a;
quit;
Dans la définition de la matrice, chaque chiffre entre crochet indique le nombre de répétition
de l’élément matriciel qui le suit immédiatement : « [3] 0 » équivaut à « 0 0 0 ». La commande
mattrib permet ensuite de formater les éléments matriciels.
Ce programme produit l’output suivant :
A
0
1
1
0
1
1
0
0
1
0
1
1
0
0
0
0
1
1
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
Autre solution, un premier module de J. Moody permet de créer une matrice d’adjacence à
partir d’une simple liste d’adjacence :
proc iml;
%include 'c:\moody\modules\adj.mod';
Ego={a,b,c,d,g,f};
Alter={b d f,
4
a d .,
. g f,
z a b,
e b d,
c d g};
adjmat=adj(Ego,Alter);
mattrib adjmat format=1.0;
print adjmat;
quit;
Ce qui produit :
ADJMAT
101010100
210010000
300000110
411000001
500000000
600110010
701011000
800000000
La première colonne correspond aux identifiants, ils apparaissent sous la forme de chiffres
pour des raisons de codage (une matrice ne peut mêler des éléments de type caractère avec des
éléments de type chiffre). En utilisant le module adj.mod, la matrice en entrée, Alter, a
nécessairement pour nombre de colonnes le nombre de choix émis par celui des individus Ego
qui en déclare le plus. Pour les autres, la matrice Alter a besoin d’être complétée avec des « . ».
Elle doit être ordonnée de la même façon que le vecteur colonne Ego : chaque ligne correspond
à un individu. La commande %include charge en mémoire le module adj.mod de J. Moody,
spécifié par son emplacement sur le disque dur.
La ligne adjmat=adj(ego,alter) est la ligne d’appel de la fonction adj.mod (une fonction est
un module qui ne produit qu’un seul résultat, dont le nom est spécifié à gauche du symbole =).
Ici, adjmat est créée et va contenir le résultat des calculs opérés par la fonction adj.mod sur les
arguments spécifiés entre parenthèse, i.e. Ego et Alter.
Importer et stocker
Il est probable que l’utilisateur ait déjà enregistré ses matrices dans un fichier interne ou
externe. Différentes manières d’importer ces données dans SAS-IML existent.
Si la matrice est enregistrée dans un fichier SAS (SDS) :
proc iml;
reset storage=nom-de-librairie.nom-de-catalogue;
use libref.fichier-sds;
read all var{liste-des-variables} into a;
store a;
quit;
Dans ce cas a est une matrice qui réceptionne les données du SDS ouvert par la commande
use avant d’être enregistrée (commande store) dans le catalogue ouvert à cet effet (commande
reset storage). La matrice « a » sera composée (« read … into a ») de l’ensemble des
observations du SDS (« read all… ») et de la liste des variables indiquée (« read… var
{liste}… »). Attention :
a) la matrice ne reprend pas les intitulés de variables,
b) une matrice ne peut comprendre que des données homogènes : on ne peut charger les
variables numériques et les variables alphanumériques dans la même matrice.
5
Comme dit plus haut, on a intérêt à créer une matrice numérique pour le réseau lui-même,
qu’il soit valué ou non, puis un vecteur colonne indépendant pour les identifiants et,
éventuellement, d’autres vecteurs colonnes, ou une autre matrice, pour les variables
alphanumériques (données attributaires en particulier). Si elles sont inutiles dans le traitement
matriciel des données réseau, on pourra cependant laisser les variables non-relationnelles dans
le fichier SDS parce qu’on reviendra à lui après avoir fait « travailler » la donnée relationnelle, à
l’aide des commandes matricielles : par exemple calculer un indicateur de centralité puis
l’adjoindre au SDS sous la forme d’une nouvelle variable individuelle, prête à l'emploi pour des
analyses statistiques standards.
Si la matrice est enregistrée dans un fichier externe :
Une première méthode simple est de copier la matrice telle quelle à partir d’un fichier texte
et de la coller dans l’éditeur de programme, une matrice s’écrit toujours de la façon suivante :
A={0010,
1000,
0110,
0000} ;
Il reste simplement à ajouter les symboles manquants (ici par exemple le nom de la matrice
« A », et les symbole =, { et }).
Si le fichier est trop volumineux, ou s’il se présente de façon incorrecte, cette méthode ne
peut pas convenir. Dans ce cas la méthode est quasiment la même que pour un SDS, avec une
étape supplémentaire : on commence par importer le fichier externe sous forme de SDS de
façon très proche de ce qu’on fait classiquement dans un data step, puis on passe du SDS à la
matrice IML en suivant exactement la même méthode que précédemment :
proc iml;
/* Création d’un SDS provisoire, c’est l’étape supplémentaire : */
infile 'c:\chemin-accès\fichier-externe';
create nom-sds-destination var {liste-variables};
do data;
input liste-variables;
append;
end;
close nom-sds-destination;
closefile 'c:\chemin-accès\fichier-externe';
/* Ensuite création de la matrice à partir du SDS provisoire, comme pour
le
programme précédent
: */
use work.nom-sds-destination;
read all into matrice;
reset storage=nom-de-librairie.nom-de-catalogue;
store matrice;
quit;
Comme pour les étapes data, on peut utiliser soit un list input (ici par défaut : les variables
doivent être dans l’ordre, séparées par une tabulation ou par une virgule, et les non-réponses
codées avec un point), soit un formatted input (plus souple1).
1
Pour la création sous IML de SDS à partir de fichiers externes, cf. chapitre VII de la documentation
IML – pour la création sous IML de matrices à partir de SDS : chapitre VI de la documentation.
6
Importer une matrice, la manipuler, puis exporter un résultat sous forme de SDS
classique pour revenir aux procédures habituelles
Nous allons pour finir aborder en exemple une situation de travail concrète. L’utilisateur
dispose de données sous la forme d’un fichier texte comprenant les identifiants, une variable
catégorielle quelconque (en exemple, le genre), et la matrice elle-même dans laquelle chaque
alter correspond à une colonne spécifique. Il va s’agir d’importer la matrice sous IML, de
l'exploiter pour produire un résultat donné (en exemple : un simple compteur de relations), avant
de réintégrer ce résultat dans un SDS pouvant faire l’objet des traitements statistiques habituels
(tris croisés, régression, etc.).
Voici comment se présentent les données initiales dans un fichier nommé données.dat :
1H01011010001
2H10001001011
3F10000110101
4H11101010110
5F01100110111
6F11100011011
7F00001100000
8H01010000100
9H11101110000
10 F 1 0 1 1 1 0 1 0 1 0 0
La première colonne correspond à l’identifiant, la seconde au sexe, et les 11 colonnes
restantes constituent la matrice à partir de laquelle on veut décompter le nombre de relations que
totalise chaque individu. On commence par importer les données sous forme de SDS dans la
librairie temporaire par défaut (WORK) pour ensuite créer les matrices qui nous intéressent,
comme précédemment :
proc iml;
/* Création du SDS provisoire : */
infile 'c:\exemples\données.dat';
create fichier1 var {ident sexe rel1 rel2 rel3 rel4 rel5 rel6 rel7 rel8
rel9 rel10 rel11};
do data;
input ident sexe $ rel1 rel2 rel3 rel4 rel5 rel6 rel7 rel8 rel9 rel10
rel11;
append;
end;
close fichier1;
closefile 'c:\exemples\données.dat';
/* Ensuite création des matrices à partir du SDS provisoire : */
use work.fichier1;
read all var{rel1 rel2 rel3 rel4 rel5 rel6 rel7 rel8 rel9 rel10 rel11}
into matrice;
read all var {ident} into id;
read all var {sexe} into sexe;
reset storage=nom-de-librairie.nom-de-catalogue;
store matrice id sexe;
quit;
A l’étape suivante, on crée le compteur qui va générer un vecteur colonne faisant la somme
des relations de chaque individu :
proc iml;
reset storage=nom-de-librairie.nom-de-catalogue;
load matrice id;
compteur=matrice[,+];
mattrib matrice format=1.;
print id matrice compteur;
7
store compteur;
quit;
Le compteur est simplement un vecteur colonne résultant de la somme en ligne des éléments
de la matrice (« matrice [,+] »).
L’output produit par ce programme est le suivant :
ID MATRICE
1
2
3
4
5
6
7
8
9
10
COMPTEUR
01011010001
10001001011
10000110101
11101010110
01100110111
11100011011
00001100000
01010000100
11101110000
10111010100
5
5
5
7
7
7
2
3
6
6
Maintenant il ne reste plus qu’à récupérer ce compteur afin de poursuivre l’analyse avec, par
exemple, un PROC MEANS. On peut vouloir faire deux choses :
a) introduire le compteur dans un nouveau SDS sous la forme d’une nouvelle variable
individuelle en reprenant le SDS provisoire stocké dans la librairie WORK au moment de
l’import (cf. plus haut),
b) réexpédier les données avec ce nouveau compteur vers un fichier texte pour utiliser un autre
logiciel, par exemple.
Editer un SDS pour y introduire les résultats produits par les étapes IML :
proc iml;
reset storage=nom-de-librairie.nom-de-catalogue;
load id compteur ;
id_compteur = id || compteur;
create nom-de-librairie.SDS-destination var{ident compteur};
append from id_compteur;
quit;
Cette première étape crée un fichier SDS qui comprend deux variables : l’identifiant et le
compteur. Avant cela, le programme regroupe les deux vecteurs colonnes, qui jusque là étaient
séparés, dans une seule matrice, en utilisant l’opérateur de concaténation horizontale (« || »).
A l’issue de ce programme un nouveau SDS est créé qui comprend deux variables,
l’identifiant et notre compteur. Plus haut (au moment de l’import), nous avions créé un autre
SDS, nommé « fichier1 » et stocké dans la librairie par défaut de SAS (WORK, qui se vide à
chaque fin de session). Il s'agissait d'un SDS provisoire comportant toutes les données initiales.
La dernière étape est donc simple, il suffit de fusionner les deux bases de données avec la
commande merge.
Maintenant on en arrive à la finalité de ce travail, par exemple un PROC MEANS, qui a
besoin que les données soient triées (PROC SORT) :
proc sort data=nom-de-librairie.SDS-final out=nom-de-librairie.SDS-final;
by sexe;
run;
proc means data=nom-de-librairie.SDS-final;
var compteur;
by sexe;
run;
8
L’output nous donne la moyenne de contacts par sexes :
-------------------------------------------- SEXE=F -----------------------------------------The MEANS Procedure
Analysis Variable : COMPTEUR
N
Mean
Std Dev
Minimum
Maximum
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
5
5.4000000
2.0736441
2.0000000
7.0000000
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
-------------------------------------------- SEXE=H -----------------------------------------Analysis Variable : COMPTEUR
N
Mean
Std Dev
Minimum
Maximum
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
5
5.2000000
1.4832397
3.0000000
7.0000000
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
Éditer un fichier texte externe :
La procédure est d’inscrire dans un document les données voulues élément par élément en
utilisant une boucle pour l’inscription des vecteurs colonnes et une seconde boucle imbriquée
dans la première pour les éléments matriciels. Cette méthode permet d’exporter les données de
façon très souple. On procédera de cette façon par exemple pour éditer un fichier lisible par
Pajek notamment.
La commande FILE ouvre le document en édition.
La commande PUT inscrit dans le document spécifié les éléments ciblés.
proc iml;
reset storage=nom-de-librairie.nom-de-catalogue;
load matrice sexe id compteur;
file 'c:\exemples\document.dat';
do i=1 to nrow(id);
put (id[i,]) 2.0 (' ') (sexe[i,]) 1.0 (' ') @;
do j=1 to ncol(matrice);
put (matrice[i,j]) 1.0 (' ') @;
end;
put (compteur[i,]) 1.0 ;
end;
closefile 'c:\exemples\document.dat' ;
quit;
Il est souvent nécessaire de s’y reprendre à plusieurs fois avant de parvenir au résultat voulu.
Un bon moyen pour tester le résultat est de remplacer la ligne :
file 'c:\exemples\document.dat' ;
par la ligne
file log ;
9
(- sans oublier de supprimer la ligne « closefile 'c:\exemples\document.dat' ; »
qui n’a plus lieu d’être ) dans ce cas le résultat s’affiche dans le LOG, et une fois qu’il est jugé
convenable, il ne reste plus qu’à inverser les modifications.
10
II. Un exemple : le recours à l’inverse matricielle pour le calcul de scores de
centralité - la formule de Bonacich
L’inverse d’une matrice est utile lorsqu’on souhaite obtenir un score donnant une idée de la
capacité d’un individu à joindre (ou à être joint par) une portion plus ou moins importante des
autres individus du graphe.
Par rapport aux autres méthodes de calcul de la centralité, le recours à l’inverse matriciel a
plusieurs avantages :
-
l’inversion tient compte, pour toute liaison entre deux « sommets » (on parle de
« sommets » dans un graphe plutôt que de « personnes »), de l’ensemble des chemins
les reliant. Elle ne se imite pas à la prise en compte du chemin le plus court par
exemple ;
-
elle peut fonctionner avec des graphes valués. La valeur du lien entre deux sommets
dans l’inverse matricielle est affectée par les valeurs de l’ensemble des liens constitutifs
de chaque chemin dont la somme est faite ;
-
son usage est quasiment direct en langage matriciel puisqu’il s’agit d’une fonction
mathématique courante.
Nous allons ensuite aborder l’usage que fait la formule de Bonacich de cette matrice inverse.
Son principal apport est de pouvoir régler (grâce à un coefficient dit β) la grandeur de la
« focale » des scores de centralité individuels autour de ego, en choisissant l’importance que
l’on souhaite donner ou non aux liaisons les plus distantes : centralité locale contre centralité
globale.
Présentation : usage de base de l’inverse d’une matrice
Un premier exemple donnera les bases de la compréhension du chiffre obtenu par la mise à
l’inverse d’une matrice. Voici notre graphe de départ, il est valué :
Telle quelle, la matrice correspondant à ce graphe n’est pas encore utilisable pour obtenir le
résultat que nous recherchons. Nous devons en effet appliquer la fonction inverse sur une forme
intermédiaire de la matrice de départ. Il nous faut la transformer de la façon suivante 2 :
- si ses valeurs sont strictement inférieures à 10, la multiplier par 0.1 de façon à ce que
l’ensemble de ses valeurs soient comprises entre 0 et 1 exclu. Pour 100 ce sera 0.01,
pour 1000, 0.001, etc.
- Créer une matrice identité3 de même taille et lui retrancher la matrice telle que
transformée lors de l’étape précédente.
Le programme qui suit fabrique la matrice correspondant au graphe présenté, puis il réalise
cette transformation et applique au résultat la fonction inverse :
2
Ceci est une méthode parmi d'autres. Une autre forme de centralité recourant à l’inverse matricielle
(l’index S-Z de centralité), notamment, est basée sur une autre forme intermédiaire de la matrice de
départ.
3
Une matrice dans laquelle les valeurs de la diagonale sont égales à 1 et 0 pour le reste.
11
proc iml;
X={0 1 5 0 0,
0 0 3 0 2,
0 0 0 4 0,
0 0 0 0 0,
0 0 0 0 0};
z=x*0.1; /* Aucune valeur n'excédant 9, on multiplie la matrice par 0.1
*/
i=i(5); /* On crée une matrice identité de même taille avec la fonction
I */
mat=i-z;
inverse=inv(mat); /* On applique la fonction inverse à la matrice créée
*/
inverse=inverse-(i(5)); /* On retire les 1 de la diagonale */
quit;
Le résultat obtenu est le suivant, sous sa forme de graphe, on observe deux choses. D'une
part de nouveaux liens sont créés, reliant des individus qui ne l'étaient pas auparavant. D'autre
part les liens qui existaient déjà se voient attribuer de nouvelles valeurs.
Comment sont produits ces chiffres ? Et comment les interpréter ?
Reprenons le graphe de départ et observons la liaison entre 1 et 5. Dans la matrice initiale
ces deux acteurs ne sont pas reliés. Dans la matrice inverse la liaison existe et vaut 0.02. Ce
chiffre correspond simplement au produit des valeurs comprises dans le seul chemin les reliant
(ces valeurs ayant été divisées par 10) : 0.1 * 0.2 = 0.02. S’il y avait eu plusieurs chemins
possibles entre ces deux sommets, de tels produits auraient simplement été additionnés.
On comprend alors pourquoi faire en sorte que les valeurs de la matrice de départ soient
comprises entre 0 et 1 avant le passage à l’inverse... Cette stratégie de transformation permet de
réduire la capacité des sommets à se joindre dans le graphe final à mesure que la longueur du
chemin augmente (parce qu'ils sont distants) : le produit de valeurs inférieures à 0 entre elles
augmente en effet la taille de la partie décimale (0.x puis 0.0x puis 0.00x, etc.). Suivant le
nombre de pas compris dans le chemin - et donc suivant la distance séparant les deux sommets
dans la matrice initiale - la valeur résultante sera d'autant plus faible (nous verrons plus loin que
ce mécanisme constitue la base sur laquelle repose le coefficient β de la formule de Bonacich).
Mais il ne faut pas oublier que si plusieurs de ces chemins existent, de tels résultantes
seraient alors additionnés. L'inverse matricielle permettra alors de rendre compte, à quelque
degré que ce soit, de la connexion globale existant entre deux personnes, compte tenu du
système complet considéré dans son ensemble.
On aura ainsi toujours, entre deux sommets, un calcul reposant sur la somme des produits
des valeurs comprises dans tous les chemins les reliant.
12
On peut maintenant détailler les bases de calcul des chiffres de la matrice inverse :
S1S2 : 0.1
S1S3 : 0.5 + (0.1*0.3) = 0.53
S1S4 : (0.5*0.4) + (0.1*0.3*0.4) = 0.212. Ou : 0.53*0.4 = 0.212
S1S5 : 0.1*0.2 = 0.02
S2S3 : 0.3
S2S4 : 0.3*0.4 = 0.12
S2S5 : 0.2
S3S4 : 0.4
L’intérêt de cette matrice est aussi de pouvoir être sommée en ligne et en colonne :
INVERSE
0
0
0
0
0
0.1
0
0
0
0
SOMME Ligne
0.53
0.3
0
0
0
SOMME colonne
0
0.1
0.83
0.212
0.12
0.4
0
0
0.02
0.2
0
0
0
0.732
0.22
0.862
0.62
0.4
0
0
Les plus hauts scores correspondent alors aux individus les plus centraux, puisqu'ils résultent
de la somme de tous les chemins existant dans le système relationnels, pondérés par leurs
longueurs respectives. On reconnaît dans cet exemple la position privilégiée de l'acteur 1 en
émission, et celle de l'acteur 3 en réception, lequel est très semblable à l'acteur 4, tout en
bénéficiant de contacts plus directs que son concurrent, plus distancié de ses sources.
L’application à du matériau relationnel n’est pas le seul usage de l’inverse matricielle. H.
White dans Chains of opportunity, ou T. Snijders dans le modèle sur lequel repose le système
SIENA, utilisent des calculs basés sur des chaînes de Markov qui recourent à l’inverse
matricelle. En effet si on considère plutôt que des individus des « strates » dans le cas de White,
ou des « états » pour Snijders, les chiffres de la matrice de départ (toujours compris entre 0 et 1)
peuvent représenter des probabilité de passage d’une strate à une autre ou d’un état à un autre.
Le passage à l’inverse matricielle donne alors les « chemins probabilitaires » entre deux états ou
strates pour plusieurs réalisations successives de l'ensemble des probabilités contenues dans la
matrice. Les sommes en ligne et en colonne donnent alors des informations sur les lieux où se
cumulent les effectifs stratifiés (White), ou sur les états du réseaux les plus probables au-delà
d’une période de temps donnée et étant données des probabilités marginales de passer d’un état
à un autre (Snijders). Au-delà de son recours ponctuel dans 3 ou 4 formes de calcul de la
centralité d’acteur, l’inverse matricielle doit donc être considérée comme un outil de
formalisation générique à l’usage du méthodologue pour créer, au côté d’autres notions et
possibilités algorithmiques, des métriques neuves, ad-hoc, ou trop rares pour être présentes dans
les logiciels où ne sont enregistrées que les fonctions les plus courues. Les logiciels presseboutons ont malheureusement tendance à produire des effets de routinisation dans la recherche
en analyse de réseau, alors que la connaissance des métriques et de leur construction offre aux
chercheurs la possibilité de penser leurs outils et de les construire en fonction de leurs
hypothèses, plutôt que l'inverse, chose très dommageable pour le domaine.
13
Note sur les graphes cycliques :
Lorsqu’on utilise un graphe ayant des portions cycliques, les éléments concernés de la matrice
inverse peuvent avoir des portions décimales d’une longueur infinie. Il faut donc trancher pour
obtenir un arrondi correct. De même le diamètre du réseau influence la taille de la partie
décimale du chiffre produit.
La centralité de Bonacich : usage avancé de l’inverse matricielle
C(α,β) = α (I – βR)-1 Rl
α : Coefficient de normalisation.
β : Pondérateur.
I : Matrice identité.
R : Matrice d’adjacence pour laquelle on souhaite obtenir les scores.
l : Vecteur colonne de 1s.
Note : La mise à la puissance -1 équivaut à l’inverse.
Comment le résultat de base que nous venons de décrire est utilisé par la formule de
Bonacich ? Pour le décrire, nous allons nous appuyer sur un module de base écrit par J. Moody.
On copie ici le module BCENT.MOD disponible dans l'ouvrage de J. Moody4. On y a ajouté
quelques commentaires détaillant le fonctionnement du programme. Ceci permet à ceux
intéressés par la compréhension du fonctionnement de cet outil de maîtriser ce qui se passe
lorsqu’ils font appel au module (ou cliquent, pour les utilisateurs de UCINET, de Pajek, etc., sur
le bouton CENTRALITY / POWER). Une telle connaissance permet une meilleure
appréhension par l’utilisateur des chiffres produits par la formule, et accessoirement une
compréhension de ce qui est à l'œuvre dans son travail.
start bcent(inmat, beta);
DO K=1 TO NCOL(BETA);
B=BETA[1,K];
N=nrow(inmat);
I=I(N);
W=J(N,1,1);
C=(INV(I-B#inmat))*inmat*W;
A=SQRT(N/(C`*C));
CENT=A#C;
NBCNT=SUM(MAX(C)-C)/((N-1)*(N-2));
NBCD=J(N,1,NBCNT); /*GIVES A VECTOR OF SCORES*/
NCNTV=NCNTV||NBCD; /*THIS IS THE OUTPUT CNTRALIZATION SCORES*/
CPV=CPV||CENT; /*THIS IS THE OUTPUT CENTRALITY SCORES*/
END;
centscor=ncntv||cpv;
return(centscor);
finish;
4
Une correction doit être apportée au module. Une faute de frappe dans le fichier offert par J. Moody
provoque la perte des scores de centralité individuels antérieurs à la dernière itération : pour la corriger il
faut ouvrir le module en édition (avec le bloc-notes par exemple) et remplacer toutes les occurrences de
CPVV par CPV simplement.
14
Que fait le programme ?
Laissons pour le moment de côté la boucle DO. On commence à la troisième ligne :
N=nrow(inmat);
I=I(N);
Le programme repère le nombre d’individus présents dans la matrice et fabrique la matrice
identité ajustée à ce nombre. Puis :
W=J(N,1,1);
La fonction J fabrique une matrice N lignes, une colonne et remplie de valeurs « 1 ». Ceci est
typique en calcul matriciel pour réaliser une somme en ligne... Plutôt que d’utiliser l’opérateur
IML « + » (par exemple), le fait de multiplier une matrice par un vecteur colonne de « 1 »
produit ce résultat. Cela se rencontre fréquemment : tous les langages n’ont pas les mêmes
syntaxes, cette formulation invariable de la somme évite de rentrer dans l’explicitation du
vocabulaire utilisé et améliore la portabilité des formulations utilisées.
C=(INV(I-B#inmat))*inmat*W;
Fixons pour le moment « B » (Béta) à 0.1. La première portion de ce calcul, « (INV(IB#inmat)) », représente alors simplement l’usage de base de l’inverse que nous avons
détaillé plus haut.
Ensuite cette matrice inverse est multipliée par « inmat », c'est-à-dire la matrice de départ5.
Ceci produit la chose suivante : au final toute liaison entre A et C est égale à la valeur du lien
dans la matrice de départ entre ces deux sommets, plus, pour tout les Bs en liaison avec C dans
la matrice de départ, le produit de la valeur du lien entre A et les Bs dans la matrice inverse par
la valeur du lien entre les Bs et C dans la matrice de départ. Le procédé est assez complexe
mais un exemple nous permettra de l'approcher d'une première manière.
Dans notre exemple le lien entre 1 et 5 sera égal à : 0.1*2 = 0.2. 0.1 est la valeur du lien entre
1 et 2 dans la matrice inverse et 2 est la valeur du lien entre 2 et 3 dans la matrice de départ. De
même le lien entre 1 et 4 sera : 0.53 (lien entre 1 et 3 dans la matrice inverse) * 4 (lien entre 3 et
4 dans la matrice de départ) = 2.12.
Béta intervient dans la matrice inverse pour pondérer en fonction de la distance la
capacité de A à joindre les Bs qui eux disposent dans la matrice de départ d’un volume
de contacts directs avec les Cs plus ou moins important. Le chiffre produit est donc un
« croisement » de ces deux ordres de réalités. Cette interprétation insiste donc sur le fait
que la centralité de Bonacich dépend de la capacité des egos à joindre (nb : dans la
matrice inverse coefficientée par béta) des alters eux-mêmes « prestigieux » (nb : dans la
matrice de départ en termes de contacts directs).
Plus précisément, le coefficient béta intervient de la façon suivante. L’inverse matricielle fait
le produit des valeurs (inférieures à 1) comprises dans les chemins, et suivant la petitesse de
Béta un long chemin impliquera une décroissance plus ou moins accélérée de la valeur de ce
produit (parce que les valeurs sont inférieures à 1, cf. supra). L’allongement des chemins
provoque dans la matrice inverse une réduction accélérée de la valeur du lien entre les sommets
lorsque la valeur de Béta est plus petite (0.1 ou 0.01 ou 0.001 etc.) 6. Au final le produit de cette
5
Ce qui revient en fait à multiplier la matrice inverse par l’inverse de B (béta) et à se débarrasser des
valeurs de la diagonale.
6
Par exemple avec B=0.1, un chemin de longueur 5 constitué de 1s vaudra 0.15 = 0.00001. Le produit
de ce chiffre par B-1 (qui équivaut au produit par « inmat », cf. note 3) vaudra 0.0001. En revanche si on
15
matrice par « inmat » impliquera un accès de ego aux contacts de alter plus ou moins atténué
par la distance, atténuation au choix de l’utilisateur grâce à béta. Ce dernier peut donc se
permettre de régler la focale du calcul de la centralité en localisant ou en globalisant son calcul.
Plus on règle béta sur des valeurs élevées (proches de 0), plus on autorise le score à
prendre en compte une étendue de réseau importante autour de ego (en terme de
distance). Plus on règle béta sur des valeurs faibles, plus on insiste sur portion étroite
de réseau, focalisée autour de ego 7.
En jouant sur le coefficient béta8, on fait varier la focale pour le calcul des scores de
centralité : des individus centraux localement peuvent ne pas l’être globalement et vice-versa.
Cette variabilité de la focale de la centralité individuelle peut être récupérée sous forme de
vecteurs de partitions. De même, une étape plus loin, on peut inclure le module BCENT dans
une boucle itérative qui permettra d’ajuster le béta au mieux vis-à-vis d’une variable dépendante
spécifique puis d’interpréter le résultat en terme de focale pertinente du point de vue de la
variable, etc… Il faut toujours penser que l’intérêt de SAS-IML consiste en de telles utilisations
postérieures9 des outils classiques de l’analyse de réseaux. Pour un usage basique, autant en
rester à des logiciels plus faciles à utiliser.
Poursuivons sur l'algorithme présenté plus haut, lequel rappelons-le est utilisé sous une
forme ou sous une autre dans la plupart des logiciels commerciaux.
A=SQRT(N/(C`*C));
Calcul du coefficient alpha (un simple coefficient de normalisation). “C” est le vecteur
colonne obtenu à l’étape précédente. Sous la barre de fraction « C`*C » fait le produit de la
transposée de C (un vecteur ligne) par C. Tout comme le produit par W était un moyen matriciel
de réaliser une somme, le produit d’un vecteur ligne par sa transposée donne la somme des
carrés des éléments qu’il contient. Le nombre total de sommets dans le graphe sera ensuite
divisé par ce chiffre, dont on en prendra la racine carré.
Ceci permet de déterminer alpha afin que la somme des carrés des scores qu’il pondère soit
égale au nombre de sommets dans le graphe.
CENT=A#C;
Les scores du vecteur colonne “C” sont simplement pondérés par la valeur de alpha par
soucis de comparabilité (« # » fait un produit « elementwise », élément par élément, à la
différence de « * » qui réalise le produit matriciel). C’est le résultat final pour les scores de
centralité individuels. Reste maintenant à calculer le score de centralisation du graphe complet :
fixe B à 0.01, on aura 0.015 = 0.0000000001 et son produit par B-1 sera : 0,00000001. Un même chemin
est compté différemment suivant la valeur de béta.
7
Notez également qu’on peut utiliser un béta négatif pour inverser le sens des scores : dans ce cas le
fait d’être en contact avec des alters prestigieux est « mauvais » pour ego. Un ego, par exemple, peut
avoir d’autant plus de pouvoir sur un alter que celui-ci est isolé. Inversement un ego peut disposer
d’autant plus d’informations que ses alters en disposent eux-mêmes. On choisira le signe de béta en
fonction de ce type de considérations théoriques.
8
Dans son article Bonacich propose de fixer un maximum pour la valeur absolue de β inférieure à
l’inverse de la valeur la plus grande contenue dans la matrice de départ. Ceci permet, lors de la
multiplication de la matrice par béta, de s’assurer que l’ensemble des valeurs soit inférieur à 1. Cf. plus
haut sur la nécessité d’avoir un chiffre inférieur à 1 de façon à assurer une réduction minimale des valeurs
en fonction de la longueur des chemins.
9
Tout comme se développent à la suite de l’analyse factorielle des modèles post-factoriels d’analyse.
Le passage au « post » pour l’analyse de réseau est tout simplement ce qui rentabilise effectivement les
coûts d’apprentissage relativement élevés de la programmation matricielle.
16
NBCNT=SUM(MAX(C)-C)/((N-1)*(N-2));
NBCD=J(N,1,NBCNT); /*GIVES A VECTOR OF SCORES*/
La première ligne donne le score de centralisation du graphe complet. La seconde répète la
valeur obtenue dans un vecteur colonne de taille N (simplement pour l’accoler au vecteur des
scores individuels afin de produire un seul résultat, ce à quoi oblige le fonctionnement du
module IML).
Finissons maintenant avec la boucle DO, on a en fait :
start bcent(inmat, beta);
DO K=1 TO NCOL(BETA);
B=BETA[1,K];
(…)
Le programme tel qu’il vient d’être décrit.
(…)
NCNTV=NCNTV||NBCD; /*THIS IS THE OUTPUT CNTRALIZATION SCORES*/
CPV=CPV||CENT; /*THIS IS THE OUTPUT CENTRALITY SCORES*/
END;
centscor=ncntv||cpv;
return(centscor);
finish;
Plutôt que de rentrer une valeur fixe pour « B » (béta, dans notre exemple 0.1), on peut en
fait utiliser un vecteur ligne comprenant plusieurs valeurs possibles pour béta. Le programme
exécute l’algorithme de façon itérative pour chacune de ces valeurs et cumule les résultats
(NBCD pour le score de centralisation global et CENT pour les scores individuels) dans les
matrices NCNTV et CPV avec l’opérateur de concaténation horizontal (« || », cf. langage IML).
On peut donc générer un vecteur de valeurs pour béta allant de 0.999 à 0.001 (par exemple…)
puis analyser la matrice produite par le module colonne après colonne pour minimiser ou
maximiser la proximité à une situation théorique donnée.
17
Références
Bonacich P., 1987, Power and centrality : a family of measures, American journal of sociology,
vol. 92, pp. 1170-1182.
Delarre S., 2011, « Une méthode descriptive pour l’étude des échanges dans les systèmes
hiérarchisés », Revue des sciences et technologies de l’information - Coll. TSI, vol. 30, n° 2.
Moody J., 1998, SPAN: SAS Programs for Analyzing Networks, Chapel Hill, University of
North Carolina.
Poulin R., Boily M.C., Masse B.R., 2000, Dynamical systems to define centrality in social
networks, Social networks, vol. 22, pp. 187-220.
Snijders, T.A.B., van de Bunt, G.G., Steglich, C.E.G., 2010, Introduction to stochastic actorbased models for network dynamics, Social Networks, vol. 32, pp. 44-60.
White H., 1970, Chains of opportunity: system models of mobility in organisations, Cambridge,
Harvard University Press.
18

Documents pareils

[IML] Initiation au langage SAS/IML - OD

[IML] Initiation au langage SAS/IML - OD Le module SAS/IML donne accès à un langage spécifique pour la manipulation de matrices et les opérations qui leurs sont associées (diagonalisation, inversion, résolution de systèmes linéaires, etc....

Plus en détail