setup

library(rvest)
## Warning: package 'rvest' was built under R version 4.1.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.1.2
library(quanteda)
## Warning: package 'quanteda' was built under R version 4.1.3
## Package version: 3.2.1
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 4 of 4 threads used.
## See https://quanteda.io for tutorials and examples.
library(quanteda.textstats)
## Warning: package 'quanteda.textstats' was built under R version 4.1.3
library(stringr)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.3
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.6     v dplyr   1.0.8
## v tidyr   1.2.0     v forcats 0.5.1
## v readr   2.1.2
## Warning: package 'tibble' was built under R version 4.1.2
## Warning: package 'tidyr' was built under R version 4.1.3
## Warning: package 'readr' was built under R version 4.1.3
## Warning: package 'dplyr' was built under R version 4.1.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::between()        masks data.table::between()
## x dplyr::filter()         masks stats::filter()
## x dplyr::first()          masks data.table::first()
## x readr::guess_encoding() masks rvest::guess_encoding()
## x dplyr::lag()            masks stats::lag()
## x dplyr::last()           masks data.table::last()
## x purrr::transpose()      masks data.table::transpose()
library(dplyr)
library(ggplot2)
library(xlsx)
## Warning: package 'xlsx' was built under R version 4.1.2

set working directory

setwd("C:/Users/Jenny.WODEHOUSE/OneDrive/Documents/Uni/FS 2022/FS Datenjournalismus/datenjournalismus")

get transcripts

unzip('data/chparl_full.zip', exdir = "data")

transcripts <- rbindlist(list(
  fread('data/chparl_full/transcripts_Legislatur-46.csv', encoding = "UTF-8"),
  fread('data/chparl_full/transcripts_Legislatur-47.csv', encoding = "UTF-8"),
  fread('data/chparl_full/transcripts_Legislatur-48.csv', encoding = "UTF-8"),
  fread('data/chparl_full/transcripts_Legislatur-49.csv', encoding = "UTF-8"),
  fread('data/chparl_full/transcripts_Legislatur-50.csv', encoding = "UTF-8"),
  fread('data/chparl_full/transcripts_Legislatur-51.csv', encoding = "UTF-8")
), use.names = T, fill = T)

names(transcripts)
##  [1] "ID"                         "Language"                  
##  [3] "IdSubject"                  "VoteId"                    
##  [5] "PersonNumber"               "Type"                      
##  [7] "Text"                       "MeetingCouncilAbbreviation"
##  [9] "MeetingDate"                "MeetingVerbalixOid"        
## [11] "IdSession"                  "SpeakerFirstName"          
## [13] "SpeakerLastName"            "SpeakerFullName"           
## [15] "SpeakerFunction"            "CouncilId"                 
## [17] "CouncilName"                "CantonId"                  
## [19] "CantonName"                 "CantonAbbreviation"        
## [21] "ParlGroupName"              "ParlGroupAbbreviation"     
## [23] "SortOrder"                  "Start"                     
## [25] "End"                        "Function"                  
## [27] "DisplaySpeaker"             "LanguageOfText"            
## [29] "Modified"                   "StartTimeWithTimezone"     
## [31] "EndTimeWithTimezone"        "VoteBusinessNumber"        
## [33] "VoteBusinessShortNumber"    "VoteBusinessTitle"
str(transcripts)
## Classes 'data.table' and 'data.frame':   100365 obs. of  34 variables:
##  $ ID                        : int  21553 21554 21555 21556 21557 21558 21559 21560 21561 21562 ...
##  $ Language                  : chr  "DE" "DE" "DE" "DE" ...
##  $ IdSubject                 : int  4093 4094 4095 4095 4095 4095 4095 4095 4095 4095 ...
##  $ VoteId                    : chr  NA NA NA NA ...
##  $ PersonNumber              : int  341 341 341 430 503 316 514 348 367 435 ...
##  $ Type                      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Text                      : chr  "<pd_text><p>J'interromps très brièvement nos travaux pour saluer à la tribune diplomatique une délégation du Pa"| __truncated__ "<pd_text><p>Depuis la fin de notre dernière session, la situation au Proche-Orient s'est gravement détériorée. "| __truncated__ "<pd_text><p>Nous allons voter en premier lieu sur l'article 46. Dans la mesure où la proposition de la majorité"| __truncated__ "<pd_text><p>A mon avis, il faudrait suivre la proposition de minorité Meyer Thérèse à l'article 11 alinéa 7bis,"| __truncated__ ...
##  $ MeetingCouncilAbbreviation: chr  "N" "N" "N" "N" ...
##  $ MeetingDate               : int  20020415 20020415 20020415 20020415 20020415 20020415 20020415 20020415 20020415 20020415 ...
##  $ MeetingVerbalixOid        : int  924 924 924 924 924 924 924 924 924 924 ...
##  $ IdSession                 : int  4613 4613 4613 4613 4613 4613 4613 4613 4613 4613 ...
##  $ SpeakerFirstName          : chr  "Liliane" "Liliane" "Liliane" "Ruth" ...
##  $ SpeakerLastName           : chr  "Maury Pasquier" "Maury Pasquier" "Maury Pasquier" "Dreifuss" ...
##  $ SpeakerFullName           : chr  "Maury Pasquier Liliane" "Maury Pasquier Liliane" "Maury Pasquier Liliane" "Dreifuss Ruth" ...
##  $ SpeakerFunction           : chr  "P-F" "P-F" "P-F" "BR-F" ...
##  $ CouncilId                 : int  1 1 1 99 1 1 1 1 1 1 ...
##  $ CouncilName               : chr  "Nationalrat" "Nationalrat" "Nationalrat" "Bundesrat" ...
##  $ CantonId                  : int  25 25 25 25 27 19 1 12 17 10 ...
##  $ CantonName                : chr  "Genf" "Genf" "Genf" "Genf" ...
##  $ CantonAbbreviation        : chr  "GE" "GE" "GE" "GE" ...
##  $ ParlGroupName             : chr  "Sozialdemokratische Fraktion" "Sozialdemokratische Fraktion" "Sozialdemokratische Fraktion" "" ...
##  $ ParlGroupAbbreviation     : chr  "S" "S" "S" "" ...
##  $ SortOrder                 : int  1 1 79 78 77 76 75 74 73 72 ...
##  $ Start                     : POSIXct, format: "2002-04-15 16:56:27" "2002-04-15 14:31:28" ...
##  $ End                       : POSIXct, format: "2002-04-15 16:57:32" "2002-04-15 14:35:21" ...
##  $ Function                  : chr  "" "" "" "" ...
##  $ DisplaySpeaker            : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
##  $ LanguageOfText            : chr  "FR" "FR" "FR" "FR" ...
##  $ Modified                  : POSIXct, format: "2017-11-16 16:22:27" "2017-11-16 16:22:27" ...
##  $ StartTimeWithTimezone     : POSIXct, format: "2002-04-15 14:56:27" "2002-04-15 12:31:28" ...
##  $ EndTimeWithTimezone       : POSIXct, format: "2002-04-15 14:57:32" "2002-04-15 12:35:21" ...
##  $ VoteBusinessNumber        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ VoteBusinessShortNumber   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ VoteBusinessTitle         : chr  "" "" "" "" ...
##  - attr(*, ".internal.selfref")=<externalptr>

get person data

persons <- fread('data/chparl_full/persons_new.csv')

merge

transcripts <- merge(transcripts, persons, by="PersonNumber", all.x = TRUE)

clean up variables/names and delete any duplicate speeches

transcripts <- transcripts %>% 
  select(-Language.y) %>%
  rename(Language = Language.x,
         ModifiedSpeech = Modified.x,
         ModifiedPerson = Modified.y,
         IDSpeech = ID.x,
         IDPerson = ID.y) %>% 
  distinct(IDSpeech, .keep_all = T) # 100'365 obs.

save(transcripts, file = "data/transcripts.Rdata")
save(persons, file = "data/persons.Rdata")

clean data

load("data/transcripts.Rdata")
load("data/persons.Rdata")

clean html

transcripts[,txt_clean := gsub("<.*?>", "", Text)]
## Warning in `[.data.table`(transcripts, , `:=`(txt_clean, gsub("<.*?>", "", :
## Invalid .internal.selfref detected and fixed by taking a (shallow) copy of the
## data.table so that := can add this new column by reference. At an earlier point,
## this data.table has been copied by R (or was created manually using structure()
## or similar). Avoid names<- and attr<- which in R currently (and oddly) may
## copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?
## setnames and ?setattr. If this message doesn't help, please report your use case
## to the data.table issue tracker so the root cause can be fixed or this message
## improved.
transcripts[,txt_clean := gsub("\\n", "", txt_clean)]
head(transcripts$txt_clean)
## [1] "Art. 2 Abs. 2-4Antrag der KommissionZustimmung zum Entwurf des Bundesrates[VS]Art. 2 al. 2-4Proposition de la commissionAdhérer au projet du Conseil fédéral[VS]Angenommen - Adopté[VS]Ordnungsantrag GrobetAngesichts der hohen wirtschaftlichen Bedeutung der Revision des Bundesgesetzes über die berufliche Alters-, Hinterlassenen- und Invalidenvorsorge (BVG), angesichts der Interessenbindungen zahlreicher Nationalrätinnen und Nationalräte mit Versicherungsgesellschaften und Vorsorgefonds, beauftragt der Nationalrat sein Büro:- bis Dienstag, den 16. April, um 15 Uhr, von jedem Nationalrat und jeder Nationalrätin eine Erklärung einzuholen, in der festgehalten wird, ob er oder sie mit  [PAGE 519] Versicherungsgesellschaften oder Vorsorgefondseinrichtungen Interessenbindungen irgendwelcher Art hat oder in den letzten Jahren hatte;- die Ratsmitglieder über diese offen gelegten Interessenbindungen zu informieren.[VS]Motion d'ordre GrobetVu les enjeux économiques particulièrement importants de la révision de la loi sur la prévoyance professionnelle, vieillesse, survivants et invalidité (LPP), vu les liens d'intérêts de nombreux conseillers nationaux avec les compagnies d'assurance et les fonds de prévoyance le Conseil national décide de charger son Bureau:- de demander à chacun de ses membres de remplir, d'ici mardi 16 avril à 15 h, une déclaration indiquant s'il a ou a eu ces deux dernières années des liens d'intérêts, de quelque nature que ce soit, avec des compagnies d'assurance ou des institutions gérant des fonds de prévoyance;- d'informer les membres du Conseil des liens d'intérêts ainsi déclarés."
## [2] "Definitiv - Définitivement[NAM]Für das modifizierte Konzept der Minderheit III .... 103 StimmenFür das Konzept der Minderheit IV .... 65 Stimmen"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
## [3] "Fünfte Eventualabstimmung - Cinquième vote préliminaire[NAM]Für das modifizierte Konzept der Minderheit III .... 103 StimmenFür das Konzept der Minderheit III .... 67 Stimmen"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
## [4] "La présidente (Maury Pasquier Liliane, présidente): Dans ces conditions nous passons au vote pour savoir si la proposition de minorité III est amendée par la proposition de minorité I en ce qui concerne l'alternative \"\"un même employeur\"\" ou \"\"un ou plusieurs employeurs\"\"."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
## [5] "Vierte Eventualabstimmung - Quatrième vote préliminaire[NAM]Für das Konzept der Minderheit III .... 90 StimmenFür das Konzept der Mehrheit .... 81 Stimmen"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
## [6] "Dritte Eventualabstimmung - Troisième vote préliminaire[NAM]Für das Konzept der Minderheit III .... 97 StimmenFür den Antrag Riklin .... 71 Stimmen"

remove French/other language texts

transcripts[,lang := cld3::detect_language(txt_clean)]
summary(as.factor(transcripts$lang))
##      af bg-Latn      ca     ceb      co      cs      cy      da      de el-Latn 
##       1       5       3       1       2       4       2      92   69565       1 
##      en      es      et      eu      fi      fr      fy      gd      gl      ht 
##       3      10       2       1       5   26264       4       1       2       2 
##      hu      id      is      it      ja      la      lb      nl      ro      sl 
##      12       1       6     975       3      31     121       3       1       4 
##      sv    NA's 
##       4    3234
head(filter(transcripts, lang != "de"))
##    PersonNumber IDSpeech Language IdSubject VoteId Type
## 1:            0    21578       DE      4095   <NA>    3
## 2:            0    21581       DE      4095   <NA>    3
## 3:            0    21877       DE      4114   <NA>    3
## 4:            0    11833       DE      2321   <NA>    3
## 5:            0    11857       DE      2323   <NA>    3
## 6:            0    11889       DE      2329   <NA>    3
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Text
## 1:                                                                                                                                                                                                                                                                                                                               <pd_text><p><b>Art. 2 Abs. 2-4</b></p>\n<p><i>Antrag der Kommission</i></p>\n<p>Zustimmung zum Entwurf des Bundesrates</p>\n<p>[VS]</p>\n<p><b>Art. 2 al. 2-4</b></p>\n<p><i>Proposition de la commission</i></p>\n<p>Adhérer au projet du Conseil fédéral</p>\n<p>[VS]</p>\n<p><i>Angenommen - Adopté</i></p>\n<p>[VS]</p>\n<p><i>Ordnungsantrag Grobet</i></p>\n<p>Angesichts der hohen wirtschaftlichen Bedeutung der Revision des Bundesgesetzes über die berufliche Alters-, Hinterlassenen- und Invalidenvorsorge (BVG), angesichts der Interessenbindungen zahlreicher Nationalrätinnen und Nationalräte mit Versicherungsgesellschaften und Vorsorgefonds, beauftragt der Nationalrat sein Büro:</p>\n<p>- bis Dienstag, den 16. April, um 15 Uhr, von jedem Nationalrat und jeder Nationalrätin eine Erklärung einzuholen, in der festgehalten wird, ob er oder sie mit  [PAGE 519] Versicherungsgesellschaften oder Vorsorgefondseinrichtungen Interessenbindungen irgendwelcher Art hat oder in den letzten Jahren hatte;</p>\n<p>- die Ratsmitglieder über diese offen gelegten Interessenbindungen zu informieren.</p>\n<p>[VS]</p>\n<p><i>Motion d'ordre Grobet</i></p>\n<p>Vu les enjeux économiques particulièrement importants de la révision de la loi sur la prévoyance professionnelle, vieillesse, survivants et invalidité (LPP), vu les liens d'intérêts de nombreux conseillers nationaux avec les compagnies d'assurance et les fonds de prévoyance le Conseil national décide de charger son Bureau:</p>\n<p>- de demander à chacun de ses membres de remplir, d'ici mardi 16 avril à 15 h, une déclaration indiquant s'il a ou a eu ces deux dernières années des liens d'intérêts, de quelque nature que ce soit, avec des compagnies d'assurance ou des institutions gérant des fonds de prévoyance;</p>\n<p>- d'informer les membres du Conseil des liens d'intérêts ainsi déclarés.</p>\n</pd_text>
## 2:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             <pd_text><p><b>La présidente</b> (Maury Pasquier Liliane, présidente): Dans ces conditions nous passons au vote pour savoir si la proposition de minorité III est amendée par la proposition de minorité I en ce qui concerne l'alternative ""un même employeur"" ou ""un ou plusieurs employeurs"".</p>\n</pd_text>
## 3:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     <pd_text><p><b>2. Bundesbeschluss über Finanzhilfen für familienergänzende Kinderbetreuung </b></p>\n<p><b>2. Arrêté fédéral concernant les aides financières à l'accueil extra-familial pour enfants </b></p>\n<p>[VS]</p>\n<p><i>Detailberatung - Examen de détail</i></p>\n<p>[VS]</p>\n<p><b>Titel und Ingress</b></p>\n<p><i>Antrag der Kommission: BBl</i></p>\n<p>[VS]</p>\n<p><b>Titre et préambule</b></p>\n<p><i>Proposition de la commission: FF</i></p>\n<p>[VS]</p>\n<p><i>Angenommen - Adopté</i></p>\n<p>[VS]</p>\n<p><b>Art. 1</b></p>\n<p><i>Antrag der Kommission: BBl</i></p>\n<p><i>Antrag des Bundesrates: BBl</i></p>\n<p>[VS]</p>\n<p><b>Art. 1</b></p>\n<p><i>Proposition de la commission: FF</i></p>\n<p><i>Proposition du Conseil fédéral: FF</i></p>\n</pd_text>
## 4: <pd_text><p><b>Art. 33quater</b></p>\n<p><i>Antrag der Kommission</i></p>\n<p><i>Mehrheit</i></p>\n<p><i>Titel</i></p>\n<p>Finanzierung der Anpassung der Renten an die Lohn- und Preisentwicklung</p>\n<p><i>Text</i></p>\n<p>Zeichnet sich ab, dass der Ausgleichsfonds der AHV unter den Betrag von 70 Prozent einer Jahresausgabe fällt, und ist die Finanzierung der Anwendung von Artikel 33ter AHVG nicht anderweitig gesichert, setzt die Anwendung von Artikel 33ter AHVG voraus, dass Volk und Stände einer Anhebung des Mehrwertsteuersatzes zustimmen, und zwar in dem Umfang, dass mit den daraus erzielten Erträgen die Finanzierung der Anwendung von Artikel 33ter AHVG für eine Periode von mindestens fünf Jahren sichergestellt ist. Ist diese Voraussetzung nicht erfüllt, beantragt der Bundesrat, dass die Renten nur der Preisentwicklung angepasst werden.</p>\n<p>[VS]</p>\n<p><i>Minderheit</i></p>\n<p>(Rechsteiner-Basel, Baumann Stephanie, Fasel, Goll, Gross Jost, Maury Pasquier, Rechsteiner Paul, Rossini)</p>\n<p>Ablehnung des Antrages der Mehrheit</p>\n<p>[VS] [PAGE 451] </p>\n<p><b>Art. 33quater</b></p>\n<p><i>Proposition de la commission</i></p>\n<p><i>Majorité</i></p>\n<p><i>Titre</i></p>\n<p>Financement de l'adaptation des rentes à l'évolution des salaires et des prix</p>\n<p><i>Texte</i></p>\n<p>Si, selon toute probabilité, le fonds de compensation de l'AVS est inférieur à 70 pour cent de la somme correspondant aux dépenses d'une année et que le financement de l'adaptation prévue par l'article 33ter LAVS ne peut être assuré autrement, l'application de l'article 33ter suppose que le peuple et les cantons approuvent une augmentation du taux de la taxe sur la valeur ajoutée. Ladite augmentation doit permettre la perception de recettes qui assurent l'application de l'article 33ter LAVS pendant une période d'au moins cinq années. Si cette condition n'est pas remplie, le Conseil fédéral propose de n'adapter les rentes qu'à l'évolution des prix.</p>\n<p>[VS]</p>\n<p><i>Minorité</i></p>\n<p>(Rechsteiner-Basel, Baumann Stephanie, Fasel, Goll, Gross Jost, Maury Pasquier, Rechsteiner Paul, Rossini)</p>\n<p>Rejeter la proposition de la majorité</p>\n</pd_text>
## 5:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <pd_text><p>[VS]</p>\n<p>[VS]</p>\n<p>[VS]</p>\n<p>[VS]</p>\n<p>[VS]</p>\n<p><b>Einfache Anfragen</b></p>\n<p>[VS]</p>\n<p><i>Gemäss Artikel 59 Absatz 1 des Geschäftsreglementes des Nationalrates (GRN) werden im Amtlichen Bulletin auch die Einfachen Anfragen veröffentlicht. Sie werden vom Bundesrat schriftlich beantwortet und im Rat nicht behandelt (Art. 35 Abs. 6 GRN).</i></p>\n<p>[VS]</p>\n<p>[VS]</p>\n<p><b>Questions ordinaires</b></p>\n<p>[VS]</p>\n<p><i>Selon l'article 59 alinéa 1er du Règlement du Conseil national (RCN), les questions ordinaires sont également publiées dans le Bulletin officiel. Le Conseil fédéral y répond par écrit, et elles ne sont pas traitées par le Conseil (art. 35 al. 6 RCN).</i></p>\n</pd_text>
## 6:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <pd_text><p><b>1. Bundesbeschluss über die Finanzierung der AHV/IV durch Anhebung der Mehrwertsteuersätze </b></p>\n<p><b>1. Arrêté fédéral sur le financement de l'AVS/AI par le biais d'un relèvement de la taxe sur la valeur ajoutée </b></p>\n</pd_text>
##    MeetingCouncilAbbreviation MeetingDate MeetingVerbalixOid IdSession
## 1:                          N    20020415                924      4613
## 2:                          N    20020415                924      4613
## 3:                          N    20020417                927      4613
## 4:                          N    20010508                798      4607
## 5:                          N    20010509                799      4607
## 6:                          N    20010509                799      4607
##    SpeakerFirstName SpeakerLastName SpeakerFullName SpeakerFunction CouncilId
## 1:                                                                          0
## 2:                                                                          0
## 3:                                                                          0
## 4:                                                                          0
## 5:                                                                          0
## 6:                                                                          0
##    CouncilName CantonId CantonName CantonAbbreviation ParlGroupName
## 1:                    0                                            
## 2:                    0                                            
## 3:                    0                                            
## 4:                    0                                            
## 5:                    0                                            
## 6:                    0                                            
##    ParlGroupAbbreviation SortOrder               Start                 End
## 1:                              56 1753-01-01 00:00:00 1753-01-01 00:00:00
## 2:                              53 1753-01-01 00:00:00 1753-01-01 00:00:00
## 3:                              33 1753-01-01 00:00:00 1753-01-01 00:00:00
## 4:                              29 1753-01-01 00:00:00 1753-01-01 00:00:00
## 5:                               2 2001-05-09 11:36:47 2001-05-09 11:41:47
## 6:                              30 2001-05-09 09:19:29 2001-05-09 09:19:29
##    Function DisplaySpeaker LanguageOfText      ModifiedSpeech
## 1:                   FALSE             DE 2017-11-16 16:22:27
## 2:                   FALSE             DE 2017-11-16 16:22:27
## 3:                   FALSE             DE 2017-11-16 16:22:29
## 4:                   FALSE             DE 2017-11-16 16:21:00
## 5:                   FALSE             DE 2017-11-16 16:21:01
## 6:                   FALSE             DE 2017-11-16 16:21:01
##    StartTimeWithTimezone EndTimeWithTimezone VoteBusinessNumber
## 1:   1753-01-01 00:00:00 1753-01-01 00:00:00                  0
## 2:   1753-01-01 00:00:00 1753-01-01 00:00:00                  0
## 3:   1753-01-01 00:00:00 1753-01-01 00:00:00                  0
## 4:   1753-01-01 00:00:00 1753-01-01 00:00:00                  0
## 5:   2001-05-09 09:36:47 2001-05-09 09:41:47                  0
## 6:   2001-05-09 07:19:29 2001-05-09 07:19:29                  0
##    VoteBusinessShortNumber VoteBusinessTitle IDPerson PersonIdCode Title
## 1:                      NA                         NA           NA    NA
## 2:                      NA                         NA           NA    NA
## 3:                      NA                         NA           NA    NA
## 4:                      NA                         NA           NA    NA
## 5:                      NA                         NA           NA    NA
## 6:                      NA                         NA           NA    NA
##    TitleText LastName GenderAsString DateOfBirth DateOfDeath MaritalStatus
## 1:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
## 2:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
## 3:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
## 4:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
## 5:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
## 6:      <NA>     <NA>           <NA>        <NA>        <NA>            NA
##    MaritalStatusText PlaceOfBirthCity PlaceOfBirthCanton ModifiedPerson
## 1:              <NA>             <NA>               <NA>           <NA>
## 2:              <NA>             <NA>               <NA>           <NA>
## 3:              <NA>             <NA>               <NA>           <NA>
## 4:              <NA>             <NA>               <NA>           <NA>
## 5:              <NA>             <NA>               <NA>           <NA>
## 6:              <NA>             <NA>               <NA>           <NA>
##    FirstName OfficialName MilitaryRank MilitaryRankText NativeLanguage
## 1:      <NA>         <NA>           NA             <NA>           <NA>
## 2:      <NA>         <NA>           NA             <NA>           <NA>
## 3:      <NA>         <NA>           NA             <NA>           <NA>
## 4:      <NA>         <NA>           NA             <NA>           <NA>
## 5:      <NA>         <NA>           NA             <NA>           <NA>
## 6:      <NA>         <NA>           NA             <NA>           <NA>
##    NumberOfChildren
## 1:               NA
## 2:               NA
## 3:               NA
## 4:               NA
## 5:               NA
## 6:               NA
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     txt_clean
## 1:                                                                                                                                                                                                                                                        Art. 2 Abs. 2-4Antrag der KommissionZustimmung zum Entwurf des Bundesrates[VS]Art. 2 al. 2-4Proposition de la commissionAdhérer au projet du Conseil fédéral[VS]Angenommen - Adopté[VS]Ordnungsantrag GrobetAngesichts der hohen wirtschaftlichen Bedeutung der Revision des Bundesgesetzes über die berufliche Alters-, Hinterlassenen- und Invalidenvorsorge (BVG), angesichts der Interessenbindungen zahlreicher Nationalrätinnen und Nationalräte mit Versicherungsgesellschaften und Vorsorgefonds, beauftragt der Nationalrat sein Büro:- bis Dienstag, den 16. April, um 15 Uhr, von jedem Nationalrat und jeder Nationalrätin eine Erklärung einzuholen, in der festgehalten wird, ob er oder sie mit  [PAGE 519] Versicherungsgesellschaften oder Vorsorgefondseinrichtungen Interessenbindungen irgendwelcher Art hat oder in den letzten Jahren hatte;- die Ratsmitglieder über diese offen gelegten Interessenbindungen zu informieren.[VS]Motion d'ordre GrobetVu les enjeux économiques particulièrement importants de la révision de la loi sur la prévoyance professionnelle, vieillesse, survivants et invalidité (LPP), vu les liens d'intérêts de nombreux conseillers nationaux avec les compagnies d'assurance et les fonds de prévoyance le Conseil national décide de charger son Bureau:- de demander à chacun de ses membres de remplir, d'ici mardi 16 avril à 15 h, une déclaration indiquant s'il a ou a eu ces deux dernières années des liens d'intérêts, de quelque nature que ce soit, avec des compagnies d'assurance ou des institutions gérant des fonds de prévoyance;- d'informer les membres du Conseil des liens d'intérêts ainsi déclarés.
## 2:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          La présidente (Maury Pasquier Liliane, présidente): Dans ces conditions nous passons au vote pour savoir si la proposition de minorité III est amendée par la proposition de minorité I en ce qui concerne l'alternative ""un même employeur"" ou ""un ou plusieurs employeurs"".
## 3:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        2. Bundesbeschluss über Finanzhilfen für familienergänzende Kinderbetreuung 2. Arrêté fédéral concernant les aides financières à l'accueil extra-familial pour enfants [VS]Detailberatung - Examen de détail[VS]Titel und IngressAntrag der Kommission: BBl[VS]Titre et préambuleProposition de la commission: FF[VS]Angenommen - Adopté[VS]Art. 1Antrag der Kommission: BBlAntrag des Bundesrates: BBl[VS]Art. 1Proposition de la commission: FFProposition du Conseil fédéral: FF
## 4: Art. 33quaterAntrag der KommissionMehrheitTitelFinanzierung der Anpassung der Renten an die Lohn- und PreisentwicklungTextZeichnet sich ab, dass der Ausgleichsfonds der AHV unter den Betrag von 70 Prozent einer Jahresausgabe fällt, und ist die Finanzierung der Anwendung von Artikel 33ter AHVG nicht anderweitig gesichert, setzt die Anwendung von Artikel 33ter AHVG voraus, dass Volk und Stände einer Anhebung des Mehrwertsteuersatzes zustimmen, und zwar in dem Umfang, dass mit den daraus erzielten Erträgen die Finanzierung der Anwendung von Artikel 33ter AHVG für eine Periode von mindestens fünf Jahren sichergestellt ist. Ist diese Voraussetzung nicht erfüllt, beantragt der Bundesrat, dass die Renten nur der Preisentwicklung angepasst werden.[VS]Minderheit(Rechsteiner-Basel, Baumann Stephanie, Fasel, Goll, Gross Jost, Maury Pasquier, Rechsteiner Paul, Rossini)Ablehnung des Antrages der Mehrheit[VS] [PAGE 451] Art. 33quaterProposition de la commissionMajoritéTitreFinancement de l'adaptation des rentes à l'évolution des salaires et des prixTexteSi, selon toute probabilité, le fonds de compensation de l'AVS est inférieur à 70 pour cent de la somme correspondant aux dépenses d'une année et que le financement de l'adaptation prévue par l'article 33ter LAVS ne peut être assuré autrement, l'application de l'article 33ter suppose que le peuple et les cantons approuvent une augmentation du taux de la taxe sur la valeur ajoutée. Ladite augmentation doit permettre la perception de recettes qui assurent l'application de l'article 33ter LAVS pendant une période d'au moins cinq années. Si cette condition n'est pas remplie, le Conseil fédéral propose de n'adapter les rentes qu'à l'évolution des prix.[VS]Minorité(Rechsteiner-Basel, Baumann Stephanie, Fasel, Goll, Gross Jost, Maury Pasquier, Rechsteiner Paul, Rossini)Rejeter la proposition de la majorité
## 5:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  [VS][VS][VS][VS][VS]Einfache Anfragen[VS]Gemäss Artikel 59 Absatz 1 des Geschäftsreglementes des Nationalrates (GRN) werden im Amtlichen Bulletin auch die Einfachen Anfragen veröffentlicht. Sie werden vom Bundesrat schriftlich beantwortet und im Rat nicht behandelt (Art. 35 Abs. 6 GRN).[VS][VS]Questions ordinaires[VS]Selon l'article 59 alinéa 1er du Règlement du Conseil national (RCN), les questions ordinaires sont également publiées dans le Bulletin officiel. Le Conseil fédéral y répond par écrit, et elles ne sont pas traitées par le Conseil (art. 35 al. 6 RCN).
## 6:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 1. Bundesbeschluss über die Finanzierung der AHV/IV durch Anhebung der Mehrwertsteuersätze 1. Arrêté fédéral sur le financement de l'AVS/AI par le biais d'un relèvement de la taxe sur la valeur ajoutée 
##    lang
## 1:   fr
## 2:   fr
## 3:   fr
## 4:   fr
## 5:   fr
## 6:   fr
transcripts <- filter(transcripts, lang == "de")

lower-case text

transcripts$txt_clean <- tolower(transcripts$txt_clean)

remove Bundesräte and Bundeskanzler:innen - different kind of representation

transcripts <- filter(transcripts, SpeakerFunction != "BK-F" &
                        SpeakerFunction != "BK-M" &
                        SpeakerFunction != "BR-F" &
                        SpeakerFunction != "BR-M" &
                        SpeakerFunction != "BPR-F" &
                        SpeakerFunction != "BPR-M" &
                        SpeakerFunction != "VPBR-F" &
                        SpeakerFunction != "VPBR-M")

remove PersonNumber = 0 (Bekanntgabe von Abstimmungsresultaten etc.)

transcripts <- filter(transcripts,PersonNumber != 0)

check for complete person info

summary(as.factor(transcripts$SpeakerFullName)) #ok
##                     Binder Max Leutenegger Oberholzer Susanne 
##                            790                            702 
##     Egerszegi-Obrist Christine                  Janiak Claude 
##                            696                            630 
##                   Stöckli Hans             Lustenberger Ruedi 
##                            516                            507 
##                 Germann Hannes                     Stahl Jürg 
##                            483                            462 
##               Schwander Pirmin                Walter Hansjörg 
##                            449                            443 
##                      Graf Maya               Seiler Hanspeter 
##                            439                            436 
##                     Hess Peter                   Aebi Andreas 
##                            435                            419 
##                     Fluri Kurt                 Vischer Daniel 
##                            413                            389 
##          Bruderer Wyss Pascale             Markwalder Christa 
##                            388                            388 
##              Aeschbacher Ruedi               Rechsteiner Paul 
##                            339                            321 
##                  Kaufmann Hans              Bischofberger Ivo 
##                            304                            303 
##                 Schlüer Ulrich                  Kuprecht Alex 
##                            300                            296 
##                     Fetz Anita  Fässler-Osterwalder Hildegard 
##                            288                            283 
##               Gutzwiller Felix             Teuscher Franziska 
##                            283                            275 
##                  Engler Stefan          Kiener Nellen Margret 
##                            270                            258 
##                    Widmer Hans                    Noser Ruedi 
##                            258                            257 
##                   Hefti Thomas                 Bischof Pirmin 
##                            243                            241 
##            Keller-Sutter Karin                     Föhn Peter 
##                            239                            235 
##                       Heim Bea         Wasserfallen Christian 
##                            235                            233 
##                    Genner Ruth                    Müller Geri 
##                            232                            227 
##                Schelbert Louis                  Christen Yves 
##                            227                            224 
##                     Flach Beat                   Riklin Kathy 
##                            216                            216 
##                  Studer Heiner                Fehr Jacqueline 
##                            214                            213 
##                Bortoluzzi Toni               Pfister Theophil 
##                            209                            208 
##                  Baader Caspar            Brändli Christoffel 
##                            207                            207 
##              Glättli Balthasar                  Loepfe Arthur 
##                            205                            204 
##                  Aeschi Thomas                    Humbel Ruth 
##                            203                            201 
##                    Kälin Irène               Lombardi Filippo 
##                            201                            200 
##                  Müller Walter                  Bäumle Martin 
##                            199                            198 
##                    Bieri Peter                  Graber Konrad 
##                            198                            198 
##                 Müller Philipp                    Rieder Beat 
##                            197                            197 
##                   Altherr Hans                 Zuppiger Bruno 
##                            192                            191 
##        Häberli-Koller Brigitte                      Fehr Hans 
##                            189                            188 
##                     Lang Josef             Rechsteiner Rudolf 
##                            186                            185 
##                   Thanei Anita                  Hutter Markus 
##                            184                            183 
##               Weyeneth Hermann           Baumann J. Alexander 
##                            183                            179 
##                     Stamm Luzi                     Gysin Remo 
##                            179                            178 
##                 Amstutz Adrian                 Steiner Rudolf 
##                            176                            175 
##                 Fehr Hans-Jürg                     Gross Jost 
##                            173                            169 
##                Jositsch Daniel                  Vollmer Peter 
##                            169                            168 
##                  Caroni Andrea                   Gysi Barbara 
##                            167                            164 
##                    Vogler Karl                  Weibel Thomas 
##                            164                            163 
##                Triponez Pierre                  Bührer Gerold 
##                            162                            161 
##                Schenker Silvia                  Girod Bastien 
##                            161                            159 
##                  Schibli Ernst                Zanetti Roberto 
##                            159                            156 
##                  Schmid Martin            Sommaruga Simonetta 
##                            155                            155 
##                     Müller Leo                Theiler Georges 
##                            152                            152 
##                 Fischer Roland                      Jans Beat 
##                            150                            150 
##          Meier-Schatz Lucrezia       Carobbio Guscetti Marina 
##                            149                            148 
##                     Huber Gabi                        (Other) 
##                            146                          22091
summary(as.factor(transcripts$GenderAsString)) #ok - a lot more men :-)
##     f     m 
## 13286 34472
summary(as.factor(transcripts$CouncilName)) #! Ständerat is still there
##             Nationalrat   Ständerat 
##           3       38969        8786
transcripts <- filter(transcripts, CouncilName != "Ständerat")

