Comment c’est construit
Un entrepôt qui se reconstruit depuis les sources sur une seule machine, un site statique généré à partir de lui, et des règles qui arrêtent une jointure fausse ou une phrase non étayée avant sa mise en ligne.
- Données
- 2 717 481 lignes dans le cube des indicateurs : 52 indicateurs issus de 14 sources cataloguées, 34 858 communes, de 1960 à 2025
- Code
- 37 000 lignes de Python, 3 400 de SQL dans 60 modèles dbt, et 9 500 de JavaScript pour le site
- Tests
- 462 tests Python, 155 tests des modules du site et 34 tests de données dbt, à chaque pull request
- Site
- 454 adresses dans le plan du site, toutes construites d’avance et servies comme fichiers statiques
- Décisions
- 16 décisions d’architecture consignées
Compté sur la branche principale le 21 octobre 2026.
Vue d’ensemble
Aucun serveur à maintenir. GitHub Actions reconstruit tout depuis les sources, et Vercel sert le résultat.
Le trajet d’un chiffre
Six étapes entre un fichier publié par l’Insee ou Eurostat et une phrase sur une page.
- RécupérerChaque adresse vit dans une fiche du catalogue, avec sa licence et ses millésimes. Les téléchargements sont mis en cache et consignés : une relance ne récupère rien deux fois.
- ChargerLes fichiers entrent dans DuckDB en texte, tels que publiés. Le typage et l’interprétation viennent ensuite, là où on peut les tester.
- HarmoniserChaque source passe par la table de passage des communes, recalculée à partir de tous les mouvements du code officiel depuis 2003 et vérifiée contre la table de l’Insee, et ressort dans une seule géographie de référence.
- PublierLe cube et les tables du site portent un statut sur chaque ligne : publié, masqué, absent, ou trop peu de ventes.
- ÉcrireUne analyse calcule, puis affirme. Chaque nombre du texte sort du calcul, et chaque affirmation est vérifiée contre les données : une seule qui échoue arrête le build.
- LivrerAprès une CI verte sur main, le site est construit sur les vraies données, testé de bout en bout dans un navigateur, puis envoyé à Vercel déjà construit.
Des règles que le code ne peut pas enfreindre
En données, une jointure fausse ne lève aucune exception. Ces règles sont donc écrites, et la plupart sont testées.
Une seule géographie
Des communes fusionnent chaque année. Tout chiffre français passe dans une seule année de référence du code officiel avant de sortir de l’entrepôt. Les régions européennes sont en NUTS 2024 : un code d’une autre version est écarté, jamais converti.
int_geo__passage_communes · ADR 0005
N’additionner que ce qui s’additionne
Une population se répartit entre communes avec des poids. Une médiane ou un taux ne traverse qu’un lien un pour un, une commune renommée ou recodée, jamais une commune fusionnée.
poids · nature
Une case vide n’est jamais un zéro
Une valeur peut être masquée par le secret statistique, pas publiée du tout, ou reposer sur trop peu d’observations. Chaque cas a son statut, et aucun n’est jamais comblé.
statut
Aucune vente immobilière isolée
Les adresses et les parcelles de DVF ne quittent jamais la couche brute. Aucun prix sous 20 ventes, et aucune vente individuelle dans une table, un export, un fichier de test ou une page.
seuil_ventes_min = 20
Une année de données n’est pas une année de géographie
Filosofi 2023 arrive dans le code des communes de 2026, les données Eurostat de 2026 en NUTS 2024. Chaque source déclare son année de géographie dans le catalogue.
millesime_geo
Chaque source a sa licence
Chaque source a sa fiche, avec sa licence, sa mention et ses conditions, et chaque figure la cite. Toutes ne sont pas ouvertes : les contours GISCO sont réservés à un usage non commercial.
catalogue/<source>.yml
Chaque chiffre est calculé
Les pages ne contiennent aucun nombre en dur. Une phrase ne dit que ce que le calcul établit : le sens, la force, l’intervalle.
ADR 0004 · affirmer
Des questions sans modèle de langage
L’explorateur lit les questions avec un dictionnaire tiré du registre des indicateurs et répond par des gabarits. Pas de facture d’API, pas de chiffre inventé, et la même réponse à chaque fois.
questions.js
Des statistiques, avec leurs limites
Une page de méthode publique explique comment chaque affirmation est testée.
- Des corrélations avec un intervalle de confiance à 95 %, et celle de Spearman quand les rangs comptent plus que les valeurs.
- Des effets fixes par pays, pour distinguer ce qui se joue entre pays de ce qui se joue à l’intérieur.
- Une correction des tests multiples quand de nombreux indicateurs sont comparés à la fois.
- L’autocorrélation spatiale, avec le I de Moran : des régions voisines ne sont pas des observations indépendantes.
- Des tests de robustesse : le résultat tient-il sans les valeurs atypiques, une autre année, en échelle logarithmique ?
Un lien entre territoires ne dit rien des personnes qui y vivent : c’est l’erreur écologique, et un guide du blog l’explique. Les années récentes sont souvent provisoires, et chaque chiffre porte son millésime.
Pour les moteurs de recherche et les assistants IA
Un site de référence doit être trouvé, et cité correctement.
- llms.txt et llms-full.txt : le plan du site, et le texte intégral des analyses, des guides et des pages de méthode en un seul fichier.
- Des données structurées sur chaque page : Article avec « À retenir » en résumé, Dataset et DataDownload pour le cube, FAQPage, DefinedTermSet pour le glossaire.
- Une image de partage par article, dessinée au build à partir de son titre et de sa première figure.
- Une page en anglais pour les données, avec hreflang, pour que le cube se trouve hors de France.
- Un flux Atom des analyses, et un plan du site de 454 adresses.