Packages laden
list.of.packages <- c("plyr", "tidyr", "tidyverse","ggplot2", "ggthemes", "haven", "data.table", "readxl", "legislatoR", "dplyr", "RColorBrewer")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
lapply(list.of.packages, require, character.only = TRUE)
Daten einlesen
path <- "abstimmungen_bt/abstimmungen.csv"
DATASET_FILE_1 <- "abstimmungen.RData"
if(!file.exists(DATASET_FILE_1)){
abstimmungen <- read_csv("data/abstimmungen.csv", locale = locale(encoding = "UTF-8"))
save(file=DATASET_FILE_1, abstimmungen)
}else{
load(DATASET_FILE_1)
}
filenames <- list.files(path = "~/Desktop/abstimmungen_bt/data_bt", pattern = ".csv", full.names = T)
read_csv_filename <- function(filename){
ret <- read.csv(filename, fileEncoding="UTF-8")
ret$Source <- filename #EDIT
ret
}
import.list <- ldply(filenames, read_csv_filename)
unique(import.list$Source)
data<-import.list %>%
mutate(filenames= sub("~/Desktop/abstimmungen_bt/data_bt/","", Source))
data$filenames
abstimmungen$filenames
data$filenames <- gsub(pattern="/Users/liviahofmann 1/Desktop/abstimmungen_bt/data_bt/", replacement = "", data$filenames)
Datensätze mergen
dataset_abstimmungen <- merge(abstimmungen, data, by = "filenames")
head(dataset_abstimmungen)
Datensatz bereinigen
names(dataset_abstimmungen)[names(dataset_abstimmungen)=="Name"] <- "Nachname"
names(dataset_abstimmungen)[names(dataset_abstimmungen)=="Bezeichnung"] <- "name"
dataset_abstimmungen[ , c("Titel", "Bemerkung")] <- list(NULL)
dataset_abstimmungen$name <- gsub(pattern="Dr. ", replacement = "", dataset_abstimmungen$name)
dataset_abstimmungen$name <- gsub(pattern="Frhr. Von ", replacement = "", dataset_abstimmungen$name)
dataset_abstimmungen$name <- gsub(pattern="h.c. ", replacement = "", dataset_abstimmungen$name)
dataset_abstimmungen$name <- gsub(pattern="\\s*\\([^\\)]+\\)", replacement = "", dataset_abstimmungen$name)
dataset_abstimmungen$name <- gsub(pattern="[A-Z]{1}[.]",replacement = "", dataset_abstimmungen$name)
LegislatoR Datensatz einlesen und mit Abstimmungen-Datensatz mergen
devtools::install_github("saschagobel/legislatoR")
library(legislatoR)
library(dplyr)
# Deutschland
deu_politicians <- get_core(legislature = "deu")
# welche Periode? Sessions 18-19 (2013-2021)
deu_politicians_sessions <- get_political(legislature = "deu")
head(deu_politicians)
# assign birthdate for members of the political parties into the environment
deu_birthdates_SPD <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "SPD"),
by = "pageid")$birth
deu_birthdates_CDU <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "CDU"),
by = "pageid")$birth
deu_birthdates_CSU <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "CSU"),
by = "pageid")$birth
deu_birthdates_AfD <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "AfD"),
by = "pageid")$birth
deu_birthdates_FDP <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "FDP"),
by = "pageid")$birth
deu_birthdates_Linke <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "DIE LINKE"),
by = "pageid")$birth
deu_birthdates_Grünen <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "BÃœNDNIS 90/DIE GRÃœNEN"),
by = "pageid")$birth
deu_birthdates_FDP <- semi_join(x = select(get_core(legislature = "deu"), pageid, birth),
y = filter(get_political(legislature = "deu"), party == "Fraktionslos"),
by = "pageid")$birth
# assign data for the 18th & 19th legislative session into the environment
deu_politicians_subset <- semi_join(x = get_core(legislature = "deu"),
y = filter(get_political(legislature = "deu"), session >= 18),
by = "pageid")
cld_content(legislature = NULL)
dataset_abstimmungen_bt_2013_2021 <- merge(deu_politicians_subset, dataset_abstimmungen, by = "name")
neues Datenset bereinigen
dataset_abstimmungen_bt_2013_2021[ , c("ethnicity", "religion", "country", "pageid", "wikidataid", "wikititle", "death", "birthplace", "deathplace", "Source", "AbgNr")] <- list(NULL)
names(dataset_abstimmungen_bt_2013_2021)[names(dataset_abstimmungen_bt_2013_2021)=="sex"] <- "Geschlecht"
dataset_abstimmungen_bt_2013_2021$Alter = as.numeric(difftime(Sys.Date(),dataset_abstimmungen_bt_2013_2021$birth, units = "weeks"))/52.25
dataset_abstimmungen_bt_2013_2021$Alter <- as.integer(dataset_abstimmungen_bt_2013_2021$Alter)
names(dataset_abstimmungen_bt_2013_2021)[names(dataset_abstimmungen_bt_2013_2021)=="name"] <- "Name"
names(dataset_abstimmungen_bt_2013_2021)[names(dataset_abstimmungen_bt_2013_2021)=="Fraktion.Gruppe"] <- "Partei"
dataset_abstimmungen_bt_2013_2021$Partei[dataset_abstimmungen_bt_2013_2021$Partei =="DIE LINKE."] <- "DIE LINKE"
dataset_abstimmungen_bt_2013_2021$Partei[dataset_abstimmungen_bt_2013_2021$Partei=="BÜNDNIS`90/DIE GRÜNEN"] <- "BÜ90/GR"
names(dataset_abstimmungen_bt_2013_2021)[names(dataset_abstimmungen_bt_2013_2021)=="birth"] <- "Geburtsdatum"
dataset_abstimmungen_bt_2013_2021$Geschlecht[ dataset_abstimmungen_bt_2013_2021$Geschlecht == "female" ] <- "1"
dataset_abstimmungen_bt_2013_2021$Geschlecht[ dataset_abstimmungen_bt_2013_2021$Geschlecht == "male" ] <- "0"
dataset_abstimmungen_bt_2013_2021 %>% mutate(Partei=ifelse(Partei=="CDU","CDU/CSU", Partei))
dataset_abstimmungen_bt_2013_2021 %>% mutate(Partei=ifelse(Partei=="CSU","CDU/CSU", Partei))
Datenanalyse
dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten <- ifelse(dataset_abstimmungen_bt_2013_2021$ja == 1 & dataset_abstimmungen_bt_2013_2021$nein == 0 & dataset_abstimmungen_bt_2013_2021$Enthaltung == 0 & dataset_abstimmungen_bt_2013_2021$ungültig == 0 & dataset_abstimmungen_bt_2013_2021$nichtabgegeben == 0 , "ja", "")
dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten <- ifelse(dataset_abstimmungen_bt_2013_2021$ja == 0 & dataset_abstimmungen_bt_2013_2021$nein == 1 & dataset_abstimmungen_bt_2013_2021$Enthaltung == 0 & dataset_abstimmungen_bt_2013_2021$ungültig == 0 & dataset_abstimmungen_bt_2013_2021$nichtabgegeben == 0 , "nein" , dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten)
dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten <- ifelse(dataset_abstimmungen_bt_2013_2021$ja == 0 & dataset_abstimmungen_bt_2013_2021$nein == 0 & dataset_abstimmungen_bt_2013_2021$Enthaltung == 1 & dataset_abstimmungen_bt_2013_2021$ungültig == 0 & dataset_abstimmungen_bt_2013_2021$nichtabgegeben == 0 , "Enthaltung" , dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten)
dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten <- ifelse(dataset_abstimmungen_bt_2013_2021$ja == 0 & dataset_abstimmungen_bt_2013_2021$nein == 0 & dataset_abstimmungen_bt_2013_2021$Enthaltung == 0 & dataset_abstimmungen_bt_2013_2021$ungültig == 1 & dataset_abstimmungen_bt_2013_2021$nichtabgegeben == 0 , "ungültig" , dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten)
dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten <- ifelse(dataset_abstimmungen_bt_2013_2021$ja == 0 & dataset_abstimmungen_bt_2013_2021$nein == 0 & dataset_abstimmungen_bt_2013_2021$Enthaltung == 0 & dataset_abstimmungen_bt_2013_2021$ungültig == 0 & dataset_abstimmungen_bt_2013_2021$nichtabgegeben == 1 , "nichtabgegeben" , dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten)
## Nur "ja" und "nein"-Stimmen behalten, "Fraktionslose" werden herausgefiltert
dataset_abstimmungen_bt_2013_2021 <- dataset_abstimmungen_bt_2013_2021[dataset_abstimmungen_bt_2013_2021$Abstimmungsverhalten %in% c("ja","nein"),]
dataset_abstimmungen_bt_2013_2021 <- dataset_abstimmungen_bt_2013_2021[dataset_abstimmungen_bt_2013_2021$Partei %in% c("SPD", "FDP", "CDU/CSU", "BÜ90/GR", "AfD", "DIE LINKE"),]
Plot: Wie stimmen Frauen im Vergleich zu Männern innerhalb der eigenen Partei ab?
percentages_women <- dataset_abstimmungen_bt_2013_2021 %>%
select(Partei, Geschlecht ) %>%
mutate(Geschlecht = case_when(Geschlecht == 0 ~ "männlich", Geschlecht == 1 ~ "weiblich")) %>%
group_by(Partei, Geschlecht) %>%
summarise(n = n()) %>%
group_by(Partei) %>%
mutate(perc=n/sum(n)*100)
percentages_women
percentages_women$Partei = factor(percentages_women$Partei, levels=c("DIE LINKE", "BÜ90/GR", "SPD", "FDP", "CDU/CSU", "AfD"))
gendergap_party <- ggplot(data = percentages_women) + aes(x = Geschlecht, fill = Geschlecht, y = perc)
gender_party <- gendergap_party + geom_col(position = "dodge") +
geom_text(aes(Geschlecht, label = sprintf("%.0f%%", perc)), position = position_dodge(0.9), vjust=-0.5, hjust = "center", size = 2) +
labs(title = "Der Gender Gap ist in konservativen Parteien größer als in liberalen Parteien", subtitle = "(Anteil Frauen und Männer im Deutschen Bundestag nach Parteien, in Prozent)", x = "Geschlecht", y = "Prozent") + facet_grid(~Partei)+
scale_x_discrete(labels=c("männlich" = "m", "weiblich" = "w")) + scale_y_continuous(labels = scales::label_percent(scale=1), limits = c(0,100)) +
theme_light() + theme(plot.title = element_text(face = "bold"), strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"), legend.position = "right", legend.title = element_blank()) + scale_fill_manual(values = c("lightblue3","indianred3"))
gender_party
Plot: Wie stimmen Frauen im Vergleich zu Männern innerhalb der eigenen Partei aufgrund ihres Alters ab?
percentages_age <- dataset_abstimmungen_bt_2013_2021 %>%
select( Geschlecht, Alter ) %>%
mutate(Geschlecht = case_when(Geschlecht == 0 ~ "männlich", Geschlecht == 1 ~ "weiblich")) %>%
mutate(age_group = case_when(Alter %in% seq(18,34) ~ "18-34", Alter %in% seq(35,50) ~ "35-50", Alter %in% seq(51,65) ~ "51-65", Alter %in% seq(66,100) ~ "66+")) %>%
group_by(Geschlecht, age_group) %>%
summarise(n = n()) %>%
group_by(age_group) %>%
mutate(perc=n/sum(n)*100)
percentages_age
gendergap_age <- ggplot(data = percentages_age) + aes(x = Geschlecht, fill = Geschlecht, y = perc) + geom_bar(stat = "identity",position = "dodge") +
geom_text(aes(Geschlecht, label = sprintf("%.0f%%", perc)), position = position_dodge(width = 1), vjust=-0.5)+
facet_wrap(~ age_group)+
labs(title = "Der Gender Gap ist über alle Altersgruppen hinweg sehr groß", subtitle = "(Anteil Frauen und Männer im Deutschen Bundestag nach Altersgruppen, in Prozent)", x = "Geschlecht", y = "Prozent") + scale_x_discrete(labels=c("männlich" = "m", "weiblich" = "w")) + scale_y_continuous(labels = scales::label_percent(scale=1), limits = c(0,100)) +
theme_light() +
theme(plot.title = element_text(face = "bold"), strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"), legend.position = "right", legend.title = element_blank()) + scale_fill_manual(values = c("lightblue3","indianred3"))
gendergap_age
Plot: Gibt es einen Unterschied zwischen den Parteien?
percentages_age_group <- dataset_abstimmungen_bt_2013_2021 %>%
select(Partei, Geschlecht, Alter ) %>%
mutate(Geschlecht = case_when(Geschlecht == 0 ~ "männlich", Geschlecht == 1 ~ "weiblich")) %>%
mutate(age_group = case_when(Alter %in% seq(18,34) ~ "18-34", Alter %in% seq(35,50) ~ "35-50", Alter %in% seq(51,65) ~ "51-65", Alter %in% seq(66,100) ~ "66+")) %>%
group_by(Partei, Geschlecht, age_group) %>%
summarise(n = n()) %>%
group_by(Partei) %>%
mutate(perc=n/sum(n)*100)
percentages_age_group
percentages_age_group$Partei = factor(percentages_age_group$Partei, levels=c("DIE LINKE", "BÜ90/GR", "SPD", "FDP", "CDU/CSU", "AfD"))
gendergap_age_group <- ggplot(data = percentages_age_group) + aes(x = age_group, fill = Geschlecht, y = perc)
gender_age_group <- gendergap_age_group + geom_col(position = "dodge") +
geom_text(aes(age_group, label = sprintf("%.0f%%", perc)), position = position_dodge(width = 1.5), vjust=-0.5, hjust = "center", size = 2) +
labs(title = "Der Gender Gap ist im mittleren Alter in konservativen Parteien am größten,\nwährend er sich in liberalen Parteien umdreht", subtitle = "(Anteil Frauen und Männer im Deutschen Bundestag nach Parteien, in Prozent)", x = "Altersgruppen", y = "Prozent") + facet_grid(~Partei) + scale_y_continuous(labels = scales::label_percent(scale=1), limits = c(0,50)) +
theme_light() + theme(plot.title = element_text(face = "bold"), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"), legend.position = "right", legend.title = element_blank()) + scale_fill_manual(values = c("lightblue3","indianred3"))
gender_age_group
Plot: Wie stimmen Frauen im Vergleich zu Männern nach Themen ab?
##Abstimmung zu Schwangerschaftsabbruch
subset_abtreibung <- subset(dataset_abstimmungen_bt_2013_2021, abstimmungen == "Aufhebung des Werbeverbots für Schwangerschaftsabbrüche (Gesetzentwurf der Fraktion Die Linke)")
percentages_abtreibungen <- subset_abtreibung %>%
select(Partei, Geschlecht, Abstimmungsverhalten ) %>%
mutate(Geschlecht = case_when(Geschlecht == 0 ~ "männlich", Geschlecht == 1 ~ "weiblich")) %>%
mutate(Abstimmungsverhalten = case_when(Abstimmungsverhalten == "ja" ~ 1, Abstimmungsverhalten == "nein" ~ 0)) %>%
group_by(Partei, Geschlecht) %>%
mutate(perc=sum(Abstimmungsverhalten=="1")/(sum(Abstimmungsverhalten=="1")+ sum(Abstimmungsverhalten=="0"))*100) %>%
group_by(Partei)
percentages_abtreibungen
percentages_abtreibungen <- unique(percentages_abtreibungen)
gendergap_party_abtreibung <- ggplot(data = percentages_abtreibungen) + aes(x = Geschlecht, fill = Geschlecht, y = perc) + geom_col(position = "dodge") + geom_text(aes(Geschlecht, label = sprintf("%.2f%%", perc)), position = position_dodge(width = 1), vjust=-0.5) +
facet_wrap(~ Partei)+
labs(subtitle = "Abstimmungsverhalten zur Aufhebung des Werbeverbots für Abtreibungen nach Parteien", x = "", y = "Prozent") + scale_y_continuous(labels = scales::label_percent(scale=1), limits = c(0,125), breaks = c(25,50,75,100)) +
theme_light() +
theme(strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"), legend.position="none" , legend.title = element_blank()) + scale_fill_manual(values = c("lightblue3","indianred3"))
gendergap_party_abtreibung
##Ehe für alle
subset_ehe_fuer_alle <- subset(dataset_abstimmungen_bt_2013_2021, abstimmungen =="Eheschließung für Personen gleichen Geschlechts")
percentages_ehe_fuer_alle <- subset_ehe_fuer_alle %>%
select(Partei, Geschlecht, Abstimmungsverhalten ) %>%
mutate(Geschlecht = case_when(Geschlecht == 0 ~ "männlich", Geschlecht == 1 ~ "weiblich")) %>%
mutate(Abstimmungsverhalten = case_when(Abstimmungsverhalten == "ja" ~ 1, Abstimmungsverhalten == "nein" ~ 0)) %>%
group_by(Partei, Geschlecht) %>%
mutate(perc=sum(Abstimmungsverhalten=="1")/(sum(Abstimmungsverhalten=="1")+ sum(Abstimmungsverhalten=="0"))*100) %>%
group_by(Partei) %>%
filter(Abstimmungsverhalten == "1")
percentages_ehe_fuer_alle
percentages_ehe_fuer_alle <- unique(percentages_ehe_fuer_alle)
gendergap_party_ehe_fuer_alle <- ggplot(data = percentages_ehe_fuer_alle) + aes(x = Geschlecht, fill = Geschlecht, y = perc) + geom_col(position = "dodge") + geom_text(aes(Geschlecht, label = sprintf("%.2f%%", perc)), position = position_dodge(width = 1), vjust=-0.5) +
facet_wrap(~ Partei)+
labs(subtitle = "Abstimmungsverhalten zur Ehe für alle nach Parteien", x = "", y = "Prozent") + scale_y_continuous(labels = scales::label_percent(scale=1), limits = c(0,125), breaks = c(25,50,75,100)) +
theme_light() +
theme(strip.background = element_blank(), strip.text = element_text(color = "black", face = "italic"), legend.position = "right", legend.title = element_blank()) + scale_fill_manual(values = c("lightblue3","indianred3"))
gendergap_party_ehe_fuer_alle
##Visualisierung nebeneinander
library(ggpubr)
plot_ethikthemen <- ggarrange(gendergap_party_abtreibung, gendergap_party_ehe_fuer_alle, ncol = 2, nrow = 2)
title_3 <- expression(atop(bold("Trotz Aufhebung des Fraktionszwangs stimmen Parteien bei Ethikfragen meistens nach Parteilinie ab"), scriptstyle("(Ja-Stimmen im Deutschen Bundestag innerhalb einer Partei, in Prozent)")))
plot_ethik <- annotate_figure(plot_ethikthemen, top=text_grob(title_3, size = 22))
plot_ethik