# Commune-level data for place-based programmes and local grants: sources

Assembled 2026-10-03/04. Every value comes from a file downloaded from the URL
given below. Some values are derived from such files, and each derivation is
described. The raw downloads were kept under `raw/`, with one subfolder per
item. That folder is not committed. The xlsx, dbf and shp files were read
directly, without conversion by hand.

| File | Rows | Content | Years | Geography |
|---|---|---|---|---|
| `acv.csv` | 244 | Action cœur de ville communes (233 in the 2018 list, 11 later additions) | 2018 (+2023-2025) | COG 2025 |
| `pvd.csv` | 1,642 | Petites villes de demain, with convention signature date | 2020-2024 | COG 2025 |
| `ti.csv` | 34,790 | Territoires d'industrie: 2018-2023 generation (16,150, derived spatially) and 2023-2027 (18,640) | 2018, 2023 | COG 2025 |
| `eligible.csv` | 34,746 | every metropolitan commune: legal population, Insee zonings, EPCI industry share, and whether it met each programme's published criteria | 2015-2016, zonings 2020-2022 | COG 2025 |
| `did.csv` | 4,620 | event studies and synthetic DiD of the three programmes (`analysis/places_did.ml`) | 2006-2025 | COG 2025 |
| `zfu.csv` | 152 | communes hosting a ZFU, by generation | 1997, 2004, 2006 | COG 2025 |
| `ber.csv` | 402 | Bassins d'emploi à redynamiser (Vallée de la Meuse, Lavelanet) | 2007 | COG 2025 |
| `frr.csv` | 24,390 | FRR socle/FRR+, FRR+, FRR bénéficiaire (from `zrr/zrr_status.csv`) | 2024, 2025 | COG 2025 |
| `qpv.csv` | 1,632 | communes hosting a QPV, 2015 and 2024 lists | 2015, 2024 | COG 2025 (+COM) |
| `pinel.csv` | 453,375 | ABC zone on 1 Jan and 31 Dec, Pinel eligibility, commune × year | 2014-2026 | COG 2025 |
| `sitadel.csv` | 462,989 | housing units and floor area authorised and started, by type | 2013-2025 | year's COG + COG 2025 column |
| `dvf.csv` | 308,997 | house and apartment sales and median price (€, €/m²) | 2014-2023 | published + COG 2025 column |
| `sirene_creations.csv` | 521,136 | Sirene establishment creations | 2010-2025 | COG 2025 |
| `dgf.csv` | 315,619 | DGF, forfaitaire, DSU, DSR (+fractions), DNP, DGF and Insee population, DSU index | 2018-2026 | year's COG + COG 2025 column |
| `accounts.csv` | 569,817 | commune accounts: DGFiP 2011-2018 and OFGL 2018-2025, one row per source | 2011-2025 | see below |
| `thresholds.md` | - | legal population thresholds with CGCT and other articles | - | - |

The `year` column is the start year for programme lists, and the data year
elsewhere.

**Not obtained:**
- Sitadel by commune for 2010-2012: the commune file starts in 2013.
- DVF for 2024-2025.
- DGF components by commune for 2011-2017: only the DGF total, as booked in
  the DGFiP accounts.
- Commune-level Pinel B2 agréments.
- The pre-2014 zoning.

## Programme lists (item 1)

All downloaded 2026-10-03. Raw copies were kept in `raw/programmes/`. The
ABC zoning chain and the parsing of the JO arrêté tables are described below.

**Geography.** Every programme file is in **COG 2025**, the vintage already used for
`zrr/zrr_status.csv` and the Urssaf file. Source codes are projected with the
INSEE passage table `zrr/raw/passage_2003_2026.csv`, which was not downloaded again.
`source_codes` keeps the codes as published and `source_cog` gives their vintage.
`share_of_components` is the share of a COG 2025 commune's component communes
(in the source vintage) that are in the list, counted per commune, not weighted
by population. It is 1 everywhere except where the column says otherwise. Two
exceptions keep their source codes because they are outside the INSEE COG:
Saint-Martin (97801) and the Polynesian communes (987xx) in `qpv.csv`.

The files list treated communes only. A commune that is not in a file was not
in that programme, according to that source.

### acv.csv: Action cœur de ville (244 communes, 230 ACV ids)

- Source: Caisse des Dépôts / ANCT, "Listes des villes Action coeur de ville",
  data.gouv dataset 5fa9901c66cff095591963e8, ODS dataset modified 2026-09-20.
  The file is
  https://opendata.caissedesdepots.fr/api/explore/v2.1/catalog/datasets/villes_action_coeurdeville/exports/xlsx
  (`acv_cdc.xlsx`). Codes are valid COG 2025 codes.
- Ids ACV001 to ACV222 are numbered alphabetically by town, with one inversion
  (Romans filed under R), and 219 of them are present. **Inference:** these are the
  March 2018 list of 222 towns ("Lancée en mars 2018", dataset description). In
  that range, ids 163, 200 and 209 are missing from the current file. Ids
  ACV223 to ACV233 are later additions, all with 2023-2025 signature dates, and
  are tagged `cohort = later addition`. For these, `year` is the year of
  `date_signature_cdc`, and it is blank when that date is blank.
- `date_signature_cdc` is the ODS field `date_signature`: "the date when the
  city charter or agreement was formally signed". It mixes 2018-2019 dates
  (first conventions) with 2023-2025 dates (most likely the ACV2 amendments)
  and has blanks, so it is **not** a clean 2018 start date. Use `year` for the
  cohort.
- Binômes (two communes under one id) give 244 communes for 230 ids.
- The separate ANCT "Entrées de ville" list (ACV2 extension, 47 communes, COG
  2025) is a text CSV that WebFetch does not save, so it was not used:
  https://static.data.gouv.fr/resources/action-coeur-de-ville-les-entrees-de-ville/20250929-142434/liste-acv2-com2025-20250929.csv

### pvd.csv: Petites villes de demain (1,642 communes)

- Source: CDC / ANCT, "Programme petites villes de demain - liste des villes
  bénéficiaires", data.gouv 601c8b8c3ebd3f3468c2435a, ODS modified 2026-10-02:
  https://opendata.caissedesdepots.fr/api/explore/v2.1/catalog/datasets/programme-petites-villes-de-demain-liste-des-villes-beneficiaires/exports/xlsx
  (`pvd_cdc.xlsx`, 7.9 MB, includes the polygons). It has 1,642 communes and
  1,642 ids, all valid COG 2025 codes.
- `date_signature` is the signature date of the commune's adhesion convention
  ("Signature date", ODS field description), and `year` is its year. The years
  are: 2020: 5, 2021: 1,559, 2022: 62, 2023: 7, 2024: 4, and 5 blanks. The
  selection announcements (late 2020 to 2021) are not in the file.
- ANCT also publishes the list in COG 2026 as a text CSV, which was not used:
  https://static.data.gouv.fr/resources/programme-petites-villes-de-demain/20260819-140115/liste-pvd-com2026-20260819.csv

### ti.csv: Territoires d'industrie, two generations

- **2023-2027 (year 2023, 18,640 COG 2025 communes, 183 TI).** Source: CDC
  "Liste des Territoires d'industrie et des communes concernées", data.gouv
  5fa9901d5a498251f21963ea, ODS modified 2025-09-30:
  https://opendata.caissedesdepots.fr/api/explore/v2.1/catalog/datasets/liste-des-territoires-dindustrie-et-des-communes-concernees/exports/xlsx?select=id_ti,lib_ti,insee_com,lib_com,epci_code,epci_name,dep_code
  (`ti_cdc_2018.xlsx`; the file name is historical and the content is the 2023
  generation). It has 18,664 communes and 183 ids, with codes in COG 2023. The
  ODS description still says "149 territoires, 16,186 communes", but the data
  are the 183 TI of 2023-2027 (ids `ti-xxxx`).
- **2018-2023 (year 2018, 16,150 COG 2025 communes, 149 TI). Derived, not
  published as a commune list.** WebFetch only offers the 2018-2023 list as a
  territory-level text CSV with no communes. The ANCT/MTE perimeter layer "TI -
  Territoires d'industrie périmètre au 2022-11-28" (data.gouv
  660c007b6f059c84c900c513) was downloaded through its Atom link:
  https://atom.geo-ide.developpement-durable.gouv.fr/atomArchive/GetResource?id=e5bfd4e7-daa3-4989-a745-ac5468c8ee55&dataType=dataset
  (`ti2018_perimetre_com2022_atom.zip`, layer `liste_ti_perimetre-com2022-20221128`,
  149 polygons, WGS84). Each COG 2025 commune centroid comes from
  https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/georef-france-commune/exports/xlsx?select=com_code,com_name,year,epci_code,geo_point_2d
  (`georef_commune_points.xlsx`, OpenDataSoft "georef-france-commune", year
  2025, modified 2025-04-28). A commune is assigned to the TI polygon that
  contains its centroid (`method = centroid_in_perimeter_cog2022`). Every
  commune fell in at most one TI.
  - Check: TI were built from whole EPCI. `epci_share_inside` is the share of the
    commune's 2025 EPCI that is inside a TI. Of 558 EPCI touched, 18 are partly
    covered. Seven have exactly one commune inside: 240800920, 200030195,
    200039865, 200067882, 200034379, 241200658 and 243100781. These are likely
    border false positives and are worth dropping or checking. Métropole du
    Grand Paris (40/130) and Aix-Marseille-Provence (19/92) are partial by
    design. 16,150 is close to the 16,186 communes that the CDC description
    gives for the 149 TI before the 2023 renewal.
- `year` is the generation's start year. The dates are not verified here:
  first-generation launch late 2018, renewal 2023.

### eligible.csv: the communes that met each programme's criteria (34,746 communes)

Built 2026-10-15 by `build/eligible.ml` (command in `build/dune`) for the
controls of `did.csv`: communes that met a programme's published criteria but
were not chosen. One row per metropolitan commune in COG 2025 (the Insee
files' geography), with the inputs of each rule, so a different rule can be
applied without downloading again. The programme lists stay in their own
files; "eligible" does not say whether a commune was chosen.

**Inputs**, downloaded 2026-10-15 from insee.fr, each in its own directory
outside the tree (SHA-256 of the archive as downloaded):

- Bassins de vie 2022 at 1 January 2025,
  https://www.insee.fr/fr/statistiques/fichier/6676988/BV2022_au_01-01-2025.zip
  (`b706e01bc15fcf1faa522772a417a38de73cf95af162f3cf5097b113b252d03a`), sheet `Composition_communale`: `TYPE_COMMUNE_BV2022`
  (20 pôle, 11 pôle partiel, 12 commune associée, 00 non-pôle).
- Aires d'attraction des villes 2020 at 1 January 2025,
  https://www.insee.fr/fr/statistiques/fichier/4803954/AAV2020_au_01-01-2025.zip
  (`738f81b12832fe294bd24ddbfe3a31830c20d850143fc8b4393f18d4b8ee8181`): `AAV2020` and `CATEAAV2020` (11 commune-centre, 12 other
  commune of the main pôle, 13 secondary pôle, 20 couronne, 30 outside).
- Unités urbaines 2020 at 1 January 2025,
  https://www.insee.fr/fr/statistiques/fichier/4802589/UU2020_au_01-01-2025.zip
  (`bc43d62e67c5dc6ae25a20fc3bd440dd37408ef8313b543aa1e9cb366be44840`): `STATUT_COM_UU` (C ville-centre, B banlieue, I ville
  isolée, H outside), and from sheet `UU2020` the size class `TUU2017`
  (4: 20,000-49,999 inhabitants … 7: 200,000-1,999,999; 8 Paris).
- Historical legal populations,
  https://www.insee.fr/fr/statistiques/fichier/3698339/base-pop-historiques-1876-2023.xlsx
  (`07c992bc62c3136ab4db21647585d370666f6e56d40bad73bca43a6a5fc1d837`), sheet `pop_1876_2023`: `PMUN2015` (in force on
  1 January 2018) and `PMUN2016` (in force on 1 January 2019). Paris, Lyon and
  Marseille appear by arrondissement and are summed.
- EPCI at 1 January 2025,
  https://www.insee.fr/fr/statistiques/fichier/2510634/epci_au_01-01-2025.zip
  (`06510f6199943196b6f28c45ef65003243e73684063fd2ce21c1c35de5731696`): the commune's `EPCI`.
- Jobs located in the commune and industrial jobs, 2015 census, from
  `../zrr/census.csv`.

Each URL was fetched again on 2026-10-15 and gave the same checksum. The
AU2010 and UU2010 zonings at the 2018
geography (`AU2010_au_01-01-2018_V2.zip`, `UU2010_au_01-01-2018.zip`) were also
fetched but not used, since they are not in COG 2025.

**The criteria, as published, and the rule applied.**

- **Action cœur de ville.** The programme presentation of 14 December 2017,
  annexed to the instruction of 10 January 2018 (NOR TERR1800859C, BO MTES-MCT
  2018/1,
  https://www.bulletin-officiel.developpement-durable.gouv.fr/documents/Bulletinofficiel-0030064/met_20180001_0000_0014.pdf),
  targets « villes de rayonnement régional qui ont un rôle de centralité pour
  leur bassin de vie », « hors d'une métropole », and says « Le plan ne prévoit
  ni liste de villes fixée au niveau central, ni seuil démographique
  minimal ». The instruction addresses « en priorité des villes « pôles
  d'attractivité », hors périmètre des métropoles »; its other criteria
  (political backing, a project, engineering capacity) are not observable.
  The Cour des comptes (S2022-1266, 29 September 2022,
  https://www.ccomptes.fr/system/files/2022-09/20220929-S2022-1266-1-programme-action-coeur-ville.pdf)
  reports that « le critère principal était celui du rôle de centralité »,
  that a band of 20,000 to 100,000 inhabitants was an « orientation générale
  … pouvant être tempéré », that nearly 80 chosen towns are below 20,000, and
  that the CGET's work on the definition of villes moyennes produced a first
  list of « territoires cibles », which was not published. The CGET defined
  villes moyennes (2018, read as quoted by Warnant, Fondation Jean-Jaurès,
  2020; the CGET site is gone) as « unité urbaine de plus de 20 000 habitants
  de type « grand pôle urbain » au sens de l'Insee, non incluse dans une des 22
  aires urbaines englobant les métropoles institutionnelles ». The rule
  applies that definition on the 2020 zonings: the ville-centre (or ville
  isolée) of an unité urbaine of size class 4 to 7, whose communes held at
  least 10,000 jobs in 2015 (Insee's grand pôle threshold), outside the
  aires d'attraction of the 22 métropoles of 2018. It leaves out the
  prefectures the CGET added in six départements without such an unité
  urbaine. **Result:** 211 communes; 135 of the 218 metropolitan towns of the
  2018 list (62%) meet it, the others mostly being villes-centres of unités
  urbaines of 10,000-19,999 (33) or communes of a binôme that are not the
  ville-centre; 76 eligible communes were not chosen, of which 23 joined
  Petites villes de demain.
- **Petites villes de demain.** ANCT, « Comment candidater ? » (15 October
  2020, https://anct.gouv.fr/actualites/comment-candidater): « Etre une petite
  ville de -20 000 habitants, avec des fonctions de centralité et présentant
  des signes de fragilité ». The Sénat (rapport n° 40, 2025-2026,
  https://www.senat.fr/rap/r25-040/r25-0407.html) adds that communes were to
  be « ne bénéficiant pas du programme « Action coeur de ville » ». The
  ANCT-INRAE study of centralities (October 2020), from which the prefects'
  pre-list of 2019 came, ranks centrality from the Base permanente des
  équipements but says it « ne constitue pas une sélection ou une
  éligibilité »; its commune file was not obtained, nor the fragility scores
  of the pre-list. The rule: legal population of 2016 below 20,000, the pôle
  or a pôle partiel of its bassin de vie 2022 or in the pôle of its aire
  d'attraction (CATEAAV2020 11-13), and not in the 2018 Action cœur de ville
  list. Fragility is not applied. **Result:** 2,717 communes; 1,092 of the
  1,607 metropolitan PVD communes (68%) meet it, the others being mostly
  communes that are neither (515); 1,625 eligible communes were not chosen.
- **Territoires d'industrie.** The Cour des comptes (November 2024,
  https://www.ccomptes.fr/sites/default/files/2024-11/20241121-Programme-Territoires-d-industrie.pdf)
  gives three criteria: « une part importante de l'industrie dans l'emploi
  local ; l'engagement de l'écosystème d'acteurs … ; et l'existence d'un
  potentiel important de développement », for an EPCI or group of EPCI
  proposed by the regions, with no threshold; every candidate of the 2023
  generation was labelled. The criteria are loose and only the first is
  observable. The rule: in an EPCI (2025) where industry's share of the jobs
  located there in 2015 is at least its metropolitan share (11.79%). **Result:**
  22,913 communes; 12,725 of the 16,096 metropolitan communes of the first
  generation (79%) meet it; 10,188 eligible communes were not in it, of which
  2,461 joined in 2023.

Columns: `insee_code`; `pop_2015`, `pop_2016` (legal populations, rounded);
`bv2022_type`; `aav2020`, `aav2020_category`; `uu2020`, `uu2020_status`,
`uu2020_size`; `epci`, `epci_industry_share` (2015, four decimals);
`acv_eligible`, `pvd_eligible`, `ti_eligible` (`true` or `false`). Every
commune has a population, a bassin de vie and an EPCI share.

### zfu.csv: Zones franches urbaines (100 ZFU, 149 source communes, 152 rows)

- Source: ANCT, data.gouv 5a5784f9c751df1b5b1d530f, "Liste des communes
  inscrites (COG 2022)", last modified 2022-11-15:
  https://static.data.gouv.fr/resources/zones-franches-urbaines-zfu/20221115-155103/liste-zfu-com2022-20221115.csv
  It is a text CSV, so WebFetch did not save it. It was **transcribed from the
  WebFetch output** into `transcripts/liste-zfu-com2022-20221115.csv` (149
  communes). The companion file
  https://static.data.gouv.fr/resources/zones-franches-urbaines-zfu/20221115-155347/liste-zfu-zfu2022-20221115.csv
  was transcribed independently and agrees.
- Check against the official perimeter shapefile
  https://static.data.gouv.fr/resources/zones-franches-urbaines-zfu/20180117-110644/zfu.zip
  (`zfu_shp.zip`, 2016 layers): it has the same 100 ZFU codes, and the commune
  names per ZFU agree except for 3101ZZF (Douai), where the shapefile names 5
  communes and the 2022 list names 9. The 2022 list was kept. Metadata are in
  `zfu_metadata.pdf`.
- **Generation (inferred from the code pattern):** codes ending in digit+`ZF`
  or `ZFRAN` give 44 ZFU, `NZF` gives 41 and `ZZF` gives 15. This matches the
  44/41/15 sizes of the 1997, 2004 and 2006 waves, which `year` uses. Légifrance
  confirms the legal bases: loi 2006-396 du 31 mars 2006 art. 26 and décret
  n° 2006-1623 du 19 décembre 2006 (3rd generation delimitation). CGI art. 44
  octies A covers creations "entre le 1er janvier 2006 et le 31 décembre 2025",
  and art. 44 octies B (QPV) covers 2026-2030. The exact entry-into-force days
  (1 Jan 1997, 1 Jan 2004, 1 Aug 2006) were not verified.

### ber.csv: Bassins d'emploi à redynamiser (402 COG 2025 communes)

- Legal list: décret n° 2007-228 du 20 février 2007, current version 1 July
  2018 after décret n° 2018-550 du 29 juin 2018 (Légifrance
  https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000465967 and
  https://www.legifrance.gouv.fr/loda/id/JORFTEXT000037131263). There are two
  bassins, "Zone d'emploi de la Vallée de la Meuse" (Ardennes) and Lavelanet
  (Ariège). The annex lists the communes with INSEE codes.
- Communes: Insee zones d'emploi 1990,
  https://www.insee.fr/fr/statistiques/fichier/2114596/zones_emploi90.zip
  (`zones_emploi90.zip`, geography of 1 Jan 2009), zones 2101
  (Vallée-de-la-Meuse, 362 communes) and 7319 (Lavelanet, 56 communes). **Check:**
  the 56 Lavelanet codes quoted from the Légifrance annex equal ZE1990 7319
  exactly, and the 41 Meuse codes sampled from the annex (first and last
  entries) are all in ZE1990 2101 and are split across two ZE2010 zones. The BER
  therefore follow the 1990 zones. After projection to COG 2025 there are 346 +
  56 communes. The full Meuse annex was not transcribed, so a commune listed in
  the annex but outside ZE1990 2101 would be missed.
- `year` = 2007 (the decree). The regime's end date was not checked.

### frr.csv: France Ruralités Revitalisation (from existing data)

- Built from `zrr/zrr_status.csv`, which was not downloaded again. That file
  comes from the DGCL list of 10 July 2025, and its notes are in
  `zrr/SOURCES.md`. The statuses are:
  - FRR (socle or FRR+), start 2024-07-01: 17,769 communes, plus 20 partly
    classified (`classified = partial`).
  - FRR+, 2025-01-01: 4,456.
  - FRR bénéficiaire, the former ZRR communes that keep the effects from
    2024-07-01 to 2027-12-31: 2,134, plus 11 partial.

### qpv.csv: communes hosting a QPV

- **2015 list (year 2015; 799 COG 2025 communes, 1,436 QPV):** CDC
  "Quartiers prioritaires de la politique de la ville au 1er janvier 2023",
  modified 2023-09-20, field `list_com_2023`. The codes are concatenated with no
  separator and are split every 5 characters:
  https://opendata.caissedesdepots.fr/api/explore/v2.1/catalog/datasets/liste-des-quartiers-prioritaires-de-la-ville-2023/exports/xlsx?select=qp,lib_qp,list_com_2023,list_lib_com_2023,list_comarr_2023,dep_1,dep_2
  ANCT's official list of 1,514 QP 2015 has no commune codes:
  https://static.data.gouv.fr/resources/quartiers-prioritaires-de-la-politique-de-la-ville-qpv/20250404-081558/liste-1514qp2015.xlsx
  Compared with it, the CDC file **lacks 78 QP: 76 in French Polynesia (987)
  and 2 in Saint-Martin (978)**.
- **2024 list (year 2024; 833 communes incl. COM codes, 1,584 QPV, metropole
  + DOM + Saint-Martin + Polynesia):** ANCT perimeters (data.gouv
  5a561801c751df42d7fca9b6), resource "Périmètre des QPV 2024 (SHP)", last
  modified 2026-01-16:
  https://static.data.gouv.fr/resources/quartiers-prioritaires-de-la-politique-de-la-ville-qpv/20260115-205035/qpv-2024-shp.zip
  Attributes are from `QP2024_France_Hexagonale_Outre_Mer_WGS84.dbf`, field
  `insee_com`, with a comma-separated list for the 149 multi-commune QPV. The
  CDC 2024 file
  (`quartiers-prioritaires-de-la-politique-de-la-ville-au-1er-janvier-2024`)
  leaves the commune blank for 77 multi-commune QPV, so it was only used as a
  check.
- `n_qpv` and `qpv_codes` are the QPV that touch the commune. The data have no
  population inside the QPV.

### pinel.csv: zonage A/B/C and Pinel eligibility, commune × year 2014-2026

Zoning vintages:

| Vintage | In force | Source |
|---|---|---|
| Z2026 | from 26 June 2026 | MTE official list "Zonage ABC en vigueur 26 juin 2026", data.gouv 656715871172d08f8f680063: https://static.data.gouv.fr/resources/liste-des-communes-selon-le-zonage-abc/20260703-091327/liste-ensemble-des-communes-zonage-abc-en-vigueur-26-juin-2026.xlsx (34,875 communes, COG 2025) |
| Z2025 | 5 Sept 2025 to 25 June 2026 | Z2026 with Alfortville (94002) set to A, its post-2025 zone in the reclassification file. The arrêté du 23 juin 2026 moved it to A bis. |
| Z2024 | July 2024 to Sept 2025 | Z2025 with the "Zone avant révision 2025" column of the 468 reclassified + 19 declassified files: https://static.data.gouv.fr/resources/liste-des-communes-selon-le-zonage-abc/20250908-122705/liste-des-468-communes-reclassees-zonage-abc-5-septembre-2025.xlsx and https://static.data.gouv.fr/resources/liste-des-communes-selon-le-zonage-abc/20250908-122608/liste-des-19-communes-declassees-zonage-abc-5-septembre-2025.xlsx (2025 "after" zones = Z2025 for all 487 except Alfortville) |
| Z2023 | Oct 2023 to July 2024 | Z2024 with the arrêté du 5 juillet 2024 undone (JO 11 July 2024, NOR TREL2418376A): https://static.data.gouv.fr/resources/liste-des-communes-selon-le-zonage-abc/20240722-102354/joe-20240711-0164-0041.pdf. The PDF was parsed with `pdftotext -layout`, which gives 866 additions (48 A bis, 142 A, 676 B1; the notice says 865) and 698 removals (42 A, 145 B1, 511 B2). Removed tables give the previous zone; an addition with no removal was C. Names are matched to codes by department and name across all COG vintages. |
| Z2022 | 21 Feb 2022 to Oct 2023 | Kadata "Zonage ABC des communes - Tension du marché des logements", data.gouv 649ea362894adb8c5be51c81: https://static.data.gouv.fr/resources/zonage-abc-des-communes-tension-du-marche-des-logements/20230630-094302/zonage-abc-communes-2022.xlsx (34,955 communes, COG 2022; a third-party file). It already includes the February 2022 changes (Chamonix A, Courchevel B1, ...). |
| Z2014/Z2019 | 2014 to Feb 2022 | Z2022, except the communes changed in between, which are left **blank**: Poitiers and Angers (arrêté du 4 juillet 2019) and the 57 communes of the arrêté du 16 février 2022 (Légifrance JORFTEXT000045190946). Their names came from WebFetch summaries of the Légifrance page (`transcripts/abc_arrete_2022-02-16_names.txt`). The total of 57 equals the count in the 2024 arrêté's notice, and all 57 match a commune in the 2022 file with the same zone. |

- **Validation:** Z2023 differs from the 2022 file for 211 communes. The 2024
  arrêté's notice says the arrêté du 2 octobre 2023 reclassified 209 communes.
  The other two differences are Saint-Denis (93066, merged with Pierrefitte in
  2025, zone A|Abis) and Saint-Vincent-de-Tyrosse (40284). The 2022 file gives
  40284 B1, yet the 2024 arrêté adds it to B1 without removing it from any
  table. This is a source conflict: its Z2014-Z2023 values are blank and
  `source_conflict = 1`.
- The notice of the 2024 arrêté (verbatim) is the source for the revision
  history: "l'arrêté du 4 juillet 2019 a reclassé les communes de Poitiers et
  Angers en zone B1, l'arrêté du 16 février 2022 a révisé le classement de 57
  communes ... l'arrêté du 2 octobre 2023 ... a abouti au reclassement de 209
  communes". The visas add that the arrêté du 30 septembre 2014 also modified
  the zoning. Its content was not obtained and it is not applied.
- Columns:
  - `zone_abc_jan1` is the zone in force on 1 January (blank for 2014).
    `zone_abc_dec31` is the zone on 31 December.
  - `pinel_by_right_dec31` is 1 if A bis, A or B1, for 2014-2024 only.
  - `b2_agrement_possible` is 1 for B2 in 2014-2017. Service-public F31151: B2
    could qualify "s'il y a un besoin particulier en logement locatif" with "la
    délivrance d'un agrément de l'État". The agréments themselves were not
    collected.
  - From 2018 only A bis/A/B1 qualify. CGI art. 199 novovicies, as summarised
    from Légifrance, has a transitional rule for 2018 acquisitions with a
    permit filed by 31 December 2017. The scheme closed on 31 December 2024
    (service-public).
- Not covered: the 2009-2014 zoning used before Pinel (Scellier/Duflot) and
  the commune-level B2 agréments.

## Outcomes (item 2): sitadel.csv, dvf.csv, sirene_creations.csv

Downloaded 2026-10-03/04 with WebFetch. The raw files are in `raw/outcomes/`.
The DVF files were read from Parquet. All three outputs are mapped to COG 2025
with the Insee passage table. Codes are searched first in the data year's
geography, and arrondissements are mapped to the city.

### sitadel.csv: housing authorised and started, commune × year, 2013-2025

- **Source:** SDES, DiDo dataset 6513ee3a3b05e5cd969c270f, "Logements autorisés
  et commencés, nombre et surfaces, séries annuelles (données non estimées)".
  Datafile 9c90a880-4ba0-49b4-b99d-d7dd6c810dd0 is "communal annual data", with
  "données en date réelle". Millésime 2026-09 was published 2026-09-29 and the
  dataset was last modified 2026-09-27. Temporal coverage is 2013-01-01 to
  2025-12-31.
  - One xlsx per year:
    `https://data.statistiques.developpement-durable.gouv.fr/dido/api/v1/datafiles/9c90a880-4ba0-49b4-b99d-d7dd6c810dd0/xlsx?millesime=2026-09&withColumnName=true&withColumnDescription=false&withColumnUnit=false&ANNEE=eq:<YEAR>`
    for 2013 to 2025, saved as `sitadel_com_<YEAR>.xlsx` and converted to `.csv`.
  - Requests for `ANNEE=eq:2012` and `ANNEE=lt:2013` return HTTP 400.
- **Gaps:**
  - **No commune series for 2010-2012.** The datafile description says "date
    réelle à partir de 2011", but the published file starts in 2013. The SDES
    monthly series that go back to 2000 (dataset 6513eed03b05e5cd969c2710) are
    estimated and only at national, regional and departmental level.
  - **`log_com_*` (starts) is empty for 2025 in the source.**
  - Real-date figures for the latest years are revised upward as late
    declarations arrive. National starts are 246k in 2023 and 211k in 2024, so
    treat 2023-2025 as provisional.
- **Columns:** `insee_code` is as published, in the year's geography.
  `insee_code_cog2025` is blank for 38 rows: communes later split, plus 5
  unknown codes. `log_aut_*` and `log_com_*` are housing units authorised and
  started, `sdp_*_total` is floor area in m², and the suffixes are `total`, `ip`
  (individuel pur), `ig` (individuel groupé), `coll` (collectif) and `res`
  (résidence).
- Paris, Lyon and Marseille arrondissement rows (377) are dropped because the
  source also has whole-city rows. The type split sums exactly to the total in
  every row.
- The file has 462,989 rows. National totals from the file:
  - authorised: 2013: 367,502; 2017: 460,062; 2021: 442,527; 2022: 450,363; 2024: 310,318; 2025: 358,902
  - started: 2013: 311,119; 2017: 386,677; 2021: 351,208; 2024: 210,551

### dvf.csv: median price per m² of dwellings sold alone, commune × year, 2016-2021

Rebuilt 2026-10-15 (replacing an earlier extract of this name that was never
committed). Source: DGFiP, "Demandes de valeurs foncières", the yearly raw
files 2016-2021 on data.gouv.fr
(`https://static.data.gouv.fr/resources/demandes-de-valeurs-foncieres/<stamp>/valeursfoncieres-<year>.txt[.zip]`,
editions 20201026 for 2016-2018, 20240408 for 2019, 20250406 for 2020 and
20260405 for 2021, as downloaded by the `house` project into
`pipeline/data/raw/dvf/raw/`), Licence Ouverte. Built by
`dune exec data/places/build/dvf.exe -- data/places/dvf.csv valeursfoncieres-2016.txt ... ValeursFoncieres-2021.txt`
(the 2020 and 2021 files unzipped first).

- A sale is the run of consecutive lines with the same date, price,
  département and commune. It is kept when it is a "Vente" of exactly one
  dwelling (one distinct house or flat; outbuildings and land allowed); its
  price per m² is the price over the dwelling's built area, kept between €200
  and €30,000. The median is over a commune's kept sales in the year.
  Arrondissements of Paris, Lyon and Marseille count in their city.
- Columns: `insee_code` (as published, arrondissements merged), `year`,
  `sales`, `median_m2`. The analyses ignore a year with fewer than 5 sales.
- DVF excludes Alsace-Moselle (57, 67, 68) and Mayotte.

### dvf_etalab.csv: the same price, from Etalab's statistics, 2021-2025

Source: Etalab, "Statistiques DVF"
(`https://data-pipeline-open.s3.sbg.io.cloud.ovh.net/dvf/stats_dvf.csv`,
fetched by `house` on 17 July 2026), monthly medians of price per m² of houses
and flats (`med_prix_m2_apt_maison`) per commune; `house` collapses them to one
row per commune and year, the sales-weighted mean of the monthly medians
(`lib/fetch/dvf.ml`, file `pipeline/data/raw/dvf_prices.csv`). The commune rows
of that file were copied unchanged, in its order, under the header
`insee_code,year,sales,median_m2`:
`{ echo insee_code,year,sales,median_m2; awk -F';' '$1=="commune"{print $2","$3","$4","$5}' dvf_prices.csv; } > data/places/dvf_etalab.csv`.
**Not spliced to dvf.csv:** for the 13,904 communes with at least 10 sales
in 2021 in both, the log of Etalab's 2021 median over the DVF files' has
mean +0.010 and standard deviation 0.084, so a commune's series would jump
by several per cent at the join. The analyses use each source on its own.

### lovac.csv: vacant private dwellings, commune × year, 2019-2025

Source: Cerema for the DGALN, "Logements vacants du parc privé par commune,
département, région, France, de 2020 à 2026 (LOVAC)", data.gouv.fr dataset
61816c6e23197bb34835228e, file
`https://static.data.gouv.fr/resources/logements-vacants-du-parc-prive-par-commune-departement-region-france/20260625-163627/lovac-opendata-communes26.csv`
(updated 25 June 2026), from DGFiP's 1767 bis Com file crossed with Cerema's
fichiers fonciers, Licence Ouverte. Built by
`dune exec data/places/build/lovac.exe -- lovac-opendata-communes26.csv data/places/lovac.csv`.
Millésime 20YY counts the dwellings on 1 January 20YY-1, so `year` runs
2019-2025 (the source's metadata date `pp_vacant_23` to 1 January 2023, but
its `pp_vacant_plus_2ans_23`, from the same 1767 bis Com 2023, to 1 January
2022; the tool reads both as 2022). `vacant` and `vacant_2y` (vacant for more than two years) are
empty where the source writes "s": counts under 11 are secret. Codes are COG
2026. The source notes changes in its inputs in 2023 (the end of the
residence tax, GMBI declarations) and 2025.

### bpe.csv: shops and services by bassin de vie, 2015, 2020 and 2025

Source: Insee, base permanente des équipements, evolution file (Melodi
`DS_BPE_EVOLUTION`, edition 2025,
`https://api.insee.fr/melodi/file/DS_BPE_EVOLUTION/DS_BPE_EVOLUTION_2025_CSV_FR`),
Licence Ouverte. Insee publishes it by bassin de vie 2022 and wider areas, not
by commune, because commune counts are not comparable across BPE editions;
it keeps the facility types counted alike in the three years. A bassin's code
is its pôle's commune code. Built by
`dune exec data/places/build/bpe.exe -- DS_BPE_EVOLUTION_2025_data.csv data/places/bpe.csv`:
`shops` sums domain B (commerce), `services` domains A (services to
individuals) and D (health and social action), over the types with no missing
value in any bassin and year (44 types with a missing value are left out).

### sirene_creations.csv: establishments created, commune (COG 2025) × year, 2010-2025

- **Source:** OpenDataSoft `economicref-france-sirene-v3`, a copy of the Insee
  Sirene stock of establishments. It includes closed establishments ("Actif"
  and "Fermé") and creation dates up to 2026, so it is a 2026 extract. Its exact
  extraction date is not published.
- The aggregate is computed by the server:
  `https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/economicref-france-sirene-v3/exports/csv?select=count(*) as n&where=datecreationetablissement>=date'2010-01-01' and datecreationetablissement<date'2026-01-01'&group_by=codecommuneetablissement,year(datecreationetablissement) as year`
  (URL-encoded), downloaded on 2026-10-16 at 09:15 UTC: 7,592,316 bytes,
  semicolon-separated with a byte-order mark, 523,689 rows, SHA-256
  `67ce755ea98ffcc87758afc9972388e53a291d4a140bf42c28072cd4a721076f`; the
  file is not kept in the repository. The `exports/xlsx` form of the same
  query (2,389,888 bytes) writes rows without their `r` attribute, which the
  xlsx reader of `mono` reads as an empty sheet, so the CSV export is used.
- **Built by** `dune exec data/places/build/sirene.exe -- EXPORT.csv
  data/zrr/zrr_status.csv data/places/sirene_creations.csv
  data/zrr/raw/table_passage_annuelle_2026.zip`.
- **Check:** 2010 has 1,167,584 creations in the export, as in the first
  extract (324,343 active + 843,241 closed). Every yearly total of the export
  is the one the first extract gave, so no year moved: 2010 1,167,584; 2011
  1,114,129; 2012 1,113,535; 2013 1,099,981; 2014 1,124,071; 2015 1,104,899;
  2016 1,177,851; 2017 1,253,381; 2018 1,378,588; 2019 1,571,351; 2020
  1,589,740; 2021 1,876,567; 2022 1,889,397; 2023 1,854,288; 2024 1,928,094;
  2025 2,055,299.
- **Definition:** this counts **establishment creations** (new SIRET), and
  **not** Insee's enterprise-creation statistics. It includes every unit in
  Sirene: transfers to a new address (a new SIRET), micro-entrepreneurs,
  associations and public bodies, and establishments that have since closed. The
  commune is the establishment's address.
- **Geography.** Arrondissements are summed into Paris, Lyon and Marseille. A
  code that is a COG 2025 commune of `data/zrr/zrr_status.csv` is kept; any
  other is mapped through the Insee passage table
  (`https://www.insee.fr/fr/statistiques/fichier/7671867/table_passage_annuelle_2026.zip`,
  950,354 bytes, downloaded on 2026-10-16 into the gitignored
  `data/zrr/raw/`): every code of every vintage in its `COM` sheet goes to its
  `CODGEO_2025`. No code in the export belongs to a commune later split. A
  code the table does not hold falls back on `zrr_status.csv`'s
  `codes_cog2017`. `source_codes` lists the source codes, separated by `|`.
  Compared with the build through `codes_cog2017` alone, the passage table
  places 234 more creations, in 90 commune-year rows, and changes nothing
  else.
- **Not included:**
  - establishments with a blank commune: 248,005 over 2010-2025, rising after
    2020, probably foreign or partly-diffused units;
  - the COM codes (975xx, 977xx, 978xx, 98xxx): 32,780;
  - 42 creations under 24 codes the passage table does not hold: former codes
    of Saint-Martin and Saint-Barthélemy (97127, 97123, now COM) and codes that
    are not communes (such as 97454 or 59355), at most 15 in any year.
- The result has 521,136 rows. Kept creations are 1,160,810 in 2010, 1,092,742
  in 2013, 1,561,864 in 2020, 1,830,830 in 2021 and 2,020,391 in 2025.

## Grants (item 3): local-authority grants and commune accounts (dgf.csv, accounts.csv, thresholds.md)

Downloaded on 2026-10-03 with WebFetch. The raw files are in `raw/grants/`:
the xlsx exactly as served, plus a CSV conversion of each sheet read from the
xlsx zip and XML. Both outputs are built from those CSVs, and a rebuild gives
byte-identical files.

### dgf.csv: DGF and its components per commune, 2018-2026

**Source.** OFGL data portal, dataset `dotations-communes`, "Dotations des
communes - montants et critères". The publisher is DGCL, and OFGL republishes
the DGCL allocation database (original site
http://www.dotations-dgcl.interieur.gouv.fr/consultation/accueil.php, which
refused connections on 2026-10-03). The dataset was last modified on
2026-08-24T14:29:30Z and covers 2018 to 2026. OFGL's note: for 2018-2019 "le
nombre de variables disponibles en consultation sur notre jeu de données a été
réduit, en gardant les montants et les principaux critères". It also notes that
from 2024 a separate dotation commune nouvelle replaces the old guarantees for
new communes.

- Dataset page: https://data.ofgl.fr/explore/dataset/dotations-communes/
- API metadata: https://data.ofgl.fr/api/explore/v2.1/catalog/datasets/dotations-communes
- Exports: two xlsx files per year, `raw/grants/ofgl_dotations/ofgl_dotations_<year>_g1|g2.xlsx`. Each is
  `https://data.ofgl.fr/api/explore/v2.1/catalog/datasets/dotations-communes/exports/xlsx?select=exercice,code_insee,categorie,variable,valeur&where=exercice=date'<YEAR>' and variable in (<list>)`
  (URL-encoded). The g1 list is 'Montant Dotation DGF', 'Population DGF',
  'Population INSEE', 'Montant Dotation forfaitaire', 'Montant Dotation DSU',
  'Montant Dotation DSR'. The g2 list is 'Montant global réparti - DSR
  Bourg-centre', 'Montant global réparti - DSR Péréquation', 'Montant global
  réparti - DSR Cible', 'Montant Dotation DNP', 'Potentiel financier par hab.',
  "Valeur de l'indice synthétique de classement de la commune à la DSU", 'Rang de
  classement à la DSU des communes métropolitaines de plus de 10 000 hab.',
  'Rang de classement à la DSU des communes métropolitaines de 5 000 à 9 999
  hab.'. The exact URLs are generated in the Bash history of this session, for
  example 2024 g1:
  https://data.ofgl.fr/api/explore/v2.1/catalog/datasets/dotations-communes/exports/xlsx?select=exercice%2Ccode_insee%2Ccategorie%2Cvariable%2Cvaleur&where=exercice%3Ddate%272024%27+and+variable+in+%28%27Montant+Dotation+DGF%27%2C%27Population+DGF%27%2C%27Population+INSEE%27%2C%27Montant+Dotation+forfaitaire%27%2C%27Montant+Dotation+DSU%27%2C%27Montant+Dotation+DSR%27%29

**Transformation.** The long format (one row per commune, year and variable)
is pivoted to one row per `insee_code` × `year`. No value is computed; every
cell is the DGCL value as exported. Units are euros, inhabitants, € per
inhabitant, or index and rank.

**Columns.**
- `insee_code`: DGCL `code_insee`, in the geography of 1 January of the
  allocation year. Row counts match the COG of that year plus 86 Pacific and
  Saint-Pierre-et-Miquelon communes (codes 975xx/98xxx, which get the DACOM).
  Examples: 2024 has 35,021 = 34,935 + 86, and 2018 has 35,443 = 35,357 + 86.
- `insee_code_cog2025`: the code mapped to COG 2025 through the Insee annual
  passage table (`zrr/raw/passage_2003_2026.csv`, from
  https://www.insee.fr/fr/statistiques/fichier/7671867/table_passage_annuelle_2026.zip).
  It is blank when the code is absent from the table (98xxx). It is also blank
  when a commune was later split; `cog2025_note` then lists the successors (20
  rows). Amounts are **not** re-aggregated to COG 2025.
- `pop_dgf` (Population DGF, CGCT L2334-2) and `pop_insee` (Insee total
  population used by DGCL for the year).
- `dgf_total` (Montant Dotation DGF: all DGF to the commune, including
  forfaitaire, DSU, DSR, DNP, DACOM and dotation commune nouvelle),
  `dotation_forfaitaire`, `dsu`, `dsr`, `dsr_bourg_centre`, `dsr_perequation`
  and `dsr_cible` (each "Montant global réparti", exit guarantees included),
  `dnp` (dotation nationale de péréquation).
- `potentiel_financier_par_hab`.
- `dsu_indice_synthetique`, `dsu_rang_10000_plus`, `dsu_rang_5000_9999`: 2020-2026
  only (not in the 2018-2019 reduced files). In 2023 the two rank variables are
  filled for about 34,800 communes, while other years cover about 1,050 and
  1,270 ranked communes; this is as published.

**Blank cells.** A commune has no row in the source for a component it does not
receive (for example, 2024 has 860 DSU rows and 33,145 DSR rows). Such cells are
left blank, not set to 0. For amounts, a blank effectively means no allocation.

**Rows.** 315,619 (2018: 35,443; 2019: 35,056; 2020: 35,054; 2021: 35,051;
2022: 35,041; 2023: 35,031; 2024: 35,021; 2025: 34,961; 2026: 34,961).

**Check.** Summed over communes, `dsr_bourg_centre + dsr_perequation + dsr_cible`
equals `dsr` (2024: 751.2 + 862.1 + 465.5 = 2,078.7 M€). National totals for
2024: DGF 12,576 M€, forfaitaire 6,749, DSU 2,619, DSR 2,079, DNP 741.

**Gap: DGF components for 2011-2017 were not obtained.** The DGCL consultation
site was unreachable. The DGCL "critères de répartition" CSVs for 2016-2019 on
data.gouv.fr (dataset 5e174be4634f414cd8a244f1,
https://www.data.gouv.fr/fr/datasets/5e174be4634f414cd8a244f1/) contain only
criteria (populations, potentiel financier, DSU/DSR-cible indices and ranks),
not amounts. They are also served as text/csv, which this toolchain could not
save. For 2011-2017, `accounts.csv` holds the DGF *as booked* by each commune
(DGFiP `dgf`), with no split into forfaitaire, DSU and DSR. Not used: the
DataSpot/Le Télégramme file "DGF des communes 2014-2016" on data.gouv.fr
(https://static.data.gouv.fr/resources/la-dotation-globale-de-fonctionnement-dgf-des-communes-2014-2016/20160602-151224/DotationGlobaleFonctionnement2014_2016.xlsx),
which is over the 10 MB fetch limit and is a press-made dataset.

Also saved, for reference only: LexImpact, "Montants des dotations de
fonctionnement aux communes", national parameters (OpenFisca YAML) 2012-2025,
https://static.data.gouv.fr/resources/montants-des-dotations-de-fonctionnement-aux-communes/20260205-184044/openfisca-france-dotations-locales-extract-20260205.zip
(data.gouv dataset 6984e42c4abb23c7072e5f41, modified 2026-02-05) →
`raw/grants/leximpact_openfisca_dotations_locales_extract_20260205.zip`. It holds
national envelopes, not commune values.

### accounts.csv: commune budget accounts (principal budget), 2011-2025

Two sources, flagged in `source`. **2018 appears in both** so the two can be spliced.

#### OFGL, 2018-2025 (`source = OFGL`)
- Dataset `ofgl-base-communes`, "Comptes des communes 2018-2025"; OFGL computes
  the aggregates from DGFiP balances. Modified 2026-07-29T07:17:27Z. OFGL notes
  that 97 communes lacked 2025 accounts at that update.
  Page: https://data.ofgl.fr/explore/dataset/ofgl-base-communes/
- Exports: two per year, `raw/grants/ofgl_comptes/ofgl_comptes_<year>_A|B.xlsx`, of the form
  `https://data.ofgl.fr/api/explore/v2.1/catalog/datasets/ofgl-base-communes/exports/xlsx?select=exer,insee,com_code,agregat,montant,euros_par_habitant,ptot&where=exer=date'<YEAR>' and type_de_budget='Budget principal' and agregat in (...)`.
  A covers 'Dépenses totales', 'Dépenses totales hors remb', 'Dépenses de
  fonctionnement', "Dépenses d'investissement", "Dépenses d'investissement hors
  remb". B covers "Dépenses d'équipement", 'Frais de personnel', 'Recettes de
  fonctionnement', 'Dotation globale de fonctionnement', 'Encours de dette'.
- Only the **budget principal** is kept; annex budgets (water, sanitation...)
  are excluded. OFGL also publishes a consolidated main-plus-annex dataset,
  `ofgl-base-communes-consolidee`, which was not used.
- `insee_code` = OFGL `insee` (the commune code in that year's accounts);
  `insee_code_cog2025` = OFGL `com_code` ("Code Insee 2025 Commune").
- `population` = OFGL `ptot` (Insee total population on 1 January), the
  denominator of `*_eur_hab`. `*_eur` = `montant` in euros; `*_eur_hab` =
  `euros_par_habitant` as published.
- Definitions follow OFGL's aggregates (real flows, excluding *ordre* entries):
  https://data.ofgl.fr/explore/dataset/methodologie-ofgl-definitions-agregats-financiers/ (not downloaded).
  `dep_totales` = dépenses de fonctionnement + dépenses d'investissement
  (including debt repayment); `dep_totales_hors_remb` excludes debt repayment.

#### DGFiP "comptes individuels des communes", 2011-2018 (`source = DGFiP`)
- Publisher DGFiP, Licence Ouverte v2.0, on data.economie.gouv.fr:
  - `comptes-individuels-des-communes-fichier-global-2011-2015` (modified 2025-10-07T15:59:36Z, 183,432 records), https://data.economie.gouv.fr/explore/dataset/comptes-individuels-des-communes-fichier-global-2011-2015/
  - `...-2016` (modified 2025-10-02T14:15:49Z, 35,857), `...-2017` (2025-10-06T18:00:30Z, 35,409), `...-2018` (2025-10-06T19:01:04Z, 35,355)
- Exports: one per year, `raw/grants/dgfip_comptes/dgfip_comptes_<year>.xlsx`, as
  `https://data.economie.gouv.fr/api/explore/v2.1/catalog/datasets/<id>/exports/xlsx?select=an,dep,icom,inom,pop1,prod,fprod,charge,fcharge,perso,fperso,equip,fequip,depinv,fdepinv,remb,fremb,dgf,fdgf,dette,fdette&where=an="<YEAR>"`.
- Variable dictionary: `Maquette_commune.ods`, attachment of the 2016 dataset,
  https://data.economie.gouv.fr/api/explore/v2.1/catalog/datasets/comptes-individuels-des-communes-fichier-global-2016/attachments/maquette_commune_ods → `raw/grants/dgfip_maquette_commune.ods`.
  It says: "Population légale en vigueur au 1er janvier de l'exercice : pop1 -
  Budget principal seul". Amounts are "En milliers d'Euros", and the `f*`
  columns are "Euros par habitant". `prod` = "TOTAL DES PRODUITS DE
  FONCTIONNEMENT", `charge` = "TOTAL DES CHARGES DE FONCTIONNEMENT", `perso` =
  "Charges de personnel", `depinv` = "TOTAL DES EMPLOIS D'INVESTISSEMENT",
  `equip` = "Dépenses d'équipement", `remb` = "Remboursement d'emprunts et
  dettes assimilées", `dgf` = "Dotation globale de fonctionnement", `dette` =
  "Encours total de la dette au 31 décembre N".
- Transformations: thousand-euro amounts × 1000 → `*_eur`; `f*` → `*_eur_hab`
  unchanged; `pop1` → `population` (legal population).
  `dgfip_charges_plus_emplois_invest_eur` = (`charge` + `depinv`) × 1000 is the
  only computed column. The INSEE code is `dep[1:3] + icom` for metropolitan
  departments (`067`+`100` → `67100`, `02A` → `2A`). For overseas departments
  (DGFiP dep `101`-`106`) it is `97` + `icom`; for example dep `102` / icom
  `302` = Cayenne 97302 (the DGFiP dep numbering of DOM changes across years,
  but `icom` always carries the Insee digits). DGFiP dep `143`, `161`-`163`
  (101 Pacific communes in 2011) are dropped. `insee_code_cog2025` comes from
  the Insee passage table; it is blank for 1-8 codes per year that are not in
  the table.
- Column names shared with OFGL: `frais_personnel`, `dep_equipement`,
  `recettes_fonctionnement`, `dgf`, `encours_dette`. DGFiP-only columns:
  `charges_fonctionnement`, `emplois_investissement`, `remboursement_emprunts`,
  `dgfip_charges_plus_emplois_invest_eur`.

**Comparability (2018 overlap, national sums).** Frais de personnel: DGFiP 37.63
bn€, OFGL 37.63. DGF: 11.68 and 11.68. Équipement: DGFiP 22.26, OFGL 19.96.
Fonctionnement: DGFiP charges 74.77 vs OFGL dépenses réelles 67.58. The DGFiP
totals include *ordre* entries (amortisation and the like), so **do not chain
DGFiP `charges_fonctionnement` to OFGL `dep_fonctionnement` without calibrating
on 2018.** Staff spending and DGF chain directly.

**Rows.** 569,817 (DGFiP: 2011 36,682; 2012 36,682; 2013 36,639; 2014 36,675;
2015 36,653; 2016 35,857; 2017 35,409; 2018 35,355. OFGL: 2018 35,356;
2019 34,966; 2020 34,968; 2021 34,965; 2022 34,955; 2023 34,945; 2024 34,932;
2025 34,778). Not in OFGL: 2012-2017, which OFGL does not publish on its portal
(its base starts in 2018).

### thresholds.md
Légifrance articles read on 2026-10-03; each URL and version date is in the file.
Search URL pattern used to find the IDs:
`https://www.legifrance.gouv.fr/search/code?tab_selection=code&searchField=NUM_ARTICLE&query=<ARTICLE>&searchType=ALL&typePagination=DEFAULT&pageSize=10&page=1`.
Older versions were read by appending `/<YYYY-MM-DD>` to an article URL.

## Results: did.csv, event studies and synthetic difference-in-differences

Written 2026-10-15 by `analysis/places_did.ml` (`places_did.exe data/places`,
about 1.5 minutes on a loaded machine), beside the matched estimates of
`results.csv`, with the estimators of `lib/did.mli`. Seed 2018; 999
département-cluster bootstrap draws per event study; synthetic DiD standard
errors by the leave-one-département-out jackknife (200 placebo draws are also
computed and logged, see below).

**What the staggering buys here, and what it does not.** The programmes
barely stagger: Action cœur de ville is one cohort (2018, plus 11 later
additions), Petites villes de demain is in effect one (1,559 of 1,637
conventions signed in 2021) and Territoires d'industrie two (2018, and 2023 for
the communes that joined with the second generation). Callaway and
Sant'Anna's estimator does not fix a bias from staggering that is barely
there; what it adds is an effect for every year before and after, each
measured from the year before the cohort's start, so pre-trends are shown year
by year rather than by one placebo, and the not-yet-treated comparison (which
differs from the never-treated one only through the later cohorts). Synthetic
DiD reweights controls and years instead of pairing communes. The eligible
controls compare the chosen towns with towns that met the same published
criteria (`eligible.csv`).

**Designs.** For each programme, outcome and control set:

- `cs-never`, `cs-not-yet`: ATT(g, t) for each cohort g and year t, compared
  within the region, from 2006 (the first Urssaf year; IRCOM series are cut
  there too) to 2025 (2024 for IRCOM), aggregated by event time (rows with
  `cohort = all`, weighted by treated communes) and over every post-treatment
  cell (the row with no `event_time`, which carries `pre_trend_p`: the joint
  Wald test that every event-time coefficient from the first year to e = -2 is
  zero, with the bootstrap covariance; 0.0010 is the smallest value 999 draws
  can give). Event times are kept from 2006 - s to 2025 - s, s the main
  cohort's start, so that a cohort of a few communes does not alone carry an
  event time; the cells (rows with a `cohort` year) keep them all. The
  `cs-not-yet` first-period coefficient (event time 0) is de Chaisemartin and
  D'Haultfœuille's DID_M.
- `sdid`: synthetic DiD of the main cohort (ACV 2018, PVD 2021, TI 2018) on
  the communes observed every year of the window (the counts left out are in
  the log); `cohort` is that year, the row with no `event_time` the average
  effect, the others each year's effect against the time-weighted base.
- Outcomes as `results.csv` measures them: `jobs` and `establishments` as
  log(1 + x), `households` and `income` (per household) as logs; for ACV and
  TI also the census pair `population` and `workplace_jobs` (2015 to 2021,
  one long difference, `event_time` 3, `year` 2021), which has no pre-period
  and so no pre-trend test.
- Control sets: `far`, communes in none of the three programmes and more than
  10 km from a commune of the programme evaluated (as `zrr.ml` keeps its
  controls away from the zone); `eligible`, communes that met the programme's
  criteria in `eligible.csv` and were not chosen, and for ACV and PVD are in
  neither of the two. Members without a signature date are left out.
  Treatment is absorbing: the first TI generation stays treated after 2023.

**Standard errors of synthetic DiD.** The placebo standard error of the paper
(controls drawn as fake treated units) assumes the treated units are as noisy
as the controls. Here they are towns and the controls mostly small communes:
for jobs, the placebo gives 0.0285 for ACV against far controls and the
département jackknife 0.0070; for PVD, 0.0117 and 0.0069 (far) and 0.0158 and
0.0049 (eligible). The placebo is not defined where controls are fewer than
treated units (ACV eligible, TI). The jackknife also respects the clustering
the event-study bootstrap uses, so it is the one reported; it holds the
weights fixed, as `synthdid` does. With pools of thousands of small communes,
the noise level that sets the ridge penalty is high and the unit weights stay
close to uniform (12,123 of 12,140 far controls weighted for ACV jobs): the
reweighting works mostly through the time weights.

**Reading (jobs).** Overall ATT, 95% interval, pre-trend p:

| Programme | Controls | cs-never | cs-not-yet | sdid | matched (2025, `results.csv`) |
|---|---|---|---|---|---|
| ACV | far | -0.040 [-0.051, -0.027], p 0.001 | -0.040 [-0.051, -0.027] | -0.034 [-0.048, -0.020] | -0.039 [-0.086, +0.008] |
| ACV | eligible | -0.018 [-0.039, -0.002], p 0.001 | -0.031 [-0.059, -0.008] | -0.007 [-0.026, +0.012] | |
| PVD | far | -0.036 [-0.052, -0.023], p 0.001 | -0.036 [-0.052, -0.023] | -0.032 [-0.046, -0.019] | +0.000 [-0.017, +0.017] |
| PVD | eligible | -0.020 [-0.030, -0.012], p 0.001 | -0.020 [-0.030, -0.012] | -0.015 [-0.024, -0.005] | |
| TI | far | -0.007 [-0.025, +0.013], p 0.21 | -0.008 [-0.021, +0.005] | -0.013 [-0.031, +0.004] | +0.004 [-0.021, +0.029] |
| TI | eligible | -0.001 [-0.015, +0.012], p 0.52 | -0.003 [-0.015, +0.008] | +0.001 [-0.014, +0.016] | |

- **Territoires d'industrie:** no effect on jobs by any estimator or control
  set, and no pre-trend detected (p 0.17 to 0.61): the matched null holds.
- **Action cœur de ville and Petites villes de demain:** the event studies
  reject parallel pre-trends with every control set (p = 0.001), so their
  negative averages cannot be read as effects. Against eligible towns the
  chosen ones were already losing ground before the start, by about 0.8% a
  year (ACV +0.094 at e = -12 to +0.009 at e = -2; PVD the same), and the
  post-treatment coefficients continue that slope or flatten it (ACV -0.010
  at e = 0 to -0.012 at e = 7). Against far controls the pre-period is not a
  trend but a rise and fall (ACV -0.04 at e = -9 to -0.008 at e = -2; PVD
  +0.024 at e = -4 to +0.008 at e = -2). Synthetic DiD, which fits the
  pre-period by construction, finds nothing for ACV against eligible towns
  (-0.007) and -1.5% for PVD, a drop that appears at once in the signature
  year (-0.005 in 2021, -0.029 in 2025 against eligible; -0.024 in 2021
  against far), as a selection on a 2020-2021 shock would and a programme of
  engineering support would not. The matched estimates, which pair on jobs in
  three earlier years, find no effect for either. The reading kept is that of
  no measurable effect on private jobs, with the caveat that these designs
  cannot separate a small effect from the towns' own decline.
