Entendu en conférence

En guise de conclusion, quelques trucs rigolos entendus à #RLyon2013 :

  • “On s’est rendu compte que les crèches étaient des lieux très violents, mais que ça ne portait pas à conséquence parce que les enfants n’ont pas de muscles. Le garçon qui veut piquer un tracteur à la fille va lui tirer les cheveux, et la fille va vouloir se venger, mais tout ce qu’elle trouve pour le taper, c’est un nounours. Le plus sérieux qu’on a vu, ce sont quelques traces de morsure, mais à part ça, ça va.”
  • “C’est un singe qui hurle quand on lui tire les pattes vers l’arrière” (au sujet d’une peluche glissée dans certaines des malettes de conférence par l’un des sponsors — ne m’en demandez pas plus, je n’ai pas vu la bestiole, mais j’ai effectivement entendu des hurlements).
  • Un dialogue constructif entre un employé de l’industrie pharmaceutique et un chercheur qui enregistre des singes hurleurs tôt le matin dans la canopée de la Guyane française. (Les deux faisaient face aux même problèmes de spectographie. Cette anecdote va me servir d’illustration pour toutes les conversations futures sur l’utilité de la recherche, qui est nécessaire sans être prévisible et donc programmable à l’avance.)
  • “T’imagines pas le choc ! Dans mon boulot d’avant, je pouvais compter les emails que je recevais en une semaine, je m’en envoyais à moi-même histoire d’en avoir !” (Au cours d’un récit impressionnant sur une transition professionnelle ultra-radicale.)
  • Le plus fort reste le jeu de mots inscrit sur les porte-clés/décapsuleurs offerts en cadeau à tous les participants : « Be R ».

Et sinon, voici une bonne nouvelle pour les utilisateurs de R avec des données d’enquête ! Le package est développé par un membre du laboratoire qui produit également l’excellent TraMineR, dont l’un des auteurs a rappelé l’importance de la documentation et de l’aide sur StackOverflow dans le succès du package.

Note : pour un vrai compte-rendu, c’est ailleurs.

Conférences, méthodes, élections (annonces en vrac)

Je profite de l’annonce par un blog voisin du programme de Quantilille, qui propose une superbe formation à l’analyse de réseaux, pour rappeler que Joël et moi serons aux Rencontres R de Lyon demain et après-demain. Mes slides sur un cours donné avec Ivaylo Petev sont en ligne :

Slides Fr. R Lyon 2013

Les slides de Joël ne sont pas en ligne, mais vous devriez allez lire la suite de son travail sur les reports de voix dans les récentes élections législatives partielles. Le code est en ligne, avec les graphiques :

Graphe Joël vote Barral

En sociologie électorale, je vous conseille aussi vivement cet article, que j’avais raté à sa sortie, et dont le résumé est tellement puissant que je vous le propose ci-dessous :

La tripartition entre la gauche, la droite modérée et l’extrême droite constituait un des fondements de l’ordre électoral en place en France depuis 1984. Brutalement remise en cause par Nicolas Sarkozy en 2007, la fracture électorale entre l’UMP et le FN ne s’est pas rétablie en 2012 en dépit du redressement de l’extrême droite et du score élevé de Marine Le Pen à l’élection présidentielle. Si le FN demeure une force isolée dans le système partisan, la poursuite de la radicalisation de l’UMP sur l’immigration, l’insécurité et l’identité nationale a abouti à la confirmation des évolutions de la géographie électorale de la droite modérée et des logiques de vote en sa faveur, deux dynamiques qui traduisent un rapprochement des électorats de l’UMP et du FN.

Et vlan !

Pour terminer avec quelques lignes supplémentaires de publicité, le papier que Pierre Gueydier et moi-même présenterons bientôt à Paris au Congrès AFSP 2013 est en ligne :

Screen Shot 2013-06-26 at 2.38.31 PM

Le code des annexes inclut deux réseaux d’activistes mobilisés contre les projets de loi DADVSI et HADOPI, ainsi que deux petits scrapers sur ce même thème.

Bonne lecture et à bientôt, en espérant croiser quelques têtes connues et plein de nouvelles à Lyon !

PSRM (Une nouvelle revue ! Une nouvelle revue…)

Cambridge University Press publie une nouvelle revue de science politique pour l’EPSA, dont nous annoncions la création il y a deux ans (jetez aussi un coup d’oeil au programme de sa conférence générale, on y trouve plein de trucs chouettes).

