Le blog d’Antoine Planchot

AccueilÀ proposArchives


5 mars 2022

# Le palmarès des villes et villages où il fait bon vivre : une analyse fine et éclairée en source ouverte

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.

Lien vers le classement

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 !