Un modèle spatial de l’espace partisan sur Twitter

Note : ce billet est une version modifiée du billet publié le 17 avril. Les résultats sont à jour de la présentation que nous en avons fait, avec Ewen, à la journée d’étude “Science Po Quanti” qui s’est tenue hier. Si le fond du truc vous intéresse et/ou que vous avez un accès à l’API REST de Twitter dont vous ne vous servez pas, faîtes signe dans les commentaires, ou envoyez un tweet à @phnk ou @3wen (ou les deux).

Rappel des faits

Fin mars, j’ai rapidement expliqué comment utiliser les “followers” des comptes Twitter de la classe politique pour en positionner les différentes personnalités les unes par rapport aux autres. En partant du principe que Marine Le Pen va avoir plusieurs “followers” en commun avec Éric Ciotti, quelques-uns avec Valérie Pécresse, mais beaucoup moins avec François Hollande et encore moins avec Pierre Larrouturou, on peut reconstituer l’équivalent d’un spectre gauche-droite où la seule information de départ est la liste des “followers” de chaque personnalité, et où le résultat final est un positionnement sur une échelle unidimensionnelle allant de gauche à droite1.

Cette méthodologie, dite d’estimation de positions idéales, est bien connue en science politique : il s’agit, fondamentalement, d’identifier la dimension principale d’un espace latent, à partir d’une variable binaire comme un vote positif ou négatif. Cette méthode est généralement appliquée aux parlementaires à partir de leurs votes sur les scrutins publics, mais il y a plusieurs autres applications connues : à partir du moment où l’on dispose de votes publics, on peut par exemple s’en servir sur les décisions des juges de la Cour Suprême, ou sur les votes des pays membres des Nations Unies.

L’originalité de l’approche de Barberá (version gratuite), que j’ai déjà cité abondamment dans le billet précédent, est d’avoir transposé cette méthodologie à Twitter2, et de l’avoir appliquée avec succès aux États-Unis et à cinq pays européens. En regardant son fil Twitter récent, j’ai pu constater que sa méthodologie fonctionne également assez bien sur des personnalités politiques brésiliennes, et plusieurs papiers publiés (version gratuite) ou en cours de publication s’apprêtent à montrer que cela marche bien aussi dans d’autres contextes, y compris au-delà des frontières nationales (à suivre…).

Qu’en est-il des personnalités politiques françaises ?

Bon, notez bien que tout ce qui suit est un résultat préliminaire, car le modèle n’a pas fini de converger, malgré la très bonne machine sur laquelle Ewen est en train de le faire tourner. Vous avez bien noté la nature préliminaire des résultats ? Go :

ideal_points_parties

Le graphique ci-dessus correspond au modèle #1 de Barberá, appliqué à 418 personnalités politiques françaises, qui correspondent aux “n” en bas du graphique. Les barres verticales indiquent les positions minimales et maximales pour chaque parti, et le cercle indique la moyenne. Pour le moment, l’échantillon de “followers informatifs” est légèrement inférieur à 18 000. Pour revoir le tout premier résultat obtenu sur un échantillon encore plus petit, cliquer ici, et pour les résultats finaux sur 721 personnalités politiques, attendez encore quelques semaines. Le code de réplication (en cours d’amélioration) et la liste complète des personnalités politiques sont déjà en ligne3.

Sur le graphique, les petites croix correspondent aux scores gauche-droite des partis selon la moyenne établie par ParlGov, ce qui permet de comparer nos résultats aux mesures conventionnelles du positionnement de ces partis. Comme on peut déjà le voir, ça commence bien : “l’ordre” des partis politiques est presque celui attendu. En d’autres termes, les individus qui suivent les personnalités politiques françaises sur Twitter permettent de reconstituer l’espace partisan gauche-droite de ces personnalités de manière quasi-identique à ce que produisent des enquêtes d’experts comme la Chapel Hill Expert Survey, qui va néanmoins plus loin que cette seule dimension.

Vers quoi se dirige-t-on ?

Ce billet ne fait que résumer à très grands traits la méthode que nous sommes en train d’appliquer avec Ewen pour obtenir des estimations de points idéaux à partir de données issues de Twitter. Le point de départ de cette entreprise était un défi d’ordre strictement méthodologique : peut-on faire pareil, avec nos propres données, sur une matrice (d’adjacence) plus large, et en comprenant, à peu près, ce que l’on fait subir à cette pauvre matrice, par l’intermédiaire d’une modélisation assez compliquée ?

Les résultats finaux sont en cours de calcul, mais les résultats intermédiaires ont encourageants, et le code nous a d’ores et déjà permis de produire toutes sortes de résultats supplémentaires assez originaux. Le graphique présenté ci-dessus n’est que le point de départ de ces résultats : toute une batterie de tests montre des corrélations intéressantes au niveau géographique, par exemple. Voici un exemple de ces corrélations, qui se situent toutes entre 0.4 et 0.5 :

map_vote

Le panel de gauche montre le point idéal moyen des départements, calculé à partir des “followers informatifs” que l’on a réussi à localiser au niveau départemental ou municipal. Le panel de droite donne la carte du vote Sarkozy au second tour de la présidentielle de 2012. La corrélation est à 0.5, ce qui permet simplement de constater que les positions idéales générées par le modèle ne sont pas complètement décorrélées des comportement électoraux au niveau géographique.

Vous l’avez compris en lisant le paragraphe précédent : le modèle que l’on utilise n’estime pas des points idéaux que pour les seules personnalités politiques, mais aussi pour les “followers informatifs” que l’on y inclut (ce que ne produit pas vraiment une estimation “classique” de points idéaux à partir de données comme les votes parlementaires). Je n’ai pas évoqué cette spécificité du modèle jusqu’à présent, mais cela vous donne une petite idée de ce vers quoi se dirige l’analyse.

  1. Concrètement, la seule hypothèse nécessaire est celle d’une homophilie entre les personnalités politiques et leurs “followers”, ce qui s’établit sans difficulté quand on parle de plusieurs milliers de “followers” par personnalité. La raison pour laquelle on tombe sur un axe gauche/droite est qu’il s’agit de la dimension principale la plus forte (le clivage le plus fort). []
  2. Je comprends cette transposition comme un renversement de la proposition habituelle des modèles existants : en termes strictement utilitaristes, au lieu de considérer les votes comme “l’offre” et les personnalités politiques comme “la demande”, on considère les comptes Twitter de personnalités politiques comme constituant “l’offre”, et la liste des “followers” comme “la demande”. []
  3. Comme l’indiquent les différents totaux cités, le modèle repose sur une stratégie de sous-échantillonnage assez difficile à résumer en quelques mots. Pour indication, le nombre de “followers informatifs” sur lequel tourne actuellement le modèle final est légèrement supérieur à 44 000, après application de tous les critères cités dans le papier de Barberá. []

Les réseaux de cosignatures législatives de quinze pays européens

Si la série de billets “Charlie Hebdo” vous a plu, voici quelques réseaux en plus.

Vous vous souvenez peut-être de ce premier travail, dont j’avais parlé courant 2014, sur les réseaux des cosignatures de propositions de loi et d’amendements à l’Assemblée nationale. L’idée venait de Baptiste Coulmont.

La présentation de ce travail en conférence était plutôt bien passée. À cette époque, j’avais déjà rajouté les réseaux de cosignatures du Sénat, très faciles à construire grâce à son portail open data.

À l’occasion d’une summer school avec piscine et sauna (si si), j’ai ensuite élargi l’assiette empirique à six pays européens. Puis j’ai fait le tour de tous les pays membres de l’Union européenne et de l’AELE1.

Ce qui m’amène à la base de données actuelle : j’ai fini par assembler 100 réseaux de cosignatures législatives dans 19 chambres parlementaires de 15 pays européens. Voici un texte qui les présente rapidement2.

Les réseaux sont limités aux propositions de loi, mais cette limite permet de remonter plus loin dans le temps, sur une base plus comparable. Le code est aussi beaucoup moins dégueulasse que le code initial pour la France.

Voici par exemple l’exemple l’Islande actuelle :

net_is2013-2017

Ou encore l’Italie actuelle (chambre basse) :

net_it_ca17

Ou encore la République tchèque actuelle :

net_cz7

Et enfin, voici un tableau récapitulatif des pays et des chambres parlementaires couvertes. Les liens “plots” amènent aux représentations graphiques statiques, les liens “viz” aux visualisations interactives. Amusez-vous bien.

Pays / Chambre
Austria (chambre basse) code plots viz
Belgium (deux chambres) code plots viz
Bulgarie code plots viz
République tchèque (chambre basse) code plots viz
Danemark code plots viz
Finlande code plots viz
France (deux chambres) code plots viz
Hongrie code plots viz
Islande code plots viz
Italie (deux chambres) code plots viz
Lithuanie code plots viz
Norvège code plots viz
Roumanie (deux chambres) code plots viz
Suède code plots viz
Suisse (chambre basse) code plots viz

Le code contient des fonctions facilement réutilisables pour construire d’autres réseaux, et certains pays peuvent encore être rajoutés, à condition de trouver un moyen de récupérer les données (ce qui est parfois assez compliqué).

Si vous vous demandez à quoi peuvent servir ces réseaux, jetez un coup d’oeil au texte précité, ou au papier de Justin H. Kirkland sur la structure collaborative des chambres parlementaires, ou à ce papier sur la segmentation partisane.

Si vous souhaitez participer à l’amélioration, l’élargissement ou l’analyse de la base, je suis preneur : il y a beaucoup, beaucoup de données dans ces graphes (environ 195 000 propositions de loi et 13 000 parlementaires).

Dernier truc : j’ai publié un billet similaire à celui-ci sur la plateforme OpeningParliament.org, qui rassemble des organisations mobilisées autour de la thématique de l’open data dans le domaine législatif.

  1. À l’exception des micro-États, comme Andorre. []
  2. Le texte contient aussi un modèle très simple de la segmentation partisane des réseaux. []

Quelques séries télévisées britanniques à regarder

Ayant eu récemment l’occasion de m’amuser à regarder quelques séries télévisées pour un cours sur la politique (comparée) au prisme des fictions du petit écran, j’en profite pour faire un peu de publicité à ces séries en partageant mes slides :

