# Befolkningskorrektion fra v1 til v2

Dato: 10. juli 2026
Status: Valideret datagrundlag. Produktionsfrigivelse kræver fortsat de særskilte data-, preview- og rollback-gates.

## Konklusion

V1 brugte Konturs gridbefolkning som analytisk vægt uden først at afstemme hver kommune til Danmarks Statistiks officielle folketal. V2 retter det. DST FOLK1A 2026K2 fastlægger nu kommunens samlede befolkning, mens Kontur alene fordeler befolkningen mellem gridceller inden for kommunen.

Korrektionen er materiel. 818 af 2.087 sogne med score i begge udgaver skifter karakter. Blandt kommunerne skifter 36 af 98 karakter, og den største scoreændring er 8,05 point. Derfor skulle de publicerede data genberegnes og kontrolleres mod de faste A–G-grænser.

Grundmodellen er ikke ugyldig. Kommunernes rangorden er fortsat meget stabil med en Spearman-korrelation på 0,9915, transportberegningen er uændret, og alle integritetsgates er bestået. Den præcise konklusion er derfor: Korrektionen ændrer resultaterne mærkbart og kræver en ny dataudgave, men den ændrer ikke selve mobilitetsmodellen.

## Hvad blev rettet

Mobilitetsbarometeret beregner tilgængelighed på H3-celler. Befolkningen afgør, hvor meget den enkelte celle vejer i aggregeringen til sogn, kommune, funktionelt byområde og administrativ region.

I v1 kom både den geografiske fordeling og kommunens samlede vægt fra Kontur. Det gav plausible tal, men ikke officielle kommunetotaler. Eksempelvis havde den publicerede v1-række 1.001.310 indbyggere for København, mens FOLK1A 2026K2 har 673.438. For Tårnby var v1-vægten 195.504 mod 44.230 i DST. I den anden retning havde Samsø 1.790 mod 3.614 i DST.

V2 bruger en enkel afstemning:

1. Hver gridcelle beholder sin relative Kontur-andel inden for kommunen.
2. Andelene skaleres, så summen er nøjagtig lig kommunens FOLK1A-tal for 2026K2.
3. De afstemte vægte bruges i alle efterfølgende aggregeringer.

V2's analytiske linje omfatter 67.226 routede H3-celler. Transportidentiteten er uændret: run manifest, manifestudsnit og engine-digest er låst i den forseglede udgave.

## Hvad tallene kan sige

| Geografi | Befolkningsgrundlag i v2 | Præcision |
|---|---|---|
| Kommune | DST FOLK1A 2026K2 | Officielt registertal for referencekvartalet |
| H3-celle | Kommunens DST-total fordelt med Konturs relative mønster | Modelleret fordeling, ikke et officielt celletal |
| Sogn | Sum af de modellerede H3-vægte, inklusive nærmeste-tildelinger | Modelleret estimat, ikke et officielt sognetal |
| FUA og region | Sum og vægtning fra de afstemte kommuner | Konsistent med DST på kommuneniveau |

Afstemningen fjerner fejlen i kommunens total. Den beviser ikke, at fordelingen inden for kommunen er præcis. Kontur/DST-forholdet viser samlet over- eller undertælling på kommuneniveau. Det kan ikke bruges som validering af et bestemt sogn eller en bestemt gridcelle. Der findes ikke en uafhængig, landsdækkende reference under kommuneniveau i dette evidenssæt.

Den forseglede kildekontrol fandt 20 afvigelser, som alle er gennemgået og registreret som løst til denne beregning. De omfatter blandt andet rå Kontur/DST-forhold fra 0,673 i Rødovre til 4,031 i Tårnby. Disse forhold er diagnostik af kilden, ikke nye officielle befolkningstal.

## Datadækning

| Lag | V1 | V2 | Bemærkning |
|---|---:|---:|---|
| Routede H3-celler | 67.226 | 67.226 | Alle celler er tildelt præcis én kommune i beregningslinjen |
| Sognegeometrier | 2.097 | 2.097 | Geometridigest er identisk |
| Sogne med score | 2.088 | 2.089 | 2 nye scores, 1 tidligere score bliver no-data |
| Sogne uden score | 9 | 8 | Geometrien bevares også ved no-data |
| Kommuner | 98 | 98 | Alle har FOLK1A 2026K2-total |
| Funktionelle byområder | 13 | 13 | Samme univers |
| Administrative regioner | 5 | 5 | Samme univers |

2.188 H3-celler ligger uden for en sognpolygon og er tildelt det nærmeste sogn. Det er en praktisk fordelingsregel. Den gør dækningen komplet, men reducerer ikke usikkerheden i de lokale befolkningstal.

De otte no-data-sogne i v2 er Frederiks, Sankt Stefans, Tagensbo, Filips, Sankt Lukas, Christiansø, Fredens og Nazaret samt Davids. Tagensbo havde score i v1. Trinitatis og Holmens får score i v2.

## Ændringer på sogneniveau

På de 2.087 sogne med score i begge udgaver er medianændringen -3,2 point. Den største absolutte ændring er 88,2 point. 818 sogne, svarende til 39,2 procent af det fælles univers, skifter karakter.

Den store lokale spredning er forventelig. Små øer og små sogne kan have få celler og meget skæve v1-vægte. Afstemningen kan derfor flytte deres interne vægt kraftigt, selv om transportresultaterne er uændrede.

### Største absolutte sognændringer

| Sogn | Kommune | V1 | V2 | Ændring | Karakter | Rang |
|---|---|---:|---:|---:|---|---|
| Hjarnø | Odder | 11,6 | 99,8 | +88,2 | G → A | 1.806 → 3 |
| Bågø | Assens | 3,8 | 91,5 | +87,7 | G → A | 2.061 → 82 |
| Drejø | Svendborg | 12,9 | 97,0 | +84,1 | G → A | 1.770 → 21 |
| Avernakø | Faaborg-Midtfyn | 17,9 | 95,6 | +77,7 | F → A | 1.585 → 29 |
| Kirke Flinterup | Sorø | 55,0 | 5,4 | -49,6 | B → G | 539 → 1.796 |
| Bursø | Lolland | 66,5 | 25,5 | -41,0 | B → E | 358 → 1.072 |
| Vester Tørslev | Mariagerfjord | 40,6 | 0,2 | -40,4 | D → G | 897 → 2.088 |
| Alslev | Faxe | 51,7 | 12,0 | -39,7 | C → G | 622 → 1.519 |
| Stenderup | Vejen | 38,7 | 1,9 | -36,8 | D → G | 938 → 2.025 |
| Nordrupvester | Slagelse | 46,1 | 11,3 | -34,8 | C → G | 753 → 1.541 |

Alle rækker, også de mindre spektakulære, ligger i `population-v1-v2-sogn-deltas.csv`.

### Karakterskift for sogne

Rækker er v1, kolonner er v2. Tabellen dækker kun sogne med score i begge udgaver.

| V1 \ V2 | A | B | C | D | E | F | G | I alt |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| A | 307 | 12 | 1 | 1 | 0 | 0 | 0 | 321 |
| B | 4 | 159 | 43 | 9 | 2 | 0 | 1 | 218 |
| C | 0 | 13 | 117 | 86 | 19 | 3 | 5 | 243 |
| D | 0 | 0 | 9 | 181 | 122 | 60 | 41 | 413 |
| E | 0 | 0 | 0 | 11 | 67 | 86 | 90 | 254 |
| F | 1 | 0 | 0 | 0 | 4 | 68 | 181 | 254 |
| G | 3 | 0 | 0 | 0 | 2 | 9 | 370 | 384 |
| I alt | 315 | 184 | 170 | 288 | 216 | 226 | 688 | 2.087 |

V2-fordelingen for alle 2.089 scorede sogne er A 317, B 184, C 170, D 288, E 216, F 226 og G 688. De faste grænser er ikke ændret: A starter ved 70, B ved 55, C ved 45, D ved 30, E ved 22, F ved 15 og G ved 0.

## Ændringer på kommuneniveau

Kommunernes score falder mest i de tyndest befolkede kommuner. Den gennemsnitlige ændring går fra -5,414 point i den laveste tæthedskvartil til +0,407 point i den højeste. Forskellen mellem yderkvartilerne er 5,815 point, hvilket overskrider materialitetsgrænsen på 1,0 point.

