# Libraries laden
library("quanteda")
## Warning: package 'quanteda' was built under R version 4.0.5
## Package version: 3.0.0
## Unicode version: 10.0
## ICU version: 61.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
library("quanteda.textmodels")
## Warning: package 'quanteda.textmodels' was built under R version 4.0.5
library("quanteda.textstats")
## Warning: package 'quanteda.textstats' was built under R version 4.0.5
library("quanteda.textplots")
## Warning: package 'quanteda.textplots' was built under R version 4.0.5
library("quanteda.corpora")
library("swissparl")
## Warning: package 'swissparl' was built under R version 4.0.5
library("tidyverse")
## Warning: package 'tidyverse' was built under R version 4.0.3
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.0     v dplyr   1.0.5
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## Warning: package 'ggplot2' was built under R version 4.0.3
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library("dplyr")
library("ggplot2")
library("ggrepel")
## Warning: package 'ggrepel' was built under R version 4.0.5
library("gridExtra")
## Warning: package 'gridExtra' was built under R version 4.0.5
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library("grid")

1. Analyse Geschäfte der letzten 20 Jahre

# Datensatz laden, Jahr berechnen und filtern
chparl.dt <- readRDS("chparl_komplett.rds")
chparl.dt$year <- as.numeric(format(chparl.dt$Start, "%Y"))
chparl.dt <- subset(chparl.dt, year %in% c(2001:2020))
# Datensatz weiter runterbrechen auf Geschäfte pro Jahr
chparl.dt <- chparl.dt %>% 
  group_by(BusinessNumber, year, topic_mr) %>% 
  summarise(AnzMeldungen = n(), .groups = 'drop') %>% 
  ungroup()

chparl.dt <- chparl.dt %>% 
  group_by(year, topic_mr) %>% 
  summarise(AnzBusinesses = n(), .groups = 'drop') %>% 
  ungroup()

total.dt <- chparl.dt %>% 
  group_by(year) %>% 
  mutate(Total = sum(AnzBusinesses, na.rm = TRUE)) %>% 
  ungroup() %>% 
  filter(topic_mr == 1) %>% 
  select(year, Total)

menschenrecht.dt <- chparl.dt %>% 
  filter(topic_mr == 1) %>% 
  select(year, AnzBusinesses)
# Datensätze zusammenfügen und Prozente ausrechnen
geschafte.de <- left_join(menschenrecht.dt, total.dt, by = "year")
geschafte.de$Prozent <- (geschafte.de$AnzBusinesses/geschafte.de$Total)*100
geschafte.de$Prozent <- round(geschafte.de$Prozent, 1)
# Bar Plot kreieren

time.plot <- ggplot(geschafte.de, aes(year, Prozent))+
  geom_bar(stat = "identity", width = 0.9, fill = "turquoise2")+
  scale_x_continuous(breaks = c(2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 
                                2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 
                                2017, 2018, 2019, 2020)) +
  scale_y_continuous(labels = function(x) paste0(x, "%"))+
  geom_text(aes(label= paste0(Prozent, "%")), vjust = -0.5, size = 3.5,
            position = position_dodge(0.9))+
  theme_bw()+
  labs(title="Im Parlament werden die Menschenrechte selten thematisiert.", 
       subtitle="Anteil Geschäfte mit Nennung der Menschenrechte pro Jahr in Prozent.", 
       caption="\nDaten:swissparl: Interface to the Webservices of the Swiss Parliament \nGrafik: Felicia Mändli", y = NULL, x = NULL) +
  theme(axis.text.x = element_text(angle=65, vjust=0.6))+
  theme(
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    plot.title=element_text(size = 15, face="bold"),
    plot.title.position = "plot",
    plot.subtitle=element_text(face="italic", size=11, margin=margin(b=12)),
    plot.caption=element_text(size=8, margin=margin(t=12)))
time.plot

2. Analyse Score pro Partei bei speziellen Geschäften

