Oikeusministeriön vaalien tulospalvelusta oli ladattavissa ehti puolenyön jälkeen jo alustavan laskennan tulokset aikaisempia vuosia vastaavissa datarakenteissa. Tein tähän yhden kuntatason kartan, jossa kunnan väri kertoo suosituimman puolueen ja siirtämällä osoittimen kunnan päälle näet sekä puolueiden kannatuksen vuodesta 2011 että viiden suosituimman ehdokkaan äänimäärät 2023 vaaleissa.
[/kode]
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
if (!file.exists("./2023-vaalit-kunta-aikasarja.RData")){
# 2023
<- tempfile()
flie download.file("https://tulospalvelu.vaalit.fi/EKV-2023/ekv-2023_puo_maa.csv.zip", flie)
<- tempdir()
tmpdir unzip(zipfile = flie, exdir = tmpdir)
<- read_csv2(glue("{tmpdir}/ekv-2023_tpat_maa.csv"), col_names = FALSE)
dat <- dat %>%
dat23 filter(grepl("\\*", X5),
!grepl("\\*", X3)) %>%
# äänimäärä ja ehdokasnumero kokonaisluvuiksi
mutate(X3 = as.integer(X3),
X35 = as.integer(X35),
X39 = as.integer(X39),
X40 = as.integer(X40),
X41 = as.integer(X41)) %>%
# vaalipiirit veks
filter(!is.na(X3)) %>%
# Merkistöenkoodaukset
mutate(
X17 = iconv(x = X17, from = "Windows-1252", to = "UTF-8"),
X11 = iconv(x = X11, from = "Windows-1252", to = "UTF-8"),
X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
X15 = iconv(x = X15, from = "Windows-1252", to = "UTF-8"),
X14 = iconv(x = X14, from = "Windows-1252", to = "UTF-8"),
X12 = iconv(x = X12, from = "Windows-1252", to = "UTF-8")
%>%
) select(X3,X6,X11,X14,X16,X39,X40,X41) %>%
# filter(X14 == "Helsinki") %>%
group_by(X3,X14) %>%
mutate(osuus = round(X41 / sum(X41) * 100,1)) %>%
arrange(desc(osuus)) %>%
# slice(1:3) %>%
mutate(rank = 1:n()) %>%
ungroup() %>%
select(X14,rank,X16,osuus)
# filter(X14 == "Honkajoki") %>% arrange(desc(osuus))
# 2019
<- tempfile()
flie download.file("https://tulospalvelu.vaalit.fi/EKV-2019/ekv-2019_puo_maa.csv.zip", flie)
<- tempdir()
tmpdir unzip(zipfile = flie, exdir = tmpdir)
<- read_csv2(glue("{tmpdir}/ekv-2019_tpat_maa.csv"), col_names = FALSE)
dat <- dat %>%
dat19 filter(grepl("\\*", X5),
!grepl("\\*", X3)) %>%
# äänimäärä ja ehdokasnumero kokonaisluvuiksi
mutate(X3 = as.integer(X3),
X35 = as.integer(X35),
X39 = as.integer(X39),
X40 = as.integer(X40),
X41 = as.integer(X41)) %>%
# vaalipiirit veks
filter(!is.na(X3)) %>%
# Merkistöenkoodaukset
mutate(
X17 = iconv(x = X17, from = "Windows-1252", to = "UTF-8"),
X11 = iconv(x = X11, from = "Windows-1252", to = "UTF-8"),
X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
X15 = iconv(x = X15, from = "Windows-1252", to = "UTF-8"),
X14 = iconv(x = X14, from = "Windows-1252", to = "UTF-8"),
X12 = iconv(x = X12, from = "Windows-1252", to = "UTF-8")
%>%
) select(X3,X6,X11,X14,X16,X39,X40,X41) %>%
# filter(X14 == "Helsinki") %>%
group_by(X3,X14) %>%
mutate(osuus = round(X41 / sum(X41) * 100,1)) %>%
arrange(desc(osuus)) %>%
# slice(1:3) %>%
mutate(rank = 1:n()) %>%
ungroup() %>%
select(X14,rank,X16,osuus)
# filter(X14 == "Honkajoki") %>% arrange(desc(osuus))
# 2015
<- tempfile()
flie download.file("https://tulospalvelu.vaalit.fi/E-2015/e-2015_puo_maa.csv.zip", flie)
<- tempdir()
tmpdir unzip(zipfile = flie, exdir = tmpdir)
# list.files(tmpdir)
<- read_csv2(glue("{tmpdir}/e-2015_tpat_maa.csv"), col_names = FALSE)
dat <- dat %>%
dat15 filter(grepl("\\*", X5),
!grepl("\\*", X3)) %>%
# äänimäärä ja ehdokasnumero kokonaisluvuiksi
mutate(X3 = as.integer(X3),
X35 = as.integer(X35),
X39 = as.integer(X39),
X40 = as.integer(X40),
X41 = as.integer(X41)) %>%
# vaalipiirit veks
filter(!is.na(X3)) %>%
# Merkistöenkoodaukset
mutate(
X17 = iconv(x = X17, from = "Windows-1252", to = "UTF-8"),
X11 = iconv(x = X11, from = "Windows-1252", to = "UTF-8"),
X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
X15 = iconv(x = X15, from = "Windows-1252", to = "UTF-8"),
X14 = iconv(x = X14, from = "Windows-1252", to = "UTF-8"),
X12 = iconv(x = X12, from = "Windows-1252", to = "UTF-8")
%>%
) select(X3,X6,X11,X14,X16,X39,X40,X41) %>%
# filter(X14 == "Helsinki") %>%
group_by(X3,X14) %>%
mutate(osuus = round(X41 / sum(X41) * 100,1)) %>%
arrange(desc(osuus)) %>%
# slice(1:3) %>%
mutate(rank = 1:n()) %>%
ungroup() %>%
select(X14,rank,X16,osuus)
# filter(X14 == "Honkajoki") %>% arrange(desc(osuus))
# 2011
<- tempfile()
flie download.file("https://tulospalvelu.vaalit.fi/EKV-2011/e-2011_puo_maa.csv.zip", flie)
<- tempdir()
tmpdir unzip(zipfile = flie, exdir = tmpdir)
# list.files(tmpdir)
<- read_csv2(glue("{tmpdir}/e-2011_tpat_maa.csv"), col_names = FALSE)
dat <- dat %>%
dat11 filter(grepl("\\*", X5),
!grepl("\\*", X3)) %>%
# äänimäärä ja ehdokasnumero kokonaisluvuiksi
mutate(X3 = as.integer(X3),
X35 = as.integer(X35),
X39 = as.integer(X39),
X40 = as.integer(X40),
X41 = as.integer(X41)) %>%
# vaalipiirit veks
filter(!is.na(X3)) %>%
# Merkistöenkoodaukset
mutate(
X17 = iconv(x = X17, from = "Windows-1252", to = "UTF-8"),
X11 = iconv(x = X11, from = "Windows-1252", to = "UTF-8"),
X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
X15 = iconv(x = X15, from = "Windows-1252", to = "UTF-8"),
X14 = iconv(x = X14, from = "Windows-1252", to = "UTF-8"),
X12 = iconv(x = X12, from = "Windows-1252", to = "UTF-8")
%>%
) select(X3,X6,X11,X14,X16,X39,X40,X41) %>%
# filter(X14 == "Helsinki") %>%
group_by(X3,X14) %>%
mutate(osuus = round(X41 / sum(X41) * 100,1)) %>%
arrange(desc(osuus)) %>%
# slice(1:3) %>%
mutate(rank = 1:n()) %>%
ungroup() %>%
select(X14,rank,X16,osuus)
names(dat11) <- c("kunta","rank","puolue","osuus")
names(dat15) <- c("kunta","rank","puolue","osuus")
names(dat19) <- c("kunta","rank","puolue","osuus")
names(dat23) <- c("kunta","rank","puolue","osuus")
<- bind_rows(dat11 %>% mutate(vuosi = 2011),
dat %>% mutate(vuosi = 2015),
dat15 %>% mutate(vuosi = 2019),
dat19 %>% mutate(vuosi = 2023))
dat23
<- dat %>%
dat_2 mutate(pl = case_when(
== "Vihreä liitto" ~ "VIHR",
puolue == "Vasemmistoliitto" ~ "VAS",
puolue == "Suomen Sosialidemokraattinen Puolue" ~ "SDP",
puolue == "Suomen ruotsalainen kansanpuolue" ~ "RKP",
puolue == "Suomen Kristillisdemokraatit (KD)" ~ "KD",
puolue == "Suomen Keskusta" ~ "KESK",
puolue == "Sininen tulevaisuus" ~ "SIN",
puolue == "Perussuomalaiset" ~ "PS",
puolue == "Kansallinen Kokoomus" ~ "KOK",
puolue == "Liike Nyt" ~ "Liike Nyt",
puolue == "För Åland, gemensam lista" ~ "FÅ",
puolue # puolue == "Åländsk samling" ~ "Åländsk samling",
# puolue == "Åländsk samling gemensam lista" ~ "Åländsk samling gemensam lista",
# puolue == "Alternativ för Åland - gemensam lista" ~ "Alternativ för Åland - gemensam lista",
# puolue == "Gemensam lista Alliansen för Åland - samarbete för självstyrelse och utveckling" ~ "Gemensam lista Alliansen för Åland - samarbete för självstyrelse och utveckling",
# grepl("Jessica", puolue) ~ "Jessica Eckerman",
# puolue == "Liberalerna på Åland" ~ "Liberalerna på Åland",
# puolue == "Markus Kuotesaho" ~ "Markus Kuotesaho",
TRUE ~ "muut"
%>%
)) filter(pl != "muut")
<- dat_2 %>% filter(vuosi == 2023, rank == 1) %>%
dat_2_r1 rename(municipality_name_fi = kunta)
# tehdään png-kuvat labeleihin
# fs::dir_create("../../images/png_labs_vaalit2023")
<- unique(dat_2$kunta)
kuntanimet for (i in seq(kuntanimet)){
print(paste0(i,"/",length(kuntanimet)))
<- dat_2 %>% filter(kunta == kuntanimet[i])
dat_tmp
# että värit menee oikein
if ("RKP" %in% unique(dat_tmp$pl)){
<- dat_tmp %>% mutate(pl = factor(pl))
dat_tmp else {
} <- bind_rows(dat_tmp,
dat_tmp tibble(
puolue = "Ruotsalainen kansanpuolue",
osuus = 0,
kunta = kuntanimet[i],
rank = max(dat_tmp$rank, na.rm = TRUE) + 1,
pl = "RKP"
%>%
)) mutate(pl = factor(pl))
}
#%>%
# filter(pl != "muut")
<- ggplot(data = dat_tmp,
p aes(x = vuosi, y = osuus, color = pl, fill = pl)) +
geom_line() +
geom_point(shape = 21, color = "white", size = 2.5, stroke = 2.7) +
::geom_label_repel(data = dat_tmp %>%
ggrepelfilter(vuosi == 2023),
aes(label = pl), #color = "white",
family = "Space Mono",
size = 3.2, nudge_y = 1, color = "black", label.padding = unit(1, "mm")) +
scale_color_brewer(palette = "Set1") +
scale_fill_brewer(palette = "Set1") +
::geom_text_repel(data = dat_tmp,
ggrepelaes(label = glue("{osuus} %")),
family = "Space Mono",
size = 3.2, nudge_y = -1) +
::theme_ipsum_rc(base_size = 10, grid = "XY", plot_title_size = 9) +
hrbrthemesscale_x_continuous(breaks = c(2011, 2015, 2019,2023)) +
theme(legend.position = "none",
plot.margin = unit(c(1,1,1,1), "mm"),
plot.background = element_rect(fill = "transparent", color = NA),
panel.background = element_rect(fill = "transparent", color = NA)) +
labs(x = NULL, y = "kannatus (%)")
# p
ggsave(filename = glue("./png_labs/{kuntanimet[i]}.png"), width = 3.8, height = 2.9, dpi = 100)
}
<- geofi::get_municipalities(year = 2022) %>% mutate(vuosi = 2023)
kunnat
<- left_join(kunnat, dat_2_r1)
dat_kartta_voittaja
save.image(file = "./2023-vaalit-kunta-aikasarja.RData")
}
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
load(file = "./2023-vaalit-kunta-aikasarja.RData")
# download.file("https://tulospalvelu.vaalit.fi/EKV-2023/ekv-2023_ehd_maa.csv.zip", "ekv-2023_ehd_maa.csv.zip")
# unzip(zipfile = "ekv-2023_ehd_maa.csv.zip", exdir = "./")
<- read_csv2("ekv-2023_aea_maa.csv", col_names = FALSE)
dat <- dat %>%
dat_kunnat filter(grepl("\\*", X5)) %>% #View()
# äänimäärä ja ehdokasnumero kokonaisluvuiksi
mutate(X3 = as.integer(X3),
X35 = as.integer(X35),
X15 = as.integer(X15)) %>%
# vaalipiirit veks
filter(!is.na(X3)) %>%
# Merkistöenkoodaukset
mutate(X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
X12 = iconv(x = X12, from = "Windows-1252", to = "UTF-8")) %>%
# filter(X3 == 924) %>%
select(X3,X5,X6,X12,X15,X16,X18,X19,X35)
<- dat_kunnat %>%
dat_alue # lasketaan kuntakohtaiset summat
group_by(X3) %>%
mutate(X35_summa = sum(X35, na.rm = TRUE)) %>%
ungroup() %>%
# Lasketaan kullekin uurnalla ja ehdokkaalle ääniosuus
mutate(osuus = round(X35 / X35_summa*100, 1)) %>%
group_by(X3,X16) %>%
arrange(desc(osuus)) %>%
slice(1:5) %>%
mutate(rank = 1:n()) %>%
ungroup() %>%
mutate(nimi = paste(X18,X19)) %>%
select(X3,X16,nimi,X12,X35,rank,osuus) %>%
arrange(X3,rank)
# puoluekohtaiset kannatukset
<-dat_2_r1 %>% select(-vuosi)
dat_puoluekannatus
<- dat_alue %>% filter(rank == 1)
dat_alue_voittaja <- dat_alue %>%
dat_alue_top3 mutate(nimi = glue("<tr><td>{rank}</td><td>{nimi}</td><td>{X12}</td><td>{osuus}%</td><td>{X35}</td></tr>")) %>%
select(-osuus,-X35,-X12) %>%
spread(key = rank, value = nimi) %>%
setNames(c("X3","X16","t1","t2","t3","t4","t5"))
# äänestysalueet
# kunnat19 <- readRDS(url("https://gitlab.com/muuankarski/kelagis_data/raw/master/rds/sf19.RDS"))
<- geofi::get_municipalities(year = 2022)
kunnat19 # kunnat19 <- st_transform(x = kunnat19, crs = "+proj=longlat +init=epsg:3067")
# st_transform(muni, "EPSG:4326")
$NATCODE <- kunnat19$municipality_code
kunnat19$NAMEFIN <- kunnat19$municipality_name_fi
kunnat19<- st_transform(kunnat19, "EPSG:4326")
kunnat19
<- left_join(kunnat19, dat_alue_top3, by = c("NATCODE" = "X3"))
dat_kartta_top3 <- left_join(kunnat19, dat_alue_voittaja, by = c("NATCODE" = "X3"))
dat_kartta_voittaja <- left_join(kunnat19, dat_puoluekannatus)
dat_kartta_puolue
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
<- leaflet::colorFactor(palette = "Set1", domain = factor(dat_kartta_puolue$pl))
pal
<- leafletCRS(crsClass = "L.Proj.CRS", code = "EPSG:3067",
epsg3067 proj4def = "+proj=utm +zone=35 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs",
resolutions = 2^(13:-1), # 8192 down to 0.5
origin = c(0, 0)
)
<- sprintf(
labels '<div class="card" style="width: auto;">
<div class="card-body">
<h5 class="card-title">%s</h5>
<img src ="png_labs/%s.png">
<table class="table table-sm">
<thead>
<tr>
<th scope="col">sija</th>
<th scope="col">nimi</th>
<th scope="col">puolue</th>
<th scope="col">kannatus</th>
<th scope="col">äänet</th>
</tr>
</thead>
<tbody>
%s
%s
%s
%s
%s
</tbody>
</table>
</div>
</div>',
$NAMEFIN,
dat_kartta_top3$NAMEFIN,
dat_kartta_top3$t1,
dat_kartta_top3$t2,
dat_kartta_top3$t3,
dat_kartta_top3$t4,
dat_kartta_top3$t5
dat_kartta_top3%>% lapply(htmltools::HTML)
)
# labels <- sprintf('
# <div class="card" style="width: auto;">
# <div class="card-body">
# <h5 class="card-title">%s</h5>
# <img src ="png_labs/%s.png">
# </div>
# </div>',
# dat_kartta_voittaja$municipality_name_fi,
# dat_kartta_voittaja$municipality_name_fi
# ) %>% lapply(htmltools::HTML)
leaflet(dat_kartta_puolue, options = leafletOptions(worldCopyJump = F, crs = epsg3067)) %>%
# addProviderTiles(provider = providers$CartoDB.Positron) %>%
::setView(lng = 25.25,lat = 61.742, zoom = 4) %>%
leafletaddPolygons(fillColor = ~pal(factor(pl)),
color = "white",
weight = 1,
opacity = 1,
dashArray = "3",
fillOpacity = 0.4,
highlight = highlightOptions(
weight = 2,
color = "#666",
dashArray = "",
fillOpacity = 0.4,
bringToFront = TRUE),
label = labels,
labelOptions = labelOptions(opacity = .7,
style = list("font-weight" = "normal",
"font-family" = "Courier New",
"padding" = "0px"),
textsize = "12px",
direction = "auto")
%>%
) addLegend(pal = pal, values = ~pl, opacity = 0.7, title = "Kunnan suosituin puolue",
position = "bottomright") %>%
::addFullscreenControl() leaflet.extras
Uudelleenkäyttö
Viittaus
BibTeX-viittaus:
@online{kainu2023,
author = {Kainu, Markus},
title = {Eduskuntavaalit 2023: ehdokkaiden kannatus ja puolueiden
kannatuksen aikasarjat kuntatasolla},
date = {2023-04-02},
url = {https://markuskainu.fi/posts/2023-04-02-eduskuntavaalit-kunta/},
langid = {fi}
}
Viitatkaa tähän teokseen seuraavasti:
Kainu, Markus. 2023. “Eduskuntavaalit 2023: ehdokkaiden kannatus
ja puolueiden kannatuksen aikasarjat kuntatasolla.” April 2,
2023. https://markuskainu.fi/posts/2023-04-02-eduskuntavaalit-kunta/.