| Tæthedskvartil | Kommuner | Gennemsnit | Median | Interval |
|---|---:|---:|---:|---:|
| Q1, lavest tæthed | 25 | -5,414 | -5,460 | -8,05 til -1,32 |
| Q2 | 24 | -4,412 | -4,645 | -6,56 til -0,83 |
| Q3 | 25 | -2,194 | -2,360 | -4,48 til +0,53 |
| Q4, højest tæthed | 24 | +0,407 | +0,355 | -0,58 til +1,69 |

### Største absolutte kommuneændringer

| Kommune | V1 | V2 | Ændring | Karakter | Rang |
|---|---:|---:|---:|---|---|
| Læsø | 41,27 | 33,22 | -8,05 | D → D | 33 → 39 |
| Billund | 26,80 | 19,38 | -7,42 | E → F | 66 → 74 |
| Lolland | 30,61 | 23,67 | -6,94 | D → E | 56 → 60 |
| Morsø | 20,34 | 13,40 | -6,94 | F → G | 88 → 94 |
| Vejen | 22,06 | 15,28 | -6,78 | E → F | 82 → 84 |
| Hjørring | 27,41 | 20,85 | -6,56 | E → F | 60 → 71 |
| Brønderslev | 20,67 | 14,20 | -6,47 | F → G | 86 → 92 |
| Ikast-Brande | 22,41 | 15,99 | -6,42 | E → F | 80 → 83 |
| Lemvig | 21,40 | 15,10 | -6,30 | F → F | 84 → 85 |
| Struer | 33,80 | 27,71 | -6,09 | D → E | 48 → 53 |

Karakterskiftene er ensrettede. 9 kommuner går fra D til E, 16 fra E til F og 11 fra F til G. De øvrige 62 beholder karakteren. Ingen kommune går op i karakter. Det er en dataeffekt, ikke en ændring af grænserne.

## Funktionelle byområder og regioner

Fem af 13 funktionelle byområder skifter karakter. København-regionen går fra A til B. Esbjerg-regionen går fra D til E, mens Holstebro-, Horsens- og Herning-regionen går fra E til F.

| Funktionelt byområde | V1 | V2 | Ændring | Karakter | Rang |
|---|---:|---:|---:|---|---|
| København-regionen | 70,75 | 67,80 | -2,95 | A → B | 1 → 1 |
| Aarhus-regionen | 48,34 | 46,98 | -1,36 | C → C | 2 → 2 |
| Roskilde-regionen | 41,42 | 40,34 | -1,08 | D → D | 3 → 3 |
| Køge-regionen | 40,16 | 37,07 | -3,09 | D → D | 4 → 4 |
| Odense-regionen | 38,95 | 36,20 | -2,75 | D → D | 5 → 5 |
| Aalborg-regionen | 37,92 | 32,44 | -5,48 | D → D | 6 → 6 |
| Svendborg-regionen | 35,91 | 31,36 | -4,55 | D → D | 7 → 7 |
| Esbjerg-regionen | 34,37 | 28,94 | -5,43 | D → E | 8 → 8 |
| Vejle-regionen | 29,49 | 24,48 | -5,01 | E → E | 9 → 10 |
| Holbæk-regionen | 27,56 | 25,66 | -1,90 | E → E | 10 → 9 |
| Holstebro-regionen | 26,66 | 21,14 | -5,52 | E → F | 11 → 12 |
| Horsens-regionen | 24,49 | 21,20 | -3,29 | E → F | 12 → 11 |
| Herning-regionen | 24,32 | 18,18 | -6,14 | E → F | 13 → 13 |

To af fem administrative regioner skifter karakter: Region Nordjylland og Region Syddanmark går fra D til E. Region Hovedstaden falder 4,11 point, Region Midtjylland 4,09, Region Nordjylland 5,68, Region Sjælland 3,07 og Region Syddanmark 4,43. Regionernes rangorden er uændret.

## Hvorfor modellen består

Stabilitetstesten stiller både krav til rangstabilitet og til, hvor små ændringerne skal være. De to spørgsmål skal holdes adskilt.

| Test | Krav | Resultat | Vurdering |
|---|---:|---:|---|
| Spearman-rang for kommuner | mindst 0,98 | 0,9915 | Bestået |
| Kommuner med karakterskift | højst 5 | 36 | Materiel ændring |
| Største kommuneændring | under 5,0 point | 8,05 | Materiel ændring |
| Andel kommuneændringer under 2 point | mindst 90 % | 37,8 % | Materiel ændring |
| Forskel mellem tæthedsyderkvartiler | under 1,0 point | 5,815 | Materiel ændring |
| Antal befolkede karakterbånd | mindst 5 | 7 | Bestået |
| Største kommune-karakterandel | højst 35 % | 23,5 % | Bestået |

