Autopsie d'une dataviz [8.2] : une carte découpée en classes égales

Second épisode d'un tuto en trois volets consacré à la réalisation d'une choroplèthe sur D3js. Au menu cette fois-ci : une méthode pour découper sa future carte en classes d'effectifs égaux.

Après avoir créé un fichier geojson rempli de données à cartographier, on pourrait d'ores et déjà se ruer sur la fameuse librairie D3 pour coder une belle carte interactive.

Mais, si déjà on prend un peu le temps de détailler la marche à suivre de A à Z, attardons-nous sur les détails, qui ne sont jamais anodins en journalisme de données !

Combien de classes va contenir la future carte ?

Un type de cartes rencontrées très souvent sur les sites d'information reste la carte choroplèthe : en gros, on colorie avec différentes teintes des statistiques réparties sur plusieurs régions pour pouvoir les comparer.

A chaque plage de valeur s'applique une couleur unique, aussi appelée classe. Dès lors se pose un délicat compromis entre statistiques et géographie :

  • si on a trop de classes, la carte devient incompréhensible car trop chargée
  • si on n'en a pas assez, la carte n'éclaire rien du tout

Dans leur très exhaustif La représentation des données géographiques: Statistique et cartographie, Michèle Béguin et Denise Pumain proposent le graphique suivant pour déterminer combien de classes une carte doit comporter en fonction de ses effectifs :

discretisation

Cliquez sur l'image pour l'agrandir

 On le voit très nettement, entre 150 et 200 régions considérées, on peut sans se poser de question passer à neuf classes. Dans notre cas, avec une région qui compte un peu plus de 900 communes, le choix est limpide.

Reste maintenant à choisir une palette de neuf couleurs cohérentes. On peut directement se connecter à Colorbrewer pour cette partie.

On va directement :

  • changer le nombre de classes tout en haut de l'écran en passant de 3 à 9
  • laisser le découpage séquentiel
  • sélectionner le seul éventail qui contient du noir

Si tout se passe sans accroc, on doit arriver à quelque chose qui ressemble à ça :

tuto_discreti_1

Cliquez sur l'image pour l'agrandir

On peut laisser tranquillement reposer cet éventail de teintes en se posant la question, également essentielle, des seuils de notre future carte.

Les quantiles, bien taillés pour les comparaisons

On ne fera pas d'exposé sur la discrétisation cartographique, ceux que ça intéresse pourront directement lire ce billet entièrement consacré au sujet.

Mais on va tout de même se pencher sur deux cartes réalisables à partir des données du premier tuto. Commençons par celle-ci :

A la lecture de la légende, on remarque un découpage stable. En gros, chaque classe est séparée des autres de 5%. Ces cartes sont très répandues et donc faciles à lire pour les lecteurs.

Mais leur principale faiblesse est aussi criante dans notre exemple. Les valeurs extrêmes, très isolées par rapport au gros de la distribution, créent des classes intermédiaires quasi vides.

On se retrouve à l'arrivée avec une très large majorité des communes coloriées avec cinq couleurs sur la palette de neuf. Les nuances ne sautent pas aux yeux, et on peut simplement se dire "le FN fait des gros scores partout".

Ce n'est pas faux d'un point de vue purement statistique, mais ça ne permet pas de faire une analyse territoriale très poussée.

Deux choix s'offrent alors à nous :

  • retirer une dizaine de communes pour les valeurs minimales, une dizaine pour les valeurs maximales (ça peut être plus ou moins), et refaire un découpage en classes égales à partir de cet échantillon épuré
  • adopter un autre partage de classes

On va s'orienter vers la seconde option, et observer la carte obtenue lorsqu'on utilise la méthode des quantiles :

Ici, ce n'est pas la valeur qui compte mais bien la position des communes par rapport à la distribution de votes FN. Certaines classes regroupent des éventails de 3%, d'autres de deux, d'autres d'un seul.

Mais ce qu'on a perdu en stabilité côté légende, on l'a gagné en information sur la carte, en pouvant repérer très facilement où se situent les villes qui ont voté le plus FN et celles qui ont voté le moins.

Autre avantage : si on analyse d'autres paramètres à la même échelle (c'est le cas dans l'article final), la comparaison entre cartes est possible.

Et autre cerise sur le gâteau : on peut facilement réaliser ce découpage grâce à un logiciel tableur :-)...

La fonction CENTILE() à la rescousse

