Juhannuksena Suomi muuttaa muuttolintujen tavoin — latausverkko ei

Latausverkko jakaumana, osa 8: kesämökit, kausivaihtelu ja jonot

Latausverkko on mitoitettu sinne missä ihmiset asuvat. Juhannuksena he ovat muualla. Lasketaan mökkikannan perusteella, minne kysyntä siirtyy, ja simuloidaan jonot epävarmuus mukaan lukien.

avoin data
simulaatio
latausverkko
kausivaihtelu
jonoteoria
Author

Kristian Vepsäläinen

Published

20.10.2026

Maa, joka muuttaa paikkaa kahdesti vuodessa

Latausinfraa suunnitellaan sinne, missä ihmiset ovat. Tilastokeskus kertoo missä he asuvat, Traficom missä heidän autonsa on rekisteröity, ja näiden perusteella lasketaan missä latureita tarvitaan.

Kaikki nämä kuvaavat tilannetta keskiviikkona marraskuussa.

Juhannuksena merkittävä osa väestöstä on muualla. Suomessa on satojatuhansia kesämökkejä, ja ne eivät ole siellä missä ihmiset asuvat — ne ovat määritelmällisesti toisaalla. Mökkikunnan väkiluku voi moninkertaistua muutamaksi viikoksi.

Latausverkko ei siirry mukana. Se on rakennettu sinne, missä kysyntää on keskimäärin, ja keskimääräinen kysyntä ei tunne juhannusta.

Tässä osassa lasken mökkikannan perusteella, minne kysyntä siirtyy kesällä, ja simuloin mitä se tarkoittaa latausjonoille. Simulaatio tehdään epävarmuus mukaan lukien: kaikki oletukset ovat jakaumia eivätkä lukuja, koska yksikään niistä ei ole tarkasti tiedossa.

Missä mökit ovat

Code
alueet <- pno |>
  st_drop_geometry() |>
  mutate(
    mokkikerroin = if_else(asukkaat > 0, kesamokit / asukkaat, NA_real_),
    # Mökkiläisiä arvioidaan mökkimäärän perusteella. Kuinka monta
    # henkeä mökillä on kerrallaan, on epävarmaa – siihen palataan
    # simulaatiossa.
    mokkeja = kesamokit
  ) |>
  filter(!is.na(mokkeja))

koko_maa_mokkeja <- sum(alueet$mokkeja, na.rm = TRUE)

mokkikeskittymat <- alueet |>
  filter(asukkaat >= 50, mokkeja >= 50) |>
  slice_max(mokkikerroin, n = 15) |>
  select(pno, alue_nimi, kunta, asukkaat, mokkeja, mokkikerroin)

stopifnot(
  "Kesämökkejä ei löytynyt" = koko_maa_mokkeja > 100000,
  "Mökkikerroin on negatiivinen" =
    all(alueet$mokkikerroin >= 0, na.rm = TRUE)
)

Aineiston mukaan Suomessa on 494 378 kesämökkiä.

Kesämökkien ja vakituisten asukkaiden suhde postinumeroalueittain.

Miten kuvaa luetaan. Vaaka-akselilla on luku, joka kertoo montako kesämökkiä alueella on jokaista vakituista asukasta kohti. Akseli on logaritminen, koska arvot vaihtelevat sadasosista kymmeniin.

Punainen katkoviiva merkitsee tilannetta, jossa mökkejä on yhtä monta kuin asukkaita. Sen oikealla puolella olevilla alueilla mökkejä on enemmän — eli kesällä paikalla voi olla moninkertainen määrä ihmisiä verrattuna väestörekisteriin.

Jakauma on hyvin leveä. Se tarkoittaa, että kausivaihtelu ei jakaudu tasaisesti vaan keskittyy tiettyihin paikkoihin.

Kesämökkien keskittyminen Suomessa.

Kysynnän siirtymä

Nyt voidaan laskea, miten latauskysyntä siirtyy kesällä. Laskenta vaatii muutaman oletuksen, ja koska yksikään niistä ei ole tarkasti tiedossa, ne annetaan jakaumina.

NoteFaktalaatikko: mistä latauskysyntä syntyy

Latausaseman kuormitus riippuu kolmesta asiasta: kuinka moni auto saapuu, kuinka kauan kukin lataa ja kuinka monta latauspaikkaa on.

Saapumistahti. Mökkimatkalainen lataa matkalla, jos matka ylittää auton kantaman. Suomessa valtaosa mökkimatkoista on muutaman sadan kilometrin mittaisia, joten osa autoista tarvitsee yhden pysähdyksen.

Latausaika. Suurteholaturilla tyypillinen pysähdys on 15–30 minuuttia. Latausnopeus ei ole vakio: akku ottaa vastaan täyttä tehoa vain osan ajasta, ja hidastuu merkittävästi kun varaustaso nousee yli 80 prosentin. Siksi latauspysähdys kestää kauemmin kuin pelkkä teho ja akkukoko antaisivat olettaa.

Palvelupaikkojen määrä. Aseman kapasiteetti ei ole sen teho vaan pistokkeiden lukumäärä. Kahden pistokkeen 350 kW:n asema palvelee kahta autoa kerrallaan, ei kolmea.

Miksi nämä annetaan jakaumina. Yksikään kolmesta ei ole tarkasti tiedossa. Latausaika riippuu automallista, säästä ja siitä kuinka tyhjänä akku on. Saapumistahti riippuu siitä, kuinka moni mökkiläinen ajaa sähköautolla ja kuinka moni heistä tarvitsee latausta matkalla. Jos näille annettaisiin pistearvot, tulos näyttäisi tarkemmalta kuin se on.

Code
# Aseman kapasiteetti: suurtehopistokkeiden määrä
kapasiteetti <- liitokset |>
  filter(teho_kw >= 150) |>
  group_by(avain) |>
  summarise(pistokkeita = n(), .groups = "drop") |>
  left_join(asemat, by = "avain") |>
  filter(!is.na(lat), !is.na(lon))

stopifnot("Kapasiteettitaulu tyhjä" = nrow(kapasiteetti) > 0)

# Mökit liitetään lähimpään suurtehuasemaan: kysyntä kohdistuu sinne,
# missä matkalainen todennäköisimmin pysähtyy.
asema_sf <- kapasiteetti |>
  st_as_sf(coords = c("lon", "lat"), crs = 4326) |>
  st_transform(3067)

mokki_pisteet <- pno |> filter(kesamokit > 0)

lahin <- st_nearest_feature(mokki_pisteet, asema_sf)

mokit_asemittain <- tibble(
  avain = asema_sf$avain[lahin],
  mokkeja = mokki_pisteet$kesamokit,
  asukkaat = mokki_pisteet$asukkaat
) |>
  group_by(avain) |>
  summarise(mokkeja = sum(mokkeja), vakiasukkaat = sum(asukkaat),
            .groups = "drop")

kuormitus <- kapasiteetti |>
  left_join(mokit_asemittain, by = "avain") |>
  replace_na(list(mokkeja = 0, vakiasukkaat = 0))

stopifnot(
  "Mökkien liitos hukkasi mökkejä" =
    abs(sum(kuormitus$mokkeja) - sum(mokki_pisteet$kesamokit)) < 1
)
Code
# Erlang C: todennäköisyys joutua jonoon M/M/c-järjestelmässä.
# a = tarjottu kuorma (saapumistahti kertaa palveluaika),
# c = palvelupaikkojen määrä.
erlang_c <- function(a, c) {
  if (a >= c) return(1)  # järjestelmä ylikuormittunut
  k <- 0:(c - 1)
  summa <- sum(a^k / factorial(k))
  viim <- a^c / (factorial(c) * (1 - a / c))
  viim / (summa + viim)
}

odotusaika_min <- function(lambda_per_h, palveluaika_min, c) {
  mu <- 60 / palveluaika_min          # palveluja tunnissa per paikka
  a <- lambda_per_h / mu              # tarjottu kuorma
  if (a >= c) return(NA_real_)        # jono kasvaa rajatta
  pw <- erlang_c(a, c)
  (pw / (c * mu - lambda_per_h)) * 60
}

# Epävarmat parametrit. Jokainen on jakauma, ei luku.
n_sim <- 3000

parametrit <- tibble(
  sim = seq_len(n_sim),
  # Osuus mökkikunnista, joihin saavutaan sähköautolla. Sidotaan
  # sarjan osassa 3 laskettuun sähköistymisasteeseen ja annetaan
  # sille väljä epävarmuus.
  sahko_osuus = rbeta(n_sim, 7, 93),
  # Kuinka suuri osa mökkimatkoista vaatii latauspysähdyksen
  lataustarve = rbeta(n_sim, 4, 6),
  # Latauspysähdyksen kesto minuutteina
  palveluaika = rgamma(n_sim, shape = 25, rate = 1),
  # Kuinka monta mökkiä saapuu juhannusaaton vilkkaimman
  # kuuden tunnin aikana
  saapumisikkuna_h = 6
)

