Analysoin alkukuusta Liikenneviraston henkilöliikennetutkimuksen tulostaulukoista kulkutapoja kaupunki–maaseutu-alueittain. Tutkimuksessa on tehty lisäotoksia niistä maksaneille kaupunkiseuduille, kaupungille (Salo) ja maakunnalle (Päijät-Häme). Aluekohtaisia tuloksia on virallisesti julkaistu aluekohtaisissa raporteissa, mutta lisäotosten tietoja ei voi raporteista helposti verrata keskenään. On kuitenkin helppo lukea kaikki excelit samalla kertaa sisään ja ajaa niihin vuoronperään koodia R:n purrr
-paketin map()
-funktioilla.
Jotta saan käsityön minimoitua, lataan taulukot suoraan R:llä katsomatta nettisivua lainkaan. Lunttaan tosin käsipelillä kiinnostavan taulun nimen ja sarakkeiden sisällön.
library(tidyverse)
library(rvest)
# tekstinkäsittelyfunktiot
tekstit <- function(x) {
x <- gsub("_tulokset", "", x)
x <- gsub("_", " ", x)
x <- gsub("ät Hä", "ät-Hä", x) # Päijät-Häme special
}
isoksi <- function(x) {
y <- str_sub(x, 1, 1)
paste0(toupper(y), str_sub(x, 2, nchar(x)))
}
# sama linkki kuin ylempänä tekstissä
tulossivu <- read_html("https://www.liikennevirasto.fi/tilastot/henkiloliikennetutkimus/tuloksia-taulukoina#.W8imDmgzavs")
# haetaan osoitteet
urlit <- html_nodes(tulossivu, "a") %>%
html_attr("href") %>%
subset(str_detect(., "_tulo")) %>%
paste0("https://www.liikennevirasto.fi", .) %>%
enframe() %>%
transmute(name = map_chr(str_split(value, "/"), str_subset, "\\.xlsx$") %>%
str_replace(".xlsx", "") %>%
tekstit() %>%
isoksi(),
value)
Saan kätevästi tauluun kiinnostavien tiedostojen osoitteet:
> urlit
# A tibble: 10 x 2
name value
<chr> <chr>
1 Helsingin seutu https://www.liikennevirasto.fi/documents/20473/439901/Helsingin_seutu_tulokset.xlsx/e20b43ce-1794-4539-bb4f-6ab1c2eab5f3
2 Oulun seutu https://www.liikennevirasto.fi/documents/20473/439901/Oulun_seutu_tulokset.xlsx/66e63701-d199-42cc-82a9-29ba592e4906
3 Tampereen seutu https://www.liikennevirasto.fi/documents/20473/439901/Tampereen_seutu_tulokset.xlsx/cafbffb8-0c7d-427c-810c-5c50feb522f5
4 Turun seutu https://www.liikennevirasto.fi/documents/20473/439901/Turun_seutu_tulokset.xlsx/c52cc5a8-6c6e-4623-9f46-929021b1ca36
5 Joensuun ydinkaupunkiseu~ https://www.liikennevirasto.fi/documents/20473/439901/Joensuun_ydinkaupunkiseutu_tulokset.xlsx/ba82ff62-9feb-40e9-bda0-b3~
6 Päijät-Häme https://www.liikennevirasto.fi/documents/20473/439901/Päijät_Häme_tulokset.xlsx/b6a875b7-9538-4c8b-9064-6f5b68efe230
7 Riihimäen seutu https://www.liikennevirasto.fi/documents/20473/439901/Riihimäen_seutu_tulokset.xlsx/552e0bbc-ec09-4364-a4e7-3204cd39acd0
8 Salo https://www.liikennevirasto.fi/documents/20473/439901/Salo_tulokset.xlsx/866ffaaf-b158-4a1a-879d-040299e37f3d
9 Itäinen Uusimaa https://www.liikennevirasto.fi/documents/20473/439901/itäinen_Uusimaa_tulokset.xlsx/c5c5412f-fc13-404e-86d0-d0ed6953b171
10 Läntinen Uusimaa https://www.liikennevirasto.fi/documents/20473/439901/läntinen_Uusimaa_tulokset.xlsx/2dc40f93-6ca1-48f8-a8dd-56947553e9d4
Seuraavaksi muutamalla rivillä ensin lataan kaikki tiedostot hakemistoon ja luen ne sisään.
# ladataan tiedostot
# dir.create("data/hlt/", recursive = TRUE) # tarvittaessa
urlit %>%
pwalk(~ download.file(..2, destfile = paste0("data/hlt/", ..1, ".xlsx"), method = "curl"))
# tsekkasin myös sheetin ja kiinnostavat rivit
data_raw <- urlit %>%
select(name) %>%
mutate(path = paste0("data/hlt/", name, ".xlsx") %>% enc2native()) %>% # ääkkösiä nimissä
mutate(data = map(path, readxl::read_excel, sheet = "D183", skip = 12, n_max = 9, col_names = FALSE))
Data on listasarakkeessa.
> data_raw
# A tibble: 10 x 3
name path data
<chr> <chr> <list>
1 Helsingin seutu data/hlt/Helsingin seutu.xlsx <tibble [8 x 9]>
2 Oulun seutu data/hlt/Oulun seutu.xlsx <tibble [8 x 9]>
3 Tampereen seutu data/hlt/Tampereen seutu.xlsx <tibble [8 x 9]>
4 Turun seutu data/hlt/Turun seutu.xlsx <tibble [8 x 9]>
5 Joensuun ydinkaupunkiseutu data/hlt/Joensuun ydinkaupunkiseutu.xlsx <tibble [8 x 9]>
6 Päijät-Häme data/hlt/Päijät-Häme.xlsx <tibble [8 x 9]>
7 Riihimäen seutu data/hlt/Riihimäen seutu.xlsx <tibble [8 x 9]>
8 Salo data/hlt/Salo.xlsx <tibble [8 x 9]>
9 Itäinen Uusimaa data/hlt/Itäinen Uusimaa.xlsx <tibble [8 x 9]>
10 Läntinen Uusimaa data/hlt/Läntinen Uusimaa.xlsx <tibble [8 x 9]>
Siistitään seuraavaksi data ja muotoillaan vielä kuvaakin varten oma taulunsa.
# tsekkasin sarakkeiden nimet etukäteen
nimet <- c("tarkoitus", "kk", "pp", "jk", "ha1", "ha2", "muu", "kaikki")
data_all <- data_raw %>%
select(-path) %>%
unnest() %>%
select(-ncol(.)) %>% # viimeinen tyhjä sarake pois
set_names("name", nimet) %>%
mutate(tarkoitus = isoksi(tarkoitus)) %>%
mutate_at(vars(name, tarkoitus), as_factor)
# muotoillaan data kuvaa varten
data_kuva <- data_all %>%
transmute(name, tarkoitus, kk, pp, jk, ha = ha1 + ha2, muu, kaikki) %>% # kuski ja kyytiläinen yhteen henkilöautoluokkaan
mutate(tarkoitus = fct_relevel(tarkoitus, "Työ", "Työasia", "Koulu, opiskelu", "Ostos",
"Asiointi, muu henkilökohtainen", "Saattaminen, kyyditseminen", "Vapaa-aika")) %>%
gather(kt, matkat, kk:muu) %>%
mutate(kt = as_factor(kt)) %>%
filter(!str_detect(tarkoitus, "Kaikki")) %>%
group_by(name, tarkoitus) %>%
mutate(p_tar = matkat / sum(matkat)) %>% # pyöräilyn osuus tarkoituksesta
group_by(name, kt) %>%
mutate(p_kt = matkat / sum(matkat)) %>% # tarkoituksen osuus pyöräilystä
ungroup()
Ja piirretään kuva.
data_kuva %>%
ggplot(aes(tarkoitus %>% fct_rev(), p_tar, fill = kt %>% fct_rev())) +
facet_wrap(~ name, ncol = 2) +
geom_col() +
coord_flip() +
geom_hline(yintercept = c(0.25, 0.5, 0.75), lty = 3, color = "gray50") +
ggrepel::geom_text_repel(aes(label = format(round(p_tar * 100, 1), decimal.mark = ",")),
position = position_stack(vjust = 0.5), size = 3,
direction = "x", box.padding = 0, point.padding = 0, segment.colour = "transparent") +
scale_fill_brewer(palette = "Set2", name = NULL, labels = rev(c("Jalankulku", "Pyöräily", "Joukkoliikenne", "Henkilöauto", "Muu"))) +
scale_y_continuous(labels = function(x) paste(x * 100, "%")) +
guides(fill = guide_legend(reverse = TRUE)) +
theme_minimal() +
theme(legend.position = "top") +
labs(x = NULL, y = NULL)