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

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 à droite.

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 (voir notamment cet article pour les parlementaires français), 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á, que j’ai déjà cité abondamment dans le billet précédent, est d’avoir transposé cette méthodologie à Twitter1, 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. Qu’en est-il des personnalités politiques françaises ?

Bon, notez bien que ce qui suit est un résultat hyper, hyper-préliminaire (et même pas le résultat préliminaire le plus complet dont on dispose avec Ewen, mais ce billet a été rédigé longtemps à l’avance). C’est noté ? Go :

stanfit_provisional

Le graphique ci-dessus correspond au modèle #1 de Barberá, appliqué à 124 personnalités politiques françaises (qui correspondent aux “n” en bas du graphique ; le “sigma” correspond au nombre de personnalités totales par parti ; je n’ai dessiné les intervalles à ± 1 écart-type que lorsque je disposais de plus de 10 personnalités par parti)2. Pour le moment, l’échantillon de “followers informatifs” est légèrement inférieur à 4 000, ce qui est trop petit pour estimer les positions des 800+ autres personnalités politiques dont on a récupéré les “followers” avec Ewen, mais c’est en cours. Et comme on peut déjà le voir, ça commence bien : “l’ordre” des partis politiques est presque celui attendu, et au moins trois partis (EELV, PS et UMP) ne devraient pas beaucoup bouger dans les prochains résultats.

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) !

  1. Le principe est de renverser 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”. []
  2. L’utilisation d’intervalles “de confiance” à ± 1 écart-type est une entorse à la logique (bayésienne) du modèle, mais j’en étais là quand j’ai rédigé ce billet. Les résultats finaux utilisent des intervalles crédibles à 95%. []

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 ?

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, 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, quand on se donne deux dimensions principales pour représenter l’espace partisan à partir des votes des parlementaires :

tea party caucus

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’inverse.

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, ils sont quand même très parlants.

… 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 qu’il traite. 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.

Bilan : après quelques adaptations du code de Barberá et trois jours de requêtes dans l’API, j’ai obtenu la liste des “followers” de 795 comptes Twitter d’élus, qui contient une “audience Twitter” totale de 3 115 538 “followers” différents1.

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

> data.frame(elu = gsub("(.*)/(.*).rda", "\\2", filesList),
+            followers = sapply(followers_m, length)) %>%
+     arrange(-followers) %>%
+     head
             elu followers
1      fhollande    921711
2 nicolassarkozy    696968
3   mlp_officiel    525326
4    jlmelenchon    406113
5           nk_m    378960
6        najatvb    320487

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

Comme j’en suis encore au stade exploratoire, je n’ai appliqué que le critère n°5, et n’ai donc retenu, pour la suite, que les “followers” qui suivent au moins quatre comptes Twitter d’élus. Ce seuil légèrement plus élevé correspond au nombre moyen de comptes Twitter d’élus suivis par l’ensemble des “followers” :

> userlistfollowers = table(all_users_list)
> summary(as.vector(userlistfollowers))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    1.00    1.00    3.82    3.00  715.00

Ce qui nous donne 694 846 “followers informatifs” à la veille des élections départementales de 2015. C’est à peu près la taille de la liste de “followers informatifs” récupérée par Pablo Barberá pour les membres du Congrès américain : pari gagné du côté des données, Twitter fournit (presque) autant d’information pour les élus français que pour les élus américains.

… 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, 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 a_leboeuf   a_suguenot 269
2 a_leboeuf    abachelay 199
3 a_leboeuf adefressenel 138
4 a_leboeuf    adegermay  12
5 a_leboeuf adelinehazan  90
6 a_leboeuf adescloziers  44

Indication de lecture : 269 des “followers informatifs” du compte Twitter @a_leboeuf suivent également le compte Twitter @a_suguenot. La matrice d’adjacence est asymmétrique, et la liste est donc dirigée : le nombre de “followers informatifs” du compte Twitter @a_suguenot qui suivent aussi le compte Twitter @a_leboeuf est potentiellement différent de 269.

Normalisons, pour terminer, le nombre de “followers informatifs” partagés par deux comptes Twitter d’élus. Il se trouve que le compte Twitter @a_leboeuf est suivi par 1 256 “followers informatifs” : or, seulement une fraction de ceux-ci suivent aussi le compte Twitter @a_suguenot. 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 12 :

> head(e)
          i            j   n          w
1 a_leboeuf   a_suguenot 269 0.21417197
2 a_leboeuf    abachelay 199 0.15843949
3 a_leboeuf adefressenel 138 0.10987261
4 a_leboeuf    adegermay  12 0.00955414
5 a_leboeuf adelinehazan  90 0.07165605
6 a_leboeuf adescloziers  44 0.03503185

Indication de lecture : environ 20% des “followers informatifs” du compte Twitter @a_leboeuf suivent également le compte Twitter @a_suguenot. Cette propensité permet de repérer des affinités très fortes : par exemple, plus de 90% des “followers informatifs” des comptes Twitter @bernard_monot, @carpentrasrbm, @jfjalkh, @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 par intensité croissante. Lorsque l’on visualise le réseau des liens d’intensité 0.25, il suffit que deux élus partagent 25% de “followers informatifs” pour être connectés, ce qui crée juste un gros amas où toutes les formations partisanes sont proches les unes des autres :

net025

On repère, au centre, les comptes Twitter des élus connectés un peu à droite à gauche ; en bas à gauche, la gauche non-PS ; en bas à droite, la droite non-UMP (dont le Parti Radical Valoisien, en mauve) ; et à droite de cette droite, le Front national. Augmentons désormais le seuil d’intensité à 0.75, afin de repérer quelques comptes Twitter aux positions structurales remarquables :

net075

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.

… 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 !

  1. Quelques comptes sont inaccessibles parce que la liste des comptes n’est pas parfaitement à jour. []
  2. Ce schéma de pondération pénalise les comptes Twitter les plus suivis et avantage, à l’inverse, 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. []

Religion et violence dans les “unes” de Charlie Hebdo

Mise à jour du lendemain : voir aussi ce texte, tout juste publié dans Le Monde.

Suite et fin (définitive, cette fois-ci) d’une suite de billets publiée en quatre épisodes : mercredi, vendredi et dimanche de la semaine dernière, et mardi de cette semaine :

  1. Les données (le billet introductif, le plus accessible)
  2. Leur exploration (quelques visualisations en plus)
  3. Les premiers modèles (ou “les ERGM en trois mots”)
  4. Le modèle définitif (les finitions pour la route)

Il s’agit d’une synthèse : pas grand chose de nouveau, juste des précisions et une reformulation de l’argument général. Je n’ai pas modifié le code source de l’analyse, qui reste disponible et améliorable, comme je vais le rappeler un peu plus bas.

Désolé d’avoir accidentellement publié un brouillon de ce billet tôt ce matin.

Et oui, je veux bien la médaille en chocolat du titre racoleur. Ooh yeah.

La question initiale

À la suite de l’attentat du 7 janvier, le travail de la rédaction de Charlie Hebdo a fait l’objet de toutes sortes d’accusations, allant du blasphème à l’islamophobie en passant par le mauvais goût. Mais comme l’ont fait remarquer deux sociologues dans les colonnes du Monde, le tirage assez confidentiel du magazine permet d’écarter l’idée que ces accusations soient fondées sur une lecture attentive de Charlie Hebdo : ce sont plutôt ses illustrations de “une”, beaucoup plus accessibles que le magazine lui-même, qui ont généré ces critiques.

Les mêmes sociologues se servent des “unes” de Charlie Hebdo pour se demander si l’hebdomadaire est vraiment si “obsédé” – c’est leur terme – par l’islam que le suggèrent certaines critiques. Sans surprise, ils découvrent que ce n’est pas vraiment le cas, dans la mesure où Charlie Hebdo fait beaucoup plus souvent sa “une” sur l’actualité politique (ou économique, ou sociale) française que sur la religion, et qu’en matière de religion, le catholicisme (via l’institution papale) en prend beaucoup plus pour son grade que les autres religions monothéistes.

La méthode de cette étude est assez simple : on catégorise le contenu des “unes”, puis on fait un tri à plat, puis on en tire des observations sur la fréquence de tel ou tel personnage, thème ou événement. L’analyse des “unes” d’un support de presse n’est d’ailleurs pas une nouveauté en soi : allez voir chez Baptiste Coulmont (qui parle d’une étude des “unes” de Paris Match par Alain Chenu), ou bien lisez le bouquin que Nicolas Hubé a tiré de sa thèse sur les “unes” des journaux allemands et français, ou bien lisez cet article sur la représentation des femmes en “une” d’un magazine sportif.

Cette technique d’analyse “fréquentiste” a toutefois de sérieuses limites, car il y a aussi une dimension relationnelle à exploiter dans ce type de données : dans l’illustration de “une”, qui est connecté à qui, et à quoi ? On peut en effet suggérer que la “une” d’un hebdomadaire satirique est un travail de mise en relation : tel thème, personnage ou événement s’y trouve mis en relation avec au moins un autre, de manière à créer une association mentale qui, renforcée par le titrage de la “une”, suggère une interprétation (plus ou moins) comique, cynique ou ironique1.

La question du traitement de tel ou tel thème par Charlie Hebdo dépasse donc la simple fréquence de ce thème dans ses “unes”, et devient : à travers ce dispostif symboliqe qu’est la “une”, à qui et à quoi tel thème se retrouve-t-il associé ? Si le quotidien La Croix, par exemple, associe fréquemment le catholicisme et l’action humanitaire dans ses “unes”2, qu’en est-il des “unes” de Charlie Hebdo sur la religion ? C’est cette question que l’on va traiter, à partir d’une catégorisation des “unes” qui permet de repérer les thèmes de la religion et de la violence.

Pourquoi cette question de la relation entre religion et violence dans les “unes” de Charlie Hebdo ? Parce que, comme l’a écrit Gaël Villeneuve dans sa réaction à l’étude publiée par Le Monde, mesurer “l’islamophobie” est conceptuellement hors de portée, le terme prêtant à toutes les confusions possibles. En revanche, établir que Charlie Hebdo associe, au sens objectif du terme (c’est-à-dire : met en relation ; pas “amalgame” ou “assimile”), la religion à un thème comme la violence, tient du domaine du possible.

Les données de Strips Journal

Comme je l’ai expliqué dans le tout premier billet de cette série, c’est le blog Strips Journal qui a rendu possible cette exploration des associations thématiques dans les “unes” de Charlie Hebdo, grâce à son codage de 338 “unes” de Charlie Hebdo publiées entre 2006 et 2015. Ce codage inclut la quasi-intégralité des années 2009-2014 et assigne en moyenne 4 mots-clés par “une”, noms propres et événements inclus. C’est à partir de ces mots-clés que l’on peut constituer des réseaux de co-occurrence comme celui-ci, qui représente toutes les 338 “unes” du corpus :

full_network

Le réseau contient des mots-clés recatégorisés en six grands thèmes à partir d’un codage supplémentaire qui peut certainement être amélioré. Si vous souhaitiez vous y coller, il suffit d’améliorer ce script, ou pour celles et ceux qui sont allergiques au code, cette feuille CSV, qui contient les mots-clés des “unes” (colonne tag), leur catégorie thématique (colonne theme), et les numéros de Charlie Hebdo dans lesquels ils apparaissent (colonne nums). Une catégorisation de meilleure qualité3 permettrait d’affiner tous les résultats présentés dans cette série.

Comme le réseau de toutes les “unes” du corpus n’est pas très lisible, il peut être utile, à des fins exploratoires, de le scinder en plusieurs sous-réseaux temporels : c’est ce que j’ai proposé dans un deuxième billet, en découpant le corpus en périodes de trois mois et en mesurant la présence de chaque thème au cours de chaque période. À cette échelle, il devient plus facile d’observer certaines co-occurrences de mots-clés, et notamment celles qui concernent la religion (en vert), le terrorisme (en rouge) et la violence (en rouge) :

network_quarters

 

Pour compléter ces représentations graphiques, et afin de faire la jonction avec l’étude résumée dans Le Monde, on peut souhaiter les accompagner de quelques statistiques sur les mots-clés qu’ils contiennent. Prenons, par exemple, les 10 mots-clés les plus fréquemment utilisés pour catégoriser le contenu des “unes” de Charlie Hebdo incluses dans le corpus. Ces mots-clés ne surprendront certainement pas les lecteurs de Charlie Hebdo, et contiennent au moins deux termes (“religion” et “intégrisme”) qui retiendront notre attention plus tard :

1              sarkozy   80
2            élections   42
3    françois hollande   40
4             religion   35
5        marine le pen   25
6                   fn   23
7       présidentielle   23
8           intégrisme   22
9  présidentielle 2012   22
10      extrême droite   21

Voyons, à présent, les dix associations de mots-clés les plus fréquentes. Cette liste révèle que les mots-clés sont partiellement redondants entre eux : les mots-clés concernant les élections, par exemple, reviennent très souvent ensemble pour catégoriser les mêmes “unes”. En conséquence, le réseau des co-occurrences des mots-clés contient certaines associations très fortes entre des thèmes et des sous-thèmes, entre des institutions et leurs représentants, bref, entre des “classes” et des “sous-classes” de phénomènes :

1            élections      présidentielle 23
2            élections présidentielle 2012 22
3       présidentielle présidentielle 2012 22
4            élections             sarkozy 17
5       extrême droite                  fn 17
6           intégrisme            religion 17
7                   fn       marine le pen 15
8  présidentielle 2012             sarkozy 15
9       présidentielle             sarkozy 15
10      extrême droite       marine le pen 14

Simplifions, enfin, ces associations, en remplaçant les mots-clés par l’une des sept catégories générales évoquées ci-dessus. Cette simplification permet de catégoriser les “unes” à partir d’un ou plusieurs thèmes (entre 1 et 5, et 2 en moyenne). En regardant les fréquences brutes et relatives de ces thèmes, on observe ainsi le poids relatif de chaque thème dans le corpus. Attention, les années 2006, 2007 et 2015 ne contiennent que quelques “unes” chacune et ne sont incluses ci-dessous que pour référence.

charlie_themes_freq

charlie_themes_prop

Cette simplification produit 15 associations thématiques possibles, dont la fréquence varie en fonction de différents facteurs, comme le nombre de mots-clés de chaque catégorie, mais aussi la pertinence de chaque association dans le corpus. Sans surprise, les associations les plus fréquentes sont ainsi des associations monothématiques, correspondant à la situation où la même “une” a reçu deux mots-clés de la même catégorie ; mais on trouve aussi souvent des associations entre des thèmes différents :

1              Politique-Varia  578
2                  Varia-Varia  544
3          Politique-Politique  465
4            Religion-Religion  131
5          International-Varia  122
6               Religion-Varia  103
7               Varia-Violence   85
8      International-Politique   69
9           Politique-Violence   51
10 International-International   47
11           Religion-Violence   42
12          Politique-Religion   40
13      International-Religion   32
14      International-Violence   23
15           Violence-Violence   13

Quoi et pourquoi modéliser ?

À ce stade, on va souhaiter modéliser les associations thématiques formées par les mots-clés des “unes” de Charlie Hebdo. Ce que l’on va pouvoir modéliser, comme expliqué dans un billet plus détaillé, c’est la probabilité conditionnelle de chaque association, en fonction de plusieurs facteurs comme le nombre de mots-clés par catégorie. Cette modélisation va nous servir à estimer aussi précisément que possible la probabilité d’une association, dans les “unes” de Charlie Hebdo, entre les thèmes “Religion” et “Violence”, qui contiennent les mots-clés suivants :

Religion (23 mots-clés) :
antisémitisme, athées, benoit xvi, bible, burka, charia, coran, dieu, évêque, françois 1er, intégrisme, jesus, laïcité, lourdes, mahomet, opus dei, pape, prophète, ramadan, religion, torah, vatican, voile
Violence (21 mots-clés) :
11 septembre, al-qaida, assassinat, attentats, ben laden, discrimination, guerre, homophobie, incendie criminel, jihad, massacre, mohamed merah, otage, parricide, pédophilie, sexisme, terrorisme, torture, tueur de masse, violence, xénophobie

Afin d’être aussi clair que possible sur la méthode, rappelons qu’elle permet de mesurer une probabilité conditionnelle, c’est-à-dire “nette”, ou “indépendante” de plusieurs autres probabilités. On vient de le dire, les catégories thématiques ne contiennent pas le même nombre de mots-clés, et les associations les plus fréquentes sont monothématiques. Ce qu’apporte un modèle, et que ne permet pas un simple tri à plat, c’est de “contrôler” ces facteurs, c’est-à-dire de les prendre en compte afin de mesurer isolément la probabilité d’association entre deux thèmes différents.

Dans le modèle qu’on met en place, sous la forme d’une équation log-linéaire et additive qui va ensuite être estimée à partir de plusieurs milliers de simulation de graphes aléatoires, on va donc utiliser différents termes correspondant à chacune de ces probabilités. Dans un dernier billet, j’ai présenté la forme définitive prise par cette équation, après en être passé par quelques modélisations exploratoires, et après avoir introduit un terme servant à mesurer une propriété endogène du réseau (spécifiquement, sa tendance à la transitivité entre certains mots-clés).

Pour rappel, les termes du modèle définitif sont les suivants :

  • probabilité globale d’une co-occurrence entre deux mots-clés
  • probabilité d’occurrence des mots-clés de chaque thème
  • probabilité d’une association entre deux mots-clés d’un même thème
  • probabilité d’une association entre deux mots-clés de thèmes différents
  • probabilité de trouver une relation transitive entre trois mots-clés

En aparté — je profite de ce billet pour signaler que, dans la spécification exacte du modèle ci-dessus, j’ai utilisé trois paramètres expérimentaux qui ne figurent pas encore dans la documentation technique du code associé à la technique de modélisation que j’utilise. Je dois l’utilisation de ces paramètres à un email de Pavel Krivitsky, qui m’a aussi aidé à comprendre comment paramétrer les mêmes modèles en tenant compte de la pondération des co-occurrences. Pour celles et ceux que ça intéresse, allez lire les emails de Pavel sur la liste de diffusion du projet statnet.

Qu’a-t-on trouvé ?

Pour rappel encore, on a obtenu les résultats suivants :

edges                           -5.23 (0.08)

nodefactor.International        -0.31 (0.21)
nodefactor.Politique            -0.04 (0.15)
nodefactor.Religion             -0.52 (0.29)
nodefactor.Violence             -0.22 (0.29)

nodematch.International          1.26 (0.49)
nodematch.Politique              0.98 (0.35)
nodematch.Religion               3.28 (0.67)
nodematch.Violence               0.29 (1.30)

mix.International.Politique      0.30 (0.36)
mix.International.Religion       0.85 (0.63)
mix.Politique.Religion           0.32 (0.52)
mix.International.Violence       0.42 (0.70)
mix.Politique.Violence           0.29 (0.43)
mix.Religion.Violence            2.16 (0.50)

gwdsp.fixed.1                    0.05 (0.00)

BIC                                16095.79

Ces résultats se comprennent de la manière suivante :

  • Les mots-clés de chaque thème n’ont pas la même propension à former des liens, c’est-à-dire qu’ils n’ont pas la même tendance à être utilisés en co-occurrence avec d’autres mots-clés. Les mots-clés les plus susceptibles d’être liés à d’autres sont ceux du thème “Politique”. Les mots-clés les plus susceptibles d’être liés à d’autres sont ceux du thème “Religion”.
  • Les associations monothématiques (entre deux mots-clés d’un même thème) sont très fréquentes, en particulier pour les catégories “International” et “Religion”, qui sont donc, d’une certaine manière, les thèmes les plus homogènes (c’est-à-dire les thèmes dont les mots-clés sont les plus à même de ne pas être “mélangés” avec ceux d’un autre thème).
  • Une fois que l’on a pris en compte ces deux premières formes d’effets, les associations entre mots-clés de thèmes différents restent encore fréquentes, voire très fréquentes pour l’association entre les mots-clés du thème “Religion” et ceux du thème “Violence”, comme dans les associations “Benoît XVI” et “pédophilie” ou bien “ben Laden” et “intégrisme”.
  • Enfin, le réseau exprime une très légère tendance aux relations transitives, ce qui signifie que certains chaînes de trois mots-clés, comme “Sarkozy → élections → présidentielle 2012”, se retrouvent fréquemment dans les co-occurrences. Aussi léger soit-il, il est très important de mesurer cet effet isolément, pour ne pas fausser les autres effets que l’on mesure.

Résumons.

Dans les 338 “unes” étudiées, la religion et les actes violents sont loin d’être les thèmes les plus traités : si l’on omet la catégorie résiduelle “Varia”, le thème le plus fréquemment associé à ces “unes” est le thème “Politique”, qui revient dans un tiers d’entre elles, alors que les thèmes “Religion” et “Violence” apparaissent chacun dans un peu moins de 9% des “unes”, sans être systématiquement associés l’un à l’autre. Une “une” sur dix pour un hebdomadaire, ça fait une “une” tous les deux mois et demi, ou cinq par an.

Mais que nous apprend cette fréquence ? Pas grand chose : elle ne dit rien de la probabilité d’association entre le thème “Religion” et un autre. Quelle est ainsi la probabilité d’association de ce thème au thème “Violence”, qui contient des mots-clés associés au terrorisme et à d’autres actes violents ? Les modèles que l’on a présentés indiquent que, toutes choses égales par ailleurs, la probabilité d’association entre les deux thèmes est très forte : sans être dominants dans le corpus des “unes”, elles sont très fortement liées entre elles.

Pour aller plus loin

Pour aller plus loin dans cette modélisation des “unes” de Charlie Hebdo, il faudrait à présent voir les autrès thèmes associés à la religion dans ce corpus : trouvera-t-on, par exemple, que la religion est aussi fortement associée au thème “Capitalisme”, également bien représenté dans les “unes” du magazine ? Il faudrait pour cela identifier précisément ce thème, ce que l’on n’a pas pris le temps de faire ici, mais cela vaudrait la peine de le vérifier à partir d’un codage thématique plus détaillé, comme suggéré plus haut.

Alors, islamophobe, Charlie Hebdo ? Je n’en sais toujours rien, et je m’en balance : le terme est suffisament plastique pour accommoder les biais de confirmation des uns et des autres, et ces biais ne m’intéressent pas. En revanche, je reconnais le peu que je connais de cet hebdomadaire dans l’association entre religion et violence. Est-ce normal ? À mon sens, oui : le clergé catholique est lié à des scandales de pédophilie et à la stigmatisation de l’homosexualité, et l’islamisme est lié au terrorisme international.

Voilà, c’est terminé. Bonne journée, et n’oubliez pas de vous aimer les uns les autres, bordel de merde.

  1. La thèse de Nicolas Hubé traite rapidement de cette dimension au passage consacré à l’ironie et aux jeux de mots dans la titraille journalistique (p. 182). []
  2. Cet exemple est fictif : je ne l’ai pas mesuré, et je ne lis pas assez La Croix pour avoir la moindre idée de quoi parle ce journal, mais je suppose qu’il est “obsédé”, au sens fréquentiste de la métaphore, par le catholicisme, ce qui illustre bien l’importance des associations – positives ou négatives – que produisent les “unes”. De plus, je n’ai pas pris l’association entre catholicisme et action humanitaire complètement au hasard. []
  3. Par meilleure qualité, j’entends : chaque mot-clé doit appartenir à un seul thème, et idéalement, les thèmes doivent contenir à peu près le même nombre de mots-clés (mettons, entre 20 et 30), dont l’occurrence dans le corpus ne varie pas trop (mettons, entre 50 et 150). []