Le cours faisait intervenir plein de monde, avec des présentations sur The Wire, désormais incontournable, The West Wing, Mad Men, et j’en oublie.

Les lecteurs de ce blog connaissent déjà la plupart d’entre elles, mais je souhaite quand même en recommander deux : Boss, d’un cynisme (américain, glacial) effroyable mais pas nécessairement irréaliste (la double négation est justifiée…), et The Thick of It, d’une vulgarité et d’un humour (britannique, absurde) à hurler de rire, surtout si vous adorez l’accent écossais de Peter “Doctor Who” Capaldi.

Je ne sais pas combien de temps je garderai les extraits vidéo mentionnés sur mon disque dur, mais dans l’immédiat, essayez ce lien.

Notice technique, illustrée par la communication officielle du Front national

Suite aux séries de billets sur les “unes” de Charlie Hebdo, les revues de la sociologie française et les réseaux législatifs, j’ai reçu quelques emails – merci ! – me demandant de réexpliquer “la base” du truc :

  • comment est-ce que l’on fait pour récupérer les données ?
  • comment est-ce que l’on fait pour en sortir un réseau ?

Je vais prendre un petit exemple facile pour illustrer le principe : comment récupérer la communication officielle du Front national à partir de son site Internet, et comment en extraire un réseau de co-occurrences.

Pour cet exemple, je suppose que vous connaissez un minimum de langage HTML. Si ce n’est pas le cas, vous aurez besoin d’une semaine au maximum pour apprendre tout ce qu’il faut savoir. Le langage HTML servant à “écrire Internet”, c’est aussi le langage le mieux documenté sur Internet : commencez ici, par exemple.

Les outils

Commençons par la base.

Il vous faudra une bonne connexion Internet : idéalement de la fibre optique, mais plus généralement, une connexion qui ne va pas tomber en rade et rajouter des erreurs de téléchargement dans une procédure qui risque déjà d’en générer par elle-même. Votre connexion Ethernet universitaire, qui est probablement filtrée d’une manière ou d’une autre, n’est peut-être pas la candidate idéale ; le wifi de votre université, encore moins.

Ensuite, il vous faut un peu d’espace disque. Utiliser un disque externe pour télécharger des centaines de fichiers est une très mauvaise idée : la moindre erreur d’écriture peut envoyer l’intégralité du disque dans les Limbes. L’idéal est d’utiliser une clé USB pas chère mais de bonne qualité, histoire que le disque dur ne soit jamais menacé. Si votre disque dur est un SSD, le risque de le foutre en l’air est toutefois minime.

Enfin, il vous faut un langage de programmation, et si possible, un langage qui va vous permettre d’enchaîner les opérations (téléchargement, visualisation, modélisation) de manière fluide. J’utilise R, mais Python est un autre bon candidat. R est bien documenté, bien illustré, la communauté répond vite et bien aux questions, et les toutes dernières techniques de modélisation y sont très bien représentées.

Il est vivement conseillé d’utiliser RStudio pour coder en R. Il vous faudra aussi un navigateur Internet avec une interface de développement intégrée, pour visualiser le code source des pages HTML que vous voulez récupérer : Chrome, Firefox, Opera ou Safari feront l’affaire.

Les packages

Quel que soit votre choix de langage, vous allez devoir vous servir d’extensions pour accomplir les différentes opérations dont vous avez besoin. Pour ce petit exemple, on va utiliser les cinq packages R suivants :

  • rvest, pour récupérer les données
  • lubridate, pour en convertir les dates
  • stringr, pour manipuler les données textuelles
  • dplyr, pour manipuler les données
  • ggplot2, pour visualiser les données

Incidemment, tous ces packages ont été développés par la même personne, avec l’aide de plusieurs autres.

On rajoutera quelques packages quand on en arrivera à l’étape “réseaux”.

La source

Toutes les donnés que l’on va récupérer proviennent de la section “Actualités” du site Internet frontnational.com. La structure de l’information qui s’y trouve est régulière : la section contient une suite d’articles qui appartiennent à une ou plusieurs catégories, avec parfois un ou plusieurs mots-clés supplémentaires. Chaque article possède un titre, qui renvoie à une page individuelle, et une date, exprimée en français :

Screen Shot 2015-03-15 at 12.58.52

Jetez à présent un coup d’oeil à la source HTML de la page “Actualités” avec les Developer Tools de votre navigateur (j’utilise ceux de Chrome) : en quelques clics et recherches par mots-clés, vous allez y trouver le code HTML qui structure l’information. Ici, les articles de la page se trouvent dans le diviseur #pk_content, les titres des articles sont codés comme des titres de niveau 3 de classe .pk_entry_title, et chaque titre fait l’objet d’un lien a :

Screen Shot 2015-03-15 at 13.06.58

Vous savez à présent ce que vous allez chercher dans chaque page. Dernière étape : combien de pages va-t-on récupérer ? Le système de pagination du site est ultra-simple à identifier :

Screen Shot 2015-03-15 at 13.19.13

Chaque page est numérotée de 2 à X, l’adresse étant de type /actualites/page/4, par exemple. La page finale est identifiable par essai-erreur : si vous essayez d’accéder à la page /actualites/page/200, vous obtenez une erreur. Cherchez un peu, et vous allez trouver qu’à l’heure actuelle, il y a 179 pages qui vous ramènent jusqu’à l’actualité du Front national en avril 2013—soit presque deux ans de données.

Le code

Pour récupérer les titres, liens, dates, catégories et mots-clés de tous les articles de la section “Actualités” du site Internet du Front national :

  1. On crée une boucle qui va de 179 à 1 ;
  2. On télécharge la page correspondant à cette valeur ; et
  3. On extrait ces informations de la page.

La base du truc ressemble à ça :

for(i in 179:1) {

  # l'adresse de la page sur le site Internet
  p = paste0("http://www.frontnational.com/actualites/page/", i)

  # le nom de fichier de la page téléchargée
  f = paste0("page", i, ".html")

  # télécharger la page si le fichier est absent
  if(!file.exists(f))
    download.file(p, f, mode = "wb", quiet = TRUE)

}

La condition if(!file.exists(f)) permet de relancer le code en cas d’erreur—mais il n’y en aura pas dans cet exemple : le site ne pose pas de souci, et ma connexion Internet n’en a pas posé non plus.

On dispose à présent de toutes les pages HTML de la section “Actualités”, et à chaque itération, l’adresse du fichier de la page est stocké dans la variable f. Pour extraire les informations de cette page :

# lire la page
h = html(f)

# extraire le lien de chaque article
url = html_nodes(h, "#pk_content h3.pk_entry_title a") %>% 
  html_attr("href")

# extraire le titre de chaque article
title = html_nodes(h, "#pk_content h3.pk_entry_title a") %>% 
  html_text()

# extraire les dates, catégories et mots-clés
meta = html_nodes(h, ".pk_entry_meta p") %>% 
  html_text()

On utilise ici les fonctions du package rvest. Rapide explication de texte :

  • Les deux premiers appels de la fonction html_nodes extraient les titres ;
  • html_attr("href") en extrait le lien individuel, html_text() en extrait le titre; et
  • l’opérateur %>% permet d’enchaîner les opérations de manière lisible

Cette syntaxe est une simplification de la syntaxe XPath, qui sert à parcourir les documents XML, dont font partie les documents HTML. Le package XML permet de faire la même chose, mais de manière moins lisible.

On obtient trois différentes variables textuelles à partir de ces opérations :

  • La variable url va contenir des liens de ce type :
    [1] "http://www.frontnational.com/2015/03/lettre-ouverte-de-marine-le-pen-aux-acteurs-des-politiques-du-handicap/"                              
    [2] "http://www.frontnational.com/2015/03/document-de-campagne-departementales-22-et-29-mars-2015/"                                             
    [3] "http://www.frontnational.com/2015/03/lettre-de-marine-le-pen-a-lattention-de-monsieur-olivier-schrameck-president-du-csa/"
  • La variable title va contenir des titres :
    [1] "Lettre ouverte de Marine Le Pen aux acteurs des politiques du handicap"                                
    [2] "Document de campagne départementales 22 et 29 mars 2015"                                               
    [3] "Lettre de Marine Le Pen à l’attention de Monsieur Olivier Schrameck, Président du CSA"
  • La variable meta va contenir le reste :
    [1] "13 mars 2015/Tribunes libres/Mots-clefs: Handicap"                          
    [2] "12 mars 2015/Annonces/Mots-clefs: Départementales 2015"                     
    [3] "12 mars 2015/Tribunes libres/Mots-clefs: CSA, Injures"

La dernière variable contient plusieurs informations, il va donc falloir un peu plus de code pour la séparer dans ses différents éléments :

  • On commence par extraire le texte de la date à partir d’une expression régulière qui en repère l’année (élément \\d{4}, qui cherche quatre chiffres consécutifs), puis on la convertit du format français “jour mois année” vers un format générique :
    date = str_extract(meta, "(.*)\\d{4}/")
    date = parse_date_time(str_sub(date, end = -2), 
                           "%d %B %Y", locale = "FR_fr")
    date = as.Date(date)
  • On extrait ensuite la ou les catégorie(s), qui se situent toujours après le premier caractère / de la variable meta (c’est-à-dire après la date). Pour ce faire, on utilise le caractère / pour diviser la variable en plusieurs petits bouts de texte, et l’on sélectionne le second :
    category = sapply(str_split(meta, "/"), function(x) x[2])
  • Enfin, on répète l’opération pour le bloc de texte correspondant aux mots-clés, en prenant soin de virer le texte dont on n’a pas besoin au passage. Il n’y pas toujours de mots-clés : on se prémunit donc contre cette possibilité en prévoyant la possibilité d’une variable manquante NA.
    tags = sapply(str_split(meta, "/"), function(x) {
      x = x[ grepl("Mots-clefs", x) ]
      x = gsub("Mots-clefs: ", "", x)
      ifelse(length(x), x, NA)
    })

En mettant toutes ces opérations à la chaîne, et en stockant les informations que l’on extrait dans un jeu de données, on arrive à 42 lignes de code qui collectent 3 581 liens et titres d’articles de la source. Tous les articles sont catégorisés, mais 728 d’entre eux n’ont pas de mots-clés.