stopifnot(
  "Palveluajat epäuskottavia" =
    all(between(parametrit$palveluaika, 5, 90)),
  "Osuudet jakauman ulkopuolella" =
    all(between(parametrit$sahko_osuus, 0, 1))
)

# Simulaatio asemittain: lasketaan odotusaika jokaiselle
# parametriyhdistelmälle ja asemalle.
simuloi_asema <- function(mokkeja, pistokkeita, p) {
  lambda <- mokkeja * p$sahko_osuus * p$lataustarve / p$saapumisikkuna_h
  map2_dbl(lambda, p$palveluaika,
           \(l, s) odotusaika_min(l, s, pistokkeita))
}

isot <- kuormitus |> filter(mokkeja >= 200, pistokkeita > 0)

tulokset <- map_dfr(seq_len(nrow(isot)), function(i) {
  odotus <- simuloi_asema(isot$mokkeja[i], isot$pistokkeita[i], parametrit)
  tibble(
    avain = isot$avain[i],
    nimi = isot$nimi[i],
    kunta = isot$kunta[i],
    mokkeja = isot$mokkeja[i],
    pistokkeita = isot$pistokkeita[i],
    mediaani_odotus = median(odotus, na.rm = TRUE),
    q90_odotus = quantile(odotus, 0.9, na.rm = TRUE),
    ylikuormitus_tn = mean(is.na(odotus))
  )
})

stopifnot(
  "Simulaatio ei tuottanut tuloksia" = nrow(tulokset) > 0,
  "Todennäköisyydet jakauman ulkopuolella" =
    all(between(tulokset$ylikuormitus_tn, 0, 1))
)

Priorien perustelu. Sähköautojen osuus saa jakauman, jonka keskimassa on muutaman prosentin tuntumassa — se vastaa sarjan osassa 3 laskettua kuntakohtaista sähköistymisastetta väljällä epävarmuudella. Lataustarve eli osuus matkoista, joilla pysähdytään, saa jakauman painottuen alle puoleen: lähimmälle mökille ajetaan ilman latausta, kauimmaiselle ei. Palveluajan jakauma painottuu kahdenkymmenenviiden minuutin tienoille, mikä vastaa tyypillistä suurtehulatausta.

Mikään näistä ei ole tarkka. Siksi ne ovat jakaumia, ja siksi tulos on jakauma.

Arvioitu jonotusaika juhannusaattona mökkivaltaisten alueiden latausasemilla.

Miten kuvaa luetaan. Jokainen rivi on latausasema mökkivaltaisen alueen lähellä. Punainen piste kertoo arvioidun jonotusajan tyypillisessä tilanteessa. Oranssi viiva ulottuu kohti epäsuotuisampaa skenaariota: sen oikea pää on arvo, joka ylittyy kymmenen prosentin todennäköisyydellä.

Viivan pituus on tässä yhtä kiinnostava kuin pisteen sijainti. Pitkä viiva tarkoittaa, että asema on herkkä oletuksille — pienikin muutos sähköautojen osuudessa tai latausajassa heiluttaa tulosta paljon. Lyhyt viiva tarkoittaa vakaata tilannetta.

Ylikuormituksen todennäköisyys: kuinka usein jono kasvaisi rajatta.

Mitä ylikuormitus tarkoittaa. Jonoteoriassa järjestelmä on ylikuormittunut, kun saapumistahti ylittää palvelukyvyn. Silloin jono ei asetu mihinkään tasapainoon vaan kasvaa niin kauan kuin ruuhka jatkuu.

Käytännössä se ei tarkoita loputonta jonoa vaan sitä, että ruuhka purkautuu vasta kun saapuminen hiljenee. Autoilijan kannalta ero on olennainen: tasapainossa olevassa jonossa odotusaika on ennustettava, ylikuormittuneessa ei.

Palkin pituus kertoo, kuinka suurella osalla simulaation parametriyhdistelmistä asema ylikuormittuu. Se ei ole ennuste vaan herkkyysmittari: korkea arvo tarkoittaa, että ylikuormitus tapahtuu monilla uskottavilla oletuksilla, ei vain pahimmassa tapauksessa.

Vaihtoehtoiset skenaariot

Code
# Kolme skenaariota, joissa muutetaan yhtä tekijää kerrallaan.
skenaariot <- list(
  "Nykytila" = list(kerroin = 1, pistoke_lisa = 0, asemia_pois = 0),
  "Sähköautoja 3× nykyinen" = list(kerroin = 3, pistoke_lisa = 0, asemia_pois = 0),
  "Kaksi pistoketta lisää / asema" = list(kerroin = 3, pistoke_lisa = 2, asemia_pois = 0),
  "Sähköautoja 3× ja 10 % asemista epäkunnossa" =
    list(kerroin = 3, pistoke_lisa = 0, asemia_pois = 0.10)
)

aja_skenaario <- function(s) {
  p <- parametrit |> mutate(sahko_osuus = pmin(sahko_osuus * s$kerroin, 1))

  d <- isot
  if (s$asemia_pois > 0) {
    # Epäkunnossa olevien asemien kysyntä siirtyy jäljelle jääville:
    # mökkimäärä kasvaa samassa suhteessa.
    d <- d |> mutate(mokkeja = mokkeja / (1 - s$asemia_pois))
  }
  d <- d |> mutate(pistokkeita = pistokkeita + s$pistoke_lisa)

  map_dfr(seq_len(nrow(d)), function(i) {
    odotus <- simuloi_asema(d$mokkeja[i], d$pistokkeita[i], p)
    tibble(
      avain = d$avain[i],
      mediaani = median(odotus, na.rm = TRUE),
      ylikuormitus = mean(is.na(odotus))
    )
  })
}

vertailu <- imap_dfr(skenaariot, \(s, nimi) {
  aja_skenaario(s) |> mutate(skenaario = nimi)
})

yhteenveto <- vertailu |>
  group_by(skenaario) |>
  summarise(
    mediaani_odotus = median(mediaani, na.rm = TRUE),
    asemia_ylikuormittuu = mean(ylikuormitus > 0.5),
    .groups = "drop"
  ) |>
  mutate(skenaario = factor(skenaario, levels = names(skenaariot)))

stopifnot(
  "Skenaariot eivät tuottaneet tuloksia" = nrow(yhteenveto) == length(skenaariot)
)

Neljä skenaariota: kysynnän kasvu, kapasiteetin lisäys ja häiriö.

Vertailun opetus on jonoteorian perustulos, joka on epäintuitiivinen ja siksi kertomisen arvoinen. Jonotusaika ei kasva tasaisesti kysynnän mukana. Se pysyy pitkään lähes muuttumattomana ja räjähtää sitten äkisti, kun kuormitus lähestyy kapasiteettia.

Tämä tarkoittaa, että latausverkko voi näyttää toimivalta aivan ongelman kynnykselle asti. Kun sähköautojen määrä kasvaa tasaisesti vuosi vuodelta, jonot eivät kasva tasaisesti — ne eivät kasva lainkaan, kunnes ne kasvavat paljon.

Mittari, joka seuraa keskimääräistä jonotusaikaa, antaa siis vihreää valoa viimeiseen hetkeen asti. Kapasiteetin käyttöaste varoittaa aikaisemmin, ja se on syy seurata sitä eikä jonoja.

ImportantMitä simulaatio ei ota huomioon

Saapumiset eivät ole satunnaisia. Jonomalli olettaa, että autot saapuvat toisistaan riippumatta. Juhannusliikenteessä ne eivät saavu: ruuhka on aalto, ja autot kulkevat samassa aallossa. Todellinen huippukuormitus on siis jyrkempi kuin malli antaa ymmärtää.

Autoilijat sopeutuvat. Jos jono on pitkä, osa ajaa seuraavalle asemalle tai odottaa. Malli ei tunne tätä, joten se yliarvioi jonot vilkkaimmilla asemilla ja aliarvioi ne naapurissa.

Mökkimatkan pituutta ei tunneta. Oletan, että lataustarve syntyy mökkimatkasta, mutta en tiedä mistä kukin lähtee. Pääkaupunkiseudulta Savonlinnaan ajava tarvitsee latauksen; naapurikunnasta tuleva ei.

Liikennemäärädataa ei ole käytetty. Väylävirastolla on kattava mittausverkko valtateillä, ja sen avulla kausivaihtelun voisi mitata arvioimisen sijaan. Se on luonteva tarkennus tähän analyysiin.

Nämä rajoitteet vaikuttavat eri suuntiin, enkä pysty sanomaan kumpi voittaa. Siksi esitän tulokset jakaumina ja vertailuina skenaarioiden välillä, en absoluuttisina ennusteina. Vertailu kestää oletusten epätarkkuuden paremmin kuin yksittäinen luku.

Mitä jää käteen

Suomi muuttaa paikkaa kesällä. Mökkikanta on jakautunut täysin eri tavalla kuin vakituinen asutus, ja osalla alueista mökkejä on enemmän kuin asukkaita.

Latausverkko on mitoitettu väärän kartan mukaan. Infrastruktuuri seuraa vakituista väestöä, koska se on se mitä tilastot kertovat.

Jonot eivät kasva tasaisesti. Ne pysyvät pieninä ja räjähtävät sitten. Siksi keskimääräinen jonotusaika on huono varoitusmittari ja kapasiteetin käyttöaste hyvä.

Kapasiteetti ei ole tehoa vaan pistokkeita. Aseman kyky palvella ruuhkaa riippuu siitä, montako autoa voi ladata yhtä aikaa — ei siitä kuinka nopeasti yksi lataa.

Seuraavassa osassa katson eteenpäin. Sähköautokanta kasvaa, ja kysymys on missä verkko pettää ensimmäisenä — sekä milloin.


Mitä tästä on hyötyä yrityksellesi

Mitoita huipun mukaan, älä keskiarvon. Keskimääräinen kuormitus on suunnittelun kannalta lähes hyödytön luku. Asiakaspalvelu, laskutus, varastointi ja palvelinkapasiteetti mitoitetaan huipun mukaan, ja huippu on yleensä monikerta keskiarvosta. Jos et tiedä omaa huippukerrointasi, se on ensimmäinen laskettava luku.

Opettele jonoteorian perustulos. Odotusaika ei kasva lineaarisesti kuormituksen mukana vaan räjähtää lähellä kapasiteettirajaa. Tämä on syy siihen, miksi “meillä on 85 prosentin käyttöaste, kaikki hyvin” on vaarallinen lause. Kahdeksankymmenenviiden ja yhdeksänkymmenenviiden prosentin välillä jonot moninkertaistuvat.

Sama ilmiö koskee ihmisiä: tiimi, joka on varattu 95-prosenttisesti, ei ole kymmenen prosenttia hitaampi kuin 85-prosenttisesti varattu, vaan moninkertaisesti hitaampi.

Käytä simulaatiota, kun parametrit ovat epävarmoja. Tässä osassa yksikään oletus ei ollut tiedossa. Vaihtoehtoja oli kaksi: valita pistearvot ja esittää tulos tarkkana, tai antaa jakaumat ja esittää tulos jakaumana. Jälkimmäinen on rehellisempi ja usein helpompi — satunnaislukujen arpominen on vähemmän työtä kuin yhden oikean arvon puolustaminen kokouksessa.

Erota herkkyys ja ennuste. Luku “ylikuormituksen todennäköisyys 40 %” ei tarkoita, että näin käy neljä kertaa kymmenestä. Se tarkoittaa, että ylikuormitus tapahtuu neljällä kymmenestä uskottavasta oletusyhdistelmästä. Se on herkkyysmittari, ja se on päätöksenteossa usein hyödyllisempi kuin ennuste — koska se kertoo, kuinka paljon oletuksilla on väliä.

Ja kysy, minkä kartan mukaan toimintasi on mitoitettu. Latausverkko on rakennettu väestökartan mukaan, ja kesällä kartta on väärä. Vastaava virhe on yleinen: palveluverkko mitoitetaan asiakkaiden kotiosoitteiden mukaan vaikka heidät tavoittaa työpaikalta, tai varasto sijoitetaan myyntialueen keskelle vaikka tilaukset tulevat laidalta. Kysy aina, kuvaako käyttämäsi jakauma sitä hetkeä, jolloin kapasiteettia tarvitaan.

Jos organisaatiossasi mitoitetaan kapasiteettia keskiarvoilla, tai jos kausivaihtelu on tiedossa mutta sitä ei ole laskettu auki, siinä on työtä odottamassa. Teen tätä vuokrattavana Head of Datana ja projektikohtaisesti — hinnasto ja yhteystiedot löytyvät sivustolta.


Aineistot: Tilastokeskuksen Paavo-postinumeroalueittainen avoin tieto, Fintraffic AFIR / Digitraffic, Eurostat GISCO. Koodi on kokonaisuudessaan tässä postauksessa. Maailma on jakauma.