Lønna til norske utviklere i 2025

  • 17. September 2025 (modified 18. September 2025)
  • #datascience

I denne artikkelen skal vi gå gjennom betraktninger og metoder for å lage en lønnskalkulator for IT-utviklere. Utålmodige lesere kan gå rett til Lønnskalkulatoren og se hovedfunnene i figuren nedenfor.

Nettsiden kode24 har lenge hatt årlige spørreundersøkelser om lønn og publisert data i etterkant. Vi kan finne datasett for 2021, 2022, 2023, 2024 og 2025 på nettsidene.

Jeg har tidligere gjort flere analyser av spørreundersøkelsene:

Det meste som kan sies har blitt sagt: konsulenter tjener noe mer enn fast ansatte, bosatte i Oslo får en lønnspremie, ledere og arkitekter tjener mest, kjønn er (heldigvis) ubetydelig, og antall år med erfaring dominerer alle andre variabler. Størsteparten av variasjonen i lønn skyldes variabler som spørreundersøkelsene ikke plukker opp. Til sammen forklarer variablene i lønnsundersøkelsene mellom 30% og 50% av variasjonen i lønna; hvor mye avhenger av datasettet og modellen. Les mine tidligere analyser for en nøye gjennomgang.

Årets pro-bono bidrag til IT-miljøet blir å slå sammen alle datasettene og lage en robust lønnskalulator. Den er robust fordi den (1) baserer seg på nesten ti tusen observasjoner og (2) tar automatisk høyde for lønnsvekst i fremtiden.

Datasett

Det er fem datasett for fem ulike år. “Data engineering” er alltid mer jobb enn man håper, og innsatsen for å slå sammen disse datasettene var ikke noe unntak. Jeg måtte:

  • Sammenstille lønnstall på format som 600 000 med 600.000,00 kr og lignende.
  • Sammenstille små variasjoner i spørsmålene fra år til år, f.eks. I hvilket fylke ligger jobben din? og I hvilket fylke jobber du?.
  • Ta hensyn til at det noen år var spurt om lønn med bonus og andre år lønn uten bonus. Dette fikser jeg med en latent variabel i modelleringen, men vi går ikke inn på det i denne artikkelen.
  • Fjerne tvilsomme observasjoner (omtrent 1.5% av dataene, der lønn var under 400 TNOK eller over 2000 TNOK).
  • Noen har sannsynligvis tolket spørsmålet “Hvor mange års relevant, formell utdannelse har du?” til å inkludere barneskolen, ungdomsskolen og VGS. Dette må fikses etter beste evne (jeg håper og tror ingen har vært student på et universitet i mer enn femten år).
  • Ta hensyn til regionreformen og dens delvise omgjørelse.
  • Slå sammen fagdisipliner, f.eks. var arkitektur et alternativ noen år, mens det het arkitekt andre år.
  • Slå sammen spørsmål: tidligere var jobb (in-house, konsulent, osv.) og sektor (privat, offentlig) to spørsmål—nå er det slått sammen til ett spørsmål.

Etter en grundig datavask står vi igjen med 9610 observasjoner. En del av disse er nok de samme personene som svarer på nytt, men det tenker jeg at er greit i denne sammenhengen. Som alltid er det masse forbehold: dataene er selvrapporterte, kode24’s lesere er ikke representative for utviklere generelt, osv. Nedenfor er lønn og erfaring visualisert for alle årene.

Medianlønna har økt de siste fem årene, men det har også gjennomsnittlig erfaring blant kode24’s lesere.

  år   erfaring   lønn
2021        8.2    690
2022        8.3    725
2023        8.8    790
2024        8.5    850
2025        9.4    880

En regresjon på log-lønna avslører at den gjennomsnittlige lønnsveksten har vært omtrent 6.4% de siste årene, men dette tar ikke hensyn til at erfaringen også har økt. Om vi korrigerer for dette blir lønnsøkningen omtrent 5.1% per år.

Lønnskalkulatorer

En kalkulator implementerer vanligvis en kjent formel. For eksempel implementerer en skattekalkulator formelen for skatt (noe som kan være utfordrende å finne ut av). På samme måte kan en lønnskalkulator implementere “formelen for lønn”, men den vet vi ikke hva er. Derfor må vi først bruke en modell til å lære en formel fra datasettet, og deretter implementere denne. Et alternativ er å ikke implementere noen formel i det hele tatt, men heller bruke en såkalt ikke-parametrisk modell og vise brukeren sammenlignbare personer. Vi skal se på disse to alternativene i denne artikkelen, men det finnes andre muligheter også.

Uansett fremgangsmåte bør en god kalkulator:

  • Predikere godt. Estimert lønn bør matche faktisk lønn for så mange som mulig. Dette kan kryssvalideres.
  • Kommunisere usikkerheten. I dette datasettet har hver prediksjon stor usikkerhet, og det må brukeren forstå.

Ikke-parametriske modeller

Anta at en typisk utvikler ønsker å vite hva han eller hun kan forvente å tjene:

{'år': 2025, 'fylke': 'Oslo', 'jobb': 'in-house, privat sektor',
 'erfaring': 6, 'utdannelse': 3, 'fag': 'Fullstack'}

K-nærmeste naboer

Vi kan bruke K-nærmeste naboer med \(k=10\) på 2025-data for å vise ti personer som ligner. Disse er

  erfaring   utdannelse fylke   jobb                     fag           lønn
         5            3 Oslo     in-house, privat sektor Fullstack  775    
         7            3 Oslo     in-house, privat sektor Fullstack  803    
         6            3 Oslo     in-house, privat sektor Fullstack  819    
         5            3 Oslo     in-house, privat sektor Fullstack  877    
         6            3 Oslo     in-house, privat sektor Fullstack  895    
         6            3 Oslo     in-house, privat sektor Fullstack  900    
         6            3 Oslo     in-house, privat sektor Fullstack  914.375
         5            3 Oslo     in-house, privat sektor Fullstack  950    
         6            3 Oslo     in-house, privat sektor Fullstack 1000    
         6            3 Oslo     in-house, privat sektor Fullstack 1400    

Her var vi heldige, fordi det er mange personer i Oslo med lignende egenskaper. Medianlønna blant disse ti personene er 897 TNOK, og 80% ligger i intervallet mellom 800 og 1040 TNOK.

Beslutningstre

Dersom vi bruker et beslutningstre i stedet, får vi følgende tabell. Modellen er satt til å alltid returnere minst ti personer, og for denne spørringen returnerer den 15. Sammenlignet med K-nærmeste naboer er beslutningstreet mer opptatt av erfaring, og mindre opptatt av fag og jobb.

  erfaring   utdannelse fylke   jobb                                   fag                           lønn
         6            3 Oslo     frilans / selvstendig næringsdrivende DevOps og Automatisering  500    
         6            3 Oslo     in-house, privat sektor               UX og Design              650    
         6            3 Oslo     konsulent                             Ledelse                    735    
         6            3 Oslo     konsulent                             Frontend                  780    
         6            3 Oslo     in-house, privat sektor               Fullstack                  819    
         6            3 Oslo     konsulent                             Testing                    830    
         6            3 Oslo     in-house, privat sektor               Fullstack                  895    
         6            3 Oslo     in-house, privat sektor               Frontend                  900    
         6            3 Oslo     in-house, privat sektor               Fullstack                  900    
         6            3 Oslo     in-house, privat sektor               Fullstack                  914.375
         6            3 Oslo     konsulent                             Fullstack                  918    
         6            3 Oslo     konsulent                             Frontend                  940    
         6            3 Oslo     in-house, privat sektor               Fullstack                 1000    
         6            3 Oslo     in-house, privat sektor               Fullstack                 1400    
         6            3 Oslo     konsulent                             Fullstack                 1400    

Medianlønna blant disse 15 personene er 900 TNOK, og 80% ligger i intervallet mellom 684 og 1240 TNOK.

Sammenligning: K-nærmeste naboer vs. beslutningstre

Vi kan sammenligne Mean Absolute Error (MAE) på en 10-folds kryssvalidering for å se hvor mange personer modellen bør returnere for å gi gode prediksjoner.