Cette nouvelle revue ressemble à s’y méprendre à un clone européen de l’APSR, bien plus d’ailleurs que l’EPSR : articles ultra-cadrés et très formalisés. Celles et ceux qui connaissent le QJPS auront l’impression de lire presque la même chose. D’ailleurs :

PSRM strives to become a top-tier outlet for the best quantitative, formal, positivist and rigorous work in the discipline, and for research that lies at the substantive intersection of politics and economics and other cognate fields.

Extrait de la présentation du numéro par les éditeurs.

Outre cette imitation de l’existant, le premier numéro a aussi les défauts habituels des publications idoines : des liens compliqués et des DOI qui ne fonctionnent pas toujours, des annexes sans scripts de réplication, trois décimales de précision, …

Bref, un gros air de déjà-vu et une pointe de déception, car les nouvelles revues devraient servir à faire changer les codes de la publication universitaire, et même si les idées ne manquent pas, elles peinent à s’inscrire dans les pratiques éditoriales.

Le premier numéro est libre d’accès (c’est déjà ça).

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

Lancement de la revue “Statistique et société”

Emmanuel Didier, dont les lecteurs de ce blog ont déjà entendu parler à propos de statactivisme (conférence, émission), a annoncé cette semaine la mise en ligne du premier numéro de Statistique et société :

S & S

Cette revue se propose de montrer comment la statistique intervient dans la société, y joue un rôle souvent inaperçu, et est en retour transformée par elle.

L’information d’ordre statistique irrigue la société contemporaine de part en part, et lui donne sa propre inflexion. Il suffit de feuilleter le journal pour voir qu’elle se trouve dans chacune de ses sections : l’économie bien sûr ; la politique aussi avec les sondages ou le souci d’efficacité mesurée par des objectifs quantitatifs ; l’éducation, qui engendre non seulement des notes, mais aussi de très nombreuses enquêtes ; la santé, qui pose des questions de politique publique ; les affaires étrangères qui ont besoin de chiffres pour mettre en évidence les rapports de force entre États ; et même la culture que l’on pourrait croire rétive à la quantification, qui est pénétrée partout par des équivalents de l’audimat. D’une façon ou d’une autre, et de manière plus ou moins explicite, les statistiques sous toutes leurs formes participent au débat public.

La revue Statistique et Société, une revue de la Société Française de Statistique, se donne pour objectif de mettre en évidence les effets propres de ces quantités. Nous faisons le pari que l’on comprend mieux notre actualité si on l’envisage depuis ce point de vue, crucial mais pourtant souvent laissé dans l’ombre.

Cette revue va certainement contribuer à faire progresser les “sciences sociales du statistique”, qui sont bien représentées en sociologie des sciences et qui parlent de plus en plus fréquemment dans d’autres “langues sociologiques”, aidée dans cette évolution par la sociologie économique, la sociologie de la quantification, de la valuation, …

Ce blog trahit régulièrement sa curiosité en la matière : vous connaissez déjà mon attachement personnel à cette thématique1, et j’imagine sans difficulté que Joël sera content de parcourir un article comme “Faut-il confier à des statisticiens des responsabilités en matière électorale ?” Nos billets parlent souvent de statistiques parce que cette notion nous fait travailler au double titre d’enseignants en méthodes quantitatives et de sociologues rencontrant les statistiques à chaque coin de page de nos terrains respectifs.

Pour en revenir à la revue, les articles sont (très) courts et font parfois penser à ceux de l’initiative History and Policy, un réseau d’historiens britanniques qui publie des textes avec la volonté d’occuper un espace de réflexion tiers-sécant entre l’université et la décision publique. Le premier numéro contient un éditorial de Cédric Villani, qui évoque la légitimité du boson de Higgs en parlant de sa précision à “cinq sigma2.

Bonne lecture (et jetez un coup d’oeil aux Cafés de la statistique) !

  1. Réflexivement, je crois que c’est mon intérêt pour la notion de causalité (autre lancement revue à suivre) qui m’a entraîné sur ce domaine, outre ma curiosité dévorante pour la programmation statistique. []
  2. La physique fait, comme tout le monde, des choses assez étranges aux erreurs standard, en particulier à travers sa technique de modélisation connue sous le nom de “sigma clipping”, une sorte de rabot statistique (ce n’est pas la seule technique de “découpage” connue dans le domaine : on peut aussi faire des sandwiches avec les erreurs standard, même si ce n’est pas très recommandé). []

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.