Metodologia – Conto alla rovescia dello spopolamento (v0.4; v2 e v3 nelle sezioni 9 e 11)
Aggiornata il 24 ottobre 2026 (ora di Roma). Tutto eseguito in locale, nulla pubblicato.
Parametri in pipeline/config.yaml (sezione metodo). Sono tutti decisi da Domenico (riferiti da Comuni CEO il 24/10/2026),
tranne due parametri tecnici non coperti dalle decisioni (min_anni_serie, anno_fisso_base_meta). Scelte tecniche DT-1…DT-10:
config decisioni_progetto e data/site/meta.json. Tutte decise (DT-6 Astro, DT-8 Satori + resvg, DT-9 indice JSON unico con
ricerca tollerante, DT-10 Python) tranne DT-7 hosting, rimandato alla pubblicazione.
La distinzione è scritta in config (decisi, provvisori) e in ogni scheda.
1. Fonti (pubbliche, senza login, licenza CC BY 4.0 ISTAT)
URL, data/ora di download, byte e SHA-256 di ogni file: data/raw/manifest.json. Download del 24/10/2026, 12:51-12:57.
| Chiave | Contenuto | URL | Formato / copertura | Ultima modifica sul server (ora di Roma) |
|---|---|---|---|---|
| situas_elenco | Elenco Comuni vigenti alla data di esecuzione (SITUAS report 61) | https://situas-servizi.istat.it/publish/reportspooljson?pfun=61&pdata=GG/MM/AAAA |
JSON, 7.894 Comuni al 24/10/2026 | servizio dinamico |
| situas_variazioni | Variazioni amministrative e territoriali dal 1991 (SITUAS report 129) | https://situas-servizi.istat.it/publish/reportspooljson?pfun=129&pdata=01/01/1991 |
JSON, 2.356 eventi 1991-2026 (ultimo: 14/05/2026) | servizio dinamico |
| elenco_xlsx | Elenco Comuni ISTAT (controllo incrociato) | https://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.xlsx | XLSX, foglio "CODICI al 21_02_2026", 7.894 Comuni | 26/02/2026 17:17 |
| rcs | Ricostruzione popolazione al 1° gennaio 2002-2025 | https://demo.istat.it/data/rcs/Dati_RCS.zip | ZIP 96 MB, 48 CSV | 18/12/2025 10:28 |
| posas_2026 | Popolazione al 1/1/2026 – stima: il titolo del file dice "stima" | https://demo.istat.it/data/posas/POSAS_2026_it_Comuni.zip | CSV | 30/03/2026 23:50 |
| rbd | Ricostruzione del bilancio demografico 2001-2018 (dataset completo; pagina https://demo.istat.it/app/?i=RBD) | https://demo.istat.it/data/ricostruzione/RBD-Dataset.csv.zip | ZIP 21 MB → CSV 136 MB, ;; colonne: Anno, Sesso, Popolazione inizio/fine periodo, Nati, Morti, Iscritti/Cancellati interno ed estero, Acquisizioni di cittadinanza, Cittadinanza, Codice comune (classificazione 2019, 7.914 Comuni). Disponibili anche i file per anno RBD-Dataset-<2001…2018>.csv.zip |
27/01/2023 14:42 |
| p2_2019 … p2_2025 | Bilanci demografici annuali (P2): controlli e cause dei salti | https://demo.istat.it/data/p2/P2_<anno>_it_Comuni.zip |
CSV, 7 file 2019-2025 (2025 provvisorio). Colonne diverse tra anni: 2019 ha "Aggiustamento statistico", 2025 "Iscritti/Cancellati per altri motivi" | 2025: 06/03/2026 13:52 |
| ppc_* (20 file) | Previsioni comunali 2025-2050, scenario mediano | https://demo.istat.it/data/previsionicomunali/Previsioni_comunali_popolazione_per_eta-Comuni_<Regione>.csv.zip |
CSV per regione, classi di 5 anni | 31/08/2026 08:52 |
Note sulle fonti:
- Bilanci prima del 2019: i file P2 annuali esistono solo dal 2019 (
P2_2018_it_Comuni.zipe precedenti: HTTP 404; le vecchie paginedemo.istat.it/bil<anno>/reindirizzano alla pagina P2 attuale, che offre solo 2019-2025). Per il 2002-2018 l'ISTAT pubblica il bilancio ricostruito (RBD), coerente con la RCS: inizio periodo = RCS per tutti i Comuni e tutti gli anni (verificato). Differenze solo dove cambiano i confini (RBD usa i confini 2019: Bollate/Baranzate 2003, Mappano 2016) e a fine 2018 per i 4 Comuni con RCS 1/1/2019 incoerente. Il bilancio originale anagrafico 2002-2018 (con iscrizioni/cancellazioni "per altri motivi") non risulta più scaricabile da demo.istat.it. - Attenzione su RBD: per costruzione (Nota metodologica, https://demo.istat.it/data/ricostruzione/Nota_metodologica_Ricostruzione2002_2018.pdf) la differenza tra anagrafe e censimenti è ridistribuita come iscrizioni/cancellazioni migratorie "statistiche" aggiuntive. Quindi RBD non ha componente residua (fine − inizio − naturale − migratorio = 0 sempre) e un salto attribuito a migrazioni nel bilancio ricostruito può essere un trasferimento reale o una rettifica statistica.
- Il CSV
Elenco-comuni-italiani.csvusato nella v0.1 è fermo al 26/01/2024 (header Last-Modified). Non contiene le variazioni 2025-2026. Nella v0.2 non è più usato: il riferimento è SITUAS, e l'XLSX serve come controllo incrociato. Il fileVariazioni-amministrative-e-territoriali-dal-1991.zip(fermo all'8/1/2025) è stato sostituito dal report SITUAS 129. - Per gli endpoint SITUAS
publishva inviato l'headerReferer: https://situas.istat.it/web/: senza, la risposta è vuota. È il servizio pubblico del portale ISTAT ("Dettaglio API"), senza login. Il catalogo SITUAS dichiara una validità dei report fino al 31/05/2026, ma la chiamata alla data del 24/10/2026 risponde ed è coerente con l'XLSX: c'è una sola differenza, Vallecrosia → "Vallecrosia al mare" (14/05/2026), assente dall'XLSX del 21/02/2026. - Previsioni ISTAT: i nomi esatti dei 20 file sono stati ricavati dai link della pagina https://demo.istat.it/app/?i=PPC (es. Valle d'Aosta =
..._Comuni_Valle_dAosta-Vallee_dAoste.csv.zip; il nome "ovvio"..._Valle_d_Aosta...dà 404). Tutti i 20 file sono disponibili. Coprono 2.374 Comuni, cioè capoluoghi e Comuni sopra 5.000 abitanti al 1/1/2025. Per gli altri ~5.500 Comuni l'ISTAT non pubblica previsioni (le fornisce solo su richiesta, aggregate: escluso, perché vietato spendere e contattare enti).
2. Comuni vigenti e crosswalk dei codici (02_codici_comuni.py)
- Comuni vigenti = SITUAS report 61 alla data
data_riferimento_elenco(default "oggi"): 7.894. - Variazioni 2025-2026 rilevanti, da SITUAS:
- Lirio incorporato in Montalto Pavese (31/01/2026);
- fusione Castegnero + Nanto = Castegnero Nanto, 024129 (21/02/2026);
- riordino delle province sarde dal 1/1/2026: 377 Comuni hanno cambiato codice (es. Sassari 090064 → 112050, Nuoro 091051 → 114027);
- cessione Cividale del Friuli → Prepotto (23/04/2026), Bressanone → Varna (12/07/2025);
- cambi di nome: Murisengo Monferrato, Tripi - Abakainon, Vallecrosia al mare.
- Archi "codice → codice" del Comune intero:
ES(estinzione per fusione/incorporazione),AP(cambio provincia),RN(rinumerazione). Non si usanoCS/AQES: duplicanoESe, per gli scorpori,CSelenca anche i Comuni d'origine che continuano a esistere (verificato: i 15CSsenzaEScorrispondente sono tutti scorpori, es. Mappano, Misiliscemi, Baranzate). - Risoluzione a una data: un codice osservato alla data D viene seguito solo lungo gli eventi con data ≥ D, fino a un codice vigente. Serve perché alcuni codici sardi sono cambiati più volte (2005, 2016, 2026).
- Eventi parziali (
AQ/CEcessioni di territorio,CECSscorpori): non spostano popolazione, generano avvisi.
3. Serie storica (03_serie_popolazione.py)
- 1° gennaio 2002-2025: somma di
Totalesu tutte le cittadinanze (RCS). Il 1/1/2026 viene da POSAS (riga età 999): è marcatostimasolo se il titolo del file lo dice; se un giorno RCS copre lo stesso anno, POSAS viene ignorato. - Ogni codice dell'anno A è risolto al Comune vigente con gli eventi dal 1/1/A. Risultato: 0 codici non risolti; totali nazionali identici prima e dopo la riconduzione, per ogni anno.
- Le fonti 2025/2026 usano i 7.896 codici al 1/1/2025 (codici sardi vecchi): sono ricondotti ai 7.894 vigenti.
- Serie incomplete (solo scorpori): Mappano dal 2017, Baranzate dal 2004, Misiliscemi dal 2022.
4. Calcolo (metodo.py, 04_dimezzamento.py)
4.1 Parametri
| Parametro | CLI | Valore | Stato |
|---|---|---|---|
| finestra_anni (W) | --finestra |
10 | deciso |
| finestre_intervallo | --finestre-intervallo 5,20 |
[5, 20] | deciso |
| base_meta | --base-meta |
anno_base | deciso (alternative: massimo_storico, anno_fisso) |
| anno_tetto | --anno-tetto |
2100 | deciso |
| soglia_piccolo_comune / livello avviso | --soglia-piccolo-comune |
1000 / "alto" | deciso |
| riquadro_istat | (config) | true | deciso |
| anno_base (B) | --anno-base |
2025, con switch automatico al 2026 (4.5) | deciso (6) |
| gestione_scorpori | --gestione-scorpori |
territorio_combinato | deciso (7/a) |
| arrotondamento_anno | --arrotondamento |
vicino | deciso (8/b) |
| soglia_stabile_pct + nomi_esiti | --soglia-stabile-pct |
0,1 + esiti calo / calo_lento / stabile / crescita | deciso (c) |
| dati_2019 | (config) | nessuna_correzione | deciso (d): i 4 valori RCS 1/1/2019 incoerenti sono solo segnalati |
| regole_intervallo | (config, etichetta) | "v1" = regole in 4.3 | deciso |
| livelli_avviso | (config) | medio: salto_anomalo_serie, finestre_discordi, nato_da_scissione, finestra_modificata; info: variazione_territoriale_parziale, territorio_ceduto_a_nuovo_comune, serie_ricostruita_da_fusione | deciso |
| min_anni_serie | --min-anni-serie |
5 | provvisorio (tecnico): sotto i 5 anni di serie propria si usa il territorio combinato. Oggi non scatta mai, perché con territorio_combinato si usa già il territorio unito |
| anno_fisso_base_meta | --anno-fisso-base-meta |
2002 | provvisorio (tecnico): usato solo con base_meta = anno_fisso, quindi inattivo con le scelte decise |
Le varianti lanciate da CLI sono registrate in parametri_usati.json e nelle schede (sovrascritti_da_cli; anno_base_origine = config / switch_automatico / cli).
4.2 Formule ed esiti
r = (P(B) / P(B−W))^(1/W) − 1- obiettivo =
P(B)/2(default deciso). Con le alternative:max P(t)/2sulla parte valida della serie, oppureP(anno_fisso)/2. anno decimale = B + ln(obiettivo / P(B)) / ln(1 + r), arrotondato all'anno più vicino (vicino; l'alternativadifettoresta disponibile).- Esiti (decisione (c)), con soglia s =
soglia_stabile_pct= 0,1% l'anno:stabile: |r| ≤ s. Un calo più lento dello 0,1% l'anno conta quindi come stabile;crescita: r > +s;- con r < −s:
calose l'anno arrotondato è ≤ tetto (il tetto si confronta con l'anno arrotondato, cioè quello mostrato), altrimenticalo_lento(in calo, ma il dimezzamento cade oltre il 2100); - solo
caloha un anno;calo_lento,stabileecrescitanon ne hanno; gia_dimezzato(solo con le basi alternative) edati_insufficienti.
tendenza∈ {calo, stabile, crescita} con la stessa soglia: coincide con l'esito tranne checalo_lentoecalohanno entrambi tendenza "calo".- I codici esportati si possono rinominare in
config.yaml→nomi_esiti(oggi identità). - Scissioni / scorpori (decisione 7):
territorio_combinato. Se lo scorporo cade nella finestra (anno scorporo ≥ B − W), il tasso è quello del territorio unito (Comuni d'origine + nuovo Comune), calcolato su B − W … B e applicato alla popolazione propria di ciascun Comune. Tutti i Comuni del gruppo hanno quindi lo stesso tasso in quella finestra. Se lo scorporo è prima dell'inizio della finestra, la serie è già omogenea e si usa il tasso proprio. Oggi riguarda 7 Comuni nella finestra di 10 anni: Mappano 2017 con Borgaro, Caselle, Leini, Settimo; Misiliscemi 2021 con Trapani. L'alternativadopo_scorpororesta disponibile da CLI.
4.3 Intervallo (deciso: finestre 5 e 20, min-max, regole "v1" approvate il 24/10/2026)
Si calcola solo se l'esito principale (10 anni) è calo, altrimenti tipo = non_applicabile. Per ogni finestra dell'intervallo (5 e 20):
- esito
calo→ il suo anno entra nel min-max; - esito
calo_lento,stabileocrescita→ estremo superiore aperto (aperto_sopra = true,anno_max = null,limite_aperto = 2100). Testo suggerito: "intorno al 2091, tra il 2085 e oltre il 2100"; - esito
dati_insufficienti→ finestra esclusa (finestre_escluse).
L'anno principale è sempre dentro l'intervallo: se cade fuori dal min-max delle finestre 5/20, l'intervallo viene esteso fino a includerlo (esteso_per_principale = true, oggi in 841 Comuni). L'estremo inferiore non è mai aperto. tipo ∈ {chiuso, aperto_sopra, puntuale (min = max), non_applicabile}.
Esempi reali (ISTAT RCS, B = 2025, arrotondamento all'anno più vicino):
- Roccaforte del Greco: 2039, tra il 2037 e il 2041;
- Pietrapertosa: 2059 (2058-2062);
- Civita: 2077 (2065-2077);
- Enna: 2091, tra il 2091 e oltre il 2100;
- Nuoro: 2098, tra il 2086 e oltre il 2100;
- Morterone: 2065, oltre il 2100 come estremo superiore, perché su 5 anni cresce.
Parametri usati registrati in parametri_usati.json.
4.4 Piccoli Comuni, riquadro ISTAT, dati per il grafico (decisi)
- Sotto i 1.000 abitanti nell'anno base: avviso
piccolo_comuneconlivello: "alto". La scheda halivello_attenzione= il livello più alto tra i suoi avvisi. Anno e intervallo sono esposti come per gli altri Comuni. - Riquadro ISTAT:
riquadro_istat.mostra = trueper i 2.374 Comuni con previsione pubblica, che sono tutti sopra i 5.000 abitanti nel 2025. Contiene fonte, licenza, link alla pagina ISTAT, scenario, anni e popolazioni iniziale e finale, variazione %, serie annuale 2025-2050 e la nostra estrapolazione allo stesso anno, per il confronto. Se manca:mostra = falsecon il motivo. Caso particolare: Castegnero Nanto (5.842 abitanti) è nato nel 2026 da due Comuni sotto i 5.000, quindi non ha previsione. - Dati per il grafico: ogni scheda ha
proiezione(anno base, popolazione base, tasso ed esito per finestra 5/10/20, obiettivo, tetto) esalti_anomali(lista sempre presente). La curva per la finestra W èpop(anno) = pop_base · (1 + tasso_annuo[W])^(anno − anno_base); la fascia è compresa tra le curve 5 e 20 (vedi SCHEMA_SCHEDA).
4.5 Anno base e passaggio automatico al 2026 (decisione 6)
L'anno base è 2025, l'ultimo dato definitivo (RCS). pipeline/01b_anno_base.py (eseguito dopo il download, con --rete) controlla se l'ISTAT ha reso definitivo il dato al 1/1/2026. Prima, se sul server sono cambiati Last-Modified o dimensione rispetto a manifest.json, riscarica P2 2025, POSAS 2026 e RCS.
Tre segnali verificabili nei file ISTAT (formati osservati sui file definitivi degli anni precedenti):
| Segnale | Provvisorio (oggi) | Definitivo |
|---|---|---|
| S1 bilancio P2 2025 | colonna Informazioni con flag p su tutte le 7.896 righe; colonna "Popolazione al 31 dicembre" (non "censita") |
nessun flag p e colonna "Popolazione censita al 31 dicembre" (come P2 2019-2024) |
| S2 POSAS 2026 | titolo "…al 1° gennaio 2026 (stima)" | titolo senza "(stima)" (come POSAS 2024 e 2025: "…per età, sesso e stato civile al 1° gennaio 2025") |
| S3 RCS | Dati_RCS.zip arriva al 1/1/2025 |
contiene Dati_cittadinanza_2026.csv |
Verifica fatta sui dati: POSAS 2025 definitivo = RCS 2025 per tutti i 7.896 codici; RCS 2025 è uscita il 15-18/12/2025, POSAS 2025 definitivo il 19/01/2026.
Regola:
- switch automatico a 2026 se S3 è definitivo, oppure se S1 e S2 sono entrambi definitivi e coerenti (POSAS 2026 = P2 2025 "censita al 31 dicembre" per almeno il 99% dei codici,
quota_coerenza_min); - solo segnalazione (
decisione = da_verificare, nessun cambio) se solo uno tra S1 e S2 è definitivo, o se non sono coerenti; - con
anno_base_switch.attivo: falsesi segnala soltanto.
Esito in data/processed/stato_anno_base.json, in meta.json e nelle schede (parametri.anno_base_origine). Oggi (24/10/2026): tutti e tre i segnali dicono "provvisorio" → anno base 2025. Con lo switch, common.completa_metodo usa B = 2026 per tutti i passi. --anno-base da CLI ha sempre la precedenza.
Limite: i segnali si basano sui formati usati finora dall'ISTAT, non su un flag documentato. Se l'ISTAT cambia formato, il controllo non scatta (nessun cambio): il caso è coperto dalla segnalazione e dai test su file finti (tests/test_anno_base.py).
5. Previsioni ISTAT e confronto (05_previsioni_istat.py)
- Popolazione totale per Comune e anno 2025-2050 (somma delle classi di età, esclusa la riga "Tutte le età"), riportata ai codici vigenti (per la Sardegna i codici 2025 diventano quelli 2026).
- Se un Comune vigente nasce dalla fusione di Comuni di cui solo alcuni hanno la previsione, la previsione è esclusa per evitare territori parziali. Oggi non succede.
- Confronto al 2050 sulla finestra principale (tasso a 10 anni) (riepilogo in
previsioni_istat_stato.json):- 2.374 Comuni, base 2025 identica a RCS per tutti;
- la nostra variazione 2025-2050 è in media 2,8 punti meno negativa di quella ISTAT (mediana 2,6);
- il segno (calo o crescita) coincide nell'80% dei casi;
- in calo secondo l'ISTAT: 1.740 Comuni, secondo noi: 1.498;
- scarto più alto in Sardegna (+10,6 punti), Basilicata (+7,7) e Trentino-AA (+7,4); negativo in Valle d'Aosta (−5,4), Liguria (−4,4) e Piemonte (−3,0).
6. Controlli (06_controlli.py, test in tests/)
- SITUAS e XLSX: stessi 7.894 codici.
- RCS 1/1/2025 = P2 "popolazione al 1° gennaio" per tutti i 7.896 codici sorgente; P2 "31 dicembre 2025" = POSAS 1/1/2026 per tutti.
- Totali nazionali conservati in ogni anno.
7. Salti anomali nelle serie (07_salti_anomali.py, spec 4.4)
Soglie in config.yaml → salti_anomali. Un salto tra il 1/1 di t−1 e il 1/1 di t è anomalo se |variazione| > 8% E |variazione| > 150 abitanti. Si cerca poi una causa verificabile (mai dedotta), in quest'ordine:
- Evento SITUAS sul Comune nell'anno t−1 o t (
anni_tolleranza_evento = 1):scorporo,cessione_acquisizione_territorio,fusione_incorporazione(anche se cambia il numero di codici sommati). - Incoerenza tra fonti ISTAT:
incoerenza_rcs_p2: valore RCS al 1/1 di t−1 o di t ≠ "popolazione censita al 1° gennaio" del P2 dello stesso anno (sempre controllata);incoerenza_rcs_rbd: per t−1 ≤ 2018, se non c'è un evento SITUAS, inizio/fine del bilancio ricostruito ≠ serie RCS.
- Bilancio dell'anno t−1: la prima componente che copre almeno il 50% del salto (
quota_spiegazione):- 2019-2025, P2:
variazione_territoriale_p2,revisione_anagrafica_o_censimento_p2(componente residua: aggiustamento statistico / altri motivi),saldo_migratorio_p2,saldo_naturale_p2; - 2002-2018, bilancio ricostruito RBD:
saldo_migratorio_rbd,saldo_naturale_rbd. Il dettaglio riporta interno/estero e l'avvertenza che i flussi ricostruiti includono quote statistiche.
- 2019-2025, P2:
- Altrimenti
da_verificare.
Colonne di verifica:
verificata= una fonte spiega il salto;origine_da_verificare= vero se la spiegazione è solo una componente del bilancio ricostruito (o manca): il salto è confermato dall'ISTAT, ma non sappiamo se sia un trasferimento reale o una rettifica statistica.
Pattern descrittivo (non è una causa): picco_isolato.
Componenti del bilancio bil_* e bil_fonte (p2/rbd). Nelle schede: salti_anomali (lista) e avviso salto_anomalo_serie (livello "medio").
Risultati al 24/10/2026: 118 salti in 91 Comuni. 23 cadono nella finestra principale 2015-2025.
| Causa | Salti |
|---|---|
| saldo_migratorio_rbd | 95: erano tutti da_verificare. Il bilancio ricostruito conferma il salto; origine reale da verificare. 79 aumenti, quasi tutti nell'hinterland milanese/pavese/lodigiano e romano nel 2003-2009, con iscrizioni dall'interno dominanti; 16 cali (es. Cintano 2004→05 −207, con saldo interno −258; Paludi 2006→07, con saldo estero −663) |
| saldo_migratorio_p2 | 9 (saldo dall'estero dominante: Nicotera, Fiumefreddo Bruzio, Longobardi, San Lucido, Ordona, Soriano Calabro) |
| incoerenza_rcs_p2 (± rbd, ± fusione) | 6 (Bonvicino, Casale Cremasco-Vidolasco, Torre de' Picenardi, …: valore RCS 1/1/2019 diverso da P2 2019 e dalla fine 2018 RBD. Decisione (d): solo segnalati) |
| scorporo | 3 + 1 con fusione (Caselle T.se e Borgaro T.se 2017, Mappano; Trapani 2022, Misiliscemi; Bollate 2004, Baranzate) |
| revisione_anagrafica_o_censimento_p2 | 3 (Anzio 2020→21 +4.872, Campione d'Italia, Riace) |
| cessione_acquisizione_territorio | 1 (Sant'Egidio del Monte Albino 2024→25, scambio con Pagani) |
| da_verificare | 0 |
Nella finestra principale ci sono due salti con causa saldo_migratorio_rbd e origine da verificare:
- Palma Campania 2017→18 (+1.739, saldo estero ricostruito +1.840);
- Anzano di Puglia 2015→16 (−155, saldo estero −94, interno −44).
Confronto RCS/P2 su tutti i Comuni: coincidono sempre, tranne 4 Comuni nel 2019 (1.164 abitanti di differenza in totale) e 4 nel 2022 (1 abitante ciascuno). RCS/RBD: inizio periodo identico per tutti i Comuni e gli anni 2002-2018.
7b. Salti nelle finestre, incoerenze tra fonti, confronto provinciale (07b_finestre_confronti.py, v0.4)
Il metodo di calcolo non cambia. Si aggiungono tre diagnostiche:
- Incoerenze RCS/P2: per ogni anno con bilancio P2 si confronta la popolazione RCS al 1/1 con la "popolazione censita al 1° gennaio" del P2. Differenze: 2019 in 4 Comuni (Bonvicino +195 e Saluzzo −195; Casale Cremasco-Vidolasco +387 e Torre de' Picenardi −387: sembrano abitanti attribuiti al Comune sbagliato nella ricostruzione 2019), 2022 in 4 Comuni (±1). I valori non sono corretti; per il 2019 la scheda ha l'avviso
dato_incerto_fonti. - Salti nelle finestre: per ogni finestra (5/10/20) si elencano i salti anomali (sezione 7) con entrambi gli anni dentro la finestra e si ripete il calcolo su una serie con i salti neutralizzati, solo come prova di sensibilità (
influenza: nessuna / anno_diverso / esito_diverso / non_valutabile). Poiché il tasso usa solo il primo e l'ultimo anno della finestra, un picco isolato in mezzo non cambia il risultato, mentre un gradino (revisione anagrafica, flusso migratorio eccezionale, scambio di territorio) lo cambia. Al 24/10/2026: finestra 5 anni: 10 Comuni (13 salti), esito diverso senza salti per 5; finestra 10 anni (principale): 17 Comuni (23 salti), esito diverso per 6 (Campione d'Italia, Palma Campania, Sant'Egidio del Monte Albino, Fiumefreddo Bruzio, Riace, Nicotera), anno diverso per 1 (Anzano di Puglia: 2048 → 2068), non valutabili 3 (Borgaro T.se, Caselle T.se, Trapani: territorio unito); finestra 20 anni: 78 Comuni (97 salti), esito diverso per 10, anno diverso per 7. - Confronto provinciale: posizione del Comune nella provincia per tasso annuo della finestra principale (1 = calo più rapido) e, tra i Comuni con un anno, per anno di dimezzamento; mediane provinciali; conteggio degli esiti; i due Comuni prima e dopo in classifica. Nessun giudizio: è un ordinamento dei numeri.
7c. Avviso o nota: criterio di "causa verificata" (v0.5, decisione Comuni CEO 2026-10-24)
Ogni salto anomalo ha il campo causa_verificata (nelle schede). Regola esatta
(07_salti_anomali.py::causa_verificata, elenco in config.yaml → salti_anomali.cause_verificate):
causa_verificata = True se e solo se
- almeno una causa è tra:
saldo_migratorio_p2(migrazione documentata dal bilancio P2, 2019+),cessione_acquisizione_territorio(scambio/cessione di territorio, evento SITUAS AQ/CE),variazione_territoriale_p2(unità per variazioni territoriali nel bilancio P2),scorporo(scorporo / nascita di un nuovo Comune registrato in SITUAS, CECS),revisione_anagrafica_o_censimento_p2(componente residua del bilancio P2: revisione anagrafica documentata); - e nessuna causa è
da_verificarené un'incoerenza tra fonti (incoerenza_rcs_p2,incoerenza_rcs_rbd); - e nessuna causa viene dal bilancio ricostruito (
*_rbd), cioèorigine_da_verificareè falso.
Effetto nelle schede (solo presentazione, nessun dato corretto, metodo invariato):
- causa NON verificata → avvisi
salto_anomalo_serie/salti_nella_finestra(livellomedio), come prima; - causa verificata → note
salto_spiegato_serie/salti_spiegati_nella_finestra(livelloinfo) che riportano la causa. La prova di sensibilità della finestra principale va con l'avviso se la finestra contiene almeno un salto non verificato, altrimenti con la nota.fusione_incorporazioneda sola non è nell'elenco (non compare mai da sola: è sempre conscorporoo con un'incoerenza tra fonti). Gli avvisi sono ordinati:dato_incerto_fontiin cima, poi alto > medio > info.
Conteggi (dati del 2026-10-24): 118 salti in 91 Comuni; causa verificata 17 salti in 14 Comuni (saldo migratorio P2 9, scorporo 4, revisione anagrafica P2 3, scambio di territorio 1); non verificata 101 salti in 77 Comuni (saldo migratorio RBD 95, incoerenze tra fonti 6). Nessun Comune ha entrambi i tipi.
Risultato "senza il salto" (v0.5)
Per i Comuni in cui la prova di sensibilità sulla finestra principale cambia esito o anno (Campione d'Italia, Palma Campania,
Sant'Egidio del Monte Albino, Fiumefreddo Bruzio, Riace, Nicotera, Anzano di Puglia) la scheda mostra accanto al risultato
calcolato anche quello «senza il salto (anni del salto)» (risultato_senza_salti). È solo un confronto: il risultato principale,
l'anno nel titolo, l'immagine social e l'indice restano quelli calcolati sui dati ISTAT così come sono.
Licenza delle elaborazioni
Le nostre elaborazioni (schede e immagini) sono rilasciate con licenza CC BY 4.0 (decisione di Domenico,
2026-10-24), come i dati ISTAT di base. Citazione: «Elaborazione «[nome del sito]» su dati ISTAT (licenza CC BY 4.0)», con il nome preso da site.config.mjs.
8. Limiti
- È un'estrapolazione "a questo ritmo", non una previsione. Rispetto all'ISTAT la nostra estrapolazione dà cali più lenti per i Comuni medio-grandi del Sud e delle Isole (non coglie l'invecchiamento).
- Sensibilità alla finestra: 2.973 Comuni hanno una tendenza diversa (calo / stabile / crescita) tra le finestre 5/10/20 (avviso
finestre_discordi). - Cessioni parziali di territorio (230 Comuni coinvolti dal 1991) non sono corrette, solo segnalate. Non esistono dati pubblici sulla popolazione trasferita.
- Il dato 2026 è una stima ISTAT (usato solo nella serie, non nel calcolo, finché lo switch non scatta). RCS e RBD 2002-2018 sono ricostruzioni: possono differire dai dati anagrafici pubblicati all'epoca.
- SITUAS è un servizio dinamico: la stessa chiamata in date diverse può dare risultati diversi. Per questo il file scaricato è conservato con SHA-256.
- Le previsioni ISTAT esistono solo per 2.374 Comuni e si fermano al 2050.
- Salti anomali: nessuno resta senza spiegazione, ma per 95 la spiegazione è solo la componente migratoria del bilancio ricostruito: l'origine reale resta da verificare (
origine_da_verificare). Le serie non vengono corrette: si segnala soltanto. - Con il tetto al 2100 e la finestra di 10 anni, 3.363 Comuni sono
calo_lento(in calo, senza anno).
9. v2 – Nascite, bambini ed età (10_download_v2.py, 11_nascite_eta.py, 13_indicatori_v2.py)
Decisioni D2-1…D2-15 di docs/DECISIONI_V2.md, approvate da Domenico (via Comuni CEO, 24/10/2026) con una sola
modifica: le soglie di D2-5 e D2-7 scendono da 20 a 5. Parametri in config.yaml → v2.metodo (decisioni_progetto DT-11…DT-15).
Fonti. ISTAT, bilancio demografico P2 2019-2025 (nati, morti, popolazione a inizio/fine anno; il 2025 è
provvisorio, colonna «Informazioni» = p); ISTAT, popolazione residente per età e sesso POSAS 1° gennaio 2019-2026
(il 2026 è una stima; età 0-100, dove 100 = «100 e più»). File scaricati con data e SHA-256 (data/raw/manifest.json).
Codici ricondotti ai Comuni vigenti con lo stesso risolutore della v1 (fusioni sommate). Per le scissioni si usa il
territorio unito (Trapani + Misiliscemi, separati il 20/02/2021): avviso territorio_unito_nascite.
Indicatori per Comune (blocco nascite della scheda, schema 0.6):
- Nati: serie 2019-2025; numero principale = nati dell'ultimo anno disponibile (2025, provvisorio). Sotto i 1.000
abitanti (al 1° gennaio 2025) il numero principale è la media 2023-2025, scritta anche come somma («0,3 l'anno, 1 in
tutto»). Se la media 2023-2025 è sotto 5 nati l'anno: avviso
piccoli_numeri_nascite(info), nessuna percentuale sui nati. - Nati ogni 1.000 abitanti: nati / popolazione media dell'anno ((inizio+fine)/2) × 1.000. Sotto 1.000 abitanti su 3 anni (somma nati / somma popolazioni medie). Provincia e Italia: aggregati (somma dei nati / somma delle popolazioni) sullo stesso periodo del Comune. Italia: 6,0 (2025) e 6,2 (2023-2025).
- Bambini 0-5 e 0-14: 1° gennaio 2019 e 1° gennaio 2026 (stima). Variazione percentuale solo se nel 2019 erano almeno 5; sotto 5 solo numeri assoluti; con base tra 5 e 19 la nota «numeri piccoli: la percentuale può cambiare molto da un anno all'altro».
- Età media: media delle età con la classe aperta 100+ contata 100,5; età x contata x + 0,5.
- Indice di vecchiaia: persone 65+ ogni 100 tra 0 e 14 anni, solo con almeno 5 under 15 (nota tra 5 e 19); altrimenti i due conteggi.
- Morti per nato: anno singolo sopra 1.000 abitanti, somme 2023-2025 sotto; con 0 nati si scrive «N morti, nessun nato».
- Previsione 0-14 al 2050: solo per i Comuni con previsione ISTAT (scenario mediano), arrotondata (a 10 sotto 1.000, a 100 sopra), etichettata come previsione ISTAT.
- Fasce del grafico: 0-5, 6-14, 15-64, 65-79, 80+; 2019 e 2026 (stima).
Arrotondamenti: all'unità o al decimale più vicino, con 0,5 verso l'alto (aritmetica esatta).
Effetto della soglia 5 (invece di 20) (data/processed/v2_soglie.json): la percentuale 0-5 compare per 7.691
Comuni invece di 6.861 (+830); la percentuale 0-14 per 7.861 invece di 7.600 (+261); l'indice di vecchiaia per
7.840 invece di 7.506 (+334), su 7.894.
Dati sospetti (D2-15), segnalati e mai corretti. Criterio oggettivo: 0 nati nell'anno provvisorio (2025) con una
media di almeno 5 nati nei 3 anni precedenti (2022-2024). Avviso di livello medio zero_nati_provvisorio_da_verificare.
Casi: Palazzo Canavese (TO, media 6,0), Dolcedo (IM, 5,3), Giba (SU, 8,7).
Restano anche le 4 incoerenze RCS/POSAS del 2019 (avviso dato_2019_incerto_nascite): il confronto v2 usa POSAS.
Frase-gancio (D2-13). zero_nati (403 Comuni) se l'ultimo anno ha 0 nati; altrimenti nati_indice (7.487) con
l'indice di vecchiaia o nati_conteggi (4) con i conteggi se l'indice non è calcolabile. Ogni frase porta anno e
«provvisorio»/«stima».
Classifiche (D2-10). «0 nati nel 2024» (ultimo anno definitivo, almeno 100 abitanti al 1° gennaio 2024): 332 Comuni; «0 nati in ciascuno degli anni 2023-2025» (almeno 100 abitanti al 1° gennaio 2025): 68. Un Comune fuso conta zero solo se tutti i Comuni d'origine avevano zero nati. Elenchi di fatti, senza giudizi.
Prodotti. Schede (nascite), data/site/senza_nascite.json, immagine social v2
(/og/<versione>/v2/<codice>.png, lotti da 250; versione in site.config.mjs).
Limiti v2. Il 2025 è provvisorio e la popolazione per età 2026 è una stima: entrambi cambieranno. Con pochi nati le variazioni sono in gran parte casuali. POSAS e RCS possono differire per il 2019 (4 Comuni). Le età singole oltre 100 non sono distinte.
10. Mappa (14_mappa.py, site/public/mappa.js)
Decisioni M-1…M-6 approvate. Confini ISTAT al 1° gennaio 2026, versione generalizzata (CC BY 4.0), 7.896 poligoni:
3 codici non più vigenti (018082 → 018094, 024027 e 024071 → 024129) sono uniti al Comune attuale → 7.894 poligoni, uno
per Comune vigente (la pipeline si ferma se non coincidono). Semplificazione mapshaper -simplify 3% weighted keep-shapes,
quantizzazione 1e4 (TopoJSON 1,42 MB, compresso in rete ~0,5 MB) e confini regionali (17 kB).
Disegno con d3-geo su canvas (proiezione conica conforme), nessun servizio esterno, nessuna libreria di tile.
Colori: anno di dimezzamento (≤2050, 2051-2075, 2076-2100, calo lento, stabile con trama, crescita) e due scale
sequenziali (indice di vecchiaia, nati ogni 1.000 abitanti) verificate con la simulazione di protanopia, deuteranopia e
tritanopia (Machado 2009) e distanza CIEDE2000 ≥ 10 tra le classi (tests/test_daltonismo.py). Interazione: tocco →
dati e link alla scheda; ricerca; zoom con due dita, rotella o pulsanti; link condivisibile (#c=<codice>&v=<indicatore>&z=…).
11. v3 – Quanto è lontano (15_download_v3.py, 16_aree_interne.py, 17_esplora_v3.py, 18_indicatori_v3.py)
Decisioni D3-1…D3-7 di docs/DECISIONI_V3.md, approvate da Domenico (via Comuni CEO, 24/10/2026), tutte come
raccomandate. Parametri in config.yaml → v3.metodo (decisioni_progetto DT-16…DT-22).
Fonte (D3-0, DT-23, chiuso il 28/10/2026). Domenico ha approvato l'uso della Mappa così com'è: il sito cita la fonte
originale (DPCoe, elaborazione NUVAP) con il link alla pagina della Mappa, senza indicare una licenza che la fonte non
dichiara per i dati. Copia delle note legali del sito DPCoe e SHA-256 in manifest.json (ai2020_note_legali).
Pagina tecnica: #fonte-mappa-aree-interne.
Fonte. Dipartimento per le politiche di coesione (NUVAP), Mappa Aree Interne 2020: elenco dei Comuni con classe
(A Polo, B Polo intercomunale, C Cintura, D Intermedio, E Periferico, F Ultraperiferico), minuti medi in auto verso il
Polo più vicino (rete stradale di ottobre 2019, partenza 7:30-9:30) e Comune di destinazione; confini al 30/9/2020,
7.903 righe. Un Polo ha insieme ospedale con DEA di I livello, stazione almeno Silver e offerta completa di
scuole superiori: non è il tempo per il pronto soccorso più vicino (limite scritto in ogni scheda). Soglie delle classi:
27,7, 40,9 e 66,9 minuti (v3.metodo.soglie_classi, controllate contro il file in 16_aree_interne.py).
Comuni attuali (D3-2). Codici 2020 → vigenti con lo stesso risolutore della v1. 9 Comuni nati da fusioni dopo il 2020: minuti = media delle parti pesata per abitanti del censimento 2020, classe ricalcolata con le soglie, etichetta «media pesata per abitanti delle parti, nostro calcolo» ed elenco delle parti con i valori ufficiali (la pipeline si ferma se una fusione contiene un Polo). Misiliscemi (081025, nato nel 2021 da Trapani): nessun dato, con nota. Risultato: 7.893 Comuni con dato, 1 senza.
Poli e Cintura (D3-3). Per i Poli (A) e i Poli intercomunali (B) niente minuti, ma «è un Polo» (B: insieme ai Comuni con la stessa destinazione; se il file non li indica, frase generica senza nomi). Per la Cintura i minuti si mostrano con la classe. Classi dei Comuni attuali: Polo 241, Cintura 3.820, Intermedio 1.926, Periferico 1.524, Ultraperiferico 382.
Confronti e classifica (D3-4). Provincia e Italia: media dei minuti pesata per abitanti (censimento 2020; Poli = 0) e quota di abitanti in Comuni oltre 40,9 minuti. Italia: 16,9 minuti per abitante, 9,1% oltre la soglia. Classifica «dal più lontano» solo tra i Comuni non Polo con almeno 1.000 abitanti nel 2025 (5.630 Comuni), con pari merito espliciti; in provincia solo se ci sono almeno 10 Comuni in classifica.
Mappa (D3-5). Indicatore «Minuti dal Polo più vicino (2019)»: 5 classi ufficiali + «nessun dato». Colori provvisori
(la scala sequenziale già verificata in tests/test_daltonismo.py), in attesa del rifacimento grafico. Al tocco: classe,
minuti e Polo.
Frase-gancio e condivisione (D3-6). «Da X servono in media N minuti di auto per arrivare a Y, il Comune più vicino che ha insieme un ospedale con DEA, una stazione e tutte le scuole superiori» (varianti per fusi, Poli, Poli intercomunali, nessun dato). Nessuna nuova immagine social: l'immagine condivisa resta quella della v1.
Anomalie: segnalate, mai corrette. Comuni su un'isola (31; rilevati dai confini ISTAT: tutti i pezzi di territorio non collegati alle tre parti di terraferma più grandi, esclusa l'exclave di Campione d'Italia); valore più alto d'Italia (Lampedusa e Linosa, 317,6 minuti: il dato include la traversata ed è lasciato com'è); capoluoghi che non sono Poli nel 2020 (Matera, Enna, Isernia, Nuoro); province senza Polo (EN, IS, MT, NU, OG, compresa l'Ogliastra); Comuni fusi dopo il 2020; Misiliscemi.
Incrocio con la v1 (D3-7). Solo descrittivo, mai causa: nel sito due numeri affiancati, senza rapporto «X volte», sempre con «È un confronto, non una causa: i Comuni lontani sono anche più piccoli e più anziani». Variazione della popolazione 2015 → 2025 (ISTAT, 1° gennaio; 7.893 Comuni con dato, fusi con la media pesata): oltre 40,9 minuti −6,4% (1.906 Comuni), fino a 40,9 minuti −1,5% (5.987 Comuni). Per classe:
| Classe | Comuni | Variazione aggregata 2015-2025 | Tasso annuo mediano | Metà entro il 2100 (v1) |
|---|---|---|---|---|
| Polo | 241 | −1,5% | −0,19% | 1,7% |
| Cintura | 3.820 | −0,8% | −0,29% | 16,2% |
| Intermedio | 1.926 | −3,7% | −0,67% | 37,3% |
| Periferico | 1.524 | −6,2% | −0,95% | 52,4% |
| Ultraperiferico | 382 | −7,6% | −1,06% | 56,8% |
Output. data/processed/v3_indicatori.json, v3_riepilogo.json; schede schema 0.7 (blocco distanza, solo
aggiunte); valori.json della mappa (classe_ai, minuti_ai, polo_ai, …). Test: tests/test_v3_dati.py, tests/test_v3_indicatori.py (minuti,
classi, fusi, media italiana e anomalie confrontati con il file grezzo).