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