Created
October 22, 2019 22:04
-
-
Save psobczyk/47a9972a6392e75e1a579259d24b0af1 to your computer and use it in GitHub Desktop.
Analysis of polish general elections 2019
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Files with data come from https://wybory.gov.pl/sejmsenat2019/pl/dane_w_arkuszach | |
require(dplyr) | |
require(magrittr) | |
require(tidyr) | |
require(broom) | |
require(ggparliament) | |
# Sejm elections. Could void votes affect results? | |
okregi <- read.csv2("okregi_sejm.csv", stringsAsFactors = F) | |
okregi <- okregi %>% | |
select(Numer.okręgu, Liczba.mandatów) | |
wyniki <- read.csv2("~/Downloads/wyniki_gl_na_listy_po_okregach_proc_sejm.csv", | |
stringsAsFactors = F) | |
# hypothetical situation - void votes go to sld | |
wyniki <- wyniki %>% | |
rename(ko = KOALICYJNY.KOMITET.WYBORCZY.KOALICJA.OBYWATELSKA.PO..N.IPL.ZIELONI...ZPOW.601.6.19, | |
konfederacja = KOMITET.WYBORCZY.KONFEDERACJA.WOLNOŚĆ.I.NIEPODLEGŁOŚĆ...ZPOW.601.5.19, | |
psl = KOMITET.WYBORCZY.POLSKIE.STRONNICTWO.LUDOWE...ZPOW.601.19.19, | |
pis = KOMITET.WYBORCZY.PRAWO.I.SPRAWIEDLIWOŚĆ...ZPOW.601.9.19, | |
lewica = KOMITET.WYBORCZY.SOJUSZ.LEWICY.DEMOKRATYCZNEJ...ZPOW.601.1.19, | |
mn = KOMITET.WYBORCZY.WYBORCÓW.MNIEJSZOŚĆ.NIEMIECKA...ZPOW.601.15.19) %>% | |
mutate(lewica = lewica + X..głosów.nieważnych * W.tym.z.powodu.postawienia.znaku..X..obok.nazwiska.dwóch.lub.większej.liczby.kandydatów.z.różnych.list / 100) %>% | |
gather(komitet, poparcie, ko:mn) %>% | |
filter(komitet %in% c("ko", "konfederacja", "psl", "pis", "lewica", "mn")) | |
wyniki <- inner_join(wyniki, okregi) | |
parliament <- wyniki %>% | |
group_by(Numer.okręgu, komitet) %>% | |
do(tidy(t(.$poparcie/(1:.$Liczba.mandatów[1])))) %>% | |
ungroup() %>% | |
ungroup() %>% | |
gather(mandat, poparcie, -Numer.okręgu, -komitet) %>% | |
mutate(mandat = as.numeric(gsub('X', '', mandat))) %>% | |
filter(!is.na(poparcie)) %>% | |
group_by(Numer.okręgu) %>% | |
mutate(mandaty_w_okregu = max(mandat)) %>% | |
arrange(Numer.okręgu, desc(poparcie)) %>% | |
filter(row_number() <= mandaty_w_okregu) %>% | |
group_by(komitet) %>% | |
summarise(liczba_mandatow=n()) | |
parliament$colour <- c('#FCA241', '#000000', '#ed1c24', 'yellow', '#073A76', '#1BB100') | |
parliament$party_short <- paste(c('KO', 'Konf', 'SLD', 'MN', 'PiS', 'PSL'), "-", parliament$liczba_mandatow) | |
parliament$komitet <- factor(parliament$komitet, levels = c("lewica", 'ko', 'psl', 'mn', 'konfederacja', 'pis'), | |
ordered = T) | |
parliament <- arrange(parliament, komitet) | |
sejm <- parliament_data(election_data = parliament, | |
parl_rows = 11, | |
type = 'semicircle', | |
party_seats = parliament$liczba_mandatow) | |
ggplot(sejm, aes(x, y, colour = komitet)) + | |
geom_parliament_seats(size = 3) + | |
labs(colour="Partia", subtitle = "...głosy nieważne zdobyła Lewica? PiS topnieje do 231 posłów", | |
title = "Sejm 2019. Co by było gdyby...", caption = "@szychtawdanych") + | |
theme_ggparliament(legend = TRUE) + | |
scale_colour_manual(values = parliament$colour, labels = parliament$party_short) + | |
theme(plot.title = element_text(hjust = 0.5, size = 27), | |
plot.subtitle = element_text(hjust = 0.5, size = 22), | |
plot.caption = element_text(size = 14, colour = 'gray80'), | |
legend.text = element_text(size = 17)) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Files with data come from https://wybory.gov.pl/sejmsenat2019/pl/dane_w_arkuszach | |
require(dplyr) | |
require(tidyr) | |
require(gridExtra) | |
# could void votes tilt polish senate elections? | |
okregi_kontestowane_przez_pis <- c(12,75, 92, 95, 96, 100) | |
senat_pliki <- list.files("wyniki_gl_na_kand_po_obwodach_senat_csv/", full.names = T) | |
senat_wyniki <- lapply(senat_pliki, function(file){ | |
senat <- read.csv2(file) | |
senat %>% | |
group_by(Okręg) %>% | |
summarise_at(vars(-Symbol.kontrolny, -Kod.TERYT, -Numer, | |
-Typ.obszaru, -Typ.obwodu, -Siedziba, -Gmina, -Powiat, -Województwo), sum) %>% | |
mutate(niewaznych_podwojne_skreslenie = W.tym.z.powodu.postawienia.znaku..X..obok.nazwiska.dwóch.lub.większej.liczby.kandydatów) %>% | |
select(-Komisja.otrzymała.kart.do.głosowania:-Liczba.głosów.ważnych.oddanych.łącznie.na.wszystkich.kandydatów) %>% | |
gather(kandydat, glosow, - Okręg, -niewaznych_podwojne_skreslenie) | |
}) | |
bind_rows(senat_wyniki) %>% | |
group_by(Okręg) %>% | |
arrange(desc(glosow)) %>% | |
summarise(niewaznych_podwojne_skreslenie = niewaznych_podwojne_skreslenie[1], | |
roznica = glosow[1] - glosow[2]) %>% | |
filter(roznica < niewaznych_podwojne_skreslenie) | |
png("senat_table.png", height=200, width=520) | |
df <- bind_rows(senat_wyniki) %>% | |
group_by(Okręg) %>% | |
arrange(desc(glosow)) %>% | |
summarise(`Głosów nieważnych przez podwójne skreślenie` = niewaznych_podwojne_skreslenie[1], | |
`Przewaga kandydata opozycji` = glosow[1] - glosow[2]) %>% | |
filter(Okręg %in% okregi_kontestowane_przez_pis) | |
p <- tableGrob(df, rows = NULL) | |
grid.arrange(p) | |
dev.off() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment