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.

Qui arrivera à décoder la bombe à retardement symbolique du patrimoine des élus ?

Les décodeurs du Monde constataient récemment que les déclarations de patrimoine des élus, issues du “scandale Cahuzac”, font l’objet d’un dispositif hyper-restrictif, empêchant notamment toute prise de note lors de leur consultation en présence d’un agent préfectoral (voir les articles 1 et 3 de l’arrêté fraîchement publié).

Screen Shot 2014-06-10 at 7.37.23 PM

Aux Pays-Bas, des petits malins ont utilisé une faille juridique pour collecter en temps réel les résultats des dernières élections européennes. Rien ne semblant interdire la lecture des déclarations à haute voix, j’imagine que le dispositif français doit aussi avoir une faille—il y en a toujours au moins une, comme en matière de sécurité informatique1.

Plus sérieusement, le Parlement français a donc décidé de s’en tenir aux effets d’annonce, ce qui fait que pour un citoyen français, il reste plus difficile de s’informer sur les ressources des élus de son propre parlement que d’obtenir la même information pour la Roumanie, qui diffuse les déclarations d’intérêts et de patrimoine de ses élus, des candidats aux élections, et plus généralement de tous les agents financés par de l’argent public, qu’ils soient fonctionnaires ou pas2 :

Screen Shot 2014-06-10 at 7.46.26 PM

La comparaison avec la Roumanie est bien évidemment faussée par la corruption endémique de son appareil d’État, qu’on se doit d’espérer moindre chez les parlementaires français. Mais dans une démocratie comparable, la Grande-Bretagne, le scandale des dépenses parlementaires de 2009 me semble avoir débouché sur quelque chose de légèrement plus pertinent : les parlementaires y bénéficient désormais d’une assistance administrative les aidant à remplir leurs déclarations de revenus et à ne pas s’acheter de nains de jardin avec leur carte bancaire de représentant du peuple3.

Bref, plutôt qu’un risque de hack généralisé du dispositif grâce à une opération massive de désobéissance civile et de crowdsourcing des données, le Parlement français me semble avoir surtout pris le risque d’affronter, un de ces quatre, le même scandale que la Grande-Bretagne—c’est-à-dire un mélange d’antiparlementarisme assez rarement étayé et de dépenses injustifiées mais souvent accidentelles et futiles.

Et dans cette dernière hypothèse, les conséquences électorales seront, à coup sûr, beaucoup plus sévères que celles occasionnées par le scandale Cahuzac, sans même parler des dégâts collatéraux que de tels scandales peuvent engendrer. C’est cette perspective, inquiétante mais à mon sens tout à fait réelle, qui me fait penser que cet arrêté est une petite bombe à retardement symbolique, placée à mi-distance des deux chambres parlementaires4.

Encore un point commun avec la Grande-Bretagne, en quelque sorte.

  1. Histoire d’être bien clair, je n’encourage personne à aller vérifier cette hypothèse. Les sans-papiers savent qu’un agent préfectoral peut obtenir l’intervention des forces de police sur place. []
  2. Le dispositif roumain est né d’une condition posée lors de l’entrée du pays dans l’Union européenne. Apparemment, “deux poids, deux mesures” s’écrit “două greutăți, două măsuri” en roumain. []
  3. Je plaisante à peine : certains députés britanniques se sont fait mettre au pilori par la presse pour avoir acheté des cabanons de jardin ou des canards en plastique pour leur baignoire. []
  4. Ce raisonnement devrait inciter les parlementaires à considérer les associations comme Regards Citoyens de manière moins négative, mais je suis biaisé par mes propres amitiés sur cet exemple. []

Visualisation interactive des cosignatures à l’Assemblée nationale

Suite et fin d’un feuilleton sur les données parlementaires et la visualisation des réseaux de cosignatures, sous-titré : « Tant qu’il y aura des données. » Le code et les données sont accessibles dans ce répertoire, et j’espère bientôt présenter ces slides.

L’an dernier, je suspectais l’arrivée d’un nouveau moteur de recherche pour les amendements de l’Assemblée nationale. Ça y est, il est en ligne, et la mauvaise nouvelle est que la nouvelle interface ne se laisse pas faire et demanderait une réécriture complète de mon code d’extraction des cosignatures.

Ce premier échantillon m’a incité à coder l’extraction des cosignatures sous la forme de fonctions génériques, auxquelles j’ai ensuite passé les mêmes listes de cosignatures issues des amendements (depuis 2002) et des propositions de loi (depuis 1986) de l’Assemblée nationale et du Sénat.

Baptiste Coulmont avait défriché le terrain il y a déjà plusieurs années, et la structure de ces données constituait un bon terrain d’entraînement pour apprendre à manipuler des réseaux pondérés et bipartites, de même que le format des données fut un bon terrain d’entraînement pour coder des fonctions d’extraction un peu complexes, utilisant des données collectées en ligne ou sorties de bases SQL.

Voici quelques résultats sous la forme d’une visualisation interactive qui passe des données et des paramètres produits avec R à la librairie de visualisation Javascript produite par deux membres du Médialab de Sciences Po, sigma.js (cliquez sur les images pour la version complète) :

fig_sigma

La visualisation se limite aux propositions de loi de l’Assemblée nationale, qui sont disponibles sur la période la plus longue, couvrant toutes les périodes de cohabitation de la Cinquième République. Elles donnent à voir les cosignatures d’environ 2 000 députés travaillant à ces cosignatures de manière très différenciée selon qu’ils appartiennent à un groupe parlementaire ou à un autre, à droite ou à gauche, dans l’opposition ou dans la majorité1. Les voici géocodés :

sponsor_maps

L’interface de la visualisation permet de mettre l’accent sur les réseaux égocentrés des députés, ce qui ne sert pas à grand chose d’un point de vue analytique2, mais qui permet de mieux identifier les membres des bureaux chargés de centraliser les cosignatures:

Screen Shot 2014-02-20 at 4.04.34 PM

L’interface affiche quelques informations sur les députés tirées de leurs fiches dans la base Sycomore, ainsi que leurs distances moyennes, soit la « rapidité » avec laquelle on peut relier un député à tous les autres en suivant leurs co-signatures :

fig_sigma_detail

En ce qui concerne la construction des graphes, quelques copains assistants parlementaires (merci !) m’ont incité à structurer tous les réseaux collectés de la même manière que James Fowler, en ne retenant que les liens entre les premiers auteurs et leurs cosignataires3. J’ai découpé les données du Sénat sur les mêmes périodes temporelles que l’Assemblée nationale, par législature.

J’ai aussi calculé toute une série de mesures similaires (centralité, modularité, etc.) en tenant compte de la nature pondérée des liens entre co-signataires. Ces mesures sont expliquées en détail dans le papier qui accompagne le code du projet, et qui devrait finir par contenir des modélisations plus avancées des données4.

Avant d’effectuer les mesures, j’ai standardisé les groupes parlementaires en grandes familles sur la période observée pour pouvoir comparer d’une législature à l’autre. Voici par exemple une mesure de centralité sur la législature en cours, qui met en valeur les quelques députés intermédiaires entre les groupes minoritaires et majoritaires, à la fois dans la majorité et dans l’opposition.

fig-weighted14

Enfin, voici la contribution du groupe parlementaire à la polarisation maximale du réseau, qui mesure l’intensité du travail parlementaire intra-groupe par rapport à l’activité inter-groupe — une manière de mesurer l’importance de la segmentation partisane, déjà visuellement remarquable. Suivant cette mesure, le Parlement français est beaucoup plus discipliné que le Congrès américain, même si le Sénat apparaît systématiquement moins contraint par la discipline de parti et semble même l’être de moins en moins.

fig-max_m

Pour produire le même style de visualisation sans trop mettre les mains dans le cambouis Javascript, voici une autre visualisation qui utilise une interface clés-en-main, tous les deux écrits par une équipe de l’Oxford Internet Institute, pour un résultat approchant de mon propre bricolage5 :

fig_oii

  1. Ces variables explicatives apparaissent régulièrement dans les études législatives, notamment celles utilisant les scrutins publics (roll calls). []
  2. Le récent « Que sais-je ? » d’Emmanuel Lazega sur les structures relationnelles l’explique à plusieurs reprises dans les deux premiers chapitres. []
  3. Les bureaux des groupes opèrent fréquemment par cosignature collective sous principe d’opt-in par défaut, ce qui a pour conséquence d’inclure les groupes parlementaires complets ou quasi-complets dans sur les cosignataires. Les biais induits par cette pratique sont minimisés si l’on ne retient que les liens asymmétriques et que l’on pondère les liens par le nombre de cosignataires, ce qui est la stratégie suivie par Fowler, qui peut aussi être normalisée. []
  4. Appel aux dons : si vous avez une heure à perdre au café et que vous savez lire les diagnostics d’un ERGM estimé à partir d’une distribution de Poisson, écrivez-moi maintenant, tout de suite. []
  5. Et pour cause, c’est toujours Sigma.js qui est utilisée en arrière-plan pour dessiner le réseau, avec quelques différences avantageuses comme l’emploi d’un moteur de rendu graphique compatible avec une gamme de navigateurs légèrement plus large. []

Derniers graphiques avant 2014

En faisant tourner à nouveau les scripts de réseaux législatifs dont j’ai déjà parlé plusieurs fois ici, j’ai pu vérifier les résultats précédents sur des données un peu plus propres (merci Regards Citoyens) et étendues à tous les amendements de l’année qui se termine :

Screen Shot 2013-12-30 at 7.55.26 AM

Mais j’ai aussi pu vérifier (cf. la fin de cette note) que l’Assemblée nationale doit s’apprêter à réorganiser son site Internet : entre juillet et décembre 2013, l’index des amendements déposés sous la 13e législature a diminué de 450 à 250 dossiers, et j’ai vérifié, plusieurs d’entre eux sont tout à fait valides (ce n’est pas une correction attribuable à des problèmes de datation, par exemple).

En attendant que ce mystère s’éclaircisse, voici la tête des données actualisées. Les barres grises comptent les amendements individuels, les barres rouges les amendements co-signés à moins de dix, et les barres bleues les amendements co-signés par plus de dix députés, avec des pics de co-signatures vers 200 sur les lois de finance et autres joyeusetés. Le pic gris monstrueux correspond au mariage pour tous.

amendments_sponsors

Je vous épargne un graphique de réseau en plus. Non, je déconne, voici un dernier réseau législatif de l’année, basé sur presque 40 000 amendements déjà co-signés sur la législature en cours. Il me reste à calculer les mesures de centralité et de modularité en tenant compte de la pondération du réseau — c’est en cours.

network.example

Meilleurs voeux !

Quantification du travail parlementaire, pour quelques variables en plus

À l’occasion d’un coup de ménage estival, voici une mise à jour prévue depuis longtemps au dossier flegscrap, qui permet de récupérer les documents déposés sous les cinq dernières législatures de l’Assemblée nationale :

[image depots.year.png effacée, désolé ; voir les nouveaux graphes ]

Collecter des données pendant la session législative implique de récupérer des documents déposés le jour même, ce qui donne des comparatifs intéressants où l’on voit, par exemple, le déplacement des amendements sur les articles d’une loi en cours d’examen :

Screen Shot 2013-07-14 at 12.16.51 AM

Les projets et propositions de loi qui s’insèrent sur l’agenda parlementaires apparaissent d’abord dans les sources HTML que le code télécharge, puis rejoignent le jeu de données entre chaque itération, donnant à voir comment les données sont progressivement complétées :

Screen Shot 2013-07-18 at 8.27.59 PM

Les données montrent deux espaces, dominés respectivement par les projets de loi (probabilités de discussion et d’adoption élevées) et les propositions de loi (probabilités de discussion et d’adoption faibles). En rentrant dans le détail, on voit aussi que la distribution des séances de débat en séance publique s’achètent cher (auprès de la conférence des Présidents, si je ne m’abuse).

[ image depots.quadrant.png effacée, désolé ; voir les nouveaux graphes ]

En attendant que le site Internet de l’Assemblée nationale réorganise ses données, voire mieux, en rajoute. Cela ne fera pas disparaître la nécessité de bien nettoyer les données.

Un réseau de 68 203 co-signatures sur 11 569 amendements

J’ai récemment évoqué les co-signatures d’amendements, en me demandant tout du long si le réseau des co-signataires reflétait la même structuration partisane que le réseau des députés sur Twitter. Voici le résultat final sur les 11 500 amendements co-signés depuis le début de la 14e législature en cours :

network.fruchtermanreingold

J’ai rapidement annoté le graphique que m’a sorti ggnet après un calcul de douze minutes pour constituer le réseau1. Pour générer ou actualiser les données, il suffit de récupérer les dossiers parlementaires puis d’en extraire les co-signataires. Le résultat est une gigantesque liste de listes à décomposer en 68 203 paires uniques de co-signataires :

neta.prep

Pour tester mes versions intermédiaires, j’ai utilisé des échantillons réduits. Sur ces échantillons, le groupe GDR est complètement isolé, car il rédige moins d’amendements en valeur absolue et n’en co-signe pas souvent avec des membres d’autres groupes parlementaires. Voici le réseau avec 500 co-signatures sélectionnées au hasard :

neta.500

Puis, lorsque l’on augmente la “résolution” en prenant un échantillon dix fois plus large de 5 000 amendements, les connexions commencent à apparaître, plaçant le groupe GDR dans l’opposition, en dehors du groupe de “soutien” radical-écologiste placé à côté de la majorité socialiste :

neta.5000

Le réseau place également les élus frontistes dans cette opposition, mais comme il manque quelques données, les points gris ne sont pas tous des élus NI. Tout est perfectible, mais je n’ai pas le temps de corriger ce problème, créé par la présence d’homonymes. J’ai rédigé cette version dans le train et vais m’en tenir à ça.

La force du marqueur partisan est aussi évident que dans le cas des députés sur Twitter : l’immense majorité des liens se tisse à l’intérieur des groupes parlementaires. Cet effet ne révèle toutefois rien d’inconnu, et surtout rien de complet : le travail parlementaire trans-groupe, déjà identifiable dans ces visualisations, est simplement plus discret que ces signaux publics que sont les liens par Twitter ou par co-signature d’amendements2.

Pour terminer, une visualisation de la centralité des points montre les inégalités d’investissement dans le travail de co-signature d’amendements (tout en sachant que ce travail exclut de facto celui, non négligeable en quantité et certainement en temps, sur les amendements déposés au nom d’un seul député) :

network.centrality

Le code et les données sont en ligne, avec les notes de construction et les instructions pour actualiser les données. Il doit être possible, moyennant des retouches mineures au code du scraper, de récupérer les mêmes données pour les législatures précédentes.

Mise à jour : le code permet désormais de travailler sur les deux législatures précédentes et de visualiser les données sous forme de réseaux bipartites, un type de réseau à “deux modes” où l’on représente les acteurs et les événements (ici, les co-signatures d’amendements) sur le même graphe. Ces réseaux sont à l’honneur dans le dernier numéro de Social Networks.

Voici à quoi ressemble un réseau bipartite de la législature en cours, à partir d’un échantillon aléatoire de 5 500 amendements. La stratégie d’obstruction législative dans l’opposition est parfaitement lisible, de même que la division du travail entre les groupes et leurs positions respectives vis-à-vis du nexus majorité/opposition :

network.bipartite.14

Je n’avais pas prévu d’aller vers ce type de visualisation, mais Pedro Jordano m’a convaincu et a fourni le code qui sert à convertir les données entre single-mode et two-mode. En raison de la taille et de la nature du réseau, il faut également penser à le stocker dans une matrice “économe” qui compresse l’espace pris par les tonnes de “zéros” qu’on trouve dans les réseaux bipartites : le code pour cette sparse matrix est venu d’un billet de Solomon Messing sur le sujet.

  1. Ce n’est pas du “big data”, mais il faut quand même aplanir une matrice de plusieurs millions de lignes pour créer le réseau. []
  2. Il suffit de penser, par exemple, aux amendements déposés en commission, exclus des données uniquement nominatives montrées ici. []

Députés stratèges : un travail en cours sur des co-signatures d’amendements

Quand un député choisit de co-signer un amendement, avec combien d’autres députés co-signe-t-il ? On peut supposer que cela dépend avant tout de son groupe parlementaire, avec une stratégie « de masse » dans les groupes de la majorité (SRC) et de l’opposition (UMP), et une stratégie « isolationniste » dans les autres groupes.

C’est plus ou moins ce que l’on peut voir sur les 11,568 co-signatures d’amendements de la législature en cours. Le graphique suivant montre le nombre moyen et l’écart-type de ces co-signatures pour cent députés pris au hasard dans la masse des données, et où l’on voit bien la stratégie des députés écologistes ou frontistes :

demo_mu
(Cliquer sur le graphique pour une version PDF un peu plus lisible.)

Add. Voici la version complète, qui fait 171 cm de long et qui a mis vingt minutes à sortir sur un processeur 1.8GHz/8GB, même en vectorisant l’intégralité du calcul.

Les données proviennent d’un petit exercice de scraping qui permet aussi de dessiner le réseau des co-signatures. Le graphique suivant montre ce réseau sur les 10 000 derniers amendements déposés, et l’on y voit clairement la position centrale, isolée ou carrément décentrée de chaque groupe parlementaire :

demo
(Cliquer sur le graphique pour une version PDF avec quelques explications.)

Le matériau de réplication pour ces graphiques est en cours de constitution, sur une idée de Baptiste Coulmont qui avait produit un travail similaire. Mon obsession pour les réseaux de députés a enfin trouvé un nouveau support empirique ! Plus de nouvelles quand j’arriverai à finaliser les (très, très longues) routines d’extraction des données.

Une fonction pour passer des réseaux à ggplot2

Mise à jour : la fonction ggnet a été publiée dans le package GGally (merci à Barret, qui se charge de tenir le package à jour et qui a fourni une excellente relecture du code).

J’ai terminé de travailler sur la fonction ggnet évoquée dans un récent billet. Ça donne des graphiques comme ça :

example3

La fonction est à présent robuste à chacune de ses options : vous pouvez omettre n’importe quel argument (sauf le premier !) et toujours obtenir quelque chose de graphiquement potable. Il reste juste une petite faiblesse sur l’option quantize.weights, qui doit probablement planter si une classification par quartiles ne parvient pas à identifier les noeuds (les points) de manière unique.

Les exemples de la fonction couvrent les cas les plus simples avec des données simulées et montrent bien la filiation avec le code original de Moritz Marbach :

rnd = network::network.initialize(10)
cat = LETTERS[rbinom(10, 4, .5)]
ggnet(rnd, 
      label = TRUE,
      color = "white",
      segment.color = "grey10",
      node.group = cat)

rnd

L’option label.nodes est particulièrement flexible grâce à l’aide de Joël sur un bout du code. Un point du graphique, ou n’importe quelle série de points identifiés par l’attribut vertex.names, peuvent être légendés, ce qui donne des combinaisons faciles avec l’argument node.group, comme dans ce graphique qui distingue les “followers” de NKM de tous les autres :

example4

Pour des calculs plus avancés, jetez un coup d’oeil aux fonctions du fichier functions.R, qui simplifient un peu le boulot en calculant les “followers/followings” ou en calculant des mesures de centralité pour chaque groupe parlementaire. Les packages à consulter pour l’analyse de réseau sont les packages igraph, network et sna (ou alors un logiciel comme Pajek, mais l’analyse ne sera pas réplicable comme elle peut l’être avec R).

Rajout #1 : nouvel exemple avec des données sur la répartition des sièges de grands groupes industriels et de cabinets d’avocats dans 55 villes mondiales.

cities

En six lignes de code, dont trois pour récupérer les données :

url = url("http://networkdata.ics.uci.edu/netdata/data/cities.RData")
print(load(url))
close(url)
type = network::get.vertex.attribute(cities, "type")
type = ifelse(grepl("City|Law", type), gsub("I+", "", type), "Firm")
ggnet(cities,
      mode = "kamadakawai",
      alpha = .2,
      node.group = type,
      label = c("Paris", "Beijing", "Chicago"),
      color = "darkred")

Plus de données pour tester la fonction ici et .

Rajout #2 : spécial dédicace aux carnetiers d’Hypothèses ! On reprend les données de Josquin Debaz et on représente le réseau des bloggers en décembre 2010, en pondérant les noeuds par le nombre de liens sortants :

hypo.net

En cinq trois lignes de code, dont quatre pour convertir le réseau au bon format :

url = "http://gspr.ehess.free.fr/media/hypothesosphere10C07.net"
hyp = network::read.paj(url)
ggnet(hyp, 
      label = TRUE, 
      size = 12, 
      vjust = -1.5, 
      weight = "outdegree")

Rajout #3 : le même réseau en d3 grâce au package en cours de développement d3Network, de Christopher Gangrud (cliquer sur l’aperçu pour la version interactive, hébergée ailleurs) :

d3Network screenshot

Le code est encore une fois assez court, puisqu’il ne faut qu’une dizaine de lignes pour convertir de Pajek (.net) à igraph à d3 :

# data
require(igraph)
url = "http://gspr.ehess.free.fr/media/hypothesosphere10C07.net"
hyp = read.graph(url, format = "pajek")
df = asDF(hyp)
Source = df$vertexes[df$edges$V1, 2]
Target = df$vertexes[df$edges$V2, 2]
df = data.frame(Source, Target)
# d3Network
devtools::install_github("d3Network", "christophergandrud")
require(d3Network)
d3Network(df,
          file = "hypothesosphere.html",
          width = 900,
          height = 750,
          fontsize = 12)

