--- title: "Differences in gender" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Differences in gender} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(hateimparlament) library(dplyr) library(ggplot2) library(stringr) library(tidyr) library(xml2) ``` ## Preparation of data First, you need to download all records of the current legislative period. ```r fetch_all("../records/") # path to directory where records should be stored ``` Second, those `.xml` files, need to be parsed into `R` `tibbles`. This is accomplished by: ```r read_all("../records/") %>% repair() -> res ``` We also used `repair` to fix a bunch of formatting issues in the records. For development purposes, we only fetch records if they are not already stored as csv files: ```{r} res <- read_from_csv_or_fetch('../inst/') ``` and unpack our tibbles ```{r} comments <- res$comments speeches <- res$speeches speaker <- res$speaker talks <- res$talks ``` Bevor we can do our analysis, we have to assign a gender to our politicans. We do this by reading the gender from the master data of all members of parliament, which is fetched from bundestag.de. ```{r} xml_get <- function(node, name) { res <- xml_text(xml_find_all(node, name)) if (length(res) == 0) NA_character_ else res } x <- read_xml("../inst/masterdata.xml") mdbs <- xml_find_all(x, "MDB") ids <- c() genders <- c() for (mdb in mdbs) { xml_get(mdb, "ID") -> mdb_id xml_find_first(mdb, "BIOGRAFISCHE_ANGABEN") %>% xml_get("GESCHLECHT") -> mdb_gender ids <- c(ids, mdb_id) genders <- c(genders, if (mdb_gender == "männlich") "male" else "female") } gender <- tibble(id = ids, gender = genders) speaker_with_gender <- left_join(res$speaker, gender) ``` ## Analyse First, let's look at the relative distribution of the sexes throughout the whole Bundestag. ```{r} speaker_with_gender %>% select(gender) %>% group_by(gender) %>% summarise("count" = n()) %>% filter(gender %in% c("male", "female")) %>% mutate(portion = 100*count/sum(count)) -> plot1 bp <- ggplot(plot1, aes(x = "", y = portion, fill = gender))+ geom_bar(width = 1, stat = "identity") pie <- bp + coord_polar("y", start=0) pie + scale_fill_manual(values=c("pink", "blue")) + ggtitle("Relative distribution of sexes") + xlab("") + ylab("") ``` Next, we look at the individual distributions between men and women in the different fractions. ```{r, fig.width=7} speaker_with_gender %>% group_by(fraction) %>% summarize(n = n()) -> fraction_size speaker_with_gender %>% filter(gender=="female") %>% group_by(fraction) %>% summarize(n_female = n()) %>% left_join(fraction_size) %>% mutate(q = n_female/n) -> women_per_fraction bar_plot_fractions(women_per_fraction, x_variable=fraction, y_variable=q, title="Frauenanteil nach Partei") ``` Prepared with this knowledge, we can now analyse the relative amount of speeches by gender and fraction. ```{r, fig.width=7} speaker_with_gender %>% transmute(speaker_id = id, gender, fraction) -> simple_speaker_with_gender speeches %>% transmute(id, speaker_id = speaker) %>% inner_join(simple_speaker_with_gender) %>% group_by(fraction) %>% summarize(speeches=n()) -> fraction_speeches_size speeches %>% transmute(id, speaker_id = speaker) %>% inner_join(simple_speaker_with_gender) %>% filter(gender=='female') %>% group_by(fraction) %>% summarize(female_speeches=n()) %>% left_join(fraction_speeches_size) %>% left_join(women_per_fraction) %>% mutate(q_speeches = female_speeches/speeches) -> speech_distribution #bar_plot_fractions(speech_distribution, x_variable=fraction, y_variable=q_speeches, title="Redeanteil Frauen nach Partei") party_order <- factor(c("Fraktionslos", "AfD&Fraktionslos", "DIE LINKE", "BÜNDNIS 90/DIE GRÜNEN", "SPD", "CDU/CSU", "FDP", "AfD", NA_character_)) speech_distribution %>% mutate("Frauenanteil" = q, "Redenanteil Frauen" = q_speeches) %>% pivot_longer(c(Frauenanteil, "Redenanteil Frauen"), "type") %>% ggplot(aes(x=factor(fraction, levels = party_order), y=value, fill=factor(type, levels = factor(c("Frauenanteil", "Redenanteil Frauen"))))) + scale_fill_manual(values= c("Frauenanteil"="gray", "Redenanteil Frauen"="red")) + coord_flip() + geom_bar(stat="identity", position="dodge") + labs(fill="Kategorie") ``` For comparison, let's analyze the total differences in the amount of speeches given. ```{r} speeches %>% group_by(speaker) %>% summarize(n = n()) %>% ungroup() %>% arrange(-n) %>% join_speaker(res) %>% left_join(gender, by=c("speaker"="id")) %>% group_by(gender) %>% summarise(absolute=sum(n)) %>% filter(gender %in% c("female", "male")) %>% mutate(absolute2=absolute/sum(absolute)) %>% mutate(portion=c(0.32, 0.68)) %>% mutate(relative=absolute*(1-portion)) %>% mutate(relative2=relative/sum(relative)) -> plot3 ``` At first lets take a look at the absolute difference in the amount of speeches by the two sexes. ```{r,fig.width=7} barplot(plot3$absolute2, ylab = "amount of speeches", main = "Absolute comparison of speech shares", las = 1, names.arg = c("women", "men"), col = c("pink", "darkblue"), font.main = 4, cex.axis = 0.7) ``` Since there are more men represented in the German Bundestag, we now consider the relative proportions of speeches, depending on the ratio of men and women. ```{r, fig.width=7} barplot(plot3$relative2, ylab = "amount of speeches", main = "Relative comparison of speech shares", las = 1, names.arg = c("women", "men"), col = c("pink", "darkblue"), font.main = 4, cex.axis = 0.7) ```