Dieses Dokument enthält den Code für die Datenanalyse und Erstellung der Grafiken, welche als Grundlage für den Artikel: “Abstimmungen während Corona” dienen. Der Artikel wurde im Rahmen des Forschungsseminars Politischer Datenjournalismus erstellt. Die Datenverarbeitung wurde in R Studio und R Markdown durchgeführt.

Creating the Dictionaries and patterns for the five topics

dicttwitter <- dictionary(list(Begrenzung=c("begrenzung*","personenfreizügigkeit*",
                              "bilateral*","bgi*","kündigung*",
                              "begrenzungsinitiativeja",
                              "begrenzungsinitiativenein"),
                        Kampfjet=c("filair2030","bodluf*","avionsdecombat",
                               "avionsdechasse","kampffl*","kampfjet*","nkf",
                               "air2030","flugzeugbeschaffung","sicherheitja",
                               "neuekampfflugzeuge*","mehrstutzmehrfreiheit"),
                        Vaterschaftsurlaub=c("*vaterschaftsurlaub*","elternzeitinitiative*",
                                "papizeit*","papiurlaub*"),
                        Kinderabzüge=c("*lohnabzüge*","kinderabzug*","kinderabzüg*",
                               "kinderdrittbetreuungskosten"),
                        Jagdgesetz=c("jagdgesetz*","abschussgesetz*",
                               "jazumjagdgesetz")))
dictsmd <- dictionary(list(Begrenzung=c("begrenzungsinitiative","für eine massvolle zuwanderung"),
                        Kampfjet=c("kampfjet*","kampfflugzeug*","Flugzeugbeschaffung*"),
                        Vater=c("vaterschaftsurlaub","elternzeitinitiative*"),
                        Kinderabzug=c("kinderabzüg*","Kinderabzug*","kinderdrittbetreuungskosten"),
                        Jagdgesetz=c("jagdgesetz")))

pattern_allg <- c("begrenzungsinitiative","für eine massvolle zuwanderung",
                  "kampfjet","Kampfflugzeug","Flugzeugbeschaffung",
                  "vaterschaftsurlaub","elternzeitinitiative",
                  "kinderabzüge","Kinderabzug*","kinderdrittbetreuungskosten",
                  "jagdgesetz","27. September")

pattern_begr <- c("begrenzungsinitiative","für eine massvolle zuwanderung")
pattern_jets <- c("kampfjet","Kampfflugzeug","Flugzeugbeschaffung")
pattern_vater <- c("vaterschaftsurlaub","elternzeitinitiative")
pattern_kind <- c("kinderabzüge","Kinderabzug","kinderdrittbetreuungskosten")
pattern_jagd <- c("jagdgesetz")

Preparing the SMD data set

zeitungen <- readRDS("zeitungsartikel_de_2020.RDS")
zeitungscorp <- corpus(zeitungen,text_field="tx")
zeitungstoks <- tokens(zeitungscorp,remove_punct=T)
results_dict <- tokens_lookup(zeitungstoks, dictsmd)
#Create a dfm and dataframe for the SMD data
results_dfm <- results_dict %>%
  tokens_tolower() %>%
  tokens_remove(., stopwords("de")) %>%
  tokens_remove(., "dass") %>%
  dfm()

results_df <- results_dfm %>%
  convert("data.frame") %>%
  bind_cols(docvars(zeitungstoks))

Display the first results

results_df2 <- results_df %>%
  gather(key = Vorlage, value = Value, 2:6)
results_df2$week <- lubridate::week(results_df2$pubDateTime)
  
library(streamgraph)
smdplot <- results_df2 %>%
  group_by(pubDateTime, Vorlage) %>%
  tally(wt=Value) %>%
  streamgraph("Vorlage", "n", "pubDateTime") %>%
  sg_axis_x() %>%
  sg_legend(show=TRUE, label="Vorlage: ") %>%
  sg_fill_manual(viridis(5))

Preparing the Twitter data set

