Aller au contenu

Méthodologie de nettoyage DVF+ — VenduCombien

Statut : VALIDÉ le 2026-07-30 par le propriétaire du projet (bornes après analyse de sensibilité, seuil N = 5, périmètre, segment VEFA séparé). Les paramètres vivent dans etl/config.toml. Ce document est versionné ; toute évolution des règles = nouvelle validation + commit.

Source et périmètre

Entonnoir d'exclusion (mesuré sur le panel)

Chaque mutation reçoit la première règle qui l'exclut ; la somme retombe exactement sur le volume brut.

#RègleExclues% du brut
1Nature de mutation hors périmètre (≠ vente classique)99 8175,86 %
2Mutation multi-biens non ventilable (logements)526 59230,94 %
3Bien hors logement (terrain, local d'activité…)368 46121,65 %
4Mutation à cheval sur plusieurs communes1 6370,10 %
5Surface bâtie absente ou nulle00,00 %
6Surface sous le seuil de décence (< 9 m²)00,00 %
7Valeur foncière absente ou nulle3000,02 %
8Valeur foncière symbolique (< 1 000 €)1 7030,10 %
9Prix/m² hors bornes de plausibilité6 2590,37 %
Ventes conservées697 24041,0 %

Lecture : l'essentiel de l'écart entre « mutations DVF » et « ventes de logements » vient du périmètre (règles 1-3, ~58 %), pas du filtrage qualité (règles 4-9, < 0,6 %). Les règles 5-6 ne retirent rien sur ce millésime : la typologie mono-logement de DVF+ garantit par construction une surface bâtie renseignée — on les conserve comme garde-fous à coût nul.

Bornes de plausibilité du prix/m² (PROPOSITION)

Percentiles observés sur le panel avant application des bornes :

Typenp0,5p1p5p50p95p99p99,5p99,9
appartement358 436661671 4387 50713 57117 73920 08227 837
maison345 0631662505611 8064 7879 00012 74224 097

Bornes proposées (révisées le 2026-07-30 après analyse de sensibilité) :

ParamètreValeurJustification
prix_m2_min (tous types)100 €/m²Sous p0,5 des deux types (66 € appart, 166 € maison). En dessous, il s'agit de démembrements, ventes intrafamiliales ou erreurs de saisie — pas d'un prix de marché. Un seuil plus haut (250 €) mordrait sur le bâti rural dégradé réellement vendu 300-500 €/m² (p5 maison = 561 € avec la Creuse dans le panel).
prix_m2_max (tous types)40 000 €/m²Garde-fou d'erreurs manifestes, pas de rognage statistique — voir l'analyse ci-dessous.
surface_min_m29 m²Seuil de décence locative ; garde-fou (0 exclusion constatée).
valeur_min1 000 €Écarte les ventes symboliques (1 €, 100 €) : 1 703 cas (0,10 %).

Pourquoi 40 000 € et pas p99,5 (~15-20 000 €)

Une première proposition calait la borne haute sur p99,5 du panel (20 000 € appartement / 15 000 € maison). L'analyse de sensibilité l'a invalidée : les percentiles nationaux écrasent les marchés d'ultra-luxe, qui sont précisément les pages les plus scrutées.

Part des ventes de maisons au-dessus de 15 000 €/m², communes les plus touchées (panel, 2014-2025) :

Commune> bornePartMédiane des excluesMax observé
Paris 6e (75106)12/12100 %24 583 €42 581 €
Paris 8e (75108)12/1486 %20 465 €53 750 €
Paris 7e (75107)34/4183 %29 248 €113 718 €
Saint-Jean-Cap-Ferrat (06121)85/11177 %23 162 €105 000 €
Paris 16e (75116)152/28753 %20 325 €94 380 €

À 15 000 €, la page « maisons à Paris 6e » serait vide ; les hôtels particuliers à 20-30 000 €/m² sont des ventes réelles. À l'inverse, les maximums observés (113 718 €, 281 128 €/m²) sont des erreurs manifestes. Distribution de la queue haute (ventes en périmètre) :

Bande de prix/m²AppartementsMaisons
20 000 → 25 0001 235882 (dès 15 000)
25 000 → 30 000321115
30 000 → 40 00018597
> 40 0007296

Au-delà de 40 000 €/m² ne subsistent que 168 ventes sur ~700 000 (0,02 %) : records absolus et erreurs de saisie mêlés. La borne à 40 000 € conserve tout le luxe réel, coupe l'essentiel des erreurs, et la médiane — insensible à la queue — n'en dépend pas. Piste v2 : rognage par percentiles locaux (p0,5/p99,5 par département), qui rendrait la borne fixe superflue.

Seuil de significativité N (PROPOSITION : N = 5)

Distribution des séries commune × année × type de bien sur les ventes conservées du panel (18 000 séries) :

Ventes/an dans la sérieSériesPart
1-23 94821,9 %
3-42 59514,4 %
5-93 78421,0 %
10-294 43124,6 %
30+3 24218,0 %

Avec N = 5 : la médiane est publiée pour 63,6 % des séries de ce panel ; les 36,4 % restantes affichent le volume avec la mention explicite « effectif insuffisant pour une médiane fiable ». Une médiane sur 3-4 ventes bouge de plusieurs dizaines de % d'une vente à l'autre : la publier nuirait à la crédibilité, la masquer sans rien dire cacherait de l'information — d'où volume affiché, médiane retenue. Le panel contenant Paris, la part nationale des petites séries sera plus élevée (poids des communes rurales) : N = 5 est un plancher, pas un plafond.

Seuils à étages (validés 2026-08-01)

Le seuil unique ne suffit pas à tous les usages ; trois régimes s'étagent :

Ventes/anRégime
< 5Volume affiché, médiane jamais (« donnée insuffisante »)
5–19Médiane publiée avec mention « précision limitée » et amplitude min–max observée ; série exclue des classements et des comparaisons
≥ 20Médiane publiée sans réserve ; éligible aux classements et comparaisons (S7)

L'amplitude (min–max du prix/m² des ventes conservées, arrondie à l'euro) n'accompagne que les médianes publiées : sous le seuil, la publier sur une ou deux ventes reviendrait presque à désigner les transactions. Elle est calculée aux niveaux commune, VEFA et canton — pas au département, où elle n'aiderait pas la lecture.