Visualisation hyper-basique

Cherchons à visualiser un aspect très simple du corpus : qui parle au nom du Front national auprès des médias, et dans quelles proportions ?

Pour cela, on retient les 977 articles qui appartiennent à la catégorie “Médias”, et l’on extrait les noms des intervenants, encore une fois à l’aide d’une expression régulière1. L’expression en question est élaborée en jetant un rapide coup d’oeil aux titres des articles, et en rassemblant leurs intervenants dans une même expression un peu longue :

"Marine (L|l)e Pen|Marion( |-)Maréchal|Nicolas Bay|Gollnisch|F(l)?(orian|\\.) (P|p)hilippot|Louis Aliot|Steeve Briois|Sébastien Chenu|Stéphane Ravier|Thibault de la Tocnaye|Wallerand de Saint( |-)Just|Marie-Christine Arnautu|Bousquet-Cassagne|Gilbert Collard|Julien Sanchez|Julien Rochedy|Jean-Marie Le Pen|Lacoste-Lareymondie|Philippe Murer|Sophie Montel|Laurent Lopez|Gaëtan Dussausaye|David Rachline|Bernard Monot|Aymeric Chauprade|Michel Guiniot|Edouard Cavin|Jean-Claude Otto-Bruc|Dominique Martin"

Cette expression repère tous les intervenants, et ne laisse que 16 articles sans intervenants de côté.

Il ne reste plus qu’à visualiser la quantité d’articles produites par le Front national pour sa catégorie “Médias” entre avril 2013 et aujourd’hui, en coloriant les articles par les noms des intervenants, et après avoir regroupé les intervenants avec moins de 10 articles (seuil arbitraire) dans une catégorie résiduelle. Ce qui nous donne :

fn_medias_bars

Florian Philippot est en brun, et Marine Le Pen est en bleu (clair). Je vous promets que je n’ai pas choisi les couleurs : il s’agit des couleurs par défaut de l’excellent ggplot2.

Un dernier petit coup d’oeil, pour terminer, aux mois qui ont donné le plus d’articles, et aux intervenants de ces articles. Cette fois-ci, on utilise les fonctions du package dplyr pour agréger le corpus (objet m) par mois (variable ym) et par intervenant (variable who2), puis pour compter “leurs” articles, puis pour voir les dix premiers mois classés par nombre d’articles :

filter(m, who2 != "(autres)") %>% 
  group_by(who2, ym) %>% 
  summarise(n = n()) %>% 
  group_by() %>% 
  arrange(-n)

Ce qui nous donne Florian Philippot et Marine Le Pen en tête, et très loin devant le reste du peloton. Leurs mois d’activité médiatique les plus intenses correspondent aux élections municipales de mars 2014 et à la formation du premier gouvernement Valls :

1  florian philippot  2014-5 27
2      marine le pen  2014-3 23
3  florian philippot 2013-10 21
4  florian philippot  2015-2 20
5  florian philippot 2014-11 19
6  florian philippot  2013-6 18
7  florian philippot  2015-1 18
8  florian philippot 2014-12 17
9      marine le pen  2013-9 17
10 florian philippot 2013-12 16

Enfin, si l’on répète l’opération avec la catégorie “Interventions”, on trouve les députés Gilbert Collard et Marion Maréchal-Le Pen en tête de cortège, suivis des eurodéputés frontistes, mais sur des quantités moindres (il n’y a que 336 articles, soit trois fois moins de données) et plus irrégulières :

fn_interventions_bars

Pour reproduire ces résultats, allez voir le code, il y en a pour même pas 100 lignes.

Visualisation en réseau

Revenons sur la totalité du corpus. Ce corpus contient 3 581 articles constituant les “actualités” du Front national, et 80% des articles possèdent des mots-clés. Il y a 699 mots-clés différents dans le corpus. Voici les premiers d’entre eux, qui apparaissent plus de 100 fois dans le corpus, c’est-à-dire dans plus de 3% des articles possédant des mots-clés :

Européennes 2014 118
Immigration      133
Insécurité       102
Islam radical    111
Municipales 2014 261
Paris            150
Valls            122

Aucune surprise. Voyons à présent quelles associations de mots-clés reviennent fréquemment dans ce corpus.

Première étape : créer un jeu de données à deux colonnes, où chaque ligne contient une association de deux mots-clés conjointement présents sur un même article. En langage réseau, ça s’appelle une edge list non dirigée, et en langage R, ça peut se construire comme ça, à partir de la variable b$tags contenant les mots-clés de chaque article :

# associations de mots-clés dans chaque article
e = lapply(b$tags, function(x) {
  
  y = unique(unlist(strsplit(x, ",\\s?")))
  y = expand.grid(i = y, j = y, stringsAsFactors = FALSE)
  y = filter(y, i != j)
  y = apply(y, 1, function(x) paste0(sort(x), collapse = "///"))
  y = unique(y)
  data.frame(i = gsub("(.*)///(.*)", "\\1", y),
             j = gsub("(.*)///(.*)", "\\2", y),
             stringsAsFactors = FALSE)
  
})

# assemblage des associations en une seule liste
e = bind_rows(e)

# pondération de chaque association par sa fréquence
e = group_by(e, i, j) %>% summarise(n = n())

Pour la suite, il va nous falloir utiliser le package network pour convertir cette liste en objet “réseau”, auquel on va rajouter la pondération de chaque association de mots-clés, c’est-à-dire la fréquence de chacune de ces associations dans le corpus, que l’on a calculée à la toute fin du bloc de code précédent :

n = network(e[, 1:2 ], directed = FALSE)
set.edge.attribute(n, "weight", e[, 3])

Bon, à ce stade, on a le réseau complet des co-occurrences de mots-clés dans les articles “Actualités” du site du Front national, d’avril 2013 à aujourd’hui. Ça fait beaucoup, ce dont on peut se rendre compte en visualisant le réseau à l’état brut. On produit cette visualisation avec la fonction ggnet, dont on a déjà parlé :

fn_network_0

L’épaisseur des liens entre deux mots-clés est ici proportionnelle à leur fréquence d’apparition dans le corpus, simplifiée en cinq catégories correspondant à des fréquences d’associations de 1 (co-occurrence unique), 2, 3, 4 et 5 ou plus. Le code de visualisation ressemble à ça :

# diviser les co-occurrences en 5 catégories : 1, 2, 3, 4 et 5+
w = as.numeric(cut(e[, 3], c(0, 1, 2, 3, 4, Inf)))
w = w / max(w)
# visualiser le réseau complet en faisant varier l'épaisseur des liens
ggnet(n, size = 1,
  segment.color = "black",
  segment.alpha = .5,
  segment.size = w)

Ce que l’on voit au centre, ce sont les associations de mots-clés qui reviennent fréquemment ; ce que l’on voit en périphérie, ce sont les associations de mots-clés beaucoup moins fréquentes. Concentrons-nous sur le centre en ne retenant que les associations de mots-clés apparaissant au moins cinq fois dans le corpus :

# sous-réseau des co-occurrences de fréquence 5+
nn = n
delete.edges(nn, which(w < 1))
delete.vertices(nn, isolates(nn))

ggnet(nn, size = 1,
      segment.alpha = .5, segment.color = "black",
      label.nodes = TRUE,
      label.size = 3 * as.numeric(cut(degree(nn), unique(quantile(degree(n))), 
                                      include.lowest = TRUE)))

On a ici rajouté le nécessaire pour faire apparaître les mots-clés en question, et pour leur donner une taille proportionnelle au nombre d’associations dans lesquelles ils apparaissent. Le résultat ne va pas non plus vous étonner :

fn_network_5

Visualisation animée

On introduit à présent un dernier package, animation, qui va nous permettre de montrer le réseau de co-occurrences de mots-clés à chaque étape de l’affinage entre le réseau complet, qui montre toutes les co-occurrences, jusqu’à la dernière, c’est-à-dire la co-occurrence de mots-clés la plus fréquente du corpus.

Le code ressemble à ce que l’on a déjà vu, mais dans une boucle qui élimine progressivement les associations de mots-clés les moins fréquentes :

# animation
saveGIF({
  
  w = sort(unique(e[, 3]))
  for(i in w[ -length(w) ]) {
    
    nn = n
    delete.edges(nn, which(e[, 3] <= i))
    delete.vertices(nn, isolates(nn))
    
    g = ggnet(nn, size = 0,
              segment.alpha = .5, segment.color = "black",
              label.nodes = TRUE,
              label.size = 3 * as.numeric(cut(degree(nn), 
                                              unique(quantile(degree(n))),
                                              include.lowest = TRUE))) +
      ggtitle(paste("Associations apparaissant au moins", i, "fois"))
    
    print(g)
    
  }
}, movie.name = "fn_network.gif", interval = 1)

Ce qui nous donne une suite de réseaux de plus en plus “vides”, où les mots-clés “Taubira” et “Paris” ont une assez longue durée de vie, et où les mots-clés “Paris” et “insécurité” survivent jusqu’en fin de chaîne :

fn_network

Voici le code complet de la partie “réseaux”.

Bilan technique

Dans ce billet, on a utilisé :

  • R et tout plein de packages R
  • Un navigateur Internet
  • De la syntaxe HTML et XPath
  • Des expressions régulières2
  • Un tout petit peu d’analyse de réseaux

Toutes ces technologies sont gratuites et bien documentées.

Le corpus “Actualités du Front national” a servi d’exemple parce qu’il ne présentait que des difficultés minimales, qu’il ne m’a fallu que quatre minutes pour le télécharger, et que je ne comptais en présenter que des aspects très simples. Je n’ai même pas téléchargé les articles complets, par exemple, ni envisagé leur analyse textuelle.

Les exemples que je montre sur ce blog sont souvent plus larges : le corpus des revues et articles de la plateforme Cairn.info, par exemple, que j’ai utilisé pour parler des revues de sociologie, contient plus de 400 revues et à peu près 20 000 articles. Mais la logique de base reste proche de celle détaillée ci-dessus.

  1. Attention, celle-ci n’extrait que le premier intervenant : s’il y en a plusieurs, le deuxième passe à la trappe. Il n’y a que cinq articles où le problème se pose. []
  2. Alexandre fait remarquer qu’on devrait les appeler “expressions rationnelles”. S’il vous faut d’autres exemples, en voici quelques-uns. []

Twitter permet-il de reconstituer l’espace partisan français ?

Note #1 : ce billet a été mis à jour pour refléter les données que nous avons produites avec Ewen. Voir cet autre billet pour les premiers résultats du modèle cité en fin de texte (les résultats finaux ne seront pas disponibles avant plusieurs mois, vu la lenteur de l’estimation ; je n’ai réactualisé ces deux billets qu’avec des résultats intermédiaires).

Note #2 : et pour augmenter ce réseau d’une centaine de points supplémentaires, il suffit de rajouter les données de Regards Citoyens, basées sur les listes de comptes Twitter publiées par les deux chambres parlementaires. Le réseau qui en ressort est très, très similaire à celui présenté ci-dessous.

Tout comme le dernier billet en date, une bonne partie des billets de ce blog porte sur les réseaux législatifs, où j’utilise les cosignatures de propositions de loi pour faire émerger un espace politique à deux dimensions. Dans cet espace, les parlementaires s’agrègent (se rapprochent ou s’éloignent) en fonction de différentes affinités, au premier rang desquelles l’affiliation partisane.

Peut-on retrouver cet espace partisan à partir de données complètement différentes ? Pablo Barberá s’est posé la question en partant de Twitter : si l’on regarde qui suit qui sur Twitter, est-ce que les connexions créées par les “followers” permettent de reconstituer l’espace partisan de la même manière que, par exemple, les votes ou les cosignatures ?

De quoi parle-t-on au juste ?

Quand on dispose des votes des parlementaires, on peut établir le degré de similarité de ces votes d’un parlementaire à l’autre. Quand il y a deux partis en compétition, comme aux États-Unis, les parlementaires qui votent le plus souvent avec leur parti se retrouvent à chaque extrémité du spectre (que l’on va qualifier de spectre “idéologique”), et ceux qui votent parfois avec le parti adverse se retrouvent au centre.

Toujours aux États-Unis, ce genre d’analyse peut donner un truc comme ça (via), quand on se donne deux dimensions principales pour représenter l’espace partisan à partir des votes des parlementaires :

On appelle ça des “estimations de positions idéales” (estimated ideal points). Faîtes un tour sur quelques blogs américains, et vous allez trouver plein d’exemples de ces calculs. Si vous avez le temps de lire quelques articles, cherchez les articles les plus cités de Simon Jackman. Et si tout cela vous rappelle vos cours de Master sur Anthony Downs, ça tombe bien, parce que c’est à peu près ça.

… Et le rapport avec Twitter ?

Une bonne partie de la classe politique (aux États-Unis, en France, ailleurs) est sur Twitter. Un compte Twitter peut avoir des “amis”, sélectionnés par le titulaire du compte, mais aussi des “followers”, sur lesquels le titulaire du compte n’a pas de contrôle. L’hypothèse de base : les “followers” sont plus enclins à suivre les comptes Twitter des hommes politiques qu’ils apprécient que l’inverse1.

Prenons désormais tous les “followers” de toute la classe politique française. Certains d’entre eux vont suivre un ou plusieurs comptes Twitter d’hommes politiques de gauche : Hollande, Valls, quelques députés PS, etc. D’autres vont suivre les députés UDI / MODEM, et/ou Nicolas Sarkozy. D’autres, Marine Le Pen et les eurodéputés FN. Et ainsi de suite. Et d’autres vont faire des mélanges.

Vous avez compris le principe : les “followers” peuvent être compris comme une forme de signal politique. Les “followers” de Dominique Voynet, par exemple, sont plutôt susceptibles d’être aussi les “followers” d’autres personnalités politiques EELV, ou de la “gauche plurielle” (PS, PRG, PCF) ; en revanche, ils sont peu susceptibles de faire partie des “followers” de Jean-Marie Le Pen ou d’Éric Ciotti.

Est-ce que ce qu’on peut tirer des positions idéales de ces similarités et contrastes entre “followers” sur Twitter ? Pablo Barberá montre que, pour les États-Unis et pour plusieurs pays européens, la réponse est oui. Voici par exemple, pour les États-Unis, la corrélation entre les positions idéales estimées à partir des votes (scores DW-NOMINATE, axe vertical) et celles estimées à partir des “followers” sur Twitter :

barbera

Plutôt encourageant, non ? Allez lire le reste du papier, c’est vraiment très bien fichu, et même si les résultats pour les pays européens sont un peu plus bordéliques, contexte multi-partisan oblige, ils sont quand même très pertinents.

… Et ça marche pour la France ?

Pablo Barberá n’a pas traité la France, mais on peut supposer que cela va marcher au moins aussi bien que pour les pays européens. C’est une hypothèse que l’on peut facilement mettre à l’épreuve des faits. Pour ça, il nous faut :

  • une liste des comptes Twitter de plein de personnalités politiques françaises (députés, maires, conseillers locaux…) : ça tombe bien, le site Élus 2.0 de la société Idéose en liste 800 ;
  • une manière de récupérer leurs “followers” : ça tombe bien, Pablo Barberá a publié le code pour aller taper dans l’API REST de Twitter via R ;
  • et enfin, un ou plusieurs comptes Twitter personnels, pour pouvoir récupérer toutes les données en quelques jours : et ça tombe bien, j’ai les droits nécessaires sur deux comptes, @phnk et @politbistro.

Bilan : après quelques adaptations du code de Barberá et trois jours de requêtes dans l’API, on obtient la liste des “followers” de 795 1 008 comptes Twitter d’élus, dont “l’audience Twitter” est de 3 115 538 3.16 million de “followers” différents2.

Quels sont les élus dont les comptes Twitter sont les plus suivis ? La tête du peloton n’est pas très surprenante :

> select(d, twitter, followers)
Source: local data frame [1,008 x 2]

          twitter followers
1       fhollande    949862
2  nicolassarkozy    719424
3    mlp_officiel    554177
4     jlmelenchon    424239
5            nk_m    389409
6    anne_hidalgo    338536
7         najatvb    332141
8          bayrou    279149
9      montebourg    275652
10   cecileduflot    274962
..            ...       ...

Il va désormais falloir nettoyer un peu ces listes, pour ne retenir que les “followers” les plus informatifs, au sens bayésien du terme : ceux qui produisent l’information de meilleure qualité sur l’espace latent que l’on cherche à identifie. Dans son papier, Barberá utilise plusieurs critères à cet effet :

barbera-subset1

barbera-subset2

Au stade purement exploratoire, on ne va appliquer que le critère n°5, en ne retenant pour la suite que les “followers” qui suivent au moins quatre comptes Twitter d’élus. Ce seuil légèrement plus élevé que celui de Barberá correspond au nombre moyen de comptes Twitter d’élus suivis par l’ensemble des “followers”. Ce critère nous donne 694 846 environ 725 000 “followers informatifs”3.

… Et en images, ça donne quoi ?

Voyons désormais ce que les données produisent comme espace partisan, en exploitant leur nature relationnelle. Construisons une énorme matrice d’adjacence, de dimension 795 x 694 846 1 008 x 725 390, avec les élus en lignes et leurs “followers informatifs” en colonne, puis convertissons cette matrice en une edge list de cette forme :

> head(e)
              i            j  n
1 _davidlefevre    a_leboeuf  7
2 _davidlefevre   a_suguenot 10
3 _davidlefevre    abachelay 57
4 _davidlefevre adefressenel 55
5 _davidlefevre    adegermay 17
6 _davidlefevre adelinehazan  8

Indication de lecture : 7 des “followers informatifs” du compte Twitter @_davidlefevre (élu local MODEM) suivent également le compte Twitter @a_leboeuf (député UMP). La matrice d’adjacence est asymmétrique, et la liste est donc dirigée : le nombre de “followers informatifs” du compte Twitter @a_leboeuf qui suivent aussi le compte Twitter @_davidlefevre est potentiellement différent.

Normalisons, pour terminer, le nombre de “followers informatifs” partagés par deux comptes Twitter d’élus. Il se trouve que le compte Twitter @_davidlefevre est suivi par 476 “followers informatifs” : or, seulement 7 d’entre eux suivent aussi le compte Twitter @a_leboeuf. Cette fraction nous donne, pour chaque paire (dyade) dirigée de comptes Twitter d’élus, la propensité à partager des “followers informatifs”, qui sera nécessairement comprise entre 0 et 14 :

> head(e)
              i            j  n          w
1 _davidlefevre    a_leboeuf  7 0.01470588
2 _davidlefevre   a_suguenot 10 0.02100840
3 _davidlefevre    abachelay 57 0.11974790
4 _davidlefevre adefressenel 55 0.11554622
5 _davidlefevre    adegermay 17 0.03571429
6 _davidlefevre adelinehazan  8 0.01680672

Indication de lecture : environ 1.4% des “followers informatifs” du compte Twitter @_davidlefevre suivent également le compte Twitter @a_leboeuf. Cette propensité permet de repérer des affinités très fortes : par exemple, parmi les comptes Twitter d’élus du Front National, plus de 90% des “followers informatifs” des comptes Twitter @mcaucouturier, @mireilledornano et @steevebriois suivent aussi @mlp_officiel.

Cette liste peut être représentée sous forme de réseau, en filtrant la liste des liens d’intensité située au-delà d’un seuil arbitraire. Lorsque l’on visualise le réseau des liens d’intensité 0.5, par exemple, il suffit que deux élus partagent plus de 50% de “followers informatifs” pour être connectés, ce qui crée un réseau assez dense où plusieurs formations partisanes sont proches les unes des autres :

network_0.5_paper

La méthode de pondération donne parfois une position centrale à des acteurs politiques périphériques, mais ce n’est pas la préoccupation ici : on cherchait juste à vérifier, en première approche, que les liens formés entre les comptes Twitter par leurs “followers informatifs” renvoient bien à un espace partisan latent qui ressemble à l’espace partisan réel — ce qui a l’air d’être le cas.

Le réseau permet notamment de repérer la position structurellement remarquable du Front National, qui fait figure d’outsider, et celle de Marine Le Pen, qui est presque la seule au FN à partager plus de 50% de ses “followers informatifs” (qui sont un peu plus de 200 000) avec d’autres élus que les élus FN :

> filter(e, w > .5, i == "mlp_officiel")
             i              j      n         w
1 mlp_officiel         bayrou 113166 0.5100187
2 mlp_officiel      fhollande 115244 0.5193838
3 mlp_officiel    jlmelenchon 124640 0.5617299
4 mlp_officiel nicolassarkozy 112203 0.5056786

… Et la suite ?

La suite implique de faire tourner un modèle spatial hyper-lourd qui met des plombes à converger. Comme je n’ai pas encore réussi à faire tourner le truc sur ma machine de bureau, je vais m’en tenir à l’approche exploratoire. Mais si vous avez un processeur hyper-puissant sous la main et quelques connaissances en R, laissez un commentaire, je suis très preneur ! C’est en cours : voir ce billet.

  1. L’homophilie conduisant à l’exposition sélective, vous pouvez rédiger cette hypothèse de plusieurs manières pour finir au même endroit. []
  2. Quelques comptes sont inaccessibles parce que la liste des comptes n’est pas parfaitement à jour. En creusant plus loin avec Ewen, nous avons mis la liste à jour et rajouté environ 200 comptes. []
  3. Ici aussi, le chiffre est à jour de la collecte des données effectuée avec Ewen un peu après des élections départementales de 2015 []
  4. Ce schéma de pondération pénalise les comptes Twitter les plus suivis et, à l’inverse, avantage les comptes avec peu de “followers”, mais il suffit à des fins exploratoires []

Récupérer les tweets des élections départementales

Au cas où un lecteur ait à disposition une machine qui puisse tourner sans s’arrêter sur les quinze prochains jours, histoire d’avoir une bonne fenêtre de tir…

1. Il vous faut un compte Twitter

À partir de votre compte Twitter, créez une application en vous rendant à cette adresse. Le compte en question doit être lié à un numéro de téléphone. Les autres informations à fournir ne sont pas importantes : donnez n’importe quel nom et description à l’application, cochez la case en dessous des conditions d’utilisation, et vous allez vous retrouver sur une page qui permet de récupérer ces deux informations :

Screen Shot 2015-03-21 at 18.13.58

Il vous faut l’information apparaissant sous les deux barres rouges.

2. Il vous faut le package R ROAuth

Dans R, installez le package ROAuth, puis insérez vos deux codes dans les commandes suivantes :

# install.packages("ROAuth")
library(ROAuth)

requestURL = "https://api.twitter.com/oauth/request_token"
accessURL = "https://api.twitter.com/oauth/access_token"
authURL = "https://api.twitter.com/oauth/authorize"
consumerKey = ""
consumerSecret = ""
my_oauth = OAuthFactory$new(consumerKey = consumerKey,
                            consumerSecret = consumerSecret,
                            requestURL = requestURL,
                            accessURL = accessURL,
                            authURL = authURL)

Une fois ces commandes exécutées, exécutez celle-ci :

my_oauth$handshake(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))

Votre navigateur va s’ouvrir et vous offrir un code PIN à rentrer dans R :

Screen Shot 2015-03-21 at 18.19.02

Une fois que c’est fait, sauvegardez le résultat :

save(my_oauth, file = "oauth.rda")

Et vous y êtes presque.

3. Il vous faut le package R streamR

Le petit bout de code expliqué ci-dessus traînait sur mon disque dur. Je ne me souviens pas de la source exacte, mais c’était sans doute un tutoriel de Pablo Barbera. Le même a écrit le package streamR, qui va vous permettre de récupérer une sélection de tweets identifiés par les mots-clés et hashtags des élections départementales. Installez le package, puis lancez cette boucle :

# install.packages("streamR")
library(streamR)

# load credentials
load("my_oauth.Rdata")

# scrape for 15 days
for(i in (15 * 24 * 2):1) {

  n = sprintf("%03.0f", i)
  f = paste0("tweets", n, ".json")

  cat(n, "scraping to", f, "...\n")
  filterStream(f, track = c("départementales", "departementales",
                            "#departementales2015", "#departementales",
                            "#départementales2015", "#départementales",
                            "#dep2015"),
               timeout = 60 * 25, oauth = my_oauth)

  # leave five minutes out
  Sys.sleep(60 * 5)

}

La boucle produit un fichier toutes les 25 minutes et ignore dix minutes d’information par heure, histoire de laisser l’API de Twitter souffler un peu. Les résultats ne sont pas limités aux tweets en français, mais vous aurez tout le loisir de faire le tri plus tard.

Un petit test effectué ce samedi m’a renvoyé un peu plus de 4 600 résultats de bonne qualité (dont 4 100 en français) en moins de six heures. Il est très facile d’explorer ce genre de données en utilisant, par exemple, environ 700 comptes Twitter d’élus et de partis politiques français, afin de voir s’ils sont souvent retweetés :

Rplot

Le codage ci-dessus est très incomplet : je n’ai codé que les comptes Twitter des médias les plus évidents (presse quotidienne, chaînes de télévision et quelques médias en ligne), et n’ai inclus dans la catégorie “Officiels” que le seul compte Twitter du Ministère de l’Intérieur. Récoltez les données demain et les jours suivants, et vous aurez un bon matériau pour faire beaucoup mieux.

Les revues de Cairn.info : mise à jour technique

Depuis la publication de ma petite série de billets sur les revues de sociologie, la plateforme Cairn.info a légèrement modifié le code source de ses pages. Il n’est désormais plus possible d’accéder à la liste de toutes les revues d’une discipline : cette page, par exemple ne fournit plus – contrairement à ce qu’indique son adresse – la liste intégrale des revues de la discipline “Sociologie et société”, mais seulement les derniers numéros et les articles les plus consultés de cette discipline.

Du coup, voici une mise à jour du code des billets précédents, qui contient les listes des revues de chaque discipline. La liste des revues de sociologie est à jour (mars 2015), de même que la page qui liste l’intégralité des revues de la plateforme. En revanche, les pages des autres disciplines datent de juillet 2014, ce qui fait qu’il manque quelques revues. J’ai récupéré ces pages sur archive.org, et n’ai rien trouvé dans les conditions d’utilisation de Cairn.info qui en interdise l’archivage.

Pour répliquer l’analyse des revues de sociologie, il suffit de télécharger le dossier, d’installer les packages R listés dans le fichier make.r, et d’être patient pendant le téléchargement des pages de chaque revue, puis de chaque numéro de revue. Pour analyser les revues d’une autre discipline, jetez un coup d’oeil aux instructions du fichier README : ce n’est pas très compliqué, mais il faut modifier différentes parties du code pour que le téléchargement et les graphiques se passent bien.

Dernier détail : j’ai testé le code en téléchargeant les pages de tous les numéros de revues indexés sur Cairn.info, soit un total de 422 revues, presque 17 000 articles, et un peu plus de 120 000 auteurs, avec quelques doublons : Alfred Sauvy, par exemple, s’appelle aussi “A.S.” dans les vieux numéros de Population. Attention, il vous faudra pas mal d’espace-disque pour accomplir la même opération : les pages des numéros des seules revues de sociologie et de science politique pèsent déjà près de 400 MB.

Publicité gratuite : vous pouvez suivre la plateforme Cairn sur Twitter, où elle annonce qu’elle sera représentée au Salon du livre de Paris dans les jours qui viennent.

Petit développement supplémentaire

Mise à jour : on me demande dans l’oreillette si l’analyse tient lorsque l’on considère toutes les revues de la plateforme Cairn.info.

Argument : l’espace des éditorial sciences humaines et sociales étant fortement pluridisciplinaire, il faut regarder au travers de toutes les disciplines pour y mesurer la tendance à l’entre-soi.

Réponse : pas complètement d’accord avec l’argument. Certaines disciplines sont plus transdisciplinaires que d’autres. On peut le mesurer en observant les revues qui apparaissent dans plusieurs champs disciplinaires sur Cairn.info :

     geo,scpo       geo,soc histoire,scpo      scpo,soc 
            9            11             8             7

Par ailleurs, si l’on appelle revues “trans-disciplinaires” les revues qui apparaissent dans plus d’une discipline sur Cairn.info, on obtient un joli graphique qui résume bien la situation (lignes pointillées aux moyennes de chaque axe) :

trans-disciplinaires

De la même manière, si l’on fait passer la matrice des appartenances disciplinaires dans une analyse par composantes principales, on retrouve quelques-uns des champs les plus trans-disciplinaires.

Enfin, si l’on suit la méthodologie du précédent billet pour mesurer le degré pondéré relatif de chaque revue de Cairn.info par rapport à toutes les autres, on obtient un résultat assez proche de celui déjà publié :

degree_all

Ce graphique est basé sur les connexions entre 423 revues, établies sur 16 217 articles par environ 116 800 auteurs différents.

Un “stress test” des revues de sociologie connectées par leurs auteurs

Dans le billet précédent et dans celui d’avant, on a mesuré l’entre-soi éditorial de la sociologie, c’est-à-dire la tendance des revues à “capturer” leurs auteurs.

À partir de l’échantillon des revues “Sociologie et société” de la plateforme Cairn, on peut en effet montrer que beaucoup des auteurs de ces revues ne publient que dans un nombre très limité de revues, ce qui est particulièrement vrai de certaines revues très spécialisées, rédigées par des auteurs se comportant comme des “cliques” peu connectées au reste des revues de la discipline.

Mesurons à présent la même chose, mais de toute autre manière : quelles sont les revues les plus connectées aux autres revues de l’espace éditorial de la sociologie ?

La méthode générale

On change ici une partie essentielle du raisonnement : l’objectif devient de recréer le réseau sous-jacent à cet espace éditorial, et d’y connecter les revues entre elles en fonction de la propension de leurs auteurs à publier dans d’autres revues. Au niveau technique, cette opération requiert d’établir un protocole de construction du réseau éditorial, qu’on résumera de la manière suivante :

  1. On commence par extraire tous les auteurs ayant publié dans une revue initiale X donnée. Cela nous donne une liste plus ou moins longue d’auteurs.
  2. On identifie ensuite tous les articles de ces auteurs, qu’ils aient été publiés dans la revue en question ou pas. Cela nous donne une liste d’articles.
  3. On regroupe ces articles par leur revue de publication : cela nous donne un nombre total d’articles par revue, qui est très élevé pour la revue initiale X, et plus faible pour les autres.
  4. On normalise le nombre d’articles par revue en le divisant par le nombre d’articles dans la revue initiale X : cela nous donne une fraction théoriquement bornée entre (0, 1], du moment où la revue initiale est celle qui concentre le plus de publications.
  5. Enfin, on se sert de cette fraction pour établir un lien pondéré entre la revue initiale X et chacune des autres revues identifiées par les étapes précédentes.

Illustration de la méthode :

  1. On extrait tous les auteurs ayant publié (dans les limites de l’échantillon) dans la Revue française de sociologie : il y en a 348.
  2. On identifie les articles de ces auteurs : il y en a 1 651, répartis dans 84 revues, ce qui est beaucoup, et qui va nous donner 84 liens différents au final.
  3. On regroupe ces articles par revue de publication, et l’on observe que ces 348 auteurs ont publié 352 articles dans la Revue française de sociologie, mais aussi 83 articles dans la Revue européenne des sciences sociales, par exemple :
    1                      francaise-de-sociologie  352
    2             europeenne-des-sciences-sociales   83
    3                      societes-contemporaines   68
    4                                   mouvements   67
    5                         l-annee-sociologique   63
  4. On divise ces totaux par 352, puis l’on retire la Revue française de sociologie pour ne pas créer de lien entre la revue et elle-même, ce qui n’aurait pas de sens. On obtient des coefficients de pondération entre 0 et 1 :
    1 europeenne-des-sciences-sociales 0.2357955
    2          societes-contemporaines 0.1931818
    3                       mouvements 0.1903409
    4             l-annee-sociologique 0.1789773
    5            informations-sociales 0.1562500
  5. Enfin, on crée un lien d’intensité 0.23 entre la Revue française de sociologie et la Revue européenne des sciences sociales, et de même pour les 83 autres revues suivantes.

Laissez reposer la pâte quelques heures, et c’est prêt.

Le schéma de pondération

Cette méthode produit un réseau très dense, qui connecte 96 revues entre elles par des liens d’intensité très variable. D’ailleurs, dans quelques rares cas, ces liens sont d’intensité supérieure à 1, lorsque le pool d’auteurs d’une revue a moins publié dans cette revue que dans une autre. C’est ce que l’on peut voir en dessinant la fonction de répartition empirique de ces liens, en les classant par leur intensité :

weights_ecdf

Quels sont ces cas particuliers ? Ils sont peu nombreux et explicables : par exemple, les auteurs de la revue Clio ont plus publié dans la revue Clio. Femmes, genre et société que dans la revue Clio. Ce n’est pas surprenant : il s’agit d’une seule et même revue, qui a juste changé d’identifiant sur Cairn… Quant aux autres cas particuliers, il s’agit de revues publiées par le Ministère de la Culture, ne contenant qu’un seul article par numéro.

> filter(e, w >= 1)
                    i                          j        w      ecdf
1                clio clio-femmes-genre-histoire 1.032182 0.9981329
2    culture-chiffres           culture-methodes 1.225000 0.9988798
3      culture-etudes           culture-methodes 1.258824 0.9992532
4      culture-etudes        culture-prospective 1.035948 0.9985063
5      culture-etudes                    reseaux 1.332244 0.9996266
6    culture-methodes                    reseaux 1.000545 0.9977595
7 culture-prospective                    reseaux 2.669935 1.0000000

On va laisser de côté ces cas particuliers, et se concentrer sur le reste des liens, d’intensité variant entre 0 et 1. Commençons par un exemple : où se trouvent, parmi tous ces liens, ceux qui relient la revue Genèses à d’autres autre revues ? La réponse est que ces liens se trouvent un peu partout dans la distribution : les auteurs de cette revue ont publié dans plusieurs autres revues, parfois peu, parfois beaucoup :

ecdf_geneses

Les liens les plus forts de la revue Genèses la relie aux revues Politix, Sociétés contemporaines et Actes de la recherche en sciences sociales – ce qui ne surprendra pas les politistes (ou “sociologues du politique”), qui publient fréquemment dans ces trois revues et contribuent ainsi à les rapprocher dans le réseau que l’on a construit :

                                           i                       j         w      ecdf
1                                    geneses                 politix 0.4652329 0.9973793
2                                    geneses societes-contemporaines 0.3591092 0.9910146
3 actes-de-la-recherche-en-sciences-sociales                 geneses 0.3445658 0.9887683
4                                    geneses             savoir-agir 0.3008793 0.9839012
5                                    geneses              sociologie 0.2491052 0.9734182
6                                    geneses     le-mouvement-social 0.2359327 0.9689255

Quid de la revue Sociétés, qui a servi de point de départ à ces billets ? Cette revue est également connectée à d’autres, mais par des liens beaucoup plus ténus, soit parce que ses auteurs ont beaucoup publié dans Sociétés, soit parce qu’ils ont peu publié ailleurs, ce qui revient au même dans notre schéma de pondération :

                     i        j          w      ecdf
1       communications societes 0.16422287 0.9359790
2             societes   volume 0.07563025 0.8169225
3 l-annee-sociologique societes 0.06060606 0.7663796
4              diogene societes 0.05665375 0.7472857
5              reseaux societes 0.05206477 0.7263197
6 ethnologie-francaise societes 0.05197472 0.7255709

Lorsque l’on va chercher à visualiser ces liens, on va tenir compte de leur intensité pour ne faire apparaître que les liens les plus forts : pour cela, on se servira de leur distribution cumulée pour créer un “effet de seuil”, qui nous permettra de ne visualiser, par exemple, que les 20% des liens les plus forts. Cela permettra de visualiser un réseau moins dense, plus lisible, et surtout plus significatif.

Les réseaux

Voici le réseau constitué à partir de l’échantillon de revues dont on dispose, à des valeurs différentes du seuil évoqué ci-dessus. On commence à un seuil de 0 (réseau complet), que l’on augmente ensuite par incréments de 0.1 pour retirer les liens les plus faibles, puis par incréments de 0.01 lorsque l’on atteint 0.9, de manière à ne garder que les liens les plus forts entre les revues les plus intensément connectées à d’autres :

full

Au fur et à mesure que le seuil augmente, on ne garde que les liens les plus significatifs entre les revues. L’animation permet de percevoir cet effet de composition, mais ne permet pas de scruter le réseau de manière précise. Du coup, voici une version statique du réseau, où l’on n’a retenu que les 2.5% des liens les plus forts entre les revues (cliquer pour la version PDF) :

example_975

Que trouve-t-on parmi les liens les plus forts entre les revues de sociologie ? Beaucoup de relations qui font sens si l’on connaît un peu cette littérature, comme par exemple :

  • des liens forts entre les revues Clio, Nouvelles questions féministes et Travail, genre et société (tout en haut du graphe ; vous aurez deviné le thème) ;
  • des liens forts entre Genèses, Politix, Actes de la recherche en sciences sociales et Savoir/agir (au centre ; pas de surprise non plus) ; et
  • des liens forts entre des revues généralistes : L’Année sociologique, la Revue française de sociologie, Sociologie et la Revue européenne des sciences sociales.

Jusque-là, tout va bien. Regardons à présent les différentes positions prises par la même revue au fil des graphes. On commence avec la revue Sociologie, que vous voyez ci-dessous sous la forme d’un point rouge. Au fur et à mesure que l’on éclaircit le réseau en n’en retenant que les liens les plus forts, la revue devient de plus en plus centrale, jusqu’à l’avant-dernière étape, où elle disparaît (effet de seuil à 0.99) :

sociologie

Voyons à présent la revue Sociétés. Dès le départ, la revue occupe une position plus périphérique, étant moins connectée aux autres revues que ne l’était la revue Sociologie. Sa relégation à la périphérie de l’espace éditorial devient de plus en plus claire au fur et à mesure qu’on augmente le seuil en-dessous du lequel on ignore les liens entre revues. Sociétés disparaît du réseau lorsque le seuil d’intensité atteint 0.93 :

societes

La méthode de mesure

Bien. Faisons le bilan.

Pour chaque revue, on dispose de réseaux pondérés qui exprime la propension de la revue à être connectée aux autres revues de l’espace éditorial sociologique, mesuré sous une forme limitée à l’échantillon des revues Cairn. Les différents réseaux pondérés de chaque revue sont obtenus en augmentant graduellement le seuil d’intensité des liens qui y figurent.

Ce schéma d’observation permet de mesurer, pour chaque revue, son degré de centralité dans l’espace éditorial sociologique, qui peut être très élevé, auquel cas la revue est “centrale” dans cet espace éditorial, ou très faible, auquel cas cette revue est périphérique dans ce même espace. Ce degré de centralité est mesurable à différents seuils contenus entre 0 et 11.

Du coup, voilà ce qu’on va faire :

  1. On construit les relations de chaque revue à tous les seuils compris entre 0 et 0.99, par incrément de 0.01 (soit 100 réseaux par revue) ;
  2. Dans chaque réseau, on mesure le degré de centralité pondéré de la revue2, que l’on divise par le degré de centralité maximal observé dans le réseau ;
  3. Puis l’on met toutes ces données sur un même graphique, pour comparer les revues entre elles à partir de leur degré de centralité relatif.

Que va-t-il se passer lorsque l’on va appliquer cette méthodologie ?

  • Les revues centrales de l’espace éditorial vont se distinguer par un degré de centralité élevé, qui va rester élevé jusqu’à des niveaux de seuil eux-mêmes élevés, lorsque l’on en considère plus qu’une fraction des liens les plus forts entre les revues.
  • Les revues périphériques de l’espace éditorial vont se distinguer par un degré de centralité plus faible, qui va s’effondrer au fur et à mesure que l’on limite le réseau à ses liens les plus intenses, jusqu’à disparaître à des niveaux de seuil élevés.

C’est donc une forme de “stress test” que l’on va faire subir aux revues de la sociologie : à partir de 100 valeurs différentes, on va tester leur centralité dans l’espace éditorial disciplinaire constitué par les revues de la plateforme Cairn, et voir lesquelles se maintiennent à des niveaux élevés dans cet espace, même lorsque l’on “épure” le réseau pour n’en retenir que les liens les plus forts, c’est-à-dire ceux qui représentent plusieurs articles, rédigés par plusieurs auteurs navigant d’une revue à l’autre.

Ce “stress test” va identifier certaines revues “centrales”, qui publient plusieurs auteurs actifs dans d’autres revues. À l’inverse, il va aussi identifier les revues dont les auteurs se comportent comme des “cliques” : ces revues vont en effet assez rapidement disparaître du réseau connectant les revues entre elles, de par l’absence d’activité éditoriale soutenue de leurs auteurs dans d’autres revues.

Les résultats

Voici les résultats de la méthode de calcul décrite plus haut appliquée aux 96 revues de l’échantillon. Chaque ligne représente le degré de centralité relatif d’une revue, et l’on a fait ressortir quelques revues par des couleurs distinctes :

degree_all

Dans ce graphique, on observe le degré de centralité relatif de deux revues centrales de la sociologie : Actes de la recherche en sciences sociales et la Revue française de sociologie. Ces revues correspondent à des écoles : la première est d’influence bourdieusienne, la deuxième d’influence durkheimienne3. Mais cette filiation n’empêche pas leurs auteurs d’être acceptés pour publication dans d’autres revues, d’où leur fort degré de centralité dans l’espace éditorial.

Il en va de même pour Genèses, Réseaux et Sociologie : ces revues sont également connectées à de nombreuses autres par l’intermédiaire de leurs auteurs. Pourquoi ? Il y a plusieurs explications possibles : Réseaux, par exemple, est une revue centrale pour les études communication, qui est connectée à plusieurs revues moins centrales dans ce sous-domaine des recherches sociologiques, comme la revue Télévision, ce qui lui procure une position avantageuse dans l’espace éditorial4.

De la même manière que ces résultats permettent de repérer les revues dont les auteurs cherchent à se positionner au centre de l’espace éditorial sociologique, ils permettent aussi d’identifier les revues dont les auteurs sont beaucoup plus isolés dans cet espace. Nota bene : dans une structure en réseau, l’isolement se traduit par un positionnement en périphérie ; l’isolement et la marginalité y sont donc structurellement équivalentes. Je vous laisse appliquer cinquante nuances de subtilité à ce glissement conceptuel.

J’ai ainsi fait exprès de faire figurer la revue Recherches en soins infirmiers, qui est très illustrative de cette position structurale : de par sa nature hyper-spécialisée, cette revue attire des auteurs extérieurs au champ universitaire, qui ne cherchent pas à s’imposer dans l’espace éditorial sociologique, et qui publient par conséquent peu dans le reste des revues de la discipline. La position marginale de la revue s’explique donc très bien.

Il nous reste, enfin, la revue Sociétés, dont le sous-titre est : “Revue des sciences humaines et sociales”. Dans le billet précédent et dans celui d’avant, cette revue apparaissait déjà parmi les revues les plus caractéristiques d’un entre-soi éditorial ; l’analyse par réseaux permet de compléter cette observation en renforçant le constat de marginalité de ses auteurs dans l’espace éditorial sociologique.

Conclusion

À partir des résultats accumulés au cours des trois derniers billets, on peut désormais affirmer que l’on a établi la nature marginale de la revue Sociétés dans l’espace éditorial sociologique, entendu encore au fois au sens limité de l’échantillon des revues hébergées sur la plateforme Cairn. Cet échantillon est par définition incomplet, mais il est tout de même suffisamment large pour que l’on ait confiance dans ce résultat.

Quand les auteurs du canular publié par la revue Sociétés affirment que cette revue publie des auteurs qui “restent entre eux” au lieu d’aller confronter la validité de leur démarche scientifique au reste de la profession, on ne peut que leur donner raison, et constater avec eux que la revue Sociétés publie un groupe d’individus qui ne bénéficie que de connexions très faibles au reste de l’espace éditorial sociologique.

Qu’est-ce que cela signifie ? Ce n’est pas un jugement de fond : ni le contenu des articles, ni leurs citations, n’ont été mobilisés dans l’analyse. Toutefois, les liens que tissent les sociologues en publiant dans plusieurs revues renvoient aux alliances, aux coopérations et aux soutiens qui s’expriment entre différents segments de la discipline universitaire : c’est cette caractéristique du travail éditorial qui sous-tend les réseaux que l’on a fait apparaître, et qui permet de discriminer les revues centrales des revues périphériques.

De ce point de vue, et dans la limite de démonstration imposée par l’échantillon, la revue Sociétés est une revue structurellement marginale dans la discipline sociologique, ce qui n’est pas le cas, loin s’en faut, de toutes les revues représentant un courant d’analyse spécifique—à condition de considérer, bien sûr, que les publications de cette revue méritent le titre de courant d’analyse, ce que Manuel Quinon et Arnaud Saint-Martin remettent très justement en cause (et ils ne sont pas les seuls).

Pour aller plus loin

Voici le code complet de l’analyse. Le code permet très facilement d’inclure d’autres espaces disciplinaires représentés sur la plateforme Cairn.info ; en revanche, inclure les revues des plateformes Persée.fr, Érudit.org ou Revues.org demanderait beaucoup, beaucoup plus de travail.

Cette analyse pourrait être développée pour faire un petit article à destination d’une revue comme le Bulletin de méthodologie sociologique ; merci de laisser un commentaire si vous êtes intéressé.

  1. Au seuil 0, on considère tous les liens qui peuvent exister entre les revues par l’intermédiaire des auteurs qui publient dans plusieurs d’entre elles ; au seuil 0.99 approchant 1, on ne considère que les liens les plus forts. []
  2. Suivez ce lien pour comprendre la méthode de calcul. J’ai utilisé un paramètre de pondértion alpha de 1, ce qui signifie que j’ai utilisé la généralisation de Barrat pour pondérer le degré de chaque revue. []
  3. Si vous êtes spécialiste du sujet (je ne le suis pas), donnez-moi de meilleurs qualificatifs dans les commentaires. []
  4. On observera avec amusement que la revue la plus centrale au seuil le plus élevé est justement la revue… Réseaux. Autrement dit, cette revue est la mieux connectée aux autres par le biais des publications de ses auteurs : pas surprenant pour une revue trans-disciplinaire qui se situe à la frontière entre sociologie et “sciences de l’info.-comm.”. []

Quelques mesures de la concentration éditoriale en sociologie

Dans le précédent billet, on a utilisé les 96 revues indexées par la plateforme Cairn et classées dans la discipline “Sociologie et société” pour produire une première mesure de l’entre-soi éditorial dans les revues de sociologie.

Cette première mesure visait à vérifier que les auteurs du canular visant (Michel Maffesoli et) la revue Sociétés avaient raison de penser que cette revue publie surtout les travaux d’un groupe auto-référentiel et isolé dans l’espace éditorial scientifique. Les premiers résultats ont confirmé cette vision des choses.

Allons un peu plus loin en cherchant à valider ce résultat par plusieurs mesures concurrentes de la concentration éditoriale des revues de l’échantillon. On va en produire trois, en allant de la mesure la plus simple à la mesure la plus compliquée (mais qui reste très simple).

On rappellera tout d’abord que l’échantillon est limité aux revues indexées par Cairn : l’analyse ne porte donc que sur un fragment de l’espace éditorial. Toutefois, ce fragment est assez large pour faire apparaître des différences marquantes entre les revues, qui trouvent de plus des explications qualitiatives intéressantes.

Le code pour produire les graphiques suivants (dans un ordre différent) est en ligne, avec le code pour récupérer les métadonnées de base.

Mesure 1 : le pourcentage d’auteurs “mono-revues”

Le nombre d’articles publiés par les auteurs du corpus varie de manière très importante : 74% des auteurs n’ont publié qu’un seul article dans une revue indexée par Cairn, alors que d’autres, comme les directeurs de revues qui signent les éditoriaux de chaque numéro, en comptent plusieurs dizaines1.

En plus de cette variation, explicable par des différences d’avancement de carrière et de productivité, certains auteurs n’ont publié que dans une seule des revues indexées par Cairn. Appelons ces auteurs les auteurs “mono-revues”, et mesurons leur pourcentage parmi les auteurs de chaque revue.

Cette première mesure donne le résultat suivant, qui converge très fortement avec celui du billet précédent (cliquer pour la version PDF) :

revues_mono_rank

On retrouve la revue Sociologie dans les revues dont les auteurs sont très souvent “pluralistes” : 80% de ses auteurs ont publié dans une autre revue indexée par Cairn. Et tout en bas, on retrouve les revues isolées dans le champ éditorial, comme Africultures. La revue maffesolienne Sociétés est en haut du dernier quartile.

Mesure 2 : la concentration de la production écrite

Émettons à présent une critique basique de la mesure précédente : certes, 60% des auteurs d’Actes de la recherche en sciences sociales ont publié dans une autre revue, mais cette mesure ne nous dit pas s’ils ont publié un seul article ailleurs, et tous les autres dans cette revue.

Pour répondre à cette critique, reprenons une idée du précédent billet, en calculant le pourcentage moyen de la production écrite des auteurs qui se trouve “capturée” par chaque revue. L’idée fondamentale consiste ici à penser les auteurs comme une clientèle plus ou moins “captive” de chaque “entreprise” éditoriale.

Le résultat ci-dessous est, encore une fois, très fortement corrélé au(x) précédent(s) : le coefficient de corrélation linéaire est proche de rho = .94.

revues_conc_rank

Sur cette deuxième mesure, les Carnets de notes sur les maltraitances infantiles sont encore mieux séparés du reste des revues, et “capturent” la quasi-totalité des articles des auteurs y ayant publié au moins un texte. La revue étant hyper-spécialisée et périphérique à la sociologie universitaire, ce n’est pas surprenant.

Mesure 3 : l’indice de Herfindhal-Hirschman

