Décisions méthodologiques
Toutes les règles structurantes du dashboard, classées par catégorie.
Chaque décision donne la règle, la raison (↳), et les alternatives écartées (✗) quand pertinentes.
🏗️ Architecture
Choix de stack, hébergement, contraintes structurantes du site.
Quarto Dashboard en R, déploiement statique
leaflet, viz via ggplot2 + ggiraph ou SVG natif, Sankey via networkD3. Pipeline data en R (duckdb + arrow + sf).Multi-page sous 100 MB par fichier
R/setup_dashboard.R est sourcé par chaque page, charge les données conditionnellement (if (carb_ready) …). htmlwidgets n'embarque que les objets passés aux widgets de la page.Périmètre géographique : Métropole + 5 DROM en cartouches
971 Guadeloupe, 972 Martinique, 973 Guyane, 974 La Réunion, 976 Mayotte. Convention IGN.🗺️ Cartographie
Palettes, encodages, gestion des cas particuliers (PLM, DROM, légendes dynamiques).
Législatives : famille gagnante + opacité par marge
Municipales : helper dédié choropleth_municipales()
- Palette "Divers" boostée : olive
#A18047au lieu du gris national. Justification : 88% T1 + 81% T2 gagnés par "Divers" (LDIV/LDVG/LDVD/LREG) — invisibles sinon. - Stroke différencié : T1 → orange
#F0A500(0,6 px), T2 → blanc (0,3 px). L'œil distingue immédiatement le tour décisif. - Opacité fixe 0,85 pour toutes les communes avec famille, pas de fade par marge.
Paris / Lyon / Marseille : règle par viz
75056, 69123, 13055), GeoJSON expose par arrondissement (75101-75120, etc.).
- Élections : résultat ville mère répercuté sur tous les arrondissements.
- Mobilité Sankey : consolidation
751xx→75056avant agrégation (sinon 20 "Paris arrondissements" pollueraient le Sankey). - Profil radar : filtre les communes avec < 5/8 axes renseignés (exclut les codes PLM consolidés peu renseignés).
Légendes dynamiques (page Démographie)
DROM cartouches : re-fit bounds à l'expansion
R/map_helpers.R::.add_resize_handler() capture les bounds initiaux puis ré-applique fitBounds() après chaque invalidateSize(). Observe aussi le parent .card (Quarto fullscreen).📊 Données par source
Une décision par source : règles métier, filtres, snapshots. 13 sources au total.
📥 Élections Législatives 2024 — T1 fallback
tour trace la nature du résultat affiché.- NFP : UG, FI, SOC, COM, VEC, ECO
- ENS : ENS, HOR
- LR : LR, UDI, UDR
- RN : RN, UXD, EXD
- Divers : DVD, DVG, DVC, DSV, REG, EXG, DIV
📥 Municipales 2026 — T1 + T2 combinés
L) → famille : LUG/LFI/LSOC/LCOM/LVEC/LECO = NFP ; LUC = ENS ; LLR/LUDI/LUDR/LUD = LR ; LRN/LUXD/LEXD = RN ; LDIV/LDVG/LDVD/LDVC/LREG = Divers.📥 DVF Immobilier — filtres standards
nature_mutation = "Vente"type_local ∈ {"Appartement", "Maison"}surface_reelle_bati > 9 m²- Bornes :
200 €/m² < x < 30 000 €/m² - Mutations mono-local uniquement
- Médiane comme stat d'agrégation (robuste outliers)
- N < 5 ventes/an →
estimation_insuffisante, grisée
📥 Atmo Air — agrégation 30 jours glissants
📥 SSMSI Délinquance — secret statistique
📥 BAAC Accidents — taux ‰ habitants
pop_latest).📥 DGFiP Finances communales
📥 APL DREES — seuil désert médical
📥 Espérance de vie INSEE — join par nom
📥 FiLoSoFi Revenus INSEE
📥 INSEE Populations + Strates de taille
- Très petite (< 500 hab.)
- Rurale (500 - 2 000)
- Bourg / périurbain (2 000 - 10 000)
- Ville moyenne (10 000 - 50 000)
- Grande ville (≥ 50 000)
📥 INSEE Grille de densité (typologie 6 niveaux)
- Rural non périurbain
- Rural périurbain
- Petites villes
- Centres urbains intermédiaires
- Ceintures urbaines
- Grands centres urbains
densite_rang (1-6) dans Explorer + Bivariée.📥 DARES Chômage DEFM A+B+C
defm_abc / pop_latest * 1000.📥 RARE/CITEPA Empreinte carbone — approche conso
📥 INSEE MOBPRO — codes TRANS RP 2019
1Pas de transport2Marche à pied3Vélo (y compris VAE)42-roues motorisés5Voiture / camion / fourgonnette6Transports en commun
📥 Agence Bio Agriculture
sum(nboperateur) par commune × année.🔬 Analyse
Stratification, métriques de corrélation, filtres de tautologies.
Spearman par défaut, Pearson alternatif
Top 25 corrélations — filtrage des tautologies
del_total × del_vols_pers(ρ = 0,98) — total inclut les volsfin_charges × fin_recettes(ρ = 0,99) — budget équilibréctx_log_inscrits × ctx_log_pop(ρ = 0,99) — inscrits ≈ pop adulterevenu_median × revenu_d9(ρ = 0,95) — bougent ensemble
Bivariate choropleth — palette Stevens 3×3
scripts/05_merge_and_explore.R). 1 176 combinaisons disponibles côté JS via selectors X/Y.Stratification : 5 strates × variable continue densite_rang
correlations.parquet.densite_rang (1-6, INSEE typologie 6 niveaux) disponible dans heatmap et Bivariée mais pas (encore) en strate Explorer.📈 Visualisations
Choix d’encodage pour les 4 viz dérivées (radar, Sankey, small multiples, scatter Explorer).
Profil radar — 8 dimensions en rang centile
- Population (log)
- Revenu médian
- APL médecins
- Recettes communales €/hab
- Délinquance totale ‰
- Empreinte CO₂/hab
- % voiture mobilité
- Densité INSEE (rang 1-6)
Sankey mobilité — Top 100 flux + PLM consolidé
scripts/16_mobilite_flows.R) :
- Consolidation PLM (
751xx→75056,6938x→69123,132xx→13055) - Top 50 destinations par poids entrant total
- Filtre
COMMUNE != DCLT(exclut flux intra-commune) - Top 200 flux ≥ 100 actifs, puis top 100 pour le rendu
Small multiples départements — 96 tuiles métropole
^(0[1-9]|[1-8][0-9]|9[0-5]|2[AB])$ pour le filtre — exclut ZX (Saint-Martin), ZZ (Français hors de France) et 97x/98x (DROM, séparés).Explorer scatter — LOESS approx + ρ live
🔄 Fraîcheur des données & complétions écartées
Quelles sources se rafraîchissent automatiquement, lesquelles sont figées par une limite amont, et quelles extensions ont été tentées puis écartées parce qu’elles auraient introduit un indicateur trompeur (principe d’objectivité : mieux vaut pas d’indicateur qu’un indicateur faux).
Rafraîchissement automatique mensuel
.github/workflows/refresh-data.yml (cron, 1ᵉʳ du mois) re-télécharge les sources à URL stable et recommit les parquets modifiés : Atmo air (30 j glissants — la seule qui change vraiment souvent), SSMSI, DGFiP, APL, BAAC, carbone, FiLoSoFi, populations, bio. Scripts idempotents (cache des bruts).renv.lock) pour qu'un refresh ne change jamais le comportement.Sources figées par une limite amont (refresh manuel)
- DEFM chômage : la DARES publie le fichier communal sans URL stable réutilisable (export depuis leur portail). Le millésime affiché dépend du CSV déposé manuellement dans
data/raw/dares/. - MOBPRO mobilité : dernier fichier détail commune × commune diffusé par l'INSEE = RP 2019 (décalage usuel ~3 ans). Pas de millésime plus récent au format détail à la date du build.
- Municipales 2026 : scrutin ponctuel, pas de refresh.
✗ Complétions tentées puis écartées
- Gaz + électricité par commune (bloc G complet) — Agence ORE publie un CSV de 800 MB ; l'API Tabular data.gouv le rejette et le stream complet est disproportionné pour le gain. Seul le carbone (approche conso) est retenu pour le bloc Énergie.
- % SAU en bio (bloc K) — deux pistes rejetées : (1) la SAU Agreste RA2020 republiée par ZABAL est en format long multi-millésimes à couverture partielle (~10 k lignes, non national) ; (2) normaliser la surface bio par l'aire communale donne des ratios > 100 % car l'Agence Bio attribue la surface au siège de l'opérateur, pas à la localisation des parcelles — dénominateur et numérateur ne portent pas sur le même territoire. On conserve donc la surface bio brute (ha) plutôt qu'un ratio trompeur.
- Espérance de vie — élargir le match au-delà de 81,6 % — la source INSEE ne publie que ~1 680 communes principales ; améliorer l'appariement de noms ne lèverait pas ce plafond de couverture. Gain marginal, non poursuivi.
Historique des règles
- 2026-05-25 — Décisions initiales : Quarto + leaflet, périmètre métropole+DROM, élections 2024 T2 + T1 fallback, DVF filtres standard, Atmo WFS + EPCI expansion, stratification 4 strates pop INSEE.
- 2026-05-26 matin — Multi-page split GitHub Pages, ajout SSMSI + BAAC, DGFiP, APL 5 pros + EV INSEE, FiLoSoFi, grille densité INSEE 6 levels, DEFM, Municipales 2026 T1+T2. Passage 4 → 5 strates pop INSEE.
- 2026-05-26 après-midi — Blocs G (carbone RARE/CITEPA), I (mobilité MOBPRO 2019), K (Agence Bio). Helper municipales dédié. Fix démographie click+legend, fix DROM resize fitBounds. Viz radar profil, Sankey mobilité, small multiples départements. Codes TRANS RP 2019 documentés post-bug.