Sous le seuil : la dernière médiane connue, datée (validé 2026-08-25)

Une commune de moins de 5 ventes sur 12 mois n'a pas de médiane publiable. Plutôt que de laisser la page muette, elle publie la dernière médiane qui atteignait le seuil, avec son année :

« 2 780 €/m² en 2022 — dernière année où la commune atteignait le seuil. »

Deux règles la bordent :

Les communes n'ayant jamais atteint 5 ventes sur une année ne reçoivent pas de médiane du tout : la page répond par le volume, la fourchette observée et l'échelon supérieur (canton).

Le rang dans la distribution (validé 2026-09-11)

« Situez un prix » dit désormais, quand la donnée le permet : *« ce prix dépasse 60 à 70 % des appartements vendus à Bordeaux sur douze mois »*. C'est un rang dans une distribution, calculé sur les neuf déciles communaux de la fenêtre de 12 mois glissants — la même que le chiffre du héros.

Seuil de publication : 50 ventes du type concerné sur la fenêtre. Il est plus exigeant que celui de la médiane (5) et que celui des comparaisons (20), pour une raison arithmétique : neuf quantiles découpent les ventes en dix tranches, donc à 20 ventes chaque tranche reposerait sur deux actes et le rang annoncé sauterait d'un cran entier dès qu'une vente s'ajoute. À 50, chaque tranche porte au moins cinq actes.

Ce que le seuil couvre, mesuré sur la France entière au millésime avril 2026 : 1 034 communes, soit 6,4 % des pages ville — mais 39,6 % des ventes actées (139 429 sur 352 142, mesuré dans le bundle publié le 2026-09-11). C'est le second chiffre qui a emporté la décision : un rang sert là où l'on achète.

Le rang est toujours donné en tranche, jamais en point. « 60 à 70 % » et non « 67 % » : les déciles disent dans quelle tranche le prix tombe, pas où dans la tranche. Annoncer un pourcentage exact supposerait les prix uniformément répartis à l'intérieur de la tranche, ce que rien ne garantit. Le dessin suit la même règle — le prix saisi y est marqué par une bande, pas par une aiguille.

Sous le seuil, rien ne régresse : la page garde l'axe en écart à la médiane, qui reste juste et ne promet que ce que la donnée tient.

Le lavis : ce que dit la couleur (validé 2026-08-25)

La charte « L'Acte, 2e édition » colore la silhouette de chaque commune d'un lavis en 4 crans. Ce que ce lavis signifie est une décision méthodologique, pas graphique :

#### Les paliers (validés 2026-08-25)

CranLibelléBornesCommunesPart
1abordable< 1 500 €/m²3 55725,1 %
2modéré1 500 – 2 500 €/m²6 10943,1 %
3élevé2 500 – 4 000 €/m²3 36623,8 %
4très élevé≥ 4 000 €/m²1 1308,0 %

Calibrés sur la France entière (14 162 communes ayant une médiane publiable sur 12 mois glissants). Distribution observée : 1er quartile 1 496 €/m², médiane 2 035 €/m², 3e quartile 2 747 €/m², étendue 220 – 22 024 €/m².

Ce qui a guidé le choix :

Deux points assumés et documentés plutôt que tus :

Le coût annoncé de l'option « paliers nationaux » — des départements monochromes — a été mesuré et s'avère négligeable : 3 départements sur 97. Calibration rejouable : python -m dvfplus lavis-probe --deps france.

Registre des ventes (S7a, rue ajoutée le 2026-08-04)

Chaque page ville publie les 10 dernières ventes actées de la commune : mois, rue sans numéro, type de bien et nombre de pièces, surface, prix, prix au m². Des actes réels issus des ventes nettoyées — jamais un échantillon choisi — sur une donnée déjà publique (DVF, Licence Ouverte).

D'où vient la rue. Le fichier mutation DVF+ (Cerema) ne porte aucun champ de voie : la rue vient de la DVF géolocalisée d'Etalab, rapprochée acte par acte — jamais par un identifiant supposé commun, il n'y en a pas. Clés du rapprochement : parcelle + date + valeur foncière (± 1 €), en ne retenant que les lignes Etalab portant un local du même type que le bien vendu (surface à ± 2 m² quand elle est connue) — c'est la parcelle du bâti qui porte la rue, pas celle du jardin. La voie n'est retenue que si elle est unique parmi les correspondances : une ambiguïté n'est pas une information. Taux mesuré sur département témoin (sonde du 2026-08-04) : 99,4 % des ventes de la fenêtre couverte par Etalab (~5 dernières années) ; les ventes plus anciennes du registre restent sans rue (« — »), structurellement. Un acte non apparié reste sans rue — affiché tel quel, jamais inventé. Une indisponibilité d'Etalab ne bloque pas le pipeline : le registre sort alors sans rues, et le log le dit.

Quartiers IRIS (S7b)

