En portal med nesten hundre statistikksider har et problem den ikke merker selv: hver side er god, og ingen av dem forteller deg hva den har med de andre å gjøre. Du kan lese at styringsrenten er satt opp, og du kan lese at gjeldsbelastningen i husholdningene er høy. At det første er en viktig grunn til at det andre gjør vondt, står ingen steder.
Se kunnskapskartet på faktaportalen.no →
Løsningen ble ikke en ny meny. Den ble en graf: hele portalen modellert som noder og koblinger, der hver side, hvert begrep og hver datakilde er en node, og der alle sammenhenger uttrykkes med bare fire typer koblinger.
Fire typer koblinger er nok
Modellen kommer fra informatikeren Mark Burgess, som har jobbet med hvordan man beskriver systemer som endrer seg over tid. Kjernen i det han kaller Semantic Spacetime er en påstand som virker for enkel til å stemme: uansett hvor sammensatt et fagfelt er, trenger du ikke et eget vokabular for hver type sammenheng. Alle relasjoner lar seg koke ned til fire.

Noe er del av noe større. Noe fører til noe annet. Noe henger sammen med noe beslektet. Og noe uttrykker en egenskap ved seg selv.
Det høres abstrakt ut helt til du prøver det på noe konkret. Økonomi inneholder Renter. Priser fører til Renter, som fører til Gjeld. Renter uttrykker kilden Norges Bank. Priser henger sammen med Priser i Norden. Fire koblinger, og du har beskrevet en hel liten del av portalen uten å finne opp et eneste nytt begrep underveis.
Gevinsten er at du kan stille de samme fire spørsmålene overalt: hva påvirker dette tallet, hva er det en del av, hvilke begreper deler det med andre sider, og hvilken kilde hviler det på.
Kartet er utledet, ikke vedlikeholdt
Her lå den viktigste designbeslutningen. Det enkleste hadde vært å lage en fil der vi skriver ned hvordan alt henger sammen. Det hadde også vært det verste: enda et register å holde i synk med virkeligheten, og et som råtner stille i det øyeblikket noen legger til en side uten å oppdatere det.

I stedet bygges kartet ved hver publisering fra registre som allerede finnes og allerede vedlikeholdes av andre grunner. Sidene kommer fra rutelista som driver nettstedskartet. Begrepene kommer fra taggene på hver side, de samme som driver søket. Kildene kommer fra ferskhetsregisteret bak kildesiden, som holder rede på når hver datafil sist ble oppdatert. Bloggartiklene kommer fra sin egen frontmatter.
Tre av de fire koblingstypene er derfor utledet. Ingen skriver dem, og ingen kan glemme å oppdatere dem.
Den fjerde typen er redaksjonell, og merket som det
Fører til kan ikke utledes. At prisvekst fører til renteheving er en påstand om årsak, og en påstand må noen stå for.

De 24 årsakssammenhengene i kartet er derfor håndskrevet, gruppert i sju navngitte forløp, og merket eksplisitt som redaksjonelt innhold. Hver enkelt har to felter som er obligatoriske: en begrunnelse som sier hvorfor vi mener det, og et belegg som peker på en portalside der du kan se sammenhengen i tallene selv.
Ordvalget bærer også informasjon. Vi skiller mellom «fører til» og «påvirker», og det er ikke tilfeldig: det første er en sterkere påstand enn det andre. Når Norges Bank setter renten for å holde prisveksten nær inflasjonsmålet, fører KPI-vekst til renteendring. Når en svakere krone gjør importvarer dyrere, påvirker valuta prisene, i konkurranse med mye annet.
Begrunnelsen er alltid synlig. Den lå en periode i en tooltip, som var en dårlig idé av tre grunner: den finnes ikke på mobil, den er utilgjengelig for tastaturbrukere, og en påstand om årsak som krever at du holder musepekeren stille for å begrunnes, er i praksis ubegrunnet.
Hva kartet avslørte om vår egen portal
Det uventede kom med en gang. Fordi kartet bygges fra de ekte registrene, ble grafbyggeren en konsistenssjekk portalen ikke hadde hatt før. Testene kjører den mot virkeligheten, og virkeligheten svarte umiddelbart.
To datasett pekte på en rute som ikke finnes. Formue og skatt lå begge registrert som «brukes på /okonomi/formue-skatt», men den siden var for lenge siden splittet i to. Ingen hadde merket det, fordi ingenting leste feltet før nå.
Så kom dublettene. Kartet laget både en seksjonsnode og en sidenode for hver seksjon som har sin egen landingsside. Siden undersidene henges på nærmeste ekte forelder-rute, ble seksjonsnoden sittende igjen med én eneste kobling: til sin egen dublett. Inngangene på forsiden pekte altså til noder som var så godt som tomme. Økonomi gikk fra 1 til 19 koblinger da det ble rettet.
Begge feilene har det samme til felles, og det er verdt å stoppe ved: de var usynlige fordi ingenting leste feltet. Et felt ingen bruker, kan ikke være feil - helt til noen begynner å bruke det. Og til slutt kom krysningspunktene, som er den mest interessante av dem.
Tre sider hører hjemme i to historier
Da de sju kjedene ble tegnet hver for seg, så alt ryddig ut. Slår du dem sammen til ett bilde, dukker det opp tre sider som inngår i mer enn ett forløp:

Renter hører til både Rentekanalen og Konjunktur. Pensjonsutbetalinger hører til både Demografi og pensjon og Fra helse til trygd. Befolkning hører til både Demografi og pensjon og Kommune.
Det er ikke en feil i modellen. Det er poenget. Renta er ikke bare et ledd i historien om priser og gjeld, den er også et ledd i historien om konjunktur, og en leser som bare får se det ene forløpet får et smalere bilde enn virkeligheten. Per-kjede-visningen skjulte dette helt, rett og slett fordi den tegnet hver historie i sitt eget rom.
Hvorfor en statistikkportal er vanskelig å kvalitetssikre
Vanlige tester sjekker kode. De fanger at en funksjon returnerer feil, at en komponent krasjer, at en type ikke stemmer. Det de ikke fanger, er at et tall er riktig regnet ut, men foreldet. Eller at teksten over grafen sier «størst vekst» om en kategori som ikke lenger har det. Et tall har ingen type som blir feil når virkeligheten flytter seg.
Vi har fire vaner mot dette, og de tetter ulike hull. Tall i brødtekst interpoleres alltid fra datakonstantene i stedet for å skrives inn, slik at teksten følger med når pipelinen kjører. Hver datafil eksporterer en dato for når den sist ble oppdatert, og den vises i toppen av siden. Sider som ikke oppdateres automatisk får et varsel når de blir for gamle. Og hver graf har en klikkbar kildehenvisning i tittelen, slik at leseren kan gå til tabellen selv.
Alle fire har den samme svakheten: de er konvensjoner. De virker så lenge alle husker dem, og en konvensjon som er glemt, er stille.
Kartet gjør noe kvalitativt annet, og det var ikke det vi bygde det for. Ved å utlede seg selv av registrene, gjør det et databrudd til en test som feiler. Grafbyggeren samler alt den ikke får til å gå opp - en kilde som sier den brukes på en side som ikke finnes, en årsakssammenheng som peker på en slettet rute, en kant til en node som mangler - i en liste den kaller orphans. Testen krever at lista er tom. Testene rundt kartet kjører mot de ekte registrene, ikke mot oppdiktede eksempler, så en feil i dataene er en rød test og ikke en oppdagelse en leser gjør før oss.
Det er også grensen for hva kartet kan. Det sjekker at en referanse peker på noe som finnes - ikke at påstanden er sann. At vi har koblet renter til gjeld, kan ingen test bekrefte. Derfor er nettopp den delen merket som redaksjonell, med begrunnelse og belegg synlig for hver eneste sammenheng. Det maskinen kan garantere, skal den garantere. Resten skal stå med navnet vårt på.
Hvorfor det ikke er ett stort bilde av alt
Det nærliggende spørsmålet er hvorfor vi ikke bare tegner hele grafen. Svaret ligger i fordelingen mellom lagene.
Av over 500 koblinger er tre av fire av typen uttrykker. De sier at en side dekker et begrep eller hviler på en kilde. Det er nyttig informasjon når du står på én side og vil vite hvor tallet kommer fra, men som helhetsbilde er det en tett, tosidig struktur uten fortelling. Til sammenligning er bare 24 koblinger av typen fører til. Tegner du alt i samme bilde, drukner de 24 påstandene som faktisk sier noe, i alle koblingene som ikke gjør det.
Det kommer et praktisk problem i tillegg. En layout for over 300 noder må regnes ut med en kraftsimulering, og en kraftsimulering gir et nytt resultat hver gang. Da er ikke bildet lenger en påstand vi kan stå for, det er et øyeblikksbilde av en algoritme. Et lerret uten fast struktur lar seg heller ikke navigere med tastatur, og portalen er bundet til WCAG 2.1 AA.
Vi vurderte også et aggregat på seksjonsnivå, altså 17 bokser i stedet for alle nodene. Det ble forkastet av en enklere grunn: bare 10 seksjonspar har noen kobling seg imellom i det hele tatt. Diagrammet ville vært nesten tomt.
Konklusjonen ble at hvert lag vises der det bærer mening. Årsakene som kjeder med begrunnelse. Strukturen som seksjoner. Begrepene og kildene som lister sortert etter hvor mange sider som hviler på dem. Og vil du se hvordan alt henger sammen rundt ett bestemt tall, har hver eneste node sitt eget nabolagskart.

To eksempler viser hvorfor det er nok. Nabolagskartet for Priser har 14 koblinger fordelt på alle fire typene: sidene den fører til, seksjonen den ligger i, begrepene den deler med andre, og kildene den hviler på. Nabolagskartet for begrepet pensjon ser helt annerledes ut - 16 koblinger av bare én type, en vifte av sider som dekker det samme temaet.
Det er den samme grafen sett fra to steder. Ett stort bilde måtte valgt én av formene og mistet den andre.
Det kartet ikke er
Noen ærlige forbehold hører med.
Kartet er en lesemodell, ikke et arkiv og ikke en modell av norsk økonomi. De 24 årsakssammenhengene er vår tolkning av veletablerte mekanismer, ikke resultater fra en estimert modell. Vi sier at renta påvirker gjeldsbelastningen; vi sier ingenting om hvor mye, eller med hvilken forsinkelse.
Likhetskoblingene, de 17 av typen henger sammen med, er regnet ut mekanisk fra hvor mye to sider deler av tagger. Det er en grov nærhet, ikke en faglig vurdering.
Og begrepene er portalens egne stikkord. At «uføretrygd» binder fem sider sammen, sier noe om hvordan vi har organisert innholdet vårt, ikke nødvendigvis noe om verden.
Kartet er med andre ord et kart over faktaportalen.no. Det er akkurat så nyttig som det, og ikke mer.
Kunnskapskartet finnes på faktaportalen.no/kunnskapskart. Hver node har sin egen side med naboene sine gruppert per koblingstype, og alle visualiseringene kan veksles til tabell.
Kilder: Mark Burgess: Semantic Spacetime, Faktaportalen: Kunnskapskartet, Faktaportalen: Kilder og datagrunnlag. Full oversikt over datagrunnlaget vårt finnes på faktaportalen.no/kilder.