On va commencer par ouvrir notre bon Libre Calc (on Excel, peu importe) et ouvrir le fichier csv du premier tuto. Il doit s'appeler fn_1995_alsace si vous avez suivi scrupuleusement les indications.

Il doit comporter six colonnes, avec de A à F :

  • l'identifiant INSEE, appelé code_insee
  • le nom de la commune, appelé commune
  • le nombre d'inscrits, nommé inscrits
  • l'abstention, nommée abs_ins
  • le nombre d'électeurs FN, appelé fn
  • le FN en pourcentages d'exprimés, nommé fn_exp

Si l'ordre que vous est différent, aucun problème, vous aurez juste à transposer ce qui va être écrit à une autre colonne.

Ici, on va exclusivement se concentrer sur la colonne "fn_exp". On va commencer par cliquer sur la lettre correspondant à cette colonne, et à choisir dans les menus du haut Données > Trier :

tuto_discreti_2

Cliquez sur l'image pour l'agrandir

Une fenêtre s'ouvre pour demander si les autres colonnes devront aussi être triées. On choisit évidemment l'option "Etendre la sélection" pour signifier au logiciel que oui.

tuto_discreti_3

Libre Calc propose alors par défaut un tri de la colonne "fn_exp" dans l'ordre croissant, ce qui est exactement ce que nous voulons. On clique sur "OK" sans se poser des questions :

tuto_discreti_4

Cliquez sur l'image pour l'agrandir

Si l'opération s'est bien déroulée, la première cellule doit correspondre à la commune de Lucelle, avec un FN à 3,85%, suivie ensuite par Bellefosse, avec 10,39%. Vous noterez qu'à elle seule Lucelle occupe entièrement une classe dans notre première carte.

Ce tri n'est pas obligatoire pour se servir de la fonction qui nous intéresse, mais il va nous permettre de comprendre très concrètement comme elle fonctionne.

On serait d'abord tenté de découper simplement notre carte en déciles, ce qui reviendrait à :

  • définir la première classe comme celle qui regroupe les 10% (ou 90 villes) de communes qui ont voté le moins FN
  • puis passer aux 10% de villes suivants
  • et ainsi de suite jusqu'aux communes qui ont voté le plus FN
  • Le problème est ici que nous avons choisi un nombre de neuf classes, pas de dix. Du coup, la dernière classe regrouperait à elle seule les 20% de villes qui ont voté le plus FN, soit 180 communes, alors que toutes les autres n'en affecteraient que 90 chacune.

    On va anticiper et passer à des échantillons de 11% à chaque fois, soit à peu près 100 communes. La dernière classe n'aurait plus que 10 communes en trop par rapport aux autres, ce qui est tout à fait correct.

    Pour l'illustrer, on va se placer sur la cellule G1 et taper :

    =CENTILE(F2:F904;0,11)

    La fonction CENTILE() va prendre en considération deux choses :

    • un échantillon statistique, ici la colonne qui contient les pourcentages FN
    • un alpha qui correspond au seuil recherché. Ici, on recherche la valeur en-dessous de laquelle se situent 11% de l'échantillon précédent

    Si tout va bien, notre fonction doit renvoyer (en arrondissant) 19,45. On peut alors naviguer vers les cellules 101 et 102 pour vérifier que la valeur seuil correspond bien à leur moyenne :

    tuto_discreti_4

    Cliquez sur l'image pour l'agrandir

    Une traduction textuelle serait dire que, en 1995, 11% des communes alsaciennes ont voté à moins de 19,45% en faveur du FN (ou que 89% de ces communes ont au moins donné 19,45% au parti d'extrême droite). C'est aussi simple que ça !

    On peut ensuite reprendre notre palette de Colorbrewer, et noter que la couleur #ffffff s'accordera aux valeurs inférieures à 19,45%.

    Plus qu'à continuer la manip' en ajoutant 11% à l'alpha précédent, soit :

    =CENTILE(F2:F904;0,22)

    Cette fonction doit renvoyer 21,93, et on la fera correspondre à la couleur #f0f0f0.

    On peut ainsi faire correspondre les différents seuils aux couleurs correspondantes. Je ne vais pas tout détailler, mais si vous n'avez fait aucune erreur, la dernière classe (couleur #000000) doit correspondre à 32,17%.

    Prochaine étape : le codage final de la carte en utilisant D3js 🙂 !