Quelques blogs et liens du moments

Inspiré (comme souvent) par Éconoclaste, un billet pour recenser quelques additions récentes à mon agrégateur, dans aucun ordre particulier :

  • Good Stats Bad Stats: “my name is Larry Cahoon. I have a PhD in Statistics and have spent over thirty-five years working on government surveys and censuses”.
  • Whimsley, “…where Tom Slee writes about technology and politics”. Je le signale juste pour son changement d’adresse il y a quelques semaines.
  • “Welcome to Monoskop, the media art and culture wiki.” Le blog recense des bouquins de théorie politique ou artistique des années 60-70, souvent délicieux.
  • Sur le toujours excellent conseil de Joël, Gaston Sanchez : “Data Analysis Visually Enforced”. L’auteur a notamment produit une méthode d’analyse qui a l’air intéressante, mais on manque d’avis dessus.
  • Peter Frase : un (brillant) doctorant en sociologie qui participe aussi à la rédaction du (non moins brillant) magazine américain Jacobin.
  • Brett Keller (santé publique, développement, politiques publiques et statistiques, avec un excellent billet sur la régression sur le mode de raisonnement)

Et pour les intéressés :

Pourquoi aimer les boxplots

Baptiste Coulmont rappelle qu’on n’utilise pas assez les boxplots, et cite au passage Howard Becker, qui vante leurs qualités d’identification des « observations extrêmes », les outliers. Récemment sur France Culture, on pouvait écouter Bernard Lahire faire la même apologie du travail sur les exceptions, comme par exemple les renversements de genre (il citait les camionneuses et les chirurgiennes).

La qualité première d’un boxplot est effectivement de faire ressortir des « boîtes » les observations qui se trouvent trop éloignées des autres, et qui brisent la symmétrie de la distribution. C’est pour ça que j’utilise souvents les boxplots sur des séries temporelles, pour faire ressortir l’hétérogénéité des séries. Voici un graphique d’un texte communiqué, pas publié mais réplicable :

papier AFSP 2011, annexe figure 11 : résultat d'un modèle additif généralisé

Le ‘Bistro aime aussi les boxplots. Vous en trouverez sur les résultats du concours commun des IEP d’il y a quelques années, par exemple, ou encore sur des biais de notation d’exposés. Mais encore faut-il comprendre les règles de construction du boxplot en premier lieu. Ces règles varient sur la méthode de calcul des outliers, comme le signale cet article co-signé par Hadley Wickham, le créateur de ggplot2.

Le boxplot réduit les éléments d’une fonction de répartition empirique (ECDF, déjà citée) à quelques repères essentiels : premier et dernier quartile, cinquantième pourcentile (médiane) et observations « éloignées », pour lesquelles les définitions varient. Voici un rapide exemple tiré d’un cours, avec du code Stata1 :

* Données : National Health Interview Survey (USA), 2009.
use data/nhis2009, clear
* Calculer l'Indice de Masse Corporelle (IMC/BMI) des enquêtés.
* Échantillon : population américaine adulte.
gen bmi = 703 * weight / height^2
* Calculer les pourcentiles (càd. 100 quantiles).
* Chaque pourcentile contient approx. 1% de la distribution.
xtile bmi_qt = bmi, nq(100)
* Calculer l'IMC moyen de chaque pourcentile.
bys bmi_qt: egen bmi_qm = mean(bmi)

En projetant ces données dans un graphique, on obtient une courbe qui montre d’emblée qu’il y a plus d’Américains à IMC élevé que l’inverse, et que l’état de santé des 10% les plus obèses est probablement un réel facteur de préoccupation, vu que’un IMC supérieur à 40 fait courir un risque d’obésité morbide :

* La variable contre ses quantiles (ECDF).
sc bmi_qm bmi_qt, ms(o) c(l) xla(1 10 25 50 75 90 99)

IMC USA 2009 par quantiles

En calculant les 25e et 75e pourcentiles (quartiles « Q1 » et « Q3 »), on peut voir quelle fraction de la courbe va correspondre aux limites inférieure et supérieure de la « boîte » du boxplot :


* Stocker les statistiques détaillées.
qui su bmi, d
* Extraire Q1 et Q3.
local q1 = r(p25)
local q3 = r(p75)
* Graphique avec lignes horizontales à Q1 et Q3.
* On aurait aussi grapher la médiane (Q2 / p50).
sc bmi_qm bmi_qt, ms(o) c(l) xla(1 10 25 50 75 90 99) ///
  yline(`q1' `q3') name(p1, replace)

Ces éléments sont les éléments de construction fixes. Les « moustaches » et les « outliers » dépendent de calculs plus ésotériques, décrits dans ce script pour Stata. (Au passage, j’utilise mon propre thème graphique pour atténuer la mocheté des graphiques Stata).

L’utilité du boxplot n’est pas vraiment, à mon sens, dans la réduction d’une répartition empirique. On voit plus vite où se trouve les « fat tails » dans une ECDF que dans un boxplot, où le nombre d’outliers est en plus fonction de la taille de l’échantillon, ce qui est facilement trompeur. Voici le boxplot horizontal tiré de la distribution ci-dessus :

* Boxplot.
gr hbox bmi

Boxplot IMC

On a facilement l’impression qu’il y a tout plein d’Américains gravement obèses, mais c’est un effet lié à la taille de l’échantillon. Les outliers sont visuellement nombreux mais représentent en réalité moins de 2% de la distribution (n = 464 à IMC > 40 sur N = 24 291). La courbe de l’ECDF est naturellement plus correcte à interpréter ici.

Le boxplot aide plutôt à la comparaison sur des « petits multiples« , c’est-à-dire sur un petit nombre de catégories avec lesquelles on divise une distribution (ici éducation et ethnicité, sans les « outliers » car les « boîtes » parlent d’elles-mêmes) :

* Les boîtes suffisent pour observer l'effet.
gr box bmi, over(educrec1) asyvars over(raceb) noout

IMC * Ethnicité * Éducation

C’est maintenant l’heure d’aller rattraper les cours que j’ai lamentablement ratés ou pas encore rédigés pour demain…

  1. … car je suis une feignasse, mais je posterai du code R plus chouette plus tard. []

Du code et des liens (avec des expressions régulières)

Dans la série “on n’a pas le temps de bloguer, mais d’autres s’en chargent à notre place…” Quelques actualités quand même.

1. Un député américain a demandé la suppression des crédits de recherche pour les sciences sociales.

Bizarre, pour un pays qui devrait avoir besoin de quelques recherches sur le wahhabisme. Ah, il a spécifiquement demandé la suppression de la science politique. Pas de chance, c’est là où se publient les recherches sur les trajectoires des terroristes. Ah, il a aussi une meilleur poste de dépense à conseiller : la recherche médicale (les blouses blanches qui sauvent des vies). Sur les “death panels” ?

Merci au lecteur qui nous a signalé le truc, récemment relaté en détail sur The Monkey Cage avec les manoeuvres précédentes. Je ne mets pas de lien précis, car pour être honnête, c’est vu et revu, et stupide. L’argument sur le wahhabisme est par ailleurs emprunté à un rapport public sur les sciences humaines et sociales, signé par Maurice Godelier. Je l’aime bien, cet argument.

2. Il faut lire Christophe Bouillaud sur les élections en Italie (quel bordel), et le film-documentaire TPB AFK (quelle aventure) sur le procès du site Internet The Pirate Bay.

3. Un excellent exemple de scraping avec expressions régulières sur le blog Quanti, par les auteurs du blog Data Sciences Sociales ; les deux sur la même plateforme que le ‘Bistro.

(La suite est ultra-nerd mais peut-être de salut public pour ceux qui enseignent avec R.)

Ah, l’utilité des expressions régulières… Si je devais apprendre deux choses à toute personne qui utilise un ordinateur, ce serait les raccourcis clavier et les “regex”.

Je m’en sers par exemple dans ce fichier pour compiler tout un cours en une seule frappe clavier qui sélectionne tous les fichiers .Rmd, les compile sous knitr, puis les copie au bon endroit. En pratique, ça donne ça :

html <- dir(pattern="(index|[0-9]{2,}_\\w+).html|style.css")
code <- dir("code", pattern="([0-9]{2,}_\\w+).R$")

La première ligne signifie “sélectionner le fichier index.html, tous les fichiers .html commençant par deux chiffres ou plus suivis d’un underscore et d’un mot, et le fichier style.css”. La seconde ligne signifie presque la même chose mais appliquée uniquement aux scripts .R. Une commande ultérieure les copie dans un dossier, qui est ensuite placé sur GitHub et publié par GitHub Pages.

Un autre exemple dans ce document .Rprofile, qui contient quelques fonctions pour enseigner le même cours. L’objectif était de permettre à une vingtaine d’étudiants débutants de télécharger tous les fichiers du jour en une commande, et de leur épargner les installations et chargements de packages que demande fréquemment R en s’en chargeant à leur place.

La fonction ida.prep() fait ce travail : (1) elle télécharge tous les fichiers pour une séance du cours, puis (2) elle fait scanner les fichiers par la fonction ida.scan() pour voir quels packages y sont chargés, et enfin (3) elle fait charger les packages par la fonction ida.load(), en les téléchargeant au préalable si nécessaire, le plus silencieusement possible (c’est-à-dire pas assez).

Voici les lignes qui détectent toutes les utilisations des commandes library() et require() :

grepl("(library|require)\\(([a-zA-Z0-9]*)\\)", text)
gsub(".*(library|require)\\(([a-zA-Z0-9]*)\\).*", "\\2", text)

Les lignes proviennent de la fonction ida.scan(). La première ligne “attrape” toutes les lignes de code contenant les termes library ou require suivis de quelque chose entre parenthèses. La seconde ligne extrait le contenu des parenthèses. J’envoie ensuite ce vecteur de noms de packages à la fonction ida.load().

Allez, un dernier exemple bien tordu pour la route :

grepl(paste0("^(", paste0(x, 0:3, collapse = "|"), ")_"), prep)

Cette ligne requiert un argument x, qui est le numéro de la séance. Chaque séance est divisée en quatre segments numérotés de 0 à 3. Cette ligne colle le numéro de séance à “0”, puis à “1”, puis à “2”, puis à “3”, puis colle tout ça ensemble avec des barres “|”, qui sont l’opérateur logique “ou” en regex. Tout cela doit être situé en début de ligne (“^”) et suivi d’un underscore.

Cette dernière expression sert à extraire les pages de cours pour une séance donnée, à partir de la page d’index du cours. Le reste du code montre comment exécuter tout le boulot décrit ci-dessus en moins de 100 lignes, qui permettent de gagner beaucoup de temps en classe en réduisant tout le travail de (télé)chargement à une commande, de type ida.prep(n).

4. Plus rapidement, sur le même sujet, il y a de chouettes projets de packages pour R autour de moi, et comme pour les “blogs SHS” il fut un temps, j’aimerais aider la communauté à se former.

Si vous programmez un peu sur R et voulez aider au développement de fonctions pour les analyses de données pour les sciences sociales (et notamment pour les analyses de données d’enquête, comme le permettent par exemple les packages survey et memisc), faîtes signe au Polit’bistro sur Twitter, ou dans les commentaires si vous avez comme moi du mal à tout mettre en 128 caractères.

5. Je n’ai plus le temps de bloguer sur tous les chouettes trucs qu’on peut découvrir sur les blogs de Baptiste Coulmont et Jérôme Cukier, mais vous avez les adresses.

6. Est-ce qu’on peut vraiment tolérer, au sein de l’Union européenne, un territoire qui se dispense d’élection au suffrage universel ?

Je me souviens avoir lu quelque part que le Vatican ne pratiquait pas non plus la transférabilité des peines, ce qui fait qu’un meurtrier ou un violeur au Vatican n’a pas de casier judiciaire à l’extérieur (il est simplement excommunié, en application du droit canonique). À vérifier, mais un juriste avait monté quelque chose d’assez conséquent sur le sujet ; je n’arrive plus à mettre la main dessus.

C’est à présent l’heure d’aller vraiment au bistro, histoire de savoir qui a gagné ce soir.