Les élections des dernières années ont, comme on dit dans les titres de journaux, « bouleversé le paysage politique français ». En particulier, celle du week-end dernier a réduit à peau de chagrin les deux partis politiques de papa, vu l'apparition d'un parti d'extrême-droite supplémentaire (comme si on n'en avait pas assez) et rendu le monde un peu plus triste1.
Les votes ont changé donc, mais les électeurs eux sont globalement restés les mêmes. Certes, en 10 ans, 7 millions de petits jeunes ont signé dans la réglette pour la première fois, et 5 millions de petits vieux sont devenus des ex-votants, mais il reste plus de 30 millions de braves gens qui ont poussé leur bulletin dans la fente en 2012, 2017 et 2022. L'objet qui va nous intéresser ici, c'est le nombre d'entre eux qui ayant voté pour un candidat X en 2017 ont voté pour un candidat Y en 2022, le flux d'électeurs.
Une méthode pour étudier ces flux d'une élection à l'autre consiste à regarder comment le vote évolue dans chacune des 34 970 communes. Les résultats de chaque bureau de vote sont publiés en ligne ce qui brise probablement un peu le concept de vote à bulletin secret, particulièrement pour les habitants de Pétoise-sur-Sère en Ardèche, mais est bien pratique pour faire des statistiques. Par exemple, si Pétoise-sur-Sère a eu 90% de votes pour Hamon et 10% de votes pour Le Pen en 2017, et qu'en 2022 on observe 90% de votes pour Mélenchon et 10% de votes pour Zemmour, on pourra faire l'hypothèse raisonnable d'un transfert des voix Hammon → Mélenchon et Le Pen → Zemmour. Si un schéma similaire se dessine pour les communes voisines de Pucave-sur-Sère, Pelos-sur-Sère et Palavas-sur-flots, on peut quantifier ces différents flux et faire un joli graphe.
C'est l'idée au moins, en pratique c'est un peu plus pénible, mais je laisse les détails techniques pour la dernière partie, et je commence par le résultat.
Résultats
Le diagramme2 est assez clair, il montre l'évolution des voix pour chaque candidat en 2012, 2017 et 2022. On y voit:
- le PS se déchirer entre Macron, Hamon et Mélenchon, puis les voix d'Hamon rejoindre Mélenchon (et quelques-unes aller vers Hidalgo, mais j'ai viré les traits trop petits pour que ça soit plus lisible, désolé Annie) ;
- le léger, presque imperceptible, virage à droite de Manu ;
- l'explosion du LR entre Zemmour, Pécresse et Macron. Zemmour qui ne récupère d'ailleurs presque aucune voix de Marine, on est fidèle au RN (ein Reich, ein Führer, ou quelque chose comme ça, j'imagine) ;
- et bien d'autres merveilles de la vie politique française.
Je ne vais pas me lancer dans une analyse politique sauvage, je suis pas éditorialiste, heureusement. Et discuter technique c'est moins marrant mais c'est important aussi. Parce que technique il y a, ce genre de graphe fait beaucoup d'hypothèses sans les nommer.
Méthode
Dans chaque commune $c$, il y a eu respectivement $N_{c, i}$ et $M_{c, i}$ votes pour le candidat $i$ lors de deux élections. Ce que l'on cherche, c'est $F^{\mathrm{emp.}}_{i, j}$, la proportion de votants du candidat $i$ lors de la première élection qui ont voté pour $j$ lors de la seconde. Ici l'abstention et le vote blanc/nul sont considérés comme des candidats comme les autres.3
L'approche la plus simple consiste à minimiser sur l'ensemble des communes la différence entre le nombre de votants réels pour $i$ à la seconde élection $M_{c, i}$ et le nombre de votants estimés, $\sum_{i} N_{c, j} F_{j, i}$. Explicitement, cela revient à calculer la norme de $M - N.F$ (en notation matricielle). Additionellement, on rajoute des contraintes sur les sommes des lignes et colonnes de $F$, pour que le modèle n'invente pas des votants (la primaire LR est finie), ces contraintes sont assez lâches, pour ne pas rendre le modèle insoluble.
Il y a une hypothèse cachée derrière cette méthode. Pour que ce calcul ne soit pas biaisé, il faut que toutes les communes aient les mêmes valeurs de flux (ou plus précisément la même distribution de flux sous-jacente). On imagine bien que Paris et Pétoise-sur-Sère ont des populations suffisamment différentes pour que ce ne soit pas le cas. Si on limite l'ensemble des communes sur lesquelles on optimise, on peut se restreindre à un département. Disons l'Hérault par exemple, et le Finistère pour équilibrer la pluviométrie.
Ce ne sont pas des départements dramatiquement distincts, mais on observe des différences notables dans les matrices de flux. Le vote Fillon s'est beaucoup plus reporté sur Macron dans le Finistère par exemple et beaucoup de macronistes de gauche ont découvert que c'était dur à tenir comme position. C'est beaucoup moins vrai dans l'Hérault. Regrouper ces populations avant de minimiser ne fait pas trop sens4.
La méthode honorable consisterait à associer les différentes communes en suivant des critères sociologiques, puis à minimiser indépendamment chacun de ces ensembles de communes et à regrouper les matrices de flux finales (en pondérant) pour faire une jolie figure. Une seconde option, plus élégante théoriquement, mais aussi moins précise, consisterait à inférer approximativement ces ensembles de communes à travers leurs habitudes de vote. Par exemple avec un algorithme de cluster. Ou en minimisant les contraintes globalement tout en autorisant la présence de plusieurs matrices de flux différentes. Il y a plein d'options donc. Évidemment j'ai choisi la pire et ai simplement mesuré les matrices de flux pour chaque département pour les regrouper au dernier moment.5
Un autre problème majeur mais difficilement adressable, c'est que les Français ont la mauvaise habitude de déménager. Et en particulier de déménager jeune. Cette manie désagréable est probablement responsable des échanges de flux Mélenchon ↔ abstention, ou de l'éclatement des votes Poutou et Arthaud.
Le dernier problème réglé à la hachette, c'est les métropoles. Paris, Lyon et Marseille sont particulièrement pénibles. La taille de la commune empêche d'avoir une bonne précision sur les flux, les définitions des arrondissements changent suivant la source considérée et le concept de circonscription m'échappe. Ça m'énerve. Et quand ça m'énerve je supprime. J'espère que ça n'introduit pas trop de biais, Neuilly compensera pour le XVIe et la Seine-Saint-Denis aidera le XXe à se sentir représenté quand même. C'est sûr que 4 millions d'habitants en moins ça pique un peu, mais j'assume totalement comme dit l'autre.
Numériquement, les problèmes des moindres carrés ont été résolus à l'aide de Gurobi6 et les jolis plots viennent de plotly7. Les données sont toutes publiées de manière assez hasardeuse par data.gouv.fr, avec des noms de colonnes dans tous les sens. La donnée élevée en liberté c'est pas encore ça en France.
Conclusion
Je soupçonne que ces données communales sont un peu sous-employées par les instituts de sondage, elles donnent une image assez précise pourtant. Les Français ont des idées politiques remarquablement stable sur 8 ans, même si les partis politiques qui les représentent ont changé. Pays de merde tiens. Bon sur ce, voilà le flux 1er tour ⇒ 2ème tour de 2017. Tirez-en ce que vous voulez.
C'est le thème de cette année globalement.
Ça s'appelle un diagramme de Sankey d'après internet, du nom d'un capitaine qui aurait fait le premier en 1898. Mais la jolie mais imbitable carte de Minard, qui date de 1869, y ressemble pas mal aussi.
Bien qu'ils soient honnêtes, eux.
Oui c'est volontaire.
Ok, je songe assez fort à en faire un autre post de blog, d'ici un an ou deux, c'est un bon rythme ça, un post par an.
C'est du least square avec des contraintes linéaires, c'est clairement du vice de sortir Gurobi pour ça. Mais quand on a un marteau...
Qui est imbitable à utiliser, avec une doc encore pire que celle de matplotlib, mais ne crachons pas dans la soupe, le résultat final est joli.