# Datensatz laden und Geschäftsnamen vereinfachen
MR.dt <- readRDS("menschenrechte.rds")
table(MR.dt$Title)
MR.dt$Title[MR.dt$Title == "Schweizer Recht statt fremde Richter (Selbstbestimmungsinitiative). Volksinitiative"] <- "Selbstbestimmungsinitiative"
MR.dt$Title[MR.dt$Title == "Für verantwortungsvolle Unternehmen – zum Schutz von Mensch und Umwelt. Volksinitiative"] <- "Konzernverantwortungsinitiative"
MR.dt$Title[MR.dt$Title == "Freihandelsabkommen zwischen der Schweiz und China"] <- "Freihandelsabkommen mit China"
# Parteinamen anpassen und Regionalparteien ausschliessen
# Mitte in CVP umwandeln und FDP vereinfachen
MR.dt$PartyNumber[MR.dt$PartyNumber == "1586"] <- "14"
MR.dt$PartyName[MR.dt$PartyName == "Die Mitte"] <- "Christlichdemokratische Volkspartei der Schweiz"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "M-E"] <- "CVP"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "FDP-Liberale"] <- "FDP"
# Regionalparteien entfernen
MR.dt <- subset(MR.dt, PartyNumber != 1577 & PartyNumber != 1582 & PartyNumber != 1573 & PartyNumber != 1576 & PartyNumber != 26 & PartyNumber != 18)
# CVP und BDP zusammenehmen
MR.dt$PartyNumber[MR.dt$PartyNumber == "1551"] <- "14"# Nummer der CVP beibehalten
MR.dt$PartyName[MR.dt$PartyName == "Bürgerlich-Demokratische Partei Schweiz"] <- "Christlichdemokratische Volkspartei der Schweiz/Bürgerlich-Demokratische Partei Schweiz"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "BDP"] <- "CVP und BDP"

MR.dt$PartyName[MR.dt$PartyName == "Christlichdemokratische Volkspartei der Schweiz"] <- "Christlichdemokratische Volkspartei der Schweiz/Bürgerlich-Demokratische Partei Schweiz"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "CVP"] <- "CVP und BDP"

# Grüne Parteien zusammenehmen
MR.dt$PartyNumber[MR.dt$PartyNumber == "1336"] <- "20"# Nummer der GPS beibehalten
MR.dt$PartyName[MR.dt$PartyName == "Grünliberale Partei"] <- "Grüne Parteien"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "glp"] <- "Grüne Parteien"

MR.dt$PartyName[MR.dt$PartyName == "Grüne Partei der Schweiz"] <- "Grüne Parteien"
MR.dt$PartyAbbreviation[MR.dt$PartyAbbreviation == "GPS"] <- "Grüne Parteien"

Einzelne Datensätze kreieren:

Freihandel Schweiz China

# Geschäft filtern
MR_freihandel.dt <- MR.dt %>% 
  filter(BusinessNumber == 20130071)
# Total sum
MR_freihandel_tot.dt <- MR_freihandel.dt %>% 
  group_by(BusinessNumber, Title, PartyNumber, PartyName, PartyAbbreviation) %>% 
  summarise(Total = n(), .groups = 'drop')
# Menschenrechte sum
MR_freihandel_mr.dt <- MR_freihandel.dt %>% 
  group_by(PartyNumber, topic_mr) %>% 
  summarise(MrMeldungen = n(), .groups = 'drop') %>% 
  filter(topic_mr == 1) %>% 
  select(PartyNumber, MrMeldungen)
# Datensätze verbinden
freihandel.dt <- left_join(MR_freihandel_tot.dt, MR_freihandel_mr.dt, by = "PartyNumber")
# Score = MR/Total
freihandel.dt$Score <- freihandel.dt$MrMeldungen/freihandel.dt$Total

Volksinitiative «Für verantwortungsvolle Unternehmen – zum Schutz von Mensch und Umwelt»

