Eduskuntavaalit 2023: puolueiden ja ehdokkaiden kannatukset Helsingin äänestysalueilla

data analysis
R
election
vaalit2023
eduskuntavaalit2023
avoin data
open data
spatial
Tekijä
Julkaistu

15. huhtikuuta 2023

Alla olevassa kartassa esitetään 2023 vuoden eduskuntavaalien äänestysaluekohtaiset tulokset viiden suosituimman ehdokkaan osalta. Alueen väri merkitsee suosituinta ehdokasta. Siirtämällä osoittimen alueen päälle näet viiden suosituimmain ehdokkaan tulokset.

Tiedot on ladattavissa Oikeusministeriön vaalien tulospalvelusta.

[/kode]
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
# dir.create("./vaalidata2/", recursive = TRUE)
# download.file("https://tulospalvelu.vaalit.fi/EKV-2023/ekv-2023_ehd_maa.csv.zip", "./vaalidata/ekv-2023_ehd_maa.csv.zip")
# unzip(zipfile = "./vaalidata/ekv-2023_ehd_maa.csv.zip", exdir = "./vaalidata/")
dat <- read_csv2("./vaalidata/ekv-2023_teat_maa.csv", col_names = FALSE)
dat_hel <- dat %>% 
  # valitaan vaan Helsingin äänet JA 
  filter(X6 == "HEL", 
         # ainoastaan äänestyspaikkakohtaiset tiedot
         !grepl("\\*", X5),
         nchar(X5) == 4) %>% 
  select(X5,X6,X15,X16,X12,X18,X19,X35) %>%
  # 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"),
         # äänimäärä ja ehdokasnumero kokonaisluvuiksi
         X35 = as.integer(X35),
         X15 = as.integer(X15)) 

dat_alue <- dat_hel %>%   
  # lasketaan uurnakohtaiset summat
  group_by(X5) %>% 
  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(X5,X16) %>% 
  arrange(desc(osuus)) %>% 
  slice(1:5) %>% 
  mutate(rank = 1:n()) %>% 
  ungroup() %>% 
  mutate(nimi = paste(X18,X19)) %>% 
  select(X5,X16,nimi,X12,X35,rank,osuus) %>% 
  arrange(X5,rank)

dat_alue_voittaja <- dat_alue %>% filter(rank == 1)
dat_alue_top3 <- dat_alue %>% 
  mutate(nimi = glue("<tr><td>{rank}</td><td>{nimi}</td><td>{X12}</td><td>{osuus}%</td><td>{X35}</td></tr>")) %>%
  select(-osuus,- X35,-X12) %>% 
  pivot_wider(names_from = rank, values_from = nimi) %>% 
  setNames(c("X5","X16","t1","t2","t3","t4","t5"))


hel_aanestysalueet <- st_read(dsn = "./SHP/Aanestysaluejako_PKS_2023.shp", quiet = TRUE)
# hel_aanestysalueet <- st_read(dsn = "./SHP/Aanestysaluejako_PKS_2019.shp", quiet = TRUE)
hel_aanestysalueet <- st_transform(hel_aanestysalueet, crs = 4326)
hel_aanestysalueet$X5 <- paste0("0", hel_aanestysalueet$tunnus)

hel_aanestysalueet$X5 <- stringr::str_pad(hel_aanestysalueet$tunnus, width = 4, pad = "0")


dat_kartta_top3 <- right_join(hel_aanestysalueet, dat_alue_top3, by = c("X5" = "X5"))
dat_kartta_voittaja <- right_join(hel_aanestysalueet %>% select(-nimi), dat_alue_voittaja, by = c("X5" = "X5"))

#| column: page
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
pal <- leaflet::colorFactor(palette = "Set1", domain = factor(dat_kartta_voittaja$nimi))

labels <- sprintf(
  '<div class="card" style="width: auto;">
  <div class="card-body">
    <h5 class="card-title">%s</h5>
  <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>',
  dat_kartta_top3$X16, dat_kartta_top3$t1, 
dat_kartta_top3$t2, 
dat_kartta_top3$t3, 
dat_kartta_top3$t4, 
dat_kartta_top3$t5
) %>% lapply(htmltools::HTML)

leaflet(dat_kartta_voittaja) %>% 
  leaflet::setView(lng = 24.931,lat = 60.172, zoom = 12) %>%
  addProviderTiles(provider = providers$CartoDB.Positron) %>%
  addPolygons(fillColor = ~pal(factor(nimi)),
              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 = ~nimi, opacity = 0.7, title = "Äänestysalueen suosituin ehdokas",
            position = "bottomright") %>% 
  leaflet.extras::addFullscreenControl()