S’il vous venait l’idée de vouloir représenter le réseau des députés sur Twitter en d3, essayez ceci, mais attendez-vous à un gros amas de points qui mettra longtemps à se stabiliser :

file = "network.txt"
link = "https://raw.github.com/briatte/ggnet/master/network.txt"
## downloader::download(link, file)
df = read.csv(file, sep = "\t")
names(df)
## devtools::install_github("d3Network", "christophergandrud")
require(d3Network)
d3Network(df, "network.html")

339 députés sur Twitter

Les données sur la classe politique semblant toujours trouver preneur, voici un encart publicitaire pour un jeu de données contenant les comptes Twitter de 339 députés de la législature en cours :

example1

J’ai récolté les données pour illustrer une fonction qui sert à visualiser des données de type « réseau » avec ggplot2 (note : plus de détails sur le code ici). Voici quelques compléments sur les données :

  • Le « gris central » est Jacques Bompard, mais il est central au réseau malgré lui : il est là à cause des députés qu’il suit ou qui le suivent, et qui l’attirent au centre. Voir ci-dessous pour les détails.
  • L’anomalie « rose chez les bleus » est Kheira Bouziane, dont le compte Twitter est à présent fermé et le site Internet en reconstruction. Je n’ai aucune explication. Il ne faut pas surlire les données.
  • La « rose très excentrée » est Pascale Boistard. Il y a aussi ce député UMP qui m’a fait rigoler : plein de gens le suivent, mais lui ne suit absolument personne. Il n’apparaît pas dans le graphique.

Si vous souhaitez explorer le réseau, voici une rapide fonction « qui est suivi par qui » :

who.is.followed.by <- function(df, x) {
  f = df[which(df$Source == x), ]$Target
  print(as.character(f))
  print(table(ids$Groupe[which(ids$Twitter %in% f)]))
}

Amusez-vous bien :

who.is.followed.by(df, "JacquesBompard")
who.is.followed.by(df, "Marion_M_Le_Pen")

Exercice : rédiger la fonction inverse who.follows() (qui, comme celle ci-dessus, peut s’écrire en une ligne).

Notes de construction : les données sont un mashup entre les données du site Tweet Député (qui est bourré d’erreurs et de fautes d’orthographe), celles réunies par le Lab Europe 1 lors de la campagne électorale de juin 2012 (avec beaucoup de comptes de campagne plus ou moins temporaires et les députés devenus ministres), celles du compte Twitter de l’Assemblée nationale, et le fichier sur les députés en mandat du site Nos Députés, établi par Regards Citoyens avant les partielles de décembre 2012. Le scraping des comptes a eu lieu au cours des quatre dernières semaines.

Envoyez vos corrections, et allez voir d’autres travaux similaires chez Arthur Charpentier, qui avait relayé une visualisation des données de juin 2012 avec Gephi par Ewen Gallic, chez Jonathan Chibois, qui travaille sur ces données en conservant une perspective longitudinale, ou chez Baptiste Coulmont, qui m’a inspiré ce graphique.

Rajout #1 : j’avais oublié de citer la visualisation d’Ewen Gallic, c’est fait. Par ailleurs, j’ai tenté de rendre les données de mon graphique disponibles en deux fichiers “nodes/edges” pour Gephi : le résultat est là (pour autant de temps que possible), et inclut aussi un fichier GEXF exporté avec le package rgexf. Je n’ai pas réussi à utiliser ces fichiers correctement avec Gephi 0.82, que je connais très mal. Have fun!

Rajout #2 : si vous vous demandez comment analyser ce genre de réseau, jetez un coup d’oeil à ce qui a été fait sur les meilleurs tennismen mondiaux.

Mentions au baccalauréat et systèmes de notation

Le titre fait référence à un récent billet de Philippe Cibois sur un blog voisin : “La nature fractale de la sélection dans le secondaire”. On y trouve notamment :

  • Un très intéressant tableau sur les mentions au baccalauréat, qui résume très bien la distinction qui s’exerce à travers le système des mentions ; je me demande si ce tableau ne pourrait pas être résumé sous forme de séries parallèles, grâce à l’application de Robert Kosara et Caroline Ziemkiewicz.
  • Une discussion des méthodes de notation qui aboutissent à une distribution vaguement gaussienne des notes, phénomène bien connu sous le nom “grading on the curve” (que je pratique sans allégresse et sans conviction ; la distribution des notes n’est pas le seul problème, loin de là).

Bonne lecture !