# Geschäft filtern
MR_verantwortung.dt <- MR.dt %>% 
  filter(BusinessNumber == 20170060)
# Total sum
MR_verantwortung_tot.dt <- MR_verantwortung.dt %>% 
  group_by(BusinessNumber, Title, PartyNumber, PartyName, PartyAbbreviation) %>% 
  summarise(Total = n(), .groups = 'drop')
# Menschenrechte sum
MR_verantwortung_mr.dt <- MR_verantwortung.dt %>% 
  group_by(PartyNumber, topic_mr) %>% 
  summarise(MrMeldungen = n(), .groups = 'drop') %>% 
  filter(topic_mr == 1) %>% 
  select(PartyNumber, MrMeldungen)
# Datensätze verbinden
verantwortung.dt <- left_join(MR_verantwortung_tot.dt, MR_verantwortung_mr.dt, by = "PartyNumber")
#NA mit 0 austauschen um Score berechnen zu können
verantwortung.dt$MrMeldungen[is.na(verantwortung.dt$MrMeldungen)] <- 0
# Score = MR/Total
verantwortung.dt$Score <- verantwortung.dt$MrMeldungen/verantwortung.dt$Total

OR Aktienrecht

# Geschäft filtern
MR_aktien.dt <- MR.dt %>% 
  filter(BusinessNumber == 20160077)
# Total sum
MR_aktien_tot.dt <- MR_aktien.dt %>% 
  group_by(BusinessNumber, Title, PartyNumber, PartyName, PartyAbbreviation) %>% 
  summarise(Total = n(), .groups = 'drop')
# Menschenrechte sum
MR_aktien_mr.dt <- MR_aktien.dt %>% 
  group_by(PartyNumber, topic_mr) %>% 
  summarise(MrMeldungen = n(), .groups = 'drop') %>% 
  filter(topic_mr == 1) %>% 
  select(PartyNumber, MrMeldungen)
# Datensätze verbinden
aktien.dt <- left_join(MR_aktien_tot.dt, MR_aktien_mr.dt, by = "PartyNumber")
#NA mit 0 austauschen um Score berechnen zu können
aktien.dt$MrMeldungen[is.na(aktien.dt$MrMeldungen)] <- 0
# Score = MR/Total
aktien.dt$Score <- aktien.dt$MrMeldungen/aktien.dt$Total

Selbstbestimmungsinitiative

# Geschäft filtern
MR_selbstbestimmung.dt <- MR.dt %>% 
  filter(BusinessNumber == 20170046)
# Total sum
MR_selbstbestimmung_tot.dt <- MR_selbstbestimmung.dt %>% 
  group_by(BusinessNumber, Title, PartyNumber, PartyName, PartyAbbreviation) %>% 
  summarise(Total = n(), .groups = 'drop')
# Menschenrechte sum
MR_selbstbestimmung_mr.dt <- MR_selbstbestimmung.dt %>% 
  group_by(PartyNumber, topic_mr) %>% 
  summarise(MrMeldungen = n(), .groups = 'drop') %>% 
  filter(topic_mr == 1) %>% 
  select(PartyNumber, MrMeldungen)
# Datensätze verbinden
selbstbestimmung.dt <- left_join(MR_selbstbestimmung_tot.dt, MR_selbstbestimmung_mr.dt, by = "PartyNumber")
#NA mit 0 austauschen um Score berechnen zu können
selbstbestimmung.dt$MrMeldungen[is.na(selbstbestimmung.dt$MrMeldungen)] <- 0
# Score = MR/Total
selbstbestimmung.dt$Score <- selbstbestimmung.dt$MrMeldungen/selbstbestimmung.dt$Total
# Datensätze zusammenfügen
MenschenrechtScores.dt <- rbind(freihandel.dt, verantwortung.dt, 
                                aktien.dt, selbstbestimmung.dt)