L’indice de Herfindhal-Hirschman (oui, c’est le même Hirschman) est un taux de concentration construit à partir des parts de marchés des plus grosses firmes d’un secteur industriel, élevées à la puissance 2. Je m’en sers en cours pour illustrer l’augmentation de la compétitivité sur le marché des navigateurs Internet.

Cet indice n’est plus un pourcentage, mais une somme de carrés de fractions dont la somme fait 1 : en conséquence, elle varie sur l’intervalle (0, 1], où 1 désigne une situation de monopole. Son intérêt par rapport aux mesures précédentes est de prendre en compte toute l’information dont on dispose sur les publications de chaque auteur.

Comme les mesures précédentes, l’indice de Herfindhal-Hirschman se calcule par auteur ; on prend ensuite la moyenne de cet indice pour tous les auteurs d’une revue. On peut même s’amuser à prendre la moyenne pondérée de cet indice, en fonction du nombre d’articles qu’a signé chaque auteur dans la revue2.

Voici l’indice moyen de chaque revue, entouré d’un intervalle correspondant à ± 1 écart-type des indices des auteurs. Cliquer pour la version PDF.

revues_hhi_rank

Encore une fois, on observe très, très peu de variations avec les mesures précédentes : la corrélation avec le pourcentage d’auteurs “mono-revues” est même quasi-parfaite. Le “classement” des revues, de la plus à la moins “monopolistique”, est quasiment inchangé.

Qu’a-t-on établi ?

La multiplication des mesures permet de valider le spectre de l’entre-soi éditorial identifié au billet précédent :

  • à l’extrémité gauche du spectre, on trouve des revues généralistes, accueillant des auteurs qui publient aussi dans d’autres revues ; et
  • à l’extrémité droite du spectre, on trouve des revues très spécialisées, accueillant des auteurs qui publient presque exclusivement dans cette revue.

C’est exactement ce que suggèrent les auteurs du canular visant la revue Sociétés : celle-ci est spécialisée dans la publication, et apparemment sans aucune validation scientifique, de ce que l’on appelle une “clique” en analyse de réseaux – ou encore une “secte” ou une “chapelle”, quand on veut être plus critique.

Je cite ces derniers termes à dessein : ils sont souvent utilisés pour critiquer tel ou tel sous-groupe de sociologues, pour faire passer l’idée que ce groupe est auto-référentiel. Ses membres peuvent, par exemple, se citer beaucoup les uns les autres, ou même s’auto-promouvoir les uns les autres dans certains cas extrêmes…

On reviendra donc, dans un prochain billet, sur d’autres aspects de la “clique maffesolienne”, et des autres cliques que l’on pourrait identifier dans le corpus.

Et cette fois-ci, il y aura des réseaux, promis.

  1. C’est notamment le cas d’Alfred Sauvy, personnage important pour la structuration du sous-champ scientifique auquel il appartenait (la démographie), et de sa revue centrale (Population), qu’il dirige jusqu’en 1975. Alfred Sauvy apparaît sous son nom complet ou sous les initiales “A. S.” dans les notules de fin de numéro []
  2. Le code permet de constater que la pondération de l’indice donne quasiment les mêmes résultats. []

L’entre-soi éditorial des revues de sociologie

Un autre blog de la plateforme Hypothèses a récemment lancé une “affaire Sokal à la française” en publiant un article absurde dans la revue de la chapelle Maffesoli. Je ne donne pas plus de contexte : allez lire, c’est assez amusant. Et si vous ne connaissez pas le personnage, il y a tout ce qu’il faut sur Wikipedia.

Les deux auteurs du canular critiquent aussi bien la “méthode” maffesolienne, qui fait penser au générateur automatique de textes post-modernes, que l’absence d’évaluation scientifique par la revue ciblée, Sociétés. L’une de leurs critiques porte sur “l’entre-soi [éditorial] maffesolien” qui s’incarne dans la revue :

Les autres articles du volume [contenant l’article-canular] fonctionnent sur le même schéma référentiel que celui mis en place en introduction. Les auteurs sont, pour la plupart, des habitués de la revue Sociétés pour laquelle ils publient presque exclusivement […]. Pour certains auteurs, comme le montre la base de données de Cairn.info, Sociétés est la seule revue dans laquelle ils publient. L’expérience pourrait être répétée à l’envi pour les autres numéros de la revue, et il est probable que nous retrouvions en permanence les mêmes noms (produisant le même type d’article).

Ce passage ne demande qu’à être vérifié : dans quelle mesure les sociologues ont-ils tendance à ne publier que dans une seule et même revue ?

Les données

On va tenter de répondre à cette question en prenant l’échantillon, assez large, de toute les revues de la catégorie disciplinaire “Sociologie et société” de la plateforme Cairn. Le téléchargement prend une centaine de lignes à coder. Il faut ensuite une bonne heure et demie pour obtenir toutes les pages contenant les identifiants des auteurs.

Le résultat est un jeu de données qui contient 57 298 auteurs, répartis sur 3 813 numéros de 96 revues contenant 50 640 articles. Le corpus est évidemment assez hétérogène, car les revues varient sur de nombreux paramètres. Voici par exemple les revues indexées sur les plus longues périodes, avec leur nombre total de numéros et d’auteurs :

                            revue  min  max numeros auteurs annees
1                      population 1946 2014     302    2096     69
2                         reseaux 1983 2014     170    1073     32
3            cultures-et-conflits 1990 2014      79     548     25
4             espaces-et-societes 1990 2014      71     830     25
5             le-mouvement-social 1990 2014      94     628     25

La méthode

Pour ce billet introductif, on va faire simple :

  1. On commence par extraire les identifiants uniques des auteurs1 publiés dans chaque numéro, et pour éviter de sur-valoriser les numéros spéciaux où l’introduction et la conclusion sont rédigées par le(s) même(s) auteur(s), on ne compte chaque auteur qu’une fois par numéro.
  2. On compte ensuite, pour chaque auteur, le nombre de revues de la plateforme dans lesquelles il a publié ; puis l’on établit, pour chaque revue, la moyenne et l’écart-type de cette quantité. Les revues qui correspondent à un “entre-soi” éditorial auront une moyenne très proche de 1, et un écart-type très proche de 0.

En code, ça donne :

d %>%
  group_by(auteur) %>%
  mutate(n = n_distinct(revue)) %>%
  group_by(revue) %>%
  summarise(mu = mean(n), sd = sd(n)) %>%
  arrange(-m) %>%
  data.frame

Pour rappel, l’échantillon n’est pas parfait : Cairn n’indexe qu’une fraction du champ éditorial, les revues n’ont pas la même fréquence de publication, le même nombre d’années d’archivage sur Cairn, le même nombre moyen d’auteurs par numéro, etc. Mais la taille de l’échantillon devrait être suffisante pour séparer les revues.

Le résultat

Cette méthode renvoie une jolie fonction de répartition empirique, avec tout en bas, les revues dont les auteurs ont publié dans une ou deux revues, et tout en haut, les revues qui attirent des auteurs qui publient dans trois ou quatre revues. Étant donné que Cairn n’indexe pas toutes les revues, cette fourchette est une estimation basse.

En faisant ressortir quelques revues de la distribution, on y voit bien les profils très différents d’une revue comme Population, revue de l’INED presque seule à représenter la démographie, et Sociologie, revue récente qui attire des auteurs souvent déjà publiés :

revues_ecdf

Le bas de la distribution est composé de nombreuses revues très spécialisées, comme Recherches en soins infirmiers ou Carnet de notes sur les maltraitances infantiles, qui publient des sous-champs communiquant peu avec le reste de la sociologie. Avec une moyenne de 1.4 revues par auteur, Sociétés est au 74e rang sur 96.

Le problème reste que les revues sont peu comparables entre elles. Lesquelles sont raisonnablement comparables à Sociétés. On va prendre deux revues ayant le même nombre d’années d’existence à ±2 ans près, et le même nombre d’auteurs différents à ±10 auteurs près :

                        revue  min  max numeros auteurs annees

1                     geneses 2000 2014      60     456     15
2 cahiers-d-etudes-africaines 2001 2014      43     450     14
3                    societes 2001 2014      56     453     14

revues_comparable

À ce stade, on peut raisonnablement conclure que l’entre-soi n’est pas qu’une fonction des caractéristiques de la revue : des revues aux “morphologies” comparables attirent des auteurs aux stratégies éditoriales différentes. L’écart-type confirme, par ailleurs, les différences observées :

revues_mu_sd

Rentrons, pour terminer, dans le détail de la revue Sociétés. Lorsque “ses” auteurs publient ailleurs, où vont-ils le plus souvent ?

t = unique(d[ d$revue == "societes", "auteur" ])
t = as.data.frame(table(d[ d$auteur %in% t, "revue" ]))
arrange(t, -Freq) %>% head(., 5)

                                         Var1 Freq
1                                    societes  657
2 archives-de-sciences-sociales-des-religions   18
3                        ethnologie-francaise   18
4                                     reseaux   18
5                              communications   14

L’entre-soi éditorial est ici évident : le pool d’auteurs qui a publié dans Sociétés ne publie que très peu ailleurs. On peut même le calculer assez précisément : la revue Sociétés regroupe 75% de leur production éditoriale dans les revues de Cairn.

Discussion

A-t-on pris en compte tous les paramètres possibles ? Non : il faudrait des tonnes d’information sur les auteurs, un système de pondération intelligent pour standardiser les quantités, bref, plein de choses que l’on n’a pas pris le temps de mettre en place ici.

Reste que l’observation initiale des deux auteurs du canular semble tenir : la revue Sociétés fait partie d’un ensemble de revues “de niche”, dont les auteurs restent largement “entre eux” si l’on se place du point de vue de leur propension à aller publier dans d’autres revues que celle-ci.

On essaiera d’aller un peu plus loin dans un prochain billet, en estimant plus précisément la propension des revues à se former des “clientèles captives” parmi les auteurs. Et évidemment, comme il s’agit d’auteurs et d’articles, on aura tout le nécessaire pour tenter une visualisation des collaborations scientifiques entre auteurs… avec des réseaux.

  1. Cairn possède une système d’identifiant unique par auteur : pas de risque, donc, d’homonymes. []