Resultaterne siger to ting på samme tid. Kommunernes indbyrdes rækkefølge er stabil nok til, at grundmodellens billede består. Ændringerne er samtidig for store til at blive behandlet som støj. V2 skal derfor publiceres som en ny dataudgave.

## Identitet og reproduktion

Den analytiske v1-reference og det deployede v1-snapshot har forskellige filhashes for `league_table.json`:

- analytisk v1: `650493713ac701ede8b9ec3ed45ffd129a75ca11748cecde8087a687d88272da`
- deployeret v1: `4c2d7ce5bdd00a0441d5177ae4983d2d289fcc18a47215173f20c84684cb5323`

Forskellen er afstemt. Den analytiske fil har ét ekstra topfelt, `methodology_status`, med udgaven `population-safety-v1`. Når dette felt fjernes, er filerne strukturelt identiske, inklusive alle 111 stedrækker og deres værdier. Der er ingen analytisk forskel skjult i hashforskellen. Sognfilen er byte-identisk med rollback-referencen.

| Identitet | Værdi |
|---|---|
| Deployeret v1-commit | `8e046c264e072b27d6f38bed9c97e84da53841f9` |
| Komplet v1-inventory | `db4f039ccc44e836d0a668b630d8510c8aed96658711f3ad82013d379dae2d23` |
| V1-filer og størrelse | 500 filer, 112.754.214 bytes |
| Forseglet v2-udgave | `population-revalidation-20260710-r3-sogn-v2` |
| V2-inventory | `4194cd3ab4bb9902b4bc99c1c3ae344cfe576e6218a12d18f5492303feef15ad` |
| V2-filer og størrelse | 617 filer, 203.685.408 bytes |
| Run manifest | `2d9bca0962a73294ec03678e51d6e1f3f9de23006355d1ba9e019699159ac056` |
| Manifestudsnit | `251d428503b9a9b08c1747ad2615e7fd4006bc7e99c5a2eb2a40f871b4bf8add` |
| Engine-digest | `sha256:d6c879020ebb4abd6bad6b608d250af95dad6e61c33daef54b6b6409c283781e` |
| DST-kildehash | `2d95f37c17ce9b6624bf61002c35ed335ca1134632696a2c275df4213cc613e6` |

V2-inventoryet er hentet fra `gs://seamless-pipeline/editions/population-revalidation-20260710-r3-sogn-v2`. Alle 617 filer er kontrolleret mod registreret størrelse og SHA-256. Inventory-ID'et er genberegnet fra den kanoniske filliste og matcher den forseglede værdi.

De maskinlæsbare bilag er:

- `evidence/population-v1-v2-summary.json`: identiteter, testgrænser, matricer og alle sammenfatninger
- `evidence/population-v1-v2-sogn-deltas.csv`: alle 2.097 sogne
- `evidence/population-v1-v2-kommune-deltas.csv`: alle 98 kommuner
- `evidence/population-v1-deployed-inventory.json`: komplet rollback-inventory for `data/published/**`

## Begrænsninger og frigivelseskrav

Rapporten validerer datakorrektionen. Den er ikke i sig selv en produktionsgodkendelse.

Før frigivelse skal v2 formes til den eksisterende produktionskontrakt. Det gælder især de 98 CDI-lag: 67.226 routede celler skal kombineres med det eksisterende visningsgrid, så produktionen serverer 75.659 features, heraf 8.433 med `estimated=true`. Kandidatens nyere felter må ikke lække ind i produktionsformatet.

Den uændrede app skal derefter bestå build, datakontrol og browserparitet med fungerende Mapbox-konfiguration. Til sidst skal Vercel og Railway køre samme `main`-commit og samme v2-identitet. Ved brudt rute, manglende lag, schemafejl, uventet UI-forskel eller delt v1/v2-tilstand skal den ene data-commit rulles tilbage. Rollbacken skal genskabe hele v1-inventoryet, ikke kun league- og sognfilerne.