MenschenrechtScores.dt$Prozent <- MenschenrechtScores.dt$Score * 100
MenschenrechtScores.dt$Prozent <- round(MenschenrechtScores.dt$Prozent, 0)

Small Multiple Plot

# Parteifarben bestimmen
partycolors <- c("CVP und BDP" = "orange", "FDP" = "blue", 
                 "SVP" = "darkgreen", "Grüne Parteien" = "green", "SP" = "red")
# Small Multiple Plot kreiern
sm.plot <- ggplot(data = MenschenrechtScores.dt)+
  aes(x = PartyAbbreviation, y = Prozent)+
  facet_wrap(~ Title)+
  geom_segment(aes(x=PartyAbbreviation, 
                   xend=PartyAbbreviation, 
                   y= 0, 
                   yend=max(Prozent)), 
               linetype="dashed", 
               size=0.01,
               color = "grey87") +
  geom_point(aes(colour = PartyAbbreviation), size = 3)+
  scale_color_manual(values = partycolors,
                     guide = FALSE)+
  geom_text(aes(label = paste(Prozent, "%", sep = "")), 
            size = 3, hjust = 1.4, vjust = 0.35,
            show.legend = FALSE)+
  ylim(0, 100)+
  coord_flip()+
  labs(title = "Linke Parteien erwähnen die Menschrechte öfter in Parlamentsdebatten als die bürgerlichen Parteien.", 
       subtitle = "Anteil Redebeiträge pro Partei, in denen es um Menschenrechte geht im Vergleich zu allen Beiträgen in Prozent.", 
       caption = "\nDaten:swissparl: Interface to the Webservices of the Swiss Parliament \nGrafik: Felicia Mändli", y = NULL, x = "") +
  theme_light()+
  theme(
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_rect(colour = "grey"),
    axis.text.x = element_blank(),
    axis.ticks = element_blank(),
    strip.background = element_rect(fill = "white"),
    strip.text.x = element_text(colour = "black", face = "bold", size=10),
    plot.title=element_text(size = 15, face="bold"),
    plot.title.position = "plot",
    plot.subtitle=element_text(face="italic", size=11, margin=margin(b=12)),
    plot.caption=element_text(size=8, margin=margin(t=12)))
sm.plot

3. Schlüsselwörter pro Partei im Vergleich zu allen anderen Parteien

# Datensatz DE einlesen und filtern nach Konzernverantwortungsinitiative
MR_de.dt <- readRDS("menschenrechteDE.rds")
MR_de.dt <- MR_de.dt %>% 
  subset(BusinessNumber == 20170060)
# Parteinamen anpassen
# Mitte in CVP umwandeln und FDP vereinfachen
MR_de.dt$PartyNumber[MR_de.dt$PartyNumber == "1586"] <- "14"
MR_de.dt$PartyName[MR_de.dt$PartyName == "Die Mitte"] <- "Christlichdemokratische Volkspartei der Schweiz"
MR_de.dt$PartyAbbreviation[MR_de.dt$PartyAbbreviation == "M-E"] <- "CVP"
MR_de.dt$PartyAbbreviation[MR_de.dt$PartyAbbreviation == "FDP-Liberale"] <- "FDP"
# Regionalparteien entfernen
MR_de.dt <- subset(MR_de.dt, PartyNumber != 1577 & PartyNumber != 1582 & PartyNumber != 1573 & PartyNumber != 1576 & PartyNumber != 26 & PartyNumber != 18)
# CVP und BDP zusammenehmen
MR_de.dt$PartyNumber[MR_de.dt$PartyNumber == "1551"] <- "14"# Nummer der CVP beibehalten
MR_de.dt$PartyName[MR_de.dt$PartyName == "Bürgerlich-Demokratische Partei Schweiz"] <- "Christlichdemokratische Volkspartei der Schweiz/Bürgerlich-Demokratische Partei Schweiz"
MR_de.dt$PartyAbbreviation[MR_de.dt$PartyAbbreviation == "BDP"] <- "CVP und BDP"
# Grüne Parteien zusammenehmen
MR_de.dt$PartyNumber[MR_de.dt$PartyNumber == "1336"] <- "20"# Nummer der GPS beibehalten
MR_de.dt$PartyName[MR_de.dt$PartyName == "Grünliberale Partei"] <- "Grüne Parteien"
MR_de.dt$PartyAbbreviation[MR_de.dt$PartyAbbreviation == "glp"] <- "Grüne Parteien"

MR_de.dt$PartyName[MR_de.dt$PartyName == "Grüne Partei der Schweiz"] <- "Grüne Parteien"
MR_de.dt$PartyAbbreviation[MR_de.dt$PartyAbbreviation == "GPS"] <- "Grüne Parteien"
# Keyness Vorbereitung
MR_de.corp <- corpus(MR_de.dt, text_field = "Text")
MR_de.corp <- corpus_subset(MR_de.corp, PartyAbbreviation %in% c("SVP", "FDP", "CVP und BDP", 
                                                           "SP", "Grüne Parteien"))
MR_de.dfm <- tokens(MR_de.corp, remove_punct = TRUE, remove_numbers = TRUE, remove_symbols = TRUE) %>% 
  tokens_remove(c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">", "di", "e")) %>% 
  tokens_remove(c(stopwords('fr'), "commission", "entrer", 
                  "VS", "Proposition", "matière")) %>% 
  tokens_remove(min_nchar = 3) %>% # "ja" aus Analyse ausschliessen
  tokens_group(groups = PartyAbbreviation) %>% 
  dfm()
# Keyness SP
keyness_SP <- textstat_keyness(MR_de.dfm, target = "SP")
sp.plot <- textplot_keyness(keyness_SP, show_reference = FALSE, color = c("red"), n = 10)+
  labs(subtitle = "SP",  x = NULL, y = NULL)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
# Keyness CVP und BDP
keyness_CVP_BDP <- textstat_keyness(MR_de.dfm, target = "CVP und BDP")
cvp_bdp.plot <- textplot_keyness(keyness_CVP_BDP, show_reference = FALSE, color = c("orange"), n = 10)+
  labs(subtitle = "CVP und BDP", x = NULL, y = NULL)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
# Keyness FDP
keyness_FDP <- textstat_keyness(MR_de.dfm, target = "FDP")
fdp.plot <- textplot_keyness(keyness_FDP, show_reference = FALSE, color = c("blue"), n = 10)+
  labs(subtitle = "FDP", x = NULL, y = NULL)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
# Keyness SVP
keyness_SVP <- textstat_keyness(MR_de.dfm, target = "SVP")
svp.plot <- textplot_keyness(keyness_SVP, show_reference = FALSE, color = c("darkgreen"), n = 10)+
  labs(subtitle = "SVP", x = NULL, y = NULL)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
# Keyness grüne Parteien
keyness_GrüneP <- textstat_keyness(MR_de.dfm, target = "Grüne Parteien")
grune.plot <- textplot_keyness(keyness_GrüneP, show_reference = FALSE, color = c("green"), n = 10)+
  labs(subtitle = "Grüne Parteien", x = NULL, y = NULL)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
# Keyness Plot
keyness.plot <- grid.arrange(fdp.plot, cvp_bdp.plot, svp.plot, sp.plot, 
                             grune.plot, nrow = 3,
                             top = textGrob("Schlüsselwörter pro Partei verglichen mit allen anderen Parteien.",
                                             gp = gpar(fontface = 3, fontsize = 30),
                                            x = unit(0, "lines"), y = unit(0, "lines"), 
                                            just = "left", hjust = 0, vjust = 0),
                             bottom = textGrob("\nDaten:swissparl: Interface to the Webservices of the Swiss Parliament \nGrafik: Felicia Mändli",
                                               gp = gpar(fontface = 1, fontsize = 15),
                                               hjust = 1,
                                               x = 1))

keyness.plot