Skip to content

km590/moss-trafikk

Repository files navigation

Moss Trafikk

Trafikkstatus og prediksjoner for hele Moss-korridoren. Kanalbrua, Rv19, E6/Mosseporten.

Er det smart å kjøre nå, eller lønner det seg å vente?

mosstrafikk.no

Et samarbeidsprosjekt mellom Synaro og Krescado.

Hvem står bak?

Bak prosjektet står Jørgen Simensen i Synaro og Kenneth Madsø i Krescado. Vi er to tidligere kollegaer med felles interesse for teknologi, data og produktutvikling, og begge har en nær relasjon til Moss og Jeløya.

Jørgen er oppvokst på Jeløya, har familie der og bor i dag på Ekholt. Kenneth bor på Verket og har venner og turområder på øya. Vi pendler begge til Oslo og kjenner godt på spørsmålet mange i Moss stiller seg: er det smart å kjøre nå, eller lønner det seg å vente litt?

Moss Trafikk er bygget med åpne data, åpne API-er og prediksjonsmodeller for å gi et smart anslag på trafikken akkurat nå og de neste timene.

Hva

Avviksbasert trengselsanalyse og prediksjoner for 10 tellepunkter langs korridoren fra Våler/E6 til Kanalbrua/Jeløya. To-lags prediksjonsmodell med 2 års historikk (89 000 timer), fergekontekst fra Entur, og estimert korridorstatus når Vegvesen-data er forsinket.

Prediksjonsmodell

V1: Baseline (multiplikativ dekomponering)

Median per (stasjon, ukedag, time) justert med sesong- og helligdagsfaktorer. Robust og enkel. Treffer typisk 5-10% MAPE på hverdager.

V2: Residualkorreksjon (LightGBM)

Quantile regression (p10/p50/p90) trent på residualer fra baseline. 26 features inkludert sanntidsvolum, korridorsignaler fra 6 eksterne stasjoner, og temporale features. Custom tree-walker i TypeScript for edge-inference (0 avhengigheter, ~200 KB modell).

V2 forbedrer kveld/natt, men har en kjent positiv bias i dagtimer (mars 2026). Gating-policy styrer når residualen brukes:

Policy Beskrivelse
off Kun baseline
time_window Baseline 07-17, v2 18-06 (aktiv i prod)
full V2 residual alltid på

Treffsikkerhet

Modellen evalueres fortløpende mot faktiske målinger fra Statens vegvesen.

Metode MAPE Bias Merknad
Baseline (v1) ~10% -7% Underpredikerer litt
V2 full ~16% +13% Overpredikerer dagtimer
V2 time_window Evalueres - Deployet 2026-03-24

Eval-data samles automatisk via GitHub Actions (snapshot + backfill, hver time).

Arkitektur

src/
  lib/
    prediction-engine.ts     # V1: multiplikativ dekomponering
    prediction-engine-v2.ts  # V2: baseline + LightGBM residual + gating policy
    tree-walker.ts           # LightGBM JSON tree inference (0 avhengigheter)
    feature-builder.ts       # 26 features for residualmodell
    decision-engine.ts       # "Kjøre nå eller vente?" beslutningslogikk
    ferry-signal.ts          # Ferjesignal fra Entur (avgangstider Moss-Horten)
    traffic-logic.ts         # Congestion-klassifisering og beste-tid
    data-fetcher.ts          # Orkestrerer Vegvesen + prediksjon + ferje
    norwegian-calendar.ts    # Helligdager, skoleferie, 17. mai
    vegvesen-client.ts       # Statens vegvesen Trafikkdata (GraphQL)
    entur-client.ts          # Entur Journey Planner (fergeavganger)
    stations.ts              # Stasjonskonfig, vulnerability-thresholds
  data/
    model-weights.json       # Baseline-profiler (generert av scripts/)
    residual-model.json      # LightGBM quantile modell (eksportert fra Python)
    averages.json            # Legacy fallback
scripts/
    fetch-history.ts         # Hent 2 år rådata fra Vegvesen (104 uker)
    compute-model.ts         # Beregn baseline-profiler fra rådata
    validate-model.ts        # Segmentert MAPE-validering
    golden-test.ts           # Snapshot-tester for kjente scenarier
    training/                # V2 treningspipeline (Python/LightGBM)
      train.py               # Tren 3 quantile-modeller (p10/p50/p90)
      features.py            # Feature engineering + datasett
      config.py              # Hyperparams, stasjoner, feature-lister
      export_model.py        # Eksporter til JSON for tree-walker
      ablation.py            # Feature ablation-tester

Eval-system

Prediksjoner evalueres automatisk mot Vegvesen-actuals:

  1. Snapshot (hver time): lagrer predicted, baseline, residual og policy-valg
  2. Backfill (hver time): matcher snapshots med faktisk trafikk fra Vegvesen
  3. Dashboard (/admin/eval): WAPE, MAPE, bias per periode, MAE per stasjon

GitHub Actions (eval-collect.yml) kjører begge steg automatisk.

Datakilder

Tech

  • Next.js 15 (App Router, ISR 5 min)
  • TypeScript
  • Tailwind CSS + shadcn/ui + Recharts
  • Supabase (eval-data og kalibrering)
  • Vercel (hosting, auto-deploy fra main)
  • Plausible Analytics
  • Python + LightGBM (treningspipeline, offline)

Kjør lokalt

npm install
cp .env.example .env.local  # Valgfritt: Supabase for eval
npm run dev

Generer baseline-profiler fra historikk (tar ca 15 min første gang):

npx tsx scripts/fetch-history.ts
npx tsx scripts/compute-model.ts
npx tsx scripts/validate-model.ts
npx tsx scripts/golden-test.ts

Tren V2 residualmodell (krever Python 3.11+):

cd scripts/training
pip install -r requirements.txt
python train.py

Env-variabler

Se .env.example. Alle er valgfrie - appen fungerer uten Supabase og Plausible.

Variabel Beskrivelse
SUPABASE_URL Supabase-prosjekt URL
SUPABASE_SERVICE_ROLE_KEY Service role key for eval
ADMIN_API_KEY Bearer token for /api/admin/eval/*
PREDICTION_MODEL v2 for å aktivere residualmodell
PREDICTION_RESIDUAL_POLICY off / time_window / full
NEXT_PUBLIC_PLAUSIBLE_DOMAIN Plausible-domene

Lisens

Kode: MIT

Datakilder følger egne vilkår:

  • Trafikkdata: Statens vegvesen, NLOD
  • Fergeavganger: Entur, NLOD

About

Trafikkstatus og prediksjoner for Moss-korridoren. Kanalbrua, Rv19, E6. Et samarbeidsprosjekt mellom Synaro og Krescado.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors