5 mars 2022
Le Repos, par William-Adolphe Bouguereau
Le 30 janvier 2022, Le Journal du dimanche publiait un article présentant « le top 500 des villes de France où il fait bon vivre », un classement établi par l'association Villes et villages où il fait bon vivre.
Je vous passerai mon opinion sur l'intérêt d'un tel classement, toujours est-il que j'ai bien trouvé bien dommage que le site web de l'association ne mette à disposition qu'une malheureux moteur de recherche pour s'enquérir des performances de sa ville, et que le JDD ne partage que des extraits difficilement exploitables du classement. De telles modalités ne permettant pas une analyse comparative extensive, j'ai décidé de prendre les choses en main.
J'ai donc entrepris de rassembler toutes ces données un peu éparses dans un beau tableau un peu propre. Je me suis muni à cette fin comme à chaque fois de Python et de la brave bibliothèque requests
.
La première étape c'est de regarder l'allure des URL. Chaque commune a une page dédiée où on trouve les informations qui la concernent, de la forme :
https://.../vivre-a-<nom de la ville>-<code postal>/<code insee>/<departement>
Pour trouver une liste complète des communes avec ces informations prêtes à l'emploi, le site web de l'association nous donne lui-même la réponse. Quand on fait une recherche, les caractères tapés servent à faire une requête à l'API geo.api.gouv.fr, une API pour les données géographiques, gérée par Etalab.
Un petit coup de GET https://geo.api.gouv.fr/communes/
et boum, j'ai toutes les communes de France métropolitaine dans un JSON (le plus beau format du monde).
[
{
"nom": "L'Abergement-Clémenciat",
"code": "01001",
"codeDepartement": "01",
"codeRegion": "84",
"codesPostaux": ["01400"],
"population": 779
},
{
"nom": "L'Abergement-de-Varey",
"code": "01002",
"codeDepartement": "01",
"codeRegion": "84",
"codesPostaux": ["01640"],
"population": 256
},
{…}
{
"nom": "Angers",
"code": "49007",
"codeDepartement": "49",
"codeRegion": "52",
"codesPostaux": ["49100", "49000"],
"population": 155850
},
{…}
]
Il ne reste plus qu'à lancer 34 836 requêtes pour chacune des 34 836 communes dans le fichier. Sachant que le classement est établi sur un total de 34 827, quelques messages d'erreurs sont à redouter.
Quelques heures plus tard, chaque commune s'est trouvé un classement. Enfin, la plupart en tout cas. Il ne reste plus qu'à ranger tout cela dans un fichier CSV, histoire que ce soit plus facilement lisible, et tadam :
J'ai vite fait de transformer cela en un fichier CSV, un peu plus facilement exploitable.
rang nom codes_postaux code_insee departement population
1 Angers 49100-49000 49007 49 155850
2 Annecy 74370-74960-74600-74960-74000-74370-74600-74600-74940 74010 74 130721
3 Bayonne 64100 64102 64 51894
4 La Rochelle 17000-17000-17000 17300 17 77205
5 Caen 14000 14118 14 106230
6 Le Mans 72100-72000 72181 72 143847
7 Nice 06100-06200-06200-06200-06000-06300 06088 06 342669
8 Lorient 56100 56121 56 57246
9 Brest 29200 29019 29 139926
10 Rennes 35200-35000-35700 35238 35 220488
...
Sauf que, après cette mise en forme, j'ai un problème. Mon fichier n'a pas assez de lignes. J'ai des places non atribuées, et plus exactement il apparaît que les rangs 23 151, 28 775, 34725, 34739 et 34750 sont vides. L'explication n'est pas à chercher bien loin, il y a un bug sur le site qui affiche une erreur « 500 » quand on recherche certaines communes :
Ce qu'obtiennent les fiers habitants de La Bâtie-des-Fonds quand ils veulent connaître le classement de leur village
Les communes concernées sont toutes de tailles relativement modestes, et j'ai eu vite fait de soupçonner une division par zéro qui a mal tournée (genre le nombre de médecins ou le prix du mètre carré). Pour qu'on ne les oublie pas : Leménil-Mitry (54), Molring (57), Casterets (65), Rochefourcat (26), La Bâtie-des-Fonds (26) et Caubous (31).
Un rapide aller-retour avec l'association — qui a réagi très rapidement — a permis de régler le problème.
Tout étant rentré dans l'ordre, il m'est désormais possible de mettre à disposition le classement complet. J'ai donc conçu une page web, que vous pouvez trouver ICI. Non seulement elle permet d'accéder à l'intégralité du classement, elle vous permet également de mettre des filtres pour afficher uniquement les communes de certains départements ou ayant une population comprise dans un certain intervalle. J'ai poussé le vice jusqu'à permettre de filtrer sur la base d'une expression régulière.
Ainsi il vous est désormais possible de démontrer que votre département est effectivement meilleur que celui d'à côté, ou que les communes dont le nom termine par « sur-loire » sont des havres de paix. Pour ce qui me concerne je n'irai pas plus loin dans l'analyse de ces informations capitales et à la portée hautement scientifique, je me suis déjà donné suffisamment de mal. Amusez-vous bien, et à bientôt !