summary(as.factor(transcripts$ParlGroupName))
##                                          
##                                        3 
##         Christlichdemokratische Fraktion 
##                                     2451 
##                             CVP-Fraktion 
##                                      741 
##      Die Mitte-Fraktion. Die Mitte. EVP. 
##                                      443 
##    Evangelische und Unabhängige Fraktion 
##                                      379 
##                         EVP/EDU Fraktion 
##                                      375 
##                    FDP-Liberale Fraktion 
##                                     1989 
##                              Fraktion BD 
##                                      733 
##                         Fraktion CVP-EVP 
##                                      982 
##                     Fraktion CVP/EVP/glp 
##                                     1148 
## Fraktion der Schweizerischen Volkspartei 
##                                    10722 
##                             Fraktionslos 
##                                       97 
##        Freisinnig-demokratische Fraktion 
##                                     4552 
##                           Grüne Fraktion 
##                                     3949 
##                    Grünliberale Fraktion 
##                                     1019 
##                        Liberale Fraktion 
##                                       52 
##             Sozialdemokratische Fraktion 
##                                     9337
summary(as.factor(transcripts$ParlGroupAbbreviation))
##           -    BD     C    CE   CEg     E     G    GL     L   M-E     R    RL 
##     3    97   733  3192   982  1148   754  3949  1019    52   443  3407  3134 
##     S     V 
##  9337 10722
# note on abbreviations:
# V = SVP
# S = SP
# C = Christlichdemokratische Fraktion + CVP-Fraktion --> same thing according to https://www.parlament.ch/de/%C3%BCber-das-parlament/archiv/archiv-fraktionen
# M-E = Die Mitte-Fraktion. Die Mitte. EVP.
# E = Evangelische und Unabhängige Fraktion + EVP/EDU-Fraktion
# BD = Fraktion BD --> BDP
# RL = FDP-Liberale Fraktion, Freisinnig-demokratische Fraktion
# CE = Fraktion CVP-EVP
# CEg = Fraktion CVP/EVP/glp
# - = Fraktionslos
# R = Freisinnig-demokratische Fraktion!
# G = Grüne Fraktion
# GL = Grünliberale Fraktion
# L = Liberale Fraktion

get legislature variable

transcripts$date <- as.Date(transcripts$Start) %>% 
  as.character() %>% 
  str_replace_all("-", "") %>% 
  as.numeric