twitter <- readRDS("abstimmungen_mai-sept_2020.RDS")
twitter <- tibble::rowid_to_column(twitter, "ID")
twitter <- twitter %>% select(ID,user_id,created_at,screen_name,text,mentions_screen_name,hashtags)
twitter$created_at <- lubridate::date(twitter$created_at)
twitter <- as.data.frame(twitter)
twittercorp <- corpus(twitter)
toks_tweets <- tokens(twittercorp, remove_punct = TRUE)
toks_tweets <- tokens_tolower(toks_tweets)
dfmat_tweets <- dfm(toks_tweets)

Create the Dictionary and Search the tweets for the keywords

dicttwitter <- dictionary(list(Begrenzung=c("begrenzung*","personenfreizügigkeit*",
                              "bilateral*","bgi*","kündigung*",
                              "begrenzungsinitiativeja",
                              "begrenzungsinitiativenein"),
                        Kampfjet=c("filair2030","bodluf*","avionsdecombat",
                               "avionsdechasse","kampffl*","kampfjet*","nkf",
                               "air2030","flugzeugbeschaffung","sicherheitja",
                               "neuekampfflugzeuge*","mehrstutzmehrfreiheit"),
                        Vaterschaftsurlaub=c("*vaterschaftsurlaub*","elternzeitinitiative*",
                                "papizeit*","papiurlaub*"),
                        Kinderabzüge=c("*lohnabzüge*","kinderabzug*","kinderabzüg*",
                               "kinderdrittbetreuungskosten"),
                        Jagdgesetz=c("jagdgesetz*","abschussgesetz*",
                               "jazumjagdgesetz")))

lookup_dict <- tokens_lookup(toks_tweets,
                             dicttwitter)
twitter_dfm <- lookup_dict %>%
  dfm()

tdf <- twitter_dfm %>%
  convert("data.frame") %>%
  bind_cols(docvars(lookup_dict))

tdf2 <- tdf %>%
  gather(key = Vorlage, value = Value, 2:6)
tdf2$week <- lubridate::week(tdf2$created_at)

Create the Streamgraph for the Twitter data

library(streamgraph)
pp <- tdf2 %>%
  group_by(created_at, Vorlage) %>%
  tally(wt=Value) %>%
  streamgraph("Vorlage", "n", "created_at") %>%
  sg_axis_x() %>%
  sg_legend(show=TRUE, label="Vorlage: ") %>%
  sg_fill_manual(viridis(5))

Create wordcloud for Begrenzungsinitiative

pattern_bgi <- c("begrenzung*","personenfreizügigkeit*",
                 "bilateral*","bgi*","kündigung*",
                 "begrenzungsinitiativeja",
                 "begrenzungsinitiativenein")
corp_bgi <- corpus_subset(twittercorp, grepl(paste(pattern_bgi, collapse="|"),
                                             ignore.case = T, texts(twittercorp)))

bgi_toks <- tokens(corp_bgi)
bgi_toks <- bgi_toks %>%
  tokens_remove(stopwords("de")) %>%
  tokens_remove(stopwords("en")) %>%
  tokens_remove(stopwords("fr")) %>%
  tokens_select(pattern = c("#","@"), selection = "remove")
bgi_dfm <- dfm(bgi_toks,tolower=TRUE, remove_punct = TRUE, remove_url=TRUE,
            remove= "dass", verbose=TRUE)
bgifreq<-textstat_frequency(bgi_dfm,n=30)

wordcloud_bgi <- textplot_wordcloud(bgi_dfm,rotation = 0.25,
                                    color = viridis(60),
                                    max_words=60,min_size=1.5)

Create wordcloud for Kampfjet-Vorlage

pattern_jets <- c("filair2030","bodluf*","avionsdecombat",
                 "avionsdechasse","kampffl*","kampfjet*","nkf",
                 "air2030","flugzeugbeschaffung","sicherheitja",
                 "neuekampfflugzeuge*","mehrstutzmehrfreiheit")
corp_jets <- corpus_subset(twittercorp, grepl(paste(pattern_jets, collapse="|"),
                                             ignore.case = T, texts(twittercorp)))

