Tag Archives: visualisation

Les gens bien élevés font commencer les barres en zéro

Il y a quelques jours, je mentionnais sur twitter un graphique mis en ligne sur imgur.com, au sujet des trois dernières élections présidentielles américaines,

Le premier point est que le graphique a été fait alors que les dépouillements n’étaient pas encore finis. 72 heures après la clôture des bureaux de votes, plusieurs millions de bulletins n’avaient pas été dépouillés, comme me l’ont fait noter François Gourio et Tom Roud. Comme on visualise ici le nombre de votants, et pas le pourcentage de votants, c’est génant… Le second point avait été souligné par Marin Dacos, et par plusieurs personnes, toujours sur twitter, qui disaient (je résume un peu)

On ne peut pas faire des diagrammes en barres qui ne commencent pas en zéro ! Sacrilège !

C’est en effet une règle qui semble bien établie. Enfin, quand je dis ‘règle‘, on pourrait penser qu’il s’agit d’une ‘suggestion‘. Des sortes de ‘règles de savoir vivre’, à la Nadine de Rothschild,

Quand on est bien élevé, il est de bon ton de faire commencer ses diagrammes en barres en zéro.

Et cette règle semble importante, car c’est la première que donne Nathan Yau dans ses règles pour faire des graphiques

A bar chart’s baseline must start at zero.

L’intuition est que dans un diagramme en barres, la longueur des barres a un sens.

The bar chart relies on length to show data. Shorter bars represent lower values, and longer bars represent greater values. Compare bar lengths to compare values. That’s how it works. When you shift the baseline, you distort the visual.

Quittons nos élections un instant. Regardons par exemple les temps mis au 100 mètres lors des Championnats du Monde d’Athlétisme.

> year=c(1983,1987,seq(1991,2015,by=2))
> time=c(10.07,9.93,9.86,9.87,9.97,9.86,9.80,9.82, 10.07,9.88,9.85,9.58,9.92,9.77,9.79)
> names(time)=year
> barplot(time,col="darkgreen",beside=TRUE)

Oui, on a compris, les barres ont une interpréation physique, et il ne faut pas les raccourcir ! C’est le temps mis par un sportif pour courrir 100 mètres. Mais force est de constater qu’on ne voit pas grand chose… Allez, souvenez vous en 2009,

Sur notre diagramme en barre, on ne voit rien d’exceptionnel… Allez, osons faire commencer l’axe des ordonnées à 9 secondes,

> barplot(time,ylim=c(9,10.2),col="darkgreen")

Ok, je suis un hérétique… Certes, je mesure ici le temps au delà de 9 secondes, ce qui ne veut pas dire grand chose… J’opère ici la “distortion” dont parle Nathan Yau…. mais j’ai quand même l’impression qu’on voit mieux l’exploit de Bolt (sans laquelle on ne voit absolument rien). Cela dit, on pourrait même tenter quelque chose d’encore plus violent

> barplot(time,ylim=c(min(time),10.2), col="darkgreen")

C’est ridicule comme graphique n’est-ce pas ? Cela dit, à peu de chose près, ce graphique peut se lire en translatant, et en disant qu’il s’agit le temps mis en plus, par rapport au record de Bolt en 2009,

et ce graphique, lui, a du sens et suit la règle de Nathan Yau : il commence en 0.

Sours R, naturellement, un diagramme en baton commencera en 0  mais ça ne sera pas le cas pour une courbe,

Ici, le graphique commence à peu près au minimum de nos observations. Et on comprend avec ce graphique le caractère exceptionnel du temps mis par Bolt, en 2009. Faire commencer le graphique en 0 est ridicule,

C’est presque pire lorsqu’on représente l’évolution du record du monde, au 100 mètres,

Ca n’a pas d’allure ! On ne voit rien sur ce graphique. Alors qu’en changeant l’axe des ordonnées, ça devient plus clair !

Bref, je suis surpris qu’on passe pour un hérétique quand on dit que ce n’est pas génant de ne pas commencer en 0. Ca dépend du message que l’on souhaite faire passer avec le graphique.