transcripts$leg <- car::recode(transcripts$date,
                                           "'19991201':'20031130' = 46;
                                           '20031201':'20071130' = 47;
                                           '20071201':'20111130' = 48;
                                           '20111201':'20151130' = 49;
                                           '20151201':'20191130' = 50;
                                           '20191201':'20220307' = 51")

table(transcripts$leg, transcripts$ParlGroupAbbreviation)
##     
##              -   BD    C   CE  CEg    E    G   GL    L  M-E    R   RL    S    V
##   46    0   31    0 1485    0    0  379  493    0   52    0 1810    0 2149 2126
##   47    1   55    0  966    0    0  375  765    0    0    0 1597   87 2280 2197
##   48    0   11  196    0    0 1148    0  963    0    0    0    0 1062 1839 1805
##   49    0    0  275    1  982    0    0  795  427    0    0    0  737 1295 1718
##   50    2    0  262  740    0    0    0  421  326    0    0    0  811 1153 1769
##   51    0    0    0    0    0    0    0  512  266    0  443    0  437  621 1107
transcripts$PGAleg <- paste0(transcripts$leg, transcripts$ParlGroupAbbreviation)

only keep Fraktionen with at least 200 speeches per legislature

transcripts <- filter(transcripts, ParlGroupAbbreviation != "-")
transcripts <- filter(transcripts, PGAleg != "48BD")
transcripts <- filter(transcripts, PGAleg != "46L")

correct coding errors

transcripts <- mutate(transcripts,
                      ParlGroupAbbreviation = if_else(ParlGroupAbbreviation == "R" & leg == 47, "RL", ParlGroupAbbreviation))
transcripts <- mutate(transcripts,
                      ParlGroupAbbreviation = if_else(ParlGroupAbbreviation == "C" & leg == 49, "CE", ParlGroupAbbreviation))

3 cases must be assigned manually

unknowns <- filter(transcripts, ParlGroupAbbreviation == "")
transcripts <- arrange(transcripts, IDSpeech)
transcripts[12162,22] <- "C" # Jean-Michel Cina
transcripts[12162,21] <- "Christlichdemokratische Fraktion" # Jean-Michel Cina

2 further speeches were by Ruedi Noser as a Ständerat and must be removed

transcripts <- filter(transcripts, ParlGroupAbbreviation != "")
rm(unknowns)

remove PGAleg

transcripts <- select(transcripts, -PGAleg)

save(transcripts, file = "data/transcripts.clean.Rdata") # 35'909 obs.

try dictionary

women’s topics dictionary

words.list <- list(frau = c("fraue*", "[[:alpha:]]+frau*", "rolle der frau*"),
                   weiblich = "weiblich*",
                   geschlecht = "geschlecht*",
                   gender = "gender*",
                   maedchen = "mädchen*",
                   schwanger = "schwanger*",
                   geburt = "geburt*",
                   baby = "baby*",
                   kontrazeptiv = "*kontrazeptiv*",
                   abtreibung = "abtreibung*",
                   reproduktionsmedizin = "reproduktionsmedizin*",
                   ungeboren = "ungeboren*",
                   kuenstliche_befruchtung = "künstliche* befruchtung*",
                   praeimplantationsdiagnostik = "präimplantationsdiagnostik*",
                   kinder = "kind*",
                   krippe = "krippe*",
                   kita = "kita*",
                   tagesschule = "[[:alpha:]]*tagesschule*",
                   tagesbetreuung = "[[:alpha:]]*tagesbetreuung*",
                   erziehung = "erzieh*",
                   stillzeit = "stillzeit*",
                   tagesmutter = "tagesmutter*",
                   mutter = c("mutter*", "mütter*"),
                   vaterschaft = "vaterschaft*",
                   eltern = "elter*",
                   alleinerziehend = "alleinerziehend*",
                   familie = "familie*",
                   ehe = c("ehepaar*", "eheschliessung*", "ehebund*", "ehebündnis*", "ehestand*", "ehegatt*", "ehepartner*"),
                   heirat = "heirat*",
                   trauung = "trauung*",
                   gleichstellung = c("gleichstellung* von frau*", "gleichstellung* der frau*", "gleichstellung* der geschlechter"),
                   feminismus = "feminis*",
                   gleichberechtigung = c("gleichberechtigung* von frau*", "gleichberechtigung* der frau*", "gleichberechtigung* der geschlechter"),
                   gleichbehandlung = c("gleichbehandlung* von frau*", "gleichbehandlung* der frau*", "gleichbehandlung* der geschlechter"),
                   chancengleichheit = c("chancengleichheit* der frau*", "chancengleichheit* von frau*", "chancengleichheit* zwischen frau*"),
                   ungleichheiten = c("ungleichheit* von frau*", "ungleichheit* zwischen frau*", "ungleichheit* der geschlechter*"),
                   equal_pay = "equal pay",
                   diskriminierung = c("diskriminierung* der frau*", "diskriminierung* aufgrund des geschlechts", "diskriminierung* wegen des geschlechts",
                                       "diskriminierung* von frau*", "diskriminierung* der geschlechter"),
                   vergewaltigung = c("vergewaltigung*", "vergewaltigt*"),
                   prostitution = "prostitution*",
                   genitalverstuemmelung = c("genitalverstümmelung*", "genitalmutilation*", "genitalbeschneidung*"),
                   zwangsheirat = c("zwangsheirat*", "zwangshochzeit*", "zwangsverheiratung*"),
                   sex = c("sex", "sexuelle* integrität*", "sexuelle* ausbeutung*", "sexuelle* aufklärung*", "sexuelle* belästigung*",
                           "sexuelle* nötigung*", "sexuelle* misshandlung*"),
                   haeusliche_gewalt = "häusliche* gewalt*",
                   ehrenmord = "ehrenmord*",
                   menschenhandel = "menschenhandel*",
                   scheidung = "scheidung*",
                   geschieden = "geschieden*",
                   witwe = "witwe*",
                   hinterbliebenenrente = "hinterbliebenenrente*",
                   betreuung = c("betreu* von kind*", "betreu* der kind*",
                                 "betreu* von angehörigen*", "betreu* der angehörigen*", "betreu* angehöriger*",
                                 "betreu* von betagten*", "betreu* der betagten*", "betreu* betagter*",
                                 "betreu* von alten*", "betreu* der alten*", "betreu* alter*",
                                 "betreu* von kranken*", "betreu* der kranken*", "betreu* kranker*",
                                 "betreuungspflicht*", "betreuungsgutschrift*", "betreuungszulage*",
                                 "angehörigenbetreuung*", "betagtenbetreuung*", "altersbetreuung*", "krankenbetreuung*"),
                   mammographie = "mammographie*",
                   gebaermutter = "gebärmutter*",
                   eierstock = "eierstock*",
                   unfruchtbarkeit = "unfruchtbarkeit*",
                   klimakterisch = "klimakterisch*",
                   klimakterium = "klimakterium*",
                   wechseljahre = "wechseljahre*",
                   menopause = "menopause*",
                   menstruation = "menstruation*",
                   oestrogen = "östrogen*",
                   brust = "brust*",
                   silikonimplantat = "silikonimplantat*",
                   hebamme = "hebamme*",
                   krankenschwester = "krankenschwester*",
                   arzthelferin = "arzthelferin*",
                   aupair = "aupair*",
                   pflege = c("pflege* von angehörigen*", "pflege* der angehörigen*",
                              "pflege* von betagten*", "pflege* der betagten*", "pflege* betagter*",
                              "pflege* von alten*", "pflege* der alten*", "pflege* alter*",
                              "pflege* von kranken*", "pflege* der kranken*", "pflege* kranker*",
                              "pflegeversicherung*", "pflegeausbildung*", "pflegeplatz*", "pflegeplätze*",
                              "pflegeinitiative*", "pflegefach*", "pfleger*", "pflegekraft*", "pflegekräfte",
                              "stationäre* pflege*", "ambulante* pflege*", "palliativpflege*", "sterbebegleitung*",
                              "seniorenpflege*","altenpflege*", "alterspflege*"), 
                   haushaltskraft = "haushaltskraft*",
                   care = "care*",
                   lohngleichheit = c("lohngleichheit", "lohndiskriminierung"),
                   praenatal = "pränatal*",
                   alimente = "alimente*",
                   spitex = "spitex*",
                   foetus = c("fötus", "fetus", "föten", "fötusse"),
                   adoption = c("adoptiv*", "adoption*")
)

women.dict <- dictionary(words.list)
save(women.dict, file = "data/women.dict.Rds")

create dfm

transcripts.c <- corpus(transcripts, text_field = "txt_clean")
transcripts.t <- tokens(transcripts.c, remove_number=T, remove_punct=T)
women.t <- tokens_lookup(transcripts.t, women.dict) # important to look up at tokens level because of multi-word dictionary entries
women.t %>% dfm %>% textstat_frequency()
##                        feature frequency rank docfreq group
## 1                       kinder      8450    1    2448   all
## 2                      familie      5647    2    1968   all
## 3                         frau      2998    3    1175   all
## 4                       eltern      1928    4     757   all
## 5                       mutter      1034    5     497   all
## 6                          ehe       596    6     307   all
## 7                       geburt       586    7     382   all
## 8                   geschlecht       513    8     305   all
## 9                        witwe       494    9      82   all
## 10                 vaterschaft       482   10     113   all
## 11                   schwanger       462   11     150   all
## 12                   erziehung       461   12     288   all
## 13                    adoption       319   13      90   all
## 14                   scheidung       299   14     100   all
## 15                  abtreibung       223   15      71   all
## 16              gleichstellung       210   16     147   all
## 17                      pflege       195   17      90   all
## 18              menschenhandel       173   18      83   all
## 19                      heirat       164   19     122   all
## 20              lohngleichheit       144   20      82   all
## 21              vergewaltigung       143   21     100   all
## 22                         sex       142   22      78   all
## 23           haeusliche_gewalt       133   23      71   all
## 24                      krippe       129   24      86   all
## 25                   betreuung       104   25      78   all
## 26                    maedchen       102   26      76   all
## 27                    alimente       102   26      35   all
## 28                      gender       101   28      46   all
## 29                zwangsheirat        90   29      42   all
## 30                      spitex        82   30      54   all
## 31                  geschieden        75   31      40   all
## 32             alleinerziehend        71   32      51   all
## 33                        care        70   33      56   all
## 34                   ungeboren        65   34      31   all
## 35                        kita        62   35      32   all
## 36                        baby        59   36      39   all
## 37                    weiblich        48   37      43   all
## 38                   praenatal        48   37      20   all
## 39                prostitution        44   39      28   all
## 40                       brust        44   39      29   all
## 41             diskriminierung        43   41      34   all
## 42                      foetus        32   42      16   all
## 43            krankenschwester        20   43      16   all
## 44                     hebamme        15   44      12   all
## 45          gleichberechtigung        12   45      12   all
## 46            gleichbehandlung        12   45      12   all
## 47 praeimplantationsdiagnostik         9   47       6   all
## 48     kuenstliche_befruchtung         8   48       8   all
## 49                  feminismus         8   48       8   all
## 50       genitalverstuemmelung         5   50       4   all
## 51                gebaermutter         5   50       4   all
## 52                     trauung         4   52       3   all
## 53           chancengleichheit         3   53       3   all
## 54              ungleichheiten         3   53       3   all
## 55                mammographie         2   55       2   all
## 56             unfruchtbarkeit         2   55       2   all
## 57                kontrazeptiv         1   57       1   all
## 58        reproduktionsmedizin         1   57       1   all
## 59                   stillzeit         1   57       1   all
## 60                 tagesmutter         1   57       1   all
## 61                   equal_pay         1   57       1   all
## 62                   ehrenmord         1   57       1   all
## 63        hinterbliebenenrente         1   57       1   all
## 64                   oestrogen         1   57       1   all
women.dfm <- dfm(women.t)
save(women.dfm, file = "data/women.dfm.Rds")

add to main data frame

transcripts$frau <- convert(women.dfm, to = "data.frame")[,2]
transcripts$weiblich <- convert(women.dfm, to = "data.frame")[,3]
transcripts$geschlecht <- convert(women.dfm, to = "data.frame")[,4]
transcripts$gender <- convert(women.dfm, to = "data.frame")[,5]
transcripts$maedchen <- convert(women.dfm, to = "data.frame")[,6]
transcripts$schwanger <- convert(women.dfm, to = "data.frame")[,7]
transcripts$geburt <- convert(women.dfm, to = "data.frame")[,8]
transcripts$baby <- convert(women.dfm, to = "data.frame")[,9]
transcripts$kontrazeptiv <- convert(women.dfm, to = "data.frame")[,10]
transcripts$abtreibung <- convert(women.dfm, to = "data.frame")[,11]
transcripts$reproduktionsmedizin <- convert(women.dfm, to = "data.frame")[,12]
transcripts$ungeboren <- convert(women.dfm, to = "data.frame")[,13]
transcripts$kuenstliche_befruchtung <- convert(women.dfm, to = "data.frame")[,14]
transcripts$praeimplantationsdiagnostik <- convert(women.dfm, to = "data.frame")[,15]
transcripts$kinder <- convert(women.dfm, to = "data.frame")[,16]
transcripts$krippe <- convert(women.dfm, to = "data.frame")[,17]
transcripts$kita <- convert(women.dfm, to = "data.frame")[,18]
transcripts$tagesschule <- convert(women.dfm, to = "data.frame")[,19]
transcripts$tagesbetreuung <- convert(women.dfm, to = "data.frame")[,20]
transcripts$erziehung <- convert(women.dfm, to = "data.frame")[,21]
transcripts$stillzeit <- convert(women.dfm, to = "data.frame")[,22]
transcripts$tagesmutter <- convert(women.dfm, to = "data.frame")[,23]
transcripts$mutter <- convert(women.dfm, to = "data.frame")[,24]
transcripts$vaterschaft <- convert(women.dfm, to = "data.frame")[,25]
transcripts$eltern <- convert(women.dfm, to = "data.frame")[,26]
transcripts$alleinerziehend <- convert(women.dfm, to = "data.frame")[,27]
transcripts$familie <- convert(women.dfm, to = "data.frame")[,28]
transcripts$ehe <- convert(women.dfm, to = "data.frame")[,29]
transcripts$heirat <- convert(women.dfm, to = "data.frame")[,30]
transcripts$trauung <- convert(women.dfm, to = "data.frame")[,31]
transcripts$gleichstellung <- convert(women.dfm, to = "data.frame")[,32]
transcripts$feminismus <- convert(women.dfm, to = "data.frame")[,33]
transcripts$gleichberechtigung <- convert(women.dfm, to = "data.frame")[,34]
transcripts$gleichbehandlung <- convert(women.dfm, to = "data.frame")[,35]
transcripts$chancengleichheit <- convert(women.dfm, to = "data.frame")[,36]
transcripts$ungleichheiten <- convert(women.dfm, to = "data.frame")[,37]
transcripts$equal_pay <- convert(women.dfm, to = "data.frame")[,38]
transcripts$diskriminierung <- convert(women.dfm, to = "data.frame")[,39]
transcripts$vergewaltigung <- convert(women.dfm, to = "data.frame")[,40]
transcripts$prostitution <- convert(women.dfm, to = "data.frame")[,41]
transcripts$genitalverstuemmelung <- convert(women.dfm, to = "data.frame")[,42]
transcripts$zwangsheirat <- convert(women.dfm, to = "data.frame")[,43]
transcripts$sex <- convert(women.dfm, to = "data.frame")[,44]
transcripts$haeusliche_gewalt <- convert(women.dfm, to = "data.frame")[,45]
transcripts$ehrenmord <- convert(women.dfm, to = "data.frame")[,46]
transcripts$menschenhandel <- convert(women.dfm, to = "data.frame")[,47]
transcripts$scheidung <- convert(women.dfm, to = "data.frame")[,48]
transcripts$geschieden <- convert(women.dfm, to = "data.frame")[,49]
transcripts$witwe <- convert(women.dfm, to = "data.frame")[,50]
transcripts$hinterbliebenenrente <- convert(women.dfm, to = "data.frame")[,51]
transcripts$betreuung <- convert(women.dfm, to = "data.frame")[,52]
transcripts$mammographie <- convert(women.dfm, to = "data.frame")[,53]
transcripts$gebaermutter <- convert(women.dfm, to = "data.frame")[,54]
transcripts$eierstock <- convert(women.dfm, to = "data.frame")[,55]
transcripts$unfruchtbarkeit <- convert(women.dfm, to = "data.frame")[,56]
transcripts$klimakterisch <- convert(women.dfm, to = "data.frame")[,57]
transcripts$klimakterium <- convert(women.dfm, to = "data.frame")[,58]
transcripts$wechseljahre <- convert(women.dfm, to = "data.frame")[,59]
transcripts$menopause <- convert(women.dfm, to = "data.frame")[,60]
transcripts$menstruation <- convert(women.dfm, to = "data.frame")[,61]
transcripts$oestrogen <- convert(women.dfm, to = "data.frame")[,62]
transcripts$brust <- convert(women.dfm, to = "data.frame")[,63]
transcripts$silikonimplantat <- convert(women.dfm, to = "data.frame")[,64]
transcripts$hebamme <- convert(women.dfm, to = "data.frame")[,65]
transcripts$krankenschwester <- convert(women.dfm, to = "data.frame")[,66]
transcripts$arzthelferin <- convert(women.dfm, to = "data.frame")[,67]
transcripts$aupair <- convert(women.dfm, to = "data.frame")[,68]
transcripts$pflege <- convert(women.dfm, to = "data.frame")[,69]
transcripts$haushaltskraft <- convert(women.dfm, to = "data.frame")[,70]
transcripts$care <- convert(women.dfm, to = "data.frame")[,71]
transcripts$lohngleichheit <- convert(women.dfm, to = "data.frame")[,72]
transcripts$praenatal <- convert(women.dfm, to = "data.frame")[,73]
transcripts$alimente <- convert(women.dfm, to = "data.frame")[,74]
transcripts$spitex <- convert(women.dfm, to = "data.frame")[,75]
transcripts$foetus <- convert(women.dfm, to = "data.frame")[,76]
transcripts$adoption <- convert(women.dfm, to = "data.frame")[,77]

transcripts$women <- ifelse(rowSums(transcripts[,58:133] > 0), 1, 0)

create data frame with only speeches on women’s topics

transcripts.women <- as.data.frame(filter(transcripts, women > 0))

deal with special cases of false positives

transcripts.maedchen <- as.data.frame(filter(transcripts, maedchen > 0))
transcripts.geburt <- as.data.frame(filter(transcripts, geburt > 0))
transcripts.baby <- as.data.frame(filter(transcripts, baby > 0))
transcripts.eltern <- as.data.frame(filter(transcripts, eltern > 0))

transcripts.maedchen.unclean <- transcripts.maedchen[!(transcripts.maedchen[,62] == 1) & any(transcripts.maedchen[,c(58:61,62:133)]!= 0) &
                                                       grepl("mädchen für alles", transcripts.maedchen[,54]), ]

transcripts.geburt.unclean <- transcripts.geburt[!(transcripts.geburt[,64] == 1) & any(transcripts.geburt[,c(58:63,65:133)]!= 0) &
                                                   grepl("geburtstag*", transcripts.geburt[,54]), ]

transcripts.baby.unclean <- transcripts.baby[!(transcripts.baby[,65] == 1) & any(transcripts.baby[,c(58:64,66:133)]!= 0) & 
                                               grepl("babyboom*|babylon*", transcripts.baby[,54]), ]

transcripts.eltern.unclean <- transcripts.eltern[!(transcripts.eltern[,82] == 1) & any(transcripts.eltern[,c(58:81,83:133)]!= 0) & 
                                                   grepl("elterngeneration*", transcripts.eltern[,54]), ]

transcripts.women.clean <- transcripts.women[!(transcripts.women[,2] %in% transcripts.maedchen.unclean[,2]),]
transcripts.women.clean <- transcripts.women.clean[!(transcripts.women.clean[,2] %in% transcripts.geburt.unclean[,2]),]
transcripts.women.clean <- transcripts.women.clean[!(transcripts.women.clean[,2] %in% transcripts.baby.unclean[,2]),]
transcripts.women.clean <- transcripts.women.clean[!(transcripts.women.clean[,2] %in% transcripts.eltern.unclean[,2]),]
# clean version contains 5246 obs.

save(transcripts.women.clean, file = "data/transcripts.women.Rdata")

calculate percentage of women in NR

get percentage of women in Fraktionen

anteile <- read.xlsx("data/frauenanteile_bfs_partei.xlsx", 2) %>% 
  select(-NA.)
anteile[,2:13] <- sapply(anteile[,2:13], as.numeric)
anteile <- anteile %>%
  pivot_longer(X1999_f:X2019_m, names_to = "leg_sex", values_to = "n_nr") %>% 
  rename(ParlGroupAbbreviation = partei)
anteile$sex <- substr(anteile$leg_sex, 7,7)
anteile$leg <- substr(anteile$leg_sex, 2,5)
anteile <- select(anteile, -leg_sex) %>% 
  pivot_wider(names_from = "sex", values_from = "n_nr") %>% 
  rename(f_nr_fr = f,
         m_nr_fr = m)
anteile$f_perc_nr_fr <- round(100*anteile$f_nr_fr/(anteile$f_nr_fr + anteile$m_nr_fr), 1)
anteile$leg <- car::recode(anteile$leg,
                           "1999 = 46;
                           2003 = 47;
                           2007 = 48;
                           2011 = 49;
                           2015 = 50;
                           2019 = 51")

add values to main data frame

transcripts.women.clean <- left_join(transcripts.women.clean, anteile, by = c("ParlGroupAbbreviation", "leg"))

anteile.total <- filter(anteile, ParlGroupAbbreviation == "Total") %>% 
  rename(f_nr = f_nr_fr,
         m_nr = m_nr_fr,
         f_perc_nr = f_perc_nr_fr) %>% 
  select(-ParlGroupAbbreviation)

transcripts.women.clean <- left_join(transcripts.women.clean, anteile.total, by = "leg")

add values to overall data set as well

transcripts <- left_join(transcripts, anteile, by = c("ParlGroupAbbreviation", "leg"))
transcripts <- left_join(transcripts, anteile.total, by = "leg")

add percentages of speeches

nrow(transcripts.women.clean)/nrow(transcripts) # 13.6% of all speeches are about women's topics
## [1] 0.1358188

how many speeches on women’s topics were there per legislature?

transcripts.women.leg <- group_by(transcripts.women.clean, leg) %>% 
  summarise(n = n())

create data frame with only speeches on women’s topics made by men

transcripts.women.m <- filter(transcripts.women.clean, GenderAsString == "m") # 2458 obs.
save(transcripts.women.m, file = "data/transcripts.women.m.Rdata")

transcripts.women.m.leg <- group_by(transcripts.women.m, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc = round(100*n/transcripts.women.leg$n, 1)) %>% 
  rename(m = n)

transcripts.women.clean <- left_join(transcripts.women.clean, transcripts.women.m.leg, by = "leg")
transcripts <- left_join(transcripts, transcripts.women.m.leg, by = "leg")

how many speeches in total were there per legislature?

transcripts.leg <- group_by(transcripts, leg) %>% 
  summarise(n = n())

create data frame with only speeches made by men (all topics)

transcripts.m <- filter(transcripts, GenderAsString == "m") # 24'421 obs.
save(transcripts.m, file = "data/transcripts.m.Rdata")

transcripts.m.leg <- group_by(transcripts.m, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc_all = round(100*n/transcripts.leg$n, 1)) %>% 
  rename(m_all = n)

transcripts.women.clean <- left_join(transcripts.women.clean, transcripts.m.leg, by = "leg")
transcripts <- left_join(transcripts, transcripts.m.leg, by = "leg")

how many speeches on women’s topics were there per legislature per Fraktion?

transcripts.women.fr.leg <- group_by(transcripts.women.clean, ParlGroupAbbreviation, leg) %>% 
  summarise(n = n()) %>% ungroup
## `summarise()` has grouped output by 'ParlGroupAbbreviation'. You can override
## using the `.groups` argument.
transcripts.women.m.fr.leg <- group_by(transcripts.women.m, ParlGroupAbbreviation, leg) %>% 
  summarise(n = n()) %>% ungroup %>% 
  mutate(m_perc_fr = round(100*n/transcripts.women.fr.leg$n, 1)) %>% 
  rename(m_fr = n)
## `summarise()` has grouped output by 'ParlGroupAbbreviation'. You can override
## using the `.groups` argument.
transcripts.women.clean <- left_join(transcripts.women.clean, transcripts.women.m.fr.leg, by = c("ParlGroupAbbreviation", "leg"))
transcripts <- left_join(transcripts, transcripts.women.m.fr.leg, by = c("ParlGroupAbbreviation", "leg"))

how many speeches in total were there per legislature per Fraktion?

transcripts.fr.leg <- group_by(transcripts, ParlGroupAbbreviation, leg) %>% 
  summarise(n = n()) %>% ungroup
## `summarise()` has grouped output by 'ParlGroupAbbreviation'. You can override
## using the `.groups` argument.
transcripts.m.fr.leg <- group_by(transcripts.m, ParlGroupAbbreviation, leg) %>% 
  summarise(n = n()) %>% ungroup %>% 
  mutate(m_perc_fr_all = round(100*n/transcripts.fr.leg$n, 1)) %>% 
  rename(m_fr_all = n)
## `summarise()` has grouped output by 'ParlGroupAbbreviation'. You can override
## using the `.groups` argument.
transcripts.women.clean <- left_join(transcripts.women.clean, transcripts.m.fr.leg, by = c("ParlGroupAbbreviation", "leg"))
transcripts <- left_join(transcripts, transcripts.m.fr.leg, by = c("ParlGroupAbbreviation", "leg"))

final data sets

transcripts.women.m <- filter(transcripts.women.clean,
                              GenderAsString == "m")
transcripts.m <- filter(transcripts,
                        GenderAsString == "m")

save(transcripts.women.clean, file = "data/transcripts.women.Rdata")
save(transcripts.women.m, file = "data/transcripts.women.m.Rdata")
save(transcripts, file = "data/transcripts.Rdata")
save(transcripts.m, file = "data/transcripts.m.Rdata")

Visualisations

how many speeches on women’s topics are held by men overall?

transcripts.women.all <- group_by(transcripts.women.clean, GenderAsString) %>% 
  summarise(n = n())

ggplot(transcripts.women.all,
       aes(x = GenderAsString, y = n)) +
  geom_col(fill = "light blue") +
  geom_text(aes(y = n, label = n)) +
  theme_bw() # slightly more speeches by men than by women on women's topics (ca. 2769)

how many speeches on women’s topics are held by men over time?

ggplot(transcripts.women.m.leg,
       aes(x = leg, y = m)) +
  geom_col(fill = "light blue") +
  theme_bw() # absolute number of speeches on women's topics by male parliamentarians has decreased over the legislatures

how many speeches on women’s topics are held by all parliamentarians over time?

ggplot(transcripts.women.leg,
       aes(x = leg, y = n)) +
  geom_col(fill = "light blue") +
  theme_bw() # absolute number of speeches on women's topics by all parliamentarians has decreased over the legislatures

how many speeches on all topics are held by men over time?

ggplot(transcripts.m.leg,
       aes(x = leg, y = m_all)) +
  geom_col(fill = "light blue") +
  theme_bw() # absolute number of speeches overall by male parliamentarians has decreased over time

how many speeches on women’s topics are held by men per Fraktion?

transcripts.women.m.fr <- group_by(transcripts.women.m.fr.leg, ParlGroupAbbreviation) %>% 
  summarise(m_fr = sum(m_fr))

ggplot(transcripts.women.m.fr,
       aes(x = ParlGroupAbbreviation, y = m_fr)) +
  geom_col(fill = "light blue") +
  theme_bw() # by far the most speeches by the SVP, followed by SP; then others

how many speeches on women’s topics are held by men over time per Fraktion?

ggplot(transcripts.women.m.fr.leg,
       aes(x = leg, y = m_fr)) +
  geom_col(fill = "light blue") +
  facet_wrap(~ParlGroupAbbreviation) +
  theme_bw() # general downwards tendency with some boosts in leg 49

Figure 1

transcripts.women.m.leg.perc <- group_by(transcripts.women.m, f_perc_nr, m_perc, m_perc_all, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'f_perc_nr', 'm_perc', 'm_perc_all'. You
## can override using the `.groups` argument.
transcripts.women.m.leg.perc <- transcripts.women.m.leg.perc %>% 
  mutate(m_perc_nr = 100 - f_perc_nr,
         m_perc_d = m_perc - m_perc_nr,
         m_perc_all_d = m_perc_all - m_perc_nr,
         m_perc_dd = m_perc_all - m_perc)

transcripts.women.m.leg.perc1 <- transcripts.women.m.leg.perc %>% 
  ungroup() %>% 
  pivot_longer(cols = c(m_perc, m_perc_all),
               names_to = "m_anteil",
               values_to = "perc")

ggplot(transcripts.women.m.leg.perc1,
       aes(x = leg)) +
  geom_bar(aes(y = perc,
               fill = m_anteil),
           position = "dodge", stat = "identity") +
  geom_text(aes(y = perc,
                label = perc,
                fill = m_anteil,
                vjust = 3),
            position = position_dodge(0.9),
            color = "white",
            size = 4) +
  scale_fill_manual(name = "",
                    labels = c("Redeanteil männlicher Nationalräte\n zu «Frauenthemen»", "Redeanteil männlicher Nationalräte\n insgesamt"),
                    values = c("#8700f9", "#40e0d0")) +
  scale_color_manual(name = "",
                     labels = "Männeranteil im Nationalrat",
                     values = "darkblue") +
  geom_line(aes(y = m_perc_nr,
                color = "m_perc_nr"),
            size = 1.5) +
  geom_text(aes(y = m_perc_nr,
                label = m_perc_nr,
                vjust = -1),
            size = 4) +
  annotate(geom = "text",
           x = 45.75,
           y = 64.9,
           label = "Differenz: \n 20.2 Pp.") +
  annotate(geom = "text",
           x = 48.75,
           y = 62.05,
           label = "Differenz: \n 13.7 Pp.") +
  annotate(geom = "text",
           x = 50.75,
           y = 51.25,
           label = "Differenz: \n 14.1 Pp.") +
  annotate("segment",
           x = 46, xend = 46,
           y = 55.05, yend = 74.75,
           colour = "#8700f9",
           size = 1.5,
           arrow = arrow(ends = "both")) +
  annotate("segment",
           x = 51, xend = 51,
           y = 44.45, yend = 58.05,
           colour = "#8700f9",
           size = 1.5,
           arrow = arrow(ends = "both")) +
  annotate("segment",
           x = 49, xend = 49,
           y = 55.45, yend = 68.65,
           colour = "#8700f9",
           size = 1.5,
           arrow = arrow(ends = "both")) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%")) +
  labs(title = "Männer sprechen deutlich weniger über «frauenspezifische» Themen",
       subtitle = "Redeanteile der Nationalräte",
       caption = "Quelle: swissparl",
       color = "Männeranteil im Nationalrat") +
  xlab("Legislatur") +
  ylab("Redeanteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(size = 16, face = "bold"),
        plot.subtitle = element_text(size = 14),
        legend.text = element_text(size = 14),
        axis.text = element_text(size = 14),
        axis.title = element_text(size = 14))
## Warning: Ignoring unknown aesthetics: fill

ggsave("graphics/redeanteile_vs_nranteile_zeit_bar.png", width = 13, height = 7)

Figure 3

kw.dfm <- corpus(transcripts.women.clean, text_field = "txt_clean") %>% 
  tokens(remove_numbers = T, remove_punct = T) %>% 
  tokens_lookup(women.dict) %>% 
  dfm() 

kw.dfm %>% textstat_frequency()
##                        feature frequency rank docfreq group
## 1                       kinder      8429    1    2445   all
## 2                      familie      5620    2    1964   all
## 3                         frau      2979    3    1170   all
## 4                       eltern      1919    4     754   all
## 5                       mutter      1032    5     496   all
## 6                          ehe       593    6     305   all
## 7                   geschlecht       513    7     305   all
## 8                        witwe       494    8      82   all
## 9                       geburt       487    9     340   all
## 10                 vaterschaft       480   10     112   all
## 11                   schwanger       462   11     150   all
## 12                   erziehung       460   12     287   all
## 13                    adoption       319   13      90   all
## 14                   scheidung       295   14      99   all
## 15                  abtreibung       223   15      71   all
## 16              gleichstellung       210   16     147   all
## 17                      pflege       195   17      90   all
## 18              menschenhandel       173   18      83   all
## 19                      heirat       163   19     121   all
## 20              vergewaltigung       143   20     100   all
## 21              lohngleichheit       143   20      81   all
## 22                         sex       142   22      78   all
## 23           haeusliche_gewalt       133   23      71   all
## 24                      krippe       129   24      86   all
## 25                   betreuung       103   25      77   all
## 26                    maedchen       102   26      76   all
## 27                      gender       101   27      46   all
## 28                    alimente       101   27      34   all
## 29                zwangsheirat        90   29      42   all
## 30                      spitex        82   30      54   all
## 31                  geschieden        75   31      40   all
## 32             alleinerziehend        70   32      50   all
## 33                        care        70   32      56   all
## 34                   ungeboren        65   34      31   all
## 35                        kita        62   35      32   all
## 36                        baby        56   36      37   all
## 37                    weiblich        48   37      43   all
## 38                   praenatal        48   37      20   all
## 39                prostitution        44   39      28   all
## 40                       brust        44   39      29   all
## 41             diskriminierung        43   41      34   all
## 42                      foetus        32   42      16   all
## 43            krankenschwester        19   43      15   all
## 44                     hebamme        15   44      12   all
## 45          gleichberechtigung        12   45      12   all
## 46            gleichbehandlung        12   45      12   all
## 47 praeimplantationsdiagnostik         9   47       6   all
## 48     kuenstliche_befruchtung         8   48       8   all
## 49                  feminismus         8   48       8   all
## 50       genitalverstuemmelung         5   50       4   all
## 51                gebaermutter         5   50       4   all
## 52                     trauung         4   52       3   all
## 53           chancengleichheit         3   53       3   all
## 54              ungleichheiten         3   53       3   all
## 55                mammographie         2   55       2   all
## 56             unfruchtbarkeit         2   55       2   all
## 57                kontrazeptiv         1   57       1   all
## 58        reproduktionsmedizin         1   57       1   all
## 59                   stillzeit         1   57       1   all
## 60                 tagesmutter         1   57       1   all
## 61                   equal_pay         1   57       1   all
## 62                   ehrenmord         1   57       1   all
## 63        hinterbliebenenrente         1   57       1   all
## 64                   oestrogen         1   57       1   all
# vaterschaft
transcripts.women.vaterschaft <- filter(transcripts.women.clean, vaterschaft > 0) %>% 
  mutate(m_perc_nr = 100 - f_perc_nr)

transcripts.women.m.vaterschaft <- filter(transcripts.women.vaterschaft, GenderAsString == "m")

transcripts.women.vaterschaft.leg <- group_by(transcripts.women.vaterschaft, leg) %>% 
  summarise(n = n())

transcripts.women.m.vaterschaft.leg <- group_by(transcripts.women.m.vaterschaft, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc_vaterschaft = round(100*n/transcripts.women.vaterschaft.leg$n, 1))

transcripts.women.vaterschaft <- left_join(transcripts.women.vaterschaft, transcripts.women.m.vaterschaft.leg, by = "leg")
transcripts.women.vaterschaft <-  rename(transcripts.women.vaterschaft,
                                         m_vaterschaft = n)
transcripts.women.m.vaterschaft <- filter(transcripts.women.vaterschaft, GenderAsString == "m")

transcripts.women.m.vaterschaft.leg.perc <- group_by(transcripts.women.m.vaterschaft, m_perc_nr, m_perc_vaterschaft, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'm_perc_nr', 'm_perc_vaterschaft'. You can
## override using the `.groups` argument.
ggplot(transcripts.women.m.vaterschaft.leg.perc,
       aes(x = leg)) +
  geom_line(aes(x = leg, y = m_perc_vaterschaft, color = "Redeanteil männlicher Nationalräte zum Thema 'Vaterschaft'"), size = 2) +
  geom_line(aes(x = leg, y = m_perc_nr, color = "Männeranteil im NR"), size = 2) +
  scale_color_manual(name = "",
                     values = c("Redeanteil männlicher Nationalräte zum Thema 'Vaterschaft'" = "#8700f9",
                                "Männeranteil im NR" = "darkblue")) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%"),
                     limits = c(0,80)) +
  labs(title = "Vaterschaft",
       subtitle = "Redeanteile der Nationalräte zu verschiedenen Subthemen",
       caption = "Quelle: swissparl") +
  xlab("Legislatur") +
  ylab("Anteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

ggsave("graphics/redeanteile_vs_nranteile_zeit_vaterschaft.png", width = 24, height = 10)

# schwanger
transcripts.women.schwanger <- filter(transcripts.women.clean, schwanger > 0) %>% 
  mutate(m_perc_nr = 100 - f_perc_nr)

transcripts.women.m.schwanger <- filter(transcripts.women.schwanger, GenderAsString == "m")

transcripts.women.schwanger.leg <- group_by(transcripts.women.schwanger, leg) %>% 
  summarise(n = n())

transcripts.women.m.schwanger.leg <- group_by(transcripts.women.m.schwanger, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc_schwanger = round(100*n/transcripts.women.schwanger.leg$n, 1))

transcripts.women.schwanger <- left_join(transcripts.women.schwanger, transcripts.women.m.schwanger.leg, by = "leg")
transcripts.women.schwanger <-  rename(transcripts.women.schwanger,
                                       m_schwanger = n)
transcripts.women.m.schwanger <- filter(transcripts.women.schwanger, GenderAsString == "m")

transcripts.women.m.schwanger.leg.perc <- group_by(transcripts.women.m.schwanger, m_perc_nr, m_perc_schwanger, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'm_perc_nr', 'm_perc_schwanger'. You can
## override using the `.groups` argument.
ggplot(transcripts.women.m.schwanger.leg.perc,
       aes(x = leg)) +
  geom_line(aes(x = leg, y = m_perc_schwanger, color = "Redeanteil männlicher Nationalräte zum Thema 'Schwangerschaft'"), size = 2) +
  geom_line(aes(x = leg, y = m_perc_nr, color = "Männeranteil im NR"), size = 2) +
  scale_color_manual(name = "",
                     values = c("Redeanteil männlicher Nationalräte zum Thema 'Schwangerschaft'" = "#8700f9",
                                "Männeranteil im NR" = "darkblue")) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%"),
                     limits = c(0,80)) +
  labs(title = "Schwangerschaft",
       subtitle = "Redeanteile der Nationalräte zu verschiedenen Subthemen",
       caption = "Quelle: swissparl") +
  xlab("Legislatur") +
  ylab("Anteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

ggsave("graphics/redeanteile_vs_nranteile_zeit_schwanger.png", width = 24, height = 10)

# vergewaltigung
transcripts.women.vergewaltigung <- filter(transcripts.women.clean, vergewaltigung > 0) %>% 
  mutate(m_perc_nr = 100 - f_perc_nr)

transcripts.women.m.vergewaltigung <- filter(transcripts.women.vergewaltigung, GenderAsString == "m")

transcripts.women.vergewaltigung.leg <- group_by(transcripts.women.vergewaltigung, leg) %>% 
  summarise(n = n())

transcripts.women.m.vergewaltigung.leg <- group_by(transcripts.women.m.vergewaltigung, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc_vergewaltigung = round(100*n/transcripts.women.vergewaltigung.leg$n, 1))

transcripts.women.vergewaltigung <- left_join(transcripts.women.vergewaltigung, transcripts.women.m.vergewaltigung.leg, by = "leg")
transcripts.women.vergewaltigung <-  rename(transcripts.women.vergewaltigung,
                                            m_vergewaltigung = n)
transcripts.women.m.vergewaltigung <- filter(transcripts.women.vergewaltigung, GenderAsString == "m")

transcripts.women.m.vergewaltigung.leg.perc <- group_by(transcripts.women.m.vergewaltigung, m_perc_nr, m_perc_vergewaltigung, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'm_perc_nr', 'm_perc_vergewaltigung'. You
## can override using the `.groups` argument.
ggplot(transcripts.women.m.vergewaltigung.leg.perc,
       aes(x = leg)) +
  geom_line(aes(x = leg, y = m_perc_vergewaltigung, color = "Redeanteil männlicher Nationalräte zum Thema 'Vergewaltigung'"), size = 2) +
  geom_line(aes(x = leg, y = m_perc_nr, color = "Männeranteil im NR"), size = 2) +
  scale_color_manual(name = "",
                     values = c("Redeanteil männlicher Nationalräte zum Thema 'Vergewaltigung'" = "#8700f9",
                                "Männeranteil im NR" = "darkblue")) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%"),
                     limits = c(0,80)) +
  labs(title = "Vergewaltigung",
       subtitle = "Redeanteile der Nationalräte zu verschiedenen Subthemen",
       caption = "Quelle: swissparl") +
  xlab("Legislatur") +
  ylab("Anteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

ggsave("graphics/redeanteile_vs_nranteile_zeit_vergewaltigung.png", width = 24, height = 10)

# lohngleichheit
transcripts.women.lohngleichheit <- filter(transcripts.women.clean, lohngleichheit > 0) %>% 
  mutate(m_perc_nr = 100 - f_perc_nr)

transcripts.women.m.lohngleichheit <- filter(transcripts.women.lohngleichheit, GenderAsString == "m")

transcripts.women.lohngleichheit.leg <- group_by(transcripts.women.lohngleichheit, leg) %>% 
  summarise(n = n())

transcripts.women.m.lohngleichheit.leg <- group_by(transcripts.women.m.lohngleichheit, leg) %>% 
  summarise(n = n()) %>% 
  mutate(m_perc_lohngleichheit = round(100*n/transcripts.women.lohngleichheit.leg$n, 1))

transcripts.women.lohngleichheit <- left_join(transcripts.women.lohngleichheit, transcripts.women.m.lohngleichheit.leg, by = "leg")
transcripts.women.lohngleichheit <-  rename(transcripts.women.lohngleichheit,
                                            m_lohngleichheit = n)
transcripts.women.m.lohngleichheit <- filter(transcripts.women.lohngleichheit, GenderAsString == "m")

transcripts.women.m.lohngleichheit.leg.perc <- group_by(transcripts.women.m.lohngleichheit, m_perc_nr, m_perc_lohngleichheit, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'm_perc_nr', 'm_perc_lohngleichheit'. You
## can override using the `.groups` argument.
ggplot(transcripts.women.m.lohngleichheit.leg.perc,
       aes(x = leg)) +
  geom_line(aes(x = leg, y = m_perc_lohngleichheit, color = "Redeanteil männlicher Nationalräte zum Thema 'Lohngleichheit'"), size = 2) +
  geom_line(aes(x = leg, y = m_perc_nr, color = "Männeranteil im NR"), size = 2) +
  scale_color_manual(name = "",
                     values = c("Redeanteil männlicher Nationalräte zum Thema 'Lohngleichheit'" = "#8700f9",
                                "Männeranteil im NR" = "darkblue")) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%"),
                     limits = c(0,80)) +
  labs(title = "Lohngleichheit",
       subtitle = "Redeanteile der Nationalräte zu verschiedenen Subthemen",
       caption = "Quelle: swissparl") +
  xlab("Legislatur") +
  ylab("Anteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

ggsave("graphics/redeanteile_vs_nranteile_zeit_lohngleichheit.png", width = 24, height = 10)

# all together as small multiples

transcripts.women.m.kw.leg.perc <- left_join(transcripts.women.m.vaterschaft.leg.perc, transcripts.women.m.vergewaltigung.leg.perc) %>% 
  left_join(transcripts.women.m.schwanger.leg.perc) %>% 
  left_join(transcripts.women.m.lohngleichheit.leg.perc) %>% 
  pivot_longer(c(m_perc_vaterschaft, m_perc_vergewaltigung, m_perc_schwanger, m_perc_lohngleichheit), names_to = "kw", values_to = "m_perc")
## Joining, by = c("m_perc_nr", "leg")
## Joining, by = c("m_perc_nr", "leg")
## Joining, by = c("m_perc_nr", "leg")
m_perc.labs <- c("Lohngleichheit", "Schwangerschaft", "Vaterschaft", "Vergewaltigung")
names(m_perc.labs) = c("m_perc_lohngleichheit", "m_perc_schwanger", "m_perc_vaterschaft", "m_perc_vergewaltigung")

ggplot(transcripts.women.m.kw.leg.perc,
       aes(x = leg)) +
  geom_line(aes(x = leg, y = m_perc, color = "Redeanteil männlicher Nationalräte"), size = 1.5) +
  geom_line(aes(x = leg, y = m_perc_nr, color = "Männeranteil im Nationalrat"), size = 1.5) +
  scale_color_manual(name = "",
                     values = c("Redeanteil männlicher Nationalräte" = "#8700f9",
                                "Männeranteil im Nationalrat" = "darkblue")) +
  facet_wrap(~kw,
             labeller = labeller(kw = m_perc.labs)) +
  scale_x_continuous(breaks = c(46, 47, 48, 49, 50, 51),
                     labels = c("46", "47", "48", "49", "50", "51")) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80),
                     labels = paste0(c(0, 20, 40, 60, 80), "%"),
                     limits = c(0,80)) +
  labs(title = "Der Vaterschaftsurlaub bringt männliche Nationalräte zum Reden",
       subtitle = "Redeanteile der Nationalräte zu verschiedenen Subthemen",
       caption = "Quelle: swissparl") +
  xlab("Legislatur") +
  ylab("Anteile in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"),
        legend.text = element_text(size = 12),
        strip.background = element_rect(fill="#ebd4ff"))

ggsave("graphics/redeanteile_vs_nranteile_zeit_kw.png", width = 9, height = 6)

Figure 2

# article version 2.0: recode party fractions

transcripts.women.m$ParlGroupAbbreviationNew <- car::recode(transcripts.women.m$ParlGroupAbbreviation,
                                                            "'V' = 'SVP';
                                                            'S' = 'SP';
                                                            c('C', 'M-E', 'CE', 'CEg') = 'CVP/Mitte/EVP';
                                                            'E' = 'EVP/EDU';
                                                            'BD' = 'BDP';
                                                            'RL' = 'FDP-Liberale';
                                                            'R' = 'Freisinnig-Demokratisch';
                                                            'G' = 'Grüne';
                                                            'GL' = 'Grünliberal'")

transcripts.women.m.fr.leg.perc <- group_by(transcripts.women.m, ParlGroupAbbreviationNew, f_perc_nr_fr, m_perc_fr, m_perc_fr_all, leg) %>% 
  summarise()
## `summarise()` has grouped output by 'ParlGroupAbbreviationNew', 'f_perc_nr_fr',
## 'm_perc_fr', 'm_perc_fr_all'. You can override using the `.groups` argument.
transcripts.women.m.fr.leg.perc <- transcripts.women.m.fr.leg.perc %>% 
  mutate(m_perc_nr_fr = 100 - f_perc_nr_fr,
         m_perc_fr_d = m_perc_fr - m_perc_nr_fr,
         m_perc_fr_all_d = m_perc_fr_all - m_perc_nr_fr,
         m_perc_fr_dd = m_perc_fr_all - m_perc_fr)

# article version 2.0: points = party groups, x = percentage of men in NR, y = percentage of speeches on women's topics by male NR, facets = legislatures

ggplot(transcripts.women.m.fr.leg.perc,
       aes(x = m_perc_nr_fr,
           y = m_perc_fr)) +
  geom_point(size = 5, aes(color = ParlGroupAbbreviationNew)) +
  geom_smooth(method = "lm",
              se = FALSE,
              fullrange = TRUE,
              color = "dark blue") +
  facet_wrap(~leg) +
  scale_color_manual(values = c("black", "darkorange", "yellow", "turquoise", "blue", "green", "light green", "red", "darkgreen")) +
  scale_x_continuous(breaks = c(0, 20, 40, 60, 80, 100),
                     labels = paste0(c(0, 20, 40, 60, 80, 100), "%"),
                     limits = c(0,100)) +
  scale_y_continuous(breaks = c(0, 20, 40, 60, 80, 100),
                     labels = paste0(c(0, 20, 40, 60, 80, 100), "%"),
                     limits = c(0,100)) +
  labs(title = "Die glp-Männer äussern sich häufiger als erwartet zu «Frauenthemen»",
       subtitle = "Redeanteile der Nationalräte zu «frauenspezifischen» Themen nach Fraktion und Legislatur",
       caption = "Quelle: swissparl",
       color = "Fraktion") +
  xlab("Männeranteil nach Fraktion, in Prozent") +
  ylab("Redeanteile der Männer nach Fraktion, in Prozent") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"),
        strip.background = element_rect(fill="#ebd4ff"))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 111 rows containing missing values (geom_smooth).

ggsave("graphics/redeanteile_vs_nranteile_zeit_fr_scatter_neu.png", width = 9, height = 6)
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 111 rows containing missing values (geom_smooth).