Vi observerer at:

  • Beslutningstrær er klart bedre enn K-nærmeste naboer, med lavere MAE over hele linja.
  • Så lenge vi returnerer omtrent 20 personer så får vi gode prediksjoner.
  • Jo flere personer vi returnerer, desto bedre kan vi estimere et intervall og si noe om lønnspennet.

Grunnen til at beslutningstrær er bedre enn K-nærmeste naboer er fordi førstnevnte automatisk velger hvilke variabler som er viktige (erfaring er helt klart viktigst), mens sistnevnte må gå like langt ut i alle dimensjoner for å finne naboer.

Både K-nærmeste naboer og beslutningstrær har noen felles svakheter i denne problemstillingen:

  • Nær endepunktene i hver variabel er de nødt til å se innover for å gjøre prediksjoner.   For eksempel, dersom man har 45 års erfaring vil modellen ikke finne noen personer som har mer erfaring, kun personer som har mindre erfaring.   Det samme gjelder de som har null år med erfaring eller null år med utdannelse.   Dette er spesielt kritisk i høye dimensjoner, fordi da er sannsynligvis alle datapunktene nær endepunktene—jo flere ting vi måler, desto mer er alle mennesker ulike på hver sin måte!
  • Vi brukte 2025-data til nå, men vi ønsker å bruke hele datasettet. Vi vet at tidligere år har lavere lønn på grunn av generell lønnsøkning i samfunnet, men 2025-tallene er nær endepunktet på variabelen “år”. Derfor vil modellene ofte kun hente informasjon fra 2025 og ikke bruke hele datasettet. Begge modellen er lokale heller enn globale, og evner ikke å bruke informasjon fra tidligere år på en god måte.

Parametriske modeller

En parametrisk modell lærer parametrene i en formel som beskriver et datasett. Fordelen er at hele datasettet kan komprimeres ned til én kort formel som beskriver sammenhengene. Ulempen er at man må selv spesifisere en fornuftig formel. Parametriske modeller er globale og ekstrapolerer vanligvis godt, og dette er en fordel i vår sammenheng—spesielt med tanke på årstall inn i fremtiden og lønnsinflasjon.

Første idé er å bruke en Ridge-modell og minimere

\begin{align*} \text{minimize} \, &\lVert \text{lønn} - \boldsymbol{\mu} \rVert_2^2 + \alpha \lVert \boldsymbol{\beta} \rVert_2^2 \\ \mu &= \beta_0 + f(\text{erfaring}) + \beta_{\text{utdannelse}} \text{utdannelse} + \beta_{\text{fylke}} + \beta_{\text{jobb}} + \beta_{\text{fag}} \\ f(z) &= \beta_1 z + \beta_2 z^2 + \beta_3 z^3 + \cdots \end{align*}

og dette er et godt utgangspunkt som gir helt kurante resultater. Høyere-ordens polynomer er vanligvis ingen god idé, fordi de kan overtilpasse og svinge voldsomt. Det er derfor viktig å plotte polynomet (noe som ble gjort men ikke er med i artikkelen).

Hvordan kan vi forbedre denne modellen? For det første vil vi finne medianlønna heller enn gjennomsnittslønna, fordi medianen er mindre påvirket av ekstreme observasjoner og er ofte et bedre valg i slike sammenhenger. Det var derfor vi brukte Mean Absolute Error (MAE) heller enn Mean Squared Error (MSE) tidligere; MAE er minimert av medianen.

For det andre er en tradisjonell regresjonsmodell påvirket av feil i absolutte tall, mens multiplikative feil gir mer mening i lønnssammenheng. Med andre ord, å bomme med 100 TNOK når lønna er 500 TNOK er en stor feil, mens å bomme med 100 TNOK når lønna er 1200 TNOK er ikke like ille, fordi det er en mindre multiplikativ feil.

Vi endrer modellen til å bruke en \(\ell_1\)-norm på likelihood-leddet og tilpasse log-lønn heller enn lønn:

\begin{align*} \text{minimize} \, &\lVert \log \left( \text{lønn} \right) - \boldsymbol{\mu} \rVert_1 + \alpha \lVert \boldsymbol{\beta} \rVert_2^2 \end{align*}

Dette minner om en Lasso, men med normene byttet om: vi har \(\ell_1\)-norm på likelihood-leddet og \(\ell_2\)-norm på regulariseringsleddet. Her er koeffisientene i modellen (klikk på figuren for å se større versjon):

Legg merke til at lønnsveksten estimeres til 5.1% per år.

Å sammenligne mellom kategorier innebærer å konvertere prosentene til relative tall, ikke å legge dem sammen additivt. For eksempel, dersom man går fra en in-house offentlig stilling til å bli konsulent, kan man forvente en lønnsøkning på omtrent

\begin{align*} \frac{1 + 5.9\%}{1 - 5.4\%} = \frac{1.059}{0.946}= 1.119 = 11.9\% . \end{align*}

Her er residualene til modellen:

Dette er relativt pene residualer, fordi det ikke er stor endring i residualene over lønnsintervallet, såkalt heteroskadist… hetroskedasisti…. heteroskedastisitet. Polynomet som ble brukt var et fjerdegradspolynom, som på grunn av regularisering oppfører seg pent når erfaring er mellom null og førti år.

La oss kjøre vår “typiske” utvikler gjennom alle tre modellene:

{'år': 2025, 'fylke': 'Oslo', 'jobb': 'in-house, privat sektor',
 'erfaring': 6, 'utdannelse': 3, 'fag': 'Fullstack'}

Vi observerer noe ulike estimater av medianlønn og intervaller fra de ulike modellene:

  • KNN: 897 TNOK med 80% intervall mellom 800 og 1040 TNOK.
  • Tre: 900 TNOK med 80% intervall mellom 684 og 1240 TNOK.
  • Lineær modell: 918 TNOK med 80% intervall mellom 748 og 1136 TNOK.

Intervallene fra de ikke-parametriske modellene (KNN og tre) er mindre robuste, ettersom de er basert på henholdsvis 10 og 15 observasjoner. Intervallet fra den lineære modellen er basert på alle datapunktene, og har høyere kvalitet.

La oss nå sammenligne MAE for alle modellene, samt en svak dummy-modell som alltid predikerer medianen og en kraftig gradient boosting modell.

 Modell / Metrikk  MAE
Dummy             202  
KNN               152  
Tre               128  
Lineær             119  
Gradient boosting 114  

Gradient boosting har lavest MAE, men den lineære modellen er bare marginalt verre. Likevel har den noen klare fordeler:

  • Det estimerte intervallet (usikkerheten) er nok mer robust og realistisk.
  • Den er veldig enkel å implementere i Javascript. Man bruker bare formelen.

Oppsummering

Kode24 har gjort en kjempejobb med å samle inn og publisere data på utvikleres lønn. I denne artikkelen kombinerte vi fem år med lønnsdata til ett datasett med 9610 observasjoner, etter datavask og sammenstilling av variabler på tvers av år.

Vi sammenlignet to ulike tilnærminger til lønnskalkulatorer:

  • Ikke-parametriske modeller (KNN og beslutningstrær) som viser faktiske, sammenlignbare personer
  • Parametriske modeller (log-lineær regresjon med \(\ell_1\)-loss) som bruker en global formel

Den enkle log-lineære modellen (MAE: 119) presterte bedre enn de to ikke-parametriske modellene, fordi MAE var lavere og intervallene var mer robuste. Faktisk hadde modellen nesten like lav MAE som gradient boosting (MAE: 114), men med fordelen av å være tolkbar og enkel å implementere i JavaScript. Beslutningstrær var gode for å finne sammenlignbare personer, betydelig bedre enn K-nærmeste naboer.

Når det gjelder metodikk for lønnskalkulatorer er lærdommen klar: prioriter enkelhet og transparens. Brukere trenger to ting: (1) fornuftige prediksjoner og (2) ærlig kommunikasjon om usikkerheten. Kalkulatoren implementerer den enkle lineære modellen.

Selv om jeg fulgte bud (5) og bud (9) har jeg dårlig samvittighet for å ha brukt et fjerdegradspolynom i modelleringen uten progressiv regularisering—men jeg slapp unna med det på partial dependence plottet. Aldri igjen.