En fait, j’ose affirmer que commencer en 0 n’a pas sens ici, car il est impossible qu’un être humain court le 100 mètres en 0 secondes. Cette référence n’a pas lieu d’être ! Mais supposons qu’on nous dise que pour des raisons morphologiques, on pourrait imaginer qu’un homme court, un jour, le 100 mètres en 9 secondes, mais qu’il serait physiologiquement impossible de passer en dessous. Dans ce cas, j’ai envie de croire que la réprésentation en commençant à 9 secondes aurait du sens…

On voit ici non seulement la différence entre Bolt en 2009 et les autres champions du monde, mais on voit aussi la distance qui sépare ces athlètes d’un record absolu. Je suis désolé, mais je ne trouve pas ce graphique dérangeant. Certes, il convient de lire (rapidement) l’axe des ordonnées, pour éviter d’affirmer que Bolt aurait mis 2 fois moins de temps en 2009 que le champion du monde de 2003 pour courrir le 100 mètres (car la barre semble deux fois plus haute).

Revenons maintenant à nos élections américaines, en reprenant les nombres de votes obtenus par candidats en 2008, 2012 et 2016 (avec des chiffres mis à jour)

> votes=data.frame(red=c(59948323,60933504, 62213384),blue=c(69498516,65915795,64154610))
> MV=as.matrix(t(votes))
> colnames(MV)=c(2008,2012,2016)
> barplot(MV/1e6, main="",
+         xlab="", col=c("red","darkblue"),
+         beside=TRUE)

Là encore, j’aurais presque envie d’affirmer que commencer en 0 n’a pas grand sens. Tout d’abord parce qu’il est dur d’imaginer que le candidat des Républicains comme le candidat des Démocrates ait un score proche de zéro. Ensuite, il est aussi difficile d’imaginer qu’un candidat ait deux fois plus de vote que l’autre. Car on peut comparer des barres quand une des deux fois plus grande que l’autre, pas quand elle est 14% plus grande… ça ne se voit pas à l’oeil nu… disons que la différence entre 14% et 18% n’est pas visible. Aussi, quand on connait le contexte, on sait qu’un candidat ne peut pas avoir deux fois plus que l’autre… Donc quand on voit un diagramme à baton de ce genre, on va regarder les valeurs des ordonnées.

> barplot(MV/1e6, main="",
+         xlab="", col=c("red","darkblue"),
+         beside=TRUE,ylim=c(52,72))

J’ai envie de dire qu’on pourrait accepter de fausser la représentation, parce que ce n’est pas ce qu’on veut illustrer avec ce graphique. Ce qu’on veut montrer c’est que le nombre de votes rouges varie augmente un peu, et que le nombre de votes bleus a baissé. Avec des courbes (là on a le droit), on aurait la représentation suivantes

mais je trouve le diagramme en barres plus joli. Et je trouve dommage de dire que le diagramme avec les barres juste au dessus est faussé, alors que le diagramme avec les courbes ne l’est pas… Si on fait commencer en zéro, comme le dit la règle, on ne voit plus rien. Sauf qui ça se joue dans un mouchoir de poche,

Là encore, si on veut respecter la règle du zero, et faire malgré tout des barres, peut être faut-il représenter les variations du nombre de votants (en millions), d’une élection sur l’autre

mais je n’aime pas trop…. Là encore, le graphique le plus parlant reste celui mentionné dans mon tweet

(la nuance est peut être que je ne mets pas ici de barre horizontale en bas). On peut voir le message qu’on veut faire passer avec le graphique de manière beaucoup plus claire. Certains diraient que je fausse l’interprétation, mais je trouve l’affirmation excessive. Il s’agit plutôt de déformer pour s’assurer justement qu’un message (juste et vrai) passe mieux. C’est ce qu’on voyait avec l’exemple du 100 mètres : sans déformation, le seul message que l’on retient est que le record de Bolt est anecdotique.

J’aurais presque envie de croire que la règle ne s’applique pas si la valeur zéro n’est pas atteignable (et n’aurait pas de sens). Mais je ne demande pas mieux que d’être convaincu que même ici, la règle de commencer les barres en zéro doit s’appliquer !