jets_toks <- tokens(corp_jets)
jets_toks <- jets_toks %>%
  tokens_remove(stopwords("de")) %>%
  tokens_remove(stopwords("en")) %>%
  tokens_remove(stopwords("fr")) %>%
  tokens_select(pattern = c("#","@"), selection = "remove")
jets_dfm <- dfm(jets_toks,tolower=TRUE, remove_punct = TRUE, remove_url=TRUE,
            remove= "dass", verbose=TRUE)
jetsfreq<-textstat_frequency(jets_dfm,n=30)
jetsfreq

wordcloud_jets <- textplot_wordcloud(jets_dfm,rotation = 0.25,
                                    color = viridis(60),
                                    max_words=60,min_size=1.5)

Create wordcloud for Vaterschaftsurlaub-Vorlage

pattern_vater <- c("*vaterschaftsurlaub*","elternzeitinitiative*",
                                "papizeit*","papiurlaub*")
corp_vater <- corpus_subset(twittercorp, grepl(paste(pattern_vater, collapse="|"),
                                             ignore.case = T, texts(twittercorp)))

vater_toks <- tokens(corp_vater)
vater_toks <- vater_toks %>%
  tokens_remove(stopwords("de")) %>%
  tokens_remove(stopwords("en")) %>%
  tokens_remove(stopwords("fr")) %>%
  tokens_select(pattern = c("#","@"), selection = "remove")
vater_dfm <- dfm(vater_toks,tolower=TRUE, remove_punct = TRUE, remove_url=TRUE,
            remove= "dass", verbose=TRUE)
vaterfreq<-textstat_frequency(vater_dfm,n=30)
vaterfreq

wordcloud_vater <- textplot_wordcloud(vater_dfm,rotation = 0.25,
                                    color = viridis(60),
                                    max_words=60,min_size=1.5)

Create wordcloud for Kinderzulagen-Vorlage

pattern_kinder <- c("*lohnabzüge*","kinderabzug*","kinderabzüg*",
                               "kinderdrittbetreuungskosten")
corp_kinder <- corpus_subset(twittercorp, grepl(paste(pattern_kinder, collapse="|"),
                                             ignore.case = T, texts(twittercorp)))

kinder_toks <- tokens(corp_kinder)
kinder_toks <- kinder_toks %>%
  tokens_remove(stopwords("de")) %>%
  tokens_remove(stopwords("en")) %>%
  tokens_remove(stopwords("fr")) %>%
  tokens_select(pattern = c("#","@"), selection = "remove")
kinder_dfm <- dfm(kinder_toks,tolower=TRUE, remove_punct = TRUE, remove_url=TRUE,
            remove= "dass", verbose=TRUE)
kinderfreq<-textstat_frequency(kinder_dfm,n=30)
kinderfreq

wordcloud_kinder <- textplot_wordcloud(kinder_dfm,rotation = 0.25,
                                    color = viridis(60),
                                    max_words=60,min_size=1.5)

Create wordcloud for Jagdgesetz-Vorlage

pattern_jagd <- c("jagdgesetz*","abschussgesetz*",
                               "jazumjagdgesetz")
corp_jagd <- corpus_subset(twittercorp, grepl(paste(pattern_jagd, collapse="|"),
                                             ignore.case = T, texts(twittercorp)))

jagd_toks <- tokens(corp_jagd)
jagd_toks <- jagd_toks %>%
  tokens_remove(stopwords("de")) %>%
  tokens_remove(stopwords("en")) %>%
  tokens_remove(stopwords("fr")) %>%
  tokens_select(pattern = c("#","@"), selection = "remove")
jagd_dfm <- dfm(jagd_toks,tolower=TRUE, remove_punct = TRUE, remove_url=TRUE,
            remove= "dass", verbose=TRUE)
jagdfreq<-textstat_frequency(jagd_dfm,n=30)
jagdfreq

wordcloud_jagd <- textplot_wordcloud(jagd_dfm,rotation = 0.25,
                                    color = viridis(60),
                                    max_words=60,min_size=1.5)