Dans les communes découpées en plusieurs IRIS (le maillage statistique nommé de l'INSEE), chaque page ville présente ses quartiers : ventes des 3 dernières années cumulées, volume public, médiane par type masquée sous N = 5 dans le quartier. Le rattachement est purement géométrique : DVF+ porte nativement le centroïde parcellaire de chaque mutation (Lambert 93) ; un point-dans-polygone avec les contours IRIS de l'IGN (WFS Géoplateforme, demandés en Lambert 93 natif) localise la vente — aucun géocodage, aucune adresse utilisée. Taux mesuré sur département témoin (sonde du 2026-08-04) : 99,2 % des ventes récentes des communes multi-IRIS. Les ventes du registre portent leur quartier ; une vente non localisée reste sans quartier. Les communes mono-IRIS n'ont pas de section quartiers : leur « quartier » serait la commune entière. Une indisponibilité du WFS ne bloque pas le pipeline — le site sort sans quartiers, et le log le dit.

Pages rue (v2)

Chaque voie ayant au moins une vente appariée a sa page, /rue/{commune}/{voie}/, rendue serveur : une fonction Pages lit un JSON pré-calculé par le pipeline et stocké dans R2 — jamais de calcul à la volée, jamais de base de données (constitution, amendée 2026-08-03). La page liste toutes les ventes appariées de la voie (mois, type, pièces, surface, prix, prix/m², quartier IRIS le cas échéant), sans numéro de rue, et publie la médiane par type sur les 3 dernières années sous les mêmes seuils que partout (volume public, médiane et amplitude masquées sous N = 5).

Limites dites sur la page. La rue vient du rapprochement Etalab ci-dessus : seules les ventes de la fenêtre couverte (~5 dernières années) et appariées avec certitude y figurent. Sonde du 2026-08-04 (département témoin 33) : 99,8 % des ventes de la fenêtre Etalab appariées ; sur l'ensemble du millésime (qui remonte plus loin que la fenêtre), cela représente ~31 % des ventes. Une vente non appariée n'apparaît sur aucune page rue mais reste comptée dans tous les chiffres de la commune. Quand deux voies distinctes d'une commune produisent le même slug d'URL (9 cas sur le département témoin), la voie la plus fournie garde l'URL. Les pages rue sont en noindex : leur indexation se tranchera à l'audit de lancement.

L'Indice VenduCombien (validé 2026-08-09)

L'indice mesure l'évolution des prix actés à structure de ventes constante. Une médiane France brute mélange les compositions : un trimestre où Paris vend plus que la Creuse « monte » sans qu'aucun prix n'ait bougé — l'écart mesuré entre la médiane brute et l'indice atteint 6,9 points en 2021 (2,9 points en moyenne sur la série).

Construction : les ventes sont réparties en strates département × type de bien ; à chaque période, la médiane du prix/m² de chaque strate est comparée à la médiane de la même strate sur l'année de base 2019 (= 100) ; les rapports sont agrégés en moyenne pondérée par des poids fixes — la part de chaque strate dans les ventes de 2019 (un Laspeyres de médianes). Une strate comptant moins de 50 ventes sur la période est exclue du point, et les poids sont renormalisés sur les strates présentes.

L'indice-titre est calculé sur des fenêtres de 12 mois glissants (un point par trimestre) : il lisse la saisonnalité. Une variante trimestrielle, plus réactive et plus volatile, l'accompagne sur la page /indice-venducombien. La médiane brute reste un témoin interne, jamais publiée seule. L'indice est recalculé à chaque millésime DVF (avril / octobre), chaque édition est datée ; les compléments tardifs de DVF peuvent réviser des points récents — toute révision est signalée comme telle, un indice qui réécrirait son passé sans le dire n'en serait pas un.

Fenêtre de 12 mois glissants et évolution (PROPOSITION S6)

Le chiffre-titre des pages ville et canton est la médiane des 12 mois se terminant à la dernière vente du millésime (période affichée en clair) — pour une publication d'avril, cela coïncide avec l'année civile ; pour octobre, la fenêtre chevauche deux années. L'évolution « sur un an » compare cette fenêtre aux 12 mois précédents, et n'est affichée que si les deux fenêtres comptent au moins 20 ventes (le seuil des comparaisons) — entre deux petites médianes, elle ne serait que du bruit. Sous ±1 %, le marché est dit stable (◆). La référence France est calculée de la même manière, sur le même type de bien. Les séries annuelles (graphiques, historique) restent en années civiles.

Décomposition par tranche de surface (PROPOSITION S6)

La médiane seule ne dit pas ce qui se vend. Chaque page ville décompose les ventes des trois dernières années du millésime, cumulées (fenêtre datée, affichée), par type de bien et par tranche de surface : moins de 40 m² · 40–59 · 60–79 · 80–99 · 100–139 · 140 m² et plus. Bornes rondes, identiques pour les maisons et les appartements — la comparabilité entre pages prime sur l'ajustement fin par type. Volume toujours public ; médiane (€/m² et prix de vente) masquée sous N = 5 dans la tranche, comme partout. Bornes à valider par le propriétaire du projet.

VEFA : segment « Neuf » séparé (PROPOSITION)

Diagnostic sur le panel (2014-2025) : 24 493 ventes VEFA mono-logement (23 780 appartements, 713 maisons), complétude 100 % sur la surface et la valeur — la qualité des données permet d'en faire un segment publié.

IndicateurVEFA (appart.)Ancien (appart.)
Prix/m² médian panel3 882 €7 507 €

L'écart illustre le biais de composition : le neuf se construit là où il y a du foncier (périphéries), pas dans Paris — mélanger VEFA et ancien dans une même médiane la déformerait dans les deux sens selon les communes. D'où la proposition :

Contrôle de vraisemblance

Médianes annuelles du panel (extrait) : appartements 6 857 €/m² (2014) → 8 743 € (2020) → 7 667 € (2025) ; maisons 1 643 € (2014) → 2 145 € (2022) → 2 091 € (2025). Trajectoire cohérente avec le cycle connu (hausse jusqu'en 2021-2022, correction 2023-2024, stabilisation 2025).

Point d'attention pour S3 : les volumes d'appartements chutent fortement dès 2021 (25 694 contre 36 330 en 2020) alors que 2021 fut une année record au niveau national. À recouper en S3 avec les chiffres notaires lors du contrôle de cohérence (5-10 valeurs publiées) avant toute publication — possible effet de couverture du millésime sur Paris.

Où vit chaque commune : page dédiée ou section cantonale

Toutes les communes françaises sont couvertes, mais toutes n'ont pas une page à elles. Deux raisons, une éditoriale et une technique :

Critère de page dédiée : au moins une médiane publiable — ancien ou VEFA — sur l'une des trois dernières années du millésime. Environ 16 100 communes remplissent ce critère.

Les autres sont regroupées par canton (rattachement COG, colonne CAN), à raison d'une page par canton (≈ 2 050). Chaque commune y dispose d'une section ancrée à URL stable (/canton/{slug}-{code}/#c{code_insee}) et d'un bloc factuel qui ne dépend d'aucun seuil :

La page canton porte ses propres médianes, recalculées depuis les ventes du canton — jamais une médiane de médianes communales.

Le critère est réévalué à chaque millésime : une commune peut gagner ou perdre sa page dédiée. Une URL publiée une fois continue de mener au bon contenu.

Avant d'écraser ses données, le pipeline mémorise quelles communes avaient une page dédiée. Au build suivant, la comparaison produit un fichier de redirections permanentes (301) :

Les slugs des anciennes URLs sont recalculés avec la fonction qui produit les URLs actuelles : il ne peut pas y avoir d'écart entre l'adresse émise hier et l'adresse redirigée aujourd'hui. Le build échoue si le nombre de règles dépasse la limite de l'hébergement, plutôt que de laisser des URLs répondre 404 en silence.

Signaler une erreur de regroupement

Chaque page canton porte un formulaire de signalement. Le rattachement d'une commune à son canton vient du COG de l'INSEE ; il est juste dans l'immense majorité des cas, et un habitant est le mieux placé pour repérer l'exception.

Le circuit est entièrement automatique, mais ce n'est jamais le signalement qui décide. Il déclenche une re-vérification contre la source officielle, et c'est elle qui tranche :

  1. le formulaire ouvre un ticket, avec le canton, la commune visée, le millésime et l'URL — de quoi rejouer le cas sans rien redemander ;
  2. un passage quotidien confronte le cas au Code officiel géographique ;
  3. trois issues possibles, toutes tracées et publiées : - écart confirmé — notre publication est en retard sur le COG : un recalcul complet est déclenché, le ticket est clos avec la preuve ; - conforme — la publication suit le découpage officiel : rien ne bouge, le ticket est clos en citant la ligne du COG ; - à arbitrer — code périmé, ticket illisible, ou contestation du COG lui-même : aucune décision automatique, un humain instruit.

Le même passage mesure la dérive d'ensemble entre ce que le site publie et le COG courant, indépendamment de tout signalement — le découpage administratif évolue sans prévenir.

Deux principes tiennent l'ensemble :

Le fichier etl/overrides/rattachements.toml reste la porte manuelle, réservée au cas où la source elle-même est en défaut — une décision qu'un automate ne doit pas prendre. Chaque décision, automatique ou non, est publiée sur le journal des corrections.

Communes fusionnées

DVF conserve le code INSEE en vigueur au moment de la mutation. Une commune nouvelle voit donc son histoire éclatée entre son propre code et ceux de ses communes fondatrices, disparus du COG. Ces codes sont rattachés à la commune actuelle avant le nettoyage (table v_mvt_commune du COG), en suivant la chaîne de fusions jusqu'à une commune vivante.

Conséquence assumée, validée le 2026-07-30 : les médianes d'une commune nouvelle portent sur l'ensemble de son territoire actuel, y compris pour les années antérieures à la fusion. C'est la convention usuelle, et l'alternative — laisser ces ventes sous un code sans nom — revenait à ne pas les publier du tout. 1 722 codes sont concernés au millésime avril 2026.

Limites connues

Reproduction

cd etl && python -m dvfplus all --deps 49,75,23,06,59

Rapport détaillé : artefact rapport-nettoyage du workflow Pipeline ETL (run du 2026-07-29) ou data/out/avril_2026/rapport_nettoyage.md en local.