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 : S1S2 : 0.1 S1S3 : 0.5 + (0.1*0.3) = 0.53 S1S4 : (0.5*0.4) + (0.1*0.3*0.4) = 0.212. Ou : 0.53*0.4 = 0.212 S1S5 : 0.1*0.2 = 0.02 S2S3 : 0.3 S2S4 : 0.3*0.4 = 0.12 S2S5 : 0.2 S3S4 : 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
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