[/kode]
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
dat <- read_csv2("./vaalidata/ekv-2023_teat_maa.csv", col_names = FALSE)
dat_hel <- dat %>% 
  # valitaan vaan Helsingin äänet JA 
  filter(X6 == "HEL", 
         # ainoastaan äänestyspaikkakohtaiset tiedot
         !grepl("\\*", X5),
         nchar(X5) == 4) %>% 
  select(X5,X6,X15,X16,X12,X18,X19,X35) %>%
  # 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"),
         # äänimäärä ja ehdokasnumero kokonaisluvuiksi
         X35 = as.integer(X35),
         X15 = as.integer(X15)) 

dat_alue <- dat_hel %>%   
  # lasketaan uurnakohtaiset summat
  group_by(X5) %>% 
  mutate(aa_alue_sum = sum(X35, na.rm = TRUE)) %>%
  ungroup() %>% 
  # Lasketaan kullekin uurnalla ja ehdokkaalle ääniosuus
  group_by(X5,X16,X12) %>%
  mutate(osuus = round(X35 / aa_alue_sum*100, 1)) %>% 
  group_by(X5,X16) %>% 
  arrange(desc(osuus)) %>% 
  slice(1:5) %>% 
  mutate(rank = 1:n()) %>% 
  ungroup() %>% 
  mutate(nimi = paste(X18,X19)) %>% 
  select(X5,X16,nimi,X12,X35,rank,osuus) %>% 
  arrange(X5,rank)

dat_alue_voittaja <- dat_alue %>% filter(rank == 1)
dat_alue_top3 <- dat_alue %>% 
  mutate(nimi = glue("<tr><td>{rank}</td><td>{nimi}</td><td>{X12}</td><td>{osuus}%</td><td>{X35}</td></tr>")) %>%
  select(-osuus,- X35,-X12) %>% 
  pivot_wider(names_from = rank, values_from = nimi) %>% 
  setNames(c("X5","X16","t1","t2","t3","t4","t5"))


hel_aanestysalueet <- st_read(dsn = "./SHP/Aanestysaluejako_PKS_2023.shp", quiet = TRUE)
# hel_aanestysalueet <- st_read(dsn = "./SHP/Aanestysaluejako_PKS_2019.shp", quiet = TRUE)
hel_aanestysalueet <- st_transform(hel_aanestysalueet, crs = 4326)
hel_aanestysalueet$X5 <- paste0("0", hel_aanestysalueet$tunnus)

hel_aanestysalueet$X5 <- stringr::str_pad(hel_aanestysalueet$tunnus, width = 4, pad = "0")


dat_kartta_top3 <- right_join(hel_aanestysalueet, dat_alue_top3, by = c("X5" = "X5"))
dat_kartta_voittaja <- right_join(hel_aanestysalueet %>% select(-nimi), dat_alue_voittaja, by = c("X5" = "X5"))

#| column: page
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
pal <- leaflet::colorFactor(palette = "Set1", domain = factor(dat_kartta_voittaja$nimi))

labels <- sprintf(
  '<div class="card" style="width: auto;">
  <div class="card-body">
    <h5 class="card-title">%s</h5>
  <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>',
  dat_kartta_top3$X16, dat_kartta_top3$t1, 
dat_kartta_top3$t2, 
dat_kartta_top3$t3, 
dat_kartta_top3$t4, 
dat_kartta_top3$t5
) %>% lapply(htmltools::HTML)

leaflet(dat_kartta_voittaja) %>% 
  leaflet::setView(lng = 24.931,lat = 60.172, zoom = 12) %>%
  addProviderTiles(provider = providers$CartoDB.Positron) %>%
  addPolygons(fillColor = ~pal(factor(nimi)),
              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 = ~nimi, opacity = 0.7, title = "Äänestysalueen suosituin ehdokas",
            position = "bottomright") %>% 
  leaflet.extras::addFullscreenControl()

Uudelleenkäyttö

Viittaus

BibTeX-viittaus:
@online{kainu2023,
  author = {Kainu, Markus},
  title = {Eduskuntavaalit 2023: puolueiden ja ehdokkaiden kannatukset
    Helsingin äänestysalueilla},
  date = {2023-04-15},
  url = {https://markuskainu.fi/posts/2023-04-02-helsingin_aanestysalueet/},
  langid = {fi}
}
Viitatkaa tähän teokseen seuraavasti:
Kainu, Markus. 2023. “Eduskuntavaalit 2023: puolueiden ja ehdokkaiden kannatukset Helsingin äänestysalueilla.” April 15, 2023. https://markuskainu.fi/posts/2023-04-02-helsingin_aanestysalueet/.