1. Packages und Daten laden

# Packages

library(tidyverse)
library(lubridate)
library(quanteda)
library(quanteda.textmodels)
library(quanteda.textstats)
library(tidytext)
library(readxl)
library(lubridate)
library(stringr)
library(magrittr)
# data

corona_data_twitter <- readRDS("C:/Users/Patrick/Desktop/Studium/Forschungsseminar/Data/corona_data_twitter.RDS")

2. Aufräumen

Im ersten Schritt muss ein Dataframe erstellt werden, welches nur die relevanten Informationen für den Blogbeitrag enthält. Nicht relevante Variablen werden entfernt. Jungparteien und Vereinigungen innerhalb von Parteien werden ihren Mutterparteien zugerechnet. Die Parteivariable “die Mitte” wird aus BDP, CVP und den kleineren Vereinigungen unter dem Dach der CVP gebildet.

Der Zeitraum wird gleich zu Beginn eingegrenzt. Am 25. Februar 2020 wurde ein im Kanton Tessin wohnhafter 70-Jähriger positiv auf SARS-CoV-2 getestet. Somit eignet sich der 25. Februar als Startpunkt für die Untersuchung. Weil nach dem 12. August nicht mehr alle Tweets erfasst worden sind, wird dieser Zeitpunkt das Ende der Untersuchung. Der Zeitraum beinhaltet somit eine Phase mit steigendem Gefahrenbewusstsein und dementsprechenden Verschärfungen der Massnahmen sowie eine Phase des Lockdowns, die Enspannungsphase über den Sommer und die Phase der weitgehenden Öffnung. Somit sind alle relevanten Zeiträume für die Untersuchung abgedeckt. Berücksichtigt werden nur Tweets, die in deutscher Sprache verfasst wurden.

## Nur relevante Variablen berücksichtigen und nur tweets in deutscher Sprache

d.corona_data_cleaned <- corona_data_twitter %>%
  select(1,8,14,15,35,40,46,83,96,97,99) %>%
  filter(la == "de")

## Jungparteien und Vereinigungen innerhalb von Parteien werden ihren Mutterparteien zugerechnet. 

d.corona_data_cleaned <- d.corona_data_cleaned %>% 
  mutate(Party_Short = ifelse(Party_Short == "BDP", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "CVP", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "JCVP", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "JBDP", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "CSV", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "CSPO", "Die Mitte", Party_Short),
         Party_Short =ifelse(Party_Short == "JUSO", "SP", Party_Short),
         Party_Short =ifelse(Party_Short == "glp", "GLP", Party_Short),
         Party_Short =ifelse(Party_Short == "jglp", "GLP", Party_Short),
         Party_Short =ifelse(Party_Short == "JSVP", "SVP", Party_Short),
         Party_Short =ifelse(Party_Short == "JG", "Grüne", Party_Short),
         Party_Short =ifelse(Party_Short == "jf", "FDP", Party_Short),
         Party_Short =ifelse(Party_Short == "JEVP", "EVP", Party_Short),
         Party_Short =ifelse(Party_Short == "jevp", "EVP", Party_Short))

#table(d.corona_data_cleaned$Party_Short)

## Datum formatieren und Zeitraum abgrenzen

# Fehler in den Daten: Datum_full beinhaltet manchmal Parteikürzel

d.corona_data_cleaned <- d.corona_data_cleaned %>% 
  filter(!grepl('[A-z]', Datum_full)) 

# Fehler in den Daten: Datum_full == User_id

d.corona_data_cleaned <- d.corona_data_cleaned %>% 
  filter(!(User_id == Datum_full))

# Datum_full von Character in date umwandeln

d.corona_data_cleaned$Datum_full <- as.Date(d.corona_data_cleaned$Datum_full)

#glimpse(d.corona_data_cleaned)

# Zeitraum eingrenzen

d.corona_data_cleaned <- d.corona_data_cleaned %>%
  filter(Datum_full > "2020-02-24", Datum_full < "2020-08-13")

## Bearbeitetes Dataframe Speichern

#save(d.corona_data_cleaned, file = "d.corona_data_cleaned.RData")

3. Plot Relativer Anteil Kommentare zum Thema Corona pro Tag

Hier wird die relative Anzahl tweets pro Tag zum Thema Corona dargestellt. Die Datenbasis bilden alle Tweets von Accounts von Schweizer Parteien und deren Exponenten (Parlamentarier und Kandidaten für die Wahlen 2019). Zudem beinhalten die Daten ein subset von Twitter-Nutzern, die mindestens fünf Schweizer Medien folgen. Die Tweets wurden tagesweise erfasst. Für die erste Auswertung (Relativer Anteil Tweets zum Thema Corona pro Tag) werden alle Tweets von den oben genannten Accounts verwendet. Später wird der Datensatz eingegrenzt um auf spezifische Gruppen zu fokussieren.

## Bearbeitetes Dataframe laden

load("C:/Users/Patrick/Desktop/Studium/Forschungsseminar/Data/d.corona_data_cleaned.RData")

## Zuerst muss der Datensatz gefiltert werden. Es dürfen nur tweets mit dem Thema Corona vorkommen.

t.corona_data_cleaned_filter <- d.corona_data_cleaned %>%
  filter(is_covid19 == 1)

## Akteuere eingrenzen

t.corona_data_cleaned_filter <- t.corona_data_cleaned_filter %>%
  filter(Akteur_Typ != "Administration" & Akteur_Typ != "Bundesamt" & Akteur_Typ != "Departement" & Akteur_Typ != "Gericht" & Akteur_Typ != "Institute" & Akteur_Typ != "Komitee")

d.corona_data_cleaned <- d.corona_data_cleaned %>%
  filter(Akteur_Typ != "Administration" & Akteur_Typ != "Bundesamt" & Akteur_Typ != "Departement" & Akteur_Typ != "Gericht" & Akteur_Typ != "Institute" & Akteur_Typ != "Komitee")

#table(t.corona_data_cleaned_filter$Akteur_Typ)

# Anzahl tweets pro tag zum Thema Corona in Dataframe darstellen

t.df_corona_data_cleaned_filter <- t.corona_data_cleaned_filter %>%
  group_by(Datum_full) %>%
  summarise(Anzahl = n()) %>%
  ungroup()

## Anzahl Tweets pro Tag insgesamt erstellen

corona_data_count_overall <- d.corona_data_cleaned %>%
  group_by(Datum_full) %>%
  summarise(n = n()) %>%
  ungroup()

## counts zu dataframes hinzufügen

t.df_corona_data_cleaned_filter <- t.df_corona_data_cleaned_filter %>%
  left_join(corona_data_count_overall, by = c("Datum_full"))

## Anteil relativ ausrechnen

t.df_corona_data_cleaned_filter <- t.df_corona_data_cleaned_filter %>%
  mutate(percent = Anzahl/n*100)

# Plot over time

d=data.frame(date=as.Date(c("2020-03-21", "2020-04-16", "2020-06-19")), event=c("Lockdown", "Lockerungen", "Öffnung"))

plot_corona_overall <- t.df_corona_data_cleaned_filter %>% 
  ggplot(aes(x = Datum_full, y = percent)) +
  geom_smooth(span = 0.2, size=3, alpha = 0.9, se = FALSE) +
  geom_point(size = 3, alpha=0.5) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 22, face="bold"), axis.title=element_text(size=18), text = element_text(size = 20)) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  scale_y_continuous(labels=function(x) paste0(x,"%")) +
  labs(title = "Kurz vor dem Lockdown wurde am meisten zum Thema Corona getwittert", x = "", y = "Anteil Thema Corona an allen Tweets", size =50) +
  geom_vline(xintercept=as.Date("2020-03-21"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-04-16"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-06-19"), linetype = "longdash", alpha=0.5) +
  geom_label(data=d, mapping=aes(x=date, y=80, label=event), size=5, angle=0, vjust=1, hjust=-0.1) +
  scale_color_brewer(palette = "Dark2")

plot_corona_overall
#ggsave(plot_corona_overall, file = "overall_tweets2.png", width = 13, height = 7)

4. Risikobereiche Wirtschaft und Gesundheit

Ziel dieses Abschnitts ist es aufzuzeigen, wie viele Tweets sich um das Thema Wirtschaft und wie viele sich um das Thema Gesundheit drehen. In den Grafiken wird jeweils die Anzahl Tweets, welche eines dieser Themen tangieren, in Relation zu allen Tweets zum Thema Corona dargestellt. Die Auswertung erfolgt tagesweise. Berücksichtigt werden in diesem Abschnitt also nur Tweets zum Thema Corona. Die relative Aufmerksamkeit bezüglich der beiden Themen wird folglich in Relation zu allen Tweets zum Thema Corona gemessen, in Prozent angegeben und grafisch dargestellt.

4.1 Relative Aufmerksamkeit für die zwei Risikobereiche Wirtschaft und Gesundheit

Im ersten Schritt wird die Aufmerksamkeit für die Themen Wirtschaft und Gesundheit bezogen auf alle oben ausgewählten Tweets ausgewertet. Es sind in diesem Schritt auch kleinere Parteien vertreten. So zeigt sich ein Bild der Debatte bestehend aus Politik, Medien und Öffentlichkeit auf Twitter.

## Bearbeitetes Dataframe laden

load("C:/Users/Patrick/Desktop/Studium/Forschungsseminar/Data/d.corona_data_cleaned.RData")

## Es werden nur noch tweets mit dem Thema COVID-19 verwendet

t.corona_data_parties_cleaned <- d.corona_data_cleaned %>%
  filter(is_covid19 == 1)

## Akteure eingrenzen

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  filter(Akteur_Typ != "Administration" & Akteur_Typ != "Bundesamt" & Akteur_Typ != "Departement" & Akteur_Typ != "Gericht" & Akteur_Typ != "Institute" & Akteur_Typ != "Komitee")

## Variable "week" bilden

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  mutate(week = format(Datum_full, "%V"))

#save(t.corona_data_parties_cleaned, file = "t.corona_data_parties_cleaned.RData")

4.1.1 Corpus und Preprocessing

Die Tweets müssen für den gewählten diktionärsbasierten Ansatz vorbereitet werden. Dazu ist es nötig, einen Textkorpus zu erstellen und die Tweets zu bereinigen.

## Hashtags entfernen

t.corona_data_parties_cleaned$Text <- gsub("#","", t.corona_data_parties_cleaned$Text)

## Korpus erstellen

tweets_corpus <- corpus(t.corona_data_parties_cleaned, text_field = "Text")

## Preprocessing

# Tokenization

tweet_tokens <- tokens(tweets_corpus,
                       what = c("word"),
                       remove_punct = TRUE,   # Entfernt Satzzeichen
                       remove_numbers = TRUE, # Entfernt Ziffern
                       remove_symbols = TRUE, # Entfernt Symbole (darunter auch Emojis)
                       remove_url = TRUE,     # Entfernt URLs
                       include_docvars = TRUE)

# Nur lowercase letters 

tweet_tokens_lc <- tweet_tokens %>% 
  tokens_tolower()

# Stopwords entfernen

tweet_tokens_reduced <- tweet_tokens_lc %>% 
  tokens_remove(c(stopwords("german"),"dass", "amp"))

# @ references entfernen

tweet_tokens_reduced <- tokens_remove(tweet_tokens_reduced, pattern = "@*")

# empty tokens entfernen

tweet_tokens_reduced <- tweet_tokens_reduced %>%
  tokens_remove("")

4.1.2 Diktionärsbasierter Ansatz zur Einteilung der Tweets in die Themen Wirtschaft/Gesundheit

Für den diktionärsbasierten Ansatz ist es notwendig Keys und die dazugehörenden values zu definieren. Die Keys sind gesundheitliche Risiken und wirtschaftliche Risiken. Unter gesundheitlichen Risiken wird der Umgang mit den Risikogruppen (chronisch Kranke, ältere Personen etc.) und die Belastung des Gesundheitssystems (bspw. Überlastung Spitäler und Pflegekräfte) zusammengefasst. Unter wirtschaftlichen Risiken werden die Angst um Arbeitsplätze, Konsequenzen für Unternehmen und Angestellte, sowie volkswirtschaftliche Risiken zusammengefasst.

Dem Ausgangspunkt für das Wörterbuch bilden Wörter, die während der Corona-Krise of verwendet wurden. Als Inspiration dienten einerseits journalistische Artikel aus dem ersten halbjahr 2020 und die Medienmitteilungen des Bundes, andererseits folgendes Themenglossar:

https://www.dwds.de/themenglossar/Corona

Zu passenden Ausgangswörtern wurden assoziierte Wörter gesucht und mittels Stichproben validiert. Zudem wurden Synonyme mittels des Duden Synonymwörterbuchs hinzugefügt.

4.1.2.1 Passende Stichwörter suchen (Dieser Abschnitt zeigt das methodische Vorgehen)

## Passende Wörter finden

# Ideen für assoziierte Wörter können mit folgender Variante gefunden werden

toks_inside <- tokens_keep(tweet_tokens_reduced, pattern = "STICHWORT", window = 100)
toks_inside <- tokens_remove(toks_inside, pattern = "STICHWORT")
toks_outside <- tokens_remove(tweet_tokens_reduced, pattern = "STICHWORT", window = 100)

dfmat_inside <- dfm(toks_inside)
dfmat_outside <- dfm(toks_outside)

tstat_key_inside <- textstat_keyness(rbind(dfmat_inside, dfmat_outside), 
                                     target = seq_len(ndoc(dfmat_inside)))
df1 <- head(tstat_key_inside, 100)

# Mit Hilfe von Keywords in Context können die Tweets gefunden werden, die ein Wort aus dem selbsterstellten Dictionary enthalten. So kann mittels Stichproben und selektiver Durchsicht der Tweets kontrolliert werden, ob es sich um false positives handelt. 

df <- kwic(
  tweet_tokens_reduced,
  "STICHWORT",
  window = 100,
  valuetype = c("glob"),
  case_insensitive = TRUE,
  index = NULL
)

# Ausreisser manuell kontrollieren

ausreisser <- t.corona_data_parties_cleaned %>%
  filter(Datum_full == "DATUM")

# Tabelle: In welchem Text kommt welches Keyword vor?

toks <- tokens(tweet_tokens_reduced)

dfm_list <- list()
for (key in names(corona_dictionary)) {
  this_dfm <- tokens_select(toks, corona_dictionary[key], pad = TRUE) %>%
    tokens_compound(corona_dictionary[key]) %>%
    tokens_replace("", "OTHER") %>%
    dfm(tolower = FALSE)
  dfm_list <- c(dfm_list, this_dfm)
}
names(dfm_list) <- names(corona_dictionary)

print(dfm_list)

4.1.2.2 Wörterbuch erstellen

Die für passend befundenen Wörter werden in das Wörterbuch eingetragen.

gesundheit_words <- str_split("älter* / senior* / betagt* / grosseltern / grossmutter / chronisch* / immunsystem* / herz-kreislauf-erkrankung* / atemwegserkrankung* / bluthochdruck / lebenserwartung / ü65 / 80jährige* / 80-jährige* / risikopatient* / risikoperson* / risikogruppe* / vorerkrank* / vulner* / rücksicht / mitmenschen / altenheim* / altersheim* / besuchsverbot* / triage / krankenhäuser / Spitäler / kliniken / arztprax* / *überlast* / beatmung* / beschaff* / schutzausrüstung / schutzkleidung / schutzmaterial* / schutzmaske* / pflegekräfte* / pflegepersonal / pfleger / pflegerin / krankenhauspersonal / gesundheitspersonal* / krankenpfleger* / spitalpersonal / pflegeheime* / pflegenotstand / *kapazität* / *betten* / intensivpflege* / intensivstation* / intensivmedizin* / notfallstation* / notaufnahme* / kollabieren / kollaps / zusammenbruch / operationen / unterbesetzt* / überbeleg* / pflegeeinrichtung* / ausgelast* / ips* / langzeitschäden / langzeitfolgen",
                       pattern = " / ", 
                       simplify = TRUE) 

Wirtschaft_words <- str_split(" *arbeitslos* / *kurzarbeit* / *erwerb* / arbeitsmarkt* / arbeitsplatz* / arbeitsplätze* / angestellt* / stellenabbau / selbständig* / freischaffend* / kulturschaffend* / handwerker* / grenzgänger* / lernende* / lehrstelle* / lehrling* / berufseinsteig* / entlassung* / kündigung / kündigungen / *soforthilfe* / härtefall* / *hilfsgelder* / *überbrückung* / corona-kredit* / coronakredit* / hilfskredit* / notkredit* / covid-19-kredit* / schnellkredit* / kredite / *finanzhilfe* / *corona-hilfe* / *coronahilfe* / *staatshilfe* / *hilfspaket* / zinslos* / rettungsschirm / ausschüttung* / *paket / liquidität* / weltwirtschaft* / wirtschaftsleistung / volkswirtschaft* / wirtschaftskrise / inflation / rezession / leitzins* / börse* / *pleite* / *insolvenz* / *konkurs* / geschäfte / verluste / hochfahren / *dividende* / miete* / vermieter* / geschäftsmiete* / mietzins* / armut / armutsbetroffene* / armutsbekämpfung / armutsfalle / finanziell* / wirtschaftlich* / schulden / *fonds*",
                       pattern = " / ", 
                       simplify = TRUE)

corona_dictionary <- dictionary(list(gesundheit = gesundheit_words, wirtschaft = Wirtschaft_words))
corona_dictionary

4.2 Relative Aufmersamkeit für die Themen Wirtschaft und Gesundheit (gesamte Debatte)

# Resultat aufgeteilt nach Tagen

result.tweets <- dfm(tweet_tokens_reduced, dictionary = corona_dictionary)

# dfm zu dataframe konvertieren um die Tweets den kategorien zuzuweisen

df.result.tweets.categories <- result.tweets %>% 
  convert(to = "data.frame") %>% 
  cbind(docvars(result.tweets))

# Kategorien zuweisen (Treffer == 1, Kein Treffer == 0)

df.result.tweets.categories <- df.result.tweets.categories %>%
  mutate(gesundheit = ifelse(gesundheit > 0, 1,0))

df.result.tweets.categories <- df.result.tweets.categories %>%
  mutate(wirtschaft = ifelse(wirtschaft > 0, 1, 0))

## Tweets ohne Treffer löschen

doubles <- df.result.tweets.categories %>%
  filter(gesundheit == 1 & wirtschaft == 1)

df.result.tweets.categories.ges <- df.result.tweets.categories %>%
  filter(gesundheit == 1)

df.result.tweets.categories.wir <- df.result.tweets.categories %>%
  filter(wirtschaft == 1)

## Anzahl Tweets pro Tag nach Thema erstellen

df.count_gesundheit <- df.result.tweets.categories.ges %>%
  group_by(Datum_full) %>%
  summarise(count = n()) %>%
  ungroup()

df.count_wirtschaft <- df.result.tweets.categories.wir %>%
  group_by(Datum_full) %>%
  summarise(count = n()) %>%
  ungroup()

## Anzahl Tweets pro Tag insgesamt erstellen

corona_data_day_count <- t.corona_data_parties_cleaned %>%
  group_by(Datum_full) %>%
  summarise(n = n()) %>%
  ungroup()

## counts zu dataframes hinzufügen und variable Themenfokus erstellen

df.count_gesundheit <- df.count_gesundheit %>%
  left_join(corona_data_day_count, by = c("Datum_full")) 

df.count_gesundheit$Themenfokus <- "Risiken Gesundheit"

df.count_wirtschaft <- df.count_wirtschaft %>%
  left_join(corona_data_day_count, by = c("Datum_full"))

df.count_wirtschaft$Themenfokus <- "Risiken Wirtschaft"

## Anteil relativ ausrechnen

df.count_gesundheit <- df.count_gesundheit %>%
  mutate(percent = count/n*100)

df.count_wirtschaft <- df.count_wirtschaft %>%
  mutate(percent = count/n*100)

## In einem dataframe zusammenführen

df.ratio.overall.day <- rbind(df.count_gesundheit,df.count_wirtschaft)

## Plot erstellen

d=data.frame(date=as.Date(c("2020-03-21", "2020-04-16", "2020-06-19")), event=c("Lockdown", "Lockerungen", "Öffnung"))

plot.thematisch <- df.ratio.overall.day %>%
  ggplot(aes(x = Datum_full, y = percent, color = Themenfokus, group = Themenfokus)) +
  geom_smooth(span = 0.2, size=3, alpha = 0.9, se = FALSE) +
  geom_point(size = 3, alpha=0.5) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 22, face="bold"), axis.title=element_text(size=18), text = element_text(size = 20)) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  scale_y_continuous(labels=function(x) paste0(x,"%")) +
  labs(title = "Nach dem Lockdown rücken wirtschaftliche Risiken in den Fokus", x = "", y = "Anteil an allen Tweets zum Thema Corona", size =50) +
  geom_vline(xintercept=as.Date("2020-03-21"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-04-16"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-06-19"), linetype = "longdash", alpha=0.5) +
  geom_label(data=d, mapping=aes(x=date, y = 40, label=event), size=5, angle=0, vjust=1, hjust=-0.1, inherit.aes = FALSE) +
  scale_color_brewer(palette = "Dark2", direction=-1)

plot.thematisch
#ggsave(plot.thematisch, file = "plot.thematisch.png", width = 13, height = 7)

4.3 Relative Aufmersamkeit für die Themen Wirtschaft und Gesundheit (nur Politik und nur grosse Parteien)

load("C:/Users/Patrick/Desktop/Studium/Forschungsseminar/Data/t.corona_data_parties_cleaned.RData")

# Es wird nur auf die fünf grossen Parteien und die Medien fokussiert

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  filter(Party_Short == "SP" | Party_Short == "Grüne" | Party_Short == "Die Mitte" | Party_Short == "FDP"| Party_Short == "SVP" | Party_Short == "GLP")

## Anzahl Tweets pro Tag pro Partei erstellen

corona_data_parties_count2 <- t.corona_data_parties_cleaned %>%
  group_by(Datum_full) %>%
  summarise(n = n()) %>%
  ungroup()

## Anzahl Tweets pro Tag pro Partei dem ursprünglichen Dataframe hinzufügen

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  left_join(corona_data_parties_count2, by = "Datum_full")

## Preprocessing (analog zu Schritt 4.1.1)

t.corona_data_parties_cleaned$Text <- gsub("#","", t.corona_data_parties_cleaned$Text)

# Korpus erstellen

tweets_corpus2 <- corpus(t.corona_data_parties_cleaned, text_field = "Text")

tweet_tokens2 <- tokens(tweets_corpus2,
                       what = c("word"),
                       remove_punct = TRUE,   # Entfernt Satzzeichen
                       remove_numbers = TRUE, # Entfernt Ziffern
                       remove_symbols = TRUE, # Entfernt Symbole (darunter auch Emojis)
                       remove_url = TRUE,     # Entfernt URLs
                       include_docvars = TRUE)

tweet_tokens_lc2 <- tweet_tokens2 %>% 
  tokens_tolower()

tweet_tokens_reduced2 <- tweet_tokens_lc2 %>% 
  tokens_remove(c(stopwords("german"),"dass", "amp"))

tweet_tokens_reduced2 <- tokens_remove(tweet_tokens_reduced2, pattern = "@*")

tweet_tokens_reduced2 <- tweet_tokens_reduced2 %>%
  tokens_remove("")

# Resulat für einzelne Tweets (gab es Treffer?)

result.tweets2 <- dfm(tweet_tokens_reduced2, dictionary = corona_dictionary)

## Kategorisieren der Tweets

# dfm zu dataframe konvertieren um die Tweets den kategorien zuzuweisen

df.result.tweets.categories2 <- result.tweets2 %>% 
  convert(to = "data.frame") %>% 
  cbind(docvars(result.tweets2))

# Kategorien zuweisen (Treffer == 1, Kein Treffer == 0)

df.result.tweets.categories2 <- df.result.tweets.categories2 %>%
  mutate(gesundheit = ifelse(gesundheit > 0, 1,0))

df.result.tweets.categories2 <- df.result.tweets.categories2 %>%
  mutate(wirtschaft = ifelse(wirtschaft > 0, 1, 0))

## Tweets ohne Treffer löschen

doubles2 <- df.result.tweets.categories2 %>%
  filter(gesundheit == 1 & wirtschaft == 1)

df.result.tweets.categories.ges2 <- df.result.tweets.categories2 %>%
  filter(gesundheit == 1)

df.result.tweets.categories.wir2 <- df.result.tweets.categories2 %>%
  filter(wirtschaft == 1)

## Anzahl Tweets pro Tag pro Partei erstellen

df.count_gesundheit2 <- df.result.tweets.categories.ges2 %>%
  group_by(Datum_full) %>%
  summarise(count = n()) %>%
  ungroup()

df.count_wirtschaft2 <- df.result.tweets.categories.wir2 %>%
  group_by(Datum_full) %>%
  summarise(count = n()) %>%
  ungroup()

## counts zu dataframes hinzufügen und variable Themenfokus erstellen

df.count_gesundheit2 <- df.count_gesundheit2 %>%
  left_join(corona_data_parties_count2, by = c("Datum_full")) 

df.count_gesundheit2$Themenfokus <- "Risiken Gesundheit"

df.count_wirtschaft2 <- df.count_wirtschaft2 %>%
  left_join(corona_data_parties_count2, by = c("Datum_full"))

df.count_wirtschaft2$Themenfokus <- "Risiken Wirtschaft"

## Anteil relativ ausrechnen

df.count_gesundheit2 <- df.count_gesundheit2 %>%
  mutate(percent = count/n*100)

df.count_wirtschaft2 <- df.count_wirtschaft2 %>%
  mutate(percent = count/n*100)

## In einem dataframe zusammenführen

df.ratio.overall2 <- rbind(df.count_gesundheit2,df.count_wirtschaft2)

# Plotten für alle Parteien

d=data.frame(date=as.Date(c("2020-03-21", "2020-04-16", "2020-06-19")), event=c("Lockdown", "Lockerungen", "Öffnung"))

plot.parties.pol <- df.ratio.overall2 %>%
  ggplot(aes(x = Datum_full, y = percent, color = Themenfokus, group = Themenfokus)) +
  geom_smooth(span = 0.2, size=3, alpha = 0.9, se = FALSE) +
  geom_point(size = 3, alpha=0.5) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 22, face="bold"), axis.title=element_text(size=18), text = element_text(size = 20)) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b") +
  scale_y_continuous(labels=function(x) paste0(x,"%")) +
  labs(title = "Die Politik fokussiert auf wirtschaftliche Risiken", x = "", y = "Anteil an allen Tweets zum Thema Corona", size =50) +
  geom_vline(xintercept=as.Date("2020-03-21"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-04-16"), linetype = "longdash", alpha=0.5) +
  geom_vline(xintercept=as.Date("2020-06-19"), linetype = "longdash", alpha=0.5) +
  geom_label(data=d, mapping=aes(x=date, y = 30, label=event), size=5, angle=0, vjust=1, hjust=-0.1, inherit.aes = FALSE) +
  scale_color_brewer(palette = "Dark2", direction=-1)

plot.parties.pol
#ggsave(plot.parties.pol, file = "plot.parties.pol.png", width = 13, height = 7)

5. Barplots aufgeschlüsselt nach Parteien

In diesem Abschnitt wird die relative Aufmerksamkeit der Exponenten der grossen politischen Parteien gemessen. Es werden nur noch Tweets nach Ende des Lockdowns ausgewertet. Der Fokus liegt also auf der Phase der Entspannung und der Öffnung.

load("C:/Users/Patrick/Desktop/Studium/Forschungsseminar/Data/t.corona_data_parties_cleaned.RData")

# Es wird nur auf die fünf grossen Parteien und die Medien fokussiert

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  filter(Party_Short == "SP" | Party_Short == "Grüne" | Party_Short == "Die Mitte" | Party_Short == "FDP"| Party_Short == "SVP" | Party_Short == "GLP")

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  filter(Datum_full > "2020-04-16", Datum_full < "2020-08-13")

## Anzahl Tweets pro Partei erstellen

corona_data_parties_count3 <- t.corona_data_parties_cleaned %>%
  group_by(Party_Short) %>%
  summarise(n = n()) %>%
  ungroup()

## Anzahl Tweets pro Partei dem ursprünglichen Dataframe hinzufügen

t.corona_data_parties_cleaned <- t.corona_data_parties_cleaned %>%
  left_join(corona_data_parties_count3, by = c("Party_Short"))

## Preprocessing (analog zu Schritt 4.1.1)

t.corona_data_parties_cleaned$Text <- gsub("#","", t.corona_data_parties_cleaned$Text)

# Korpus erstellen

tweets_corpus3 <- corpus(t.corona_data_parties_cleaned, text_field = "Text")

tweet_tokens3 <- tokens(tweets_corpus3,
                       what = c("word"),
                       remove_punct = TRUE,   # Entfernt Satzzeichen
                       remove_numbers = TRUE, # Entfernt Ziffern
                       remove_symbols = TRUE, # Entfernt Symbole (darunter auch Emojis)
                       remove_url = TRUE,     # Entfernt URLs
                       include_docvars = TRUE)

tweet_tokens_lc3 <- tweet_tokens3 %>% 
  tokens_tolower()

tweet_tokens_reduced3 <- tweet_tokens_lc3 %>% 
  tokens_remove(c(stopwords("german"),"dass", "amp"))

tweet_tokens_reduced3 <- tokens_remove(tweet_tokens_reduced3, pattern = "@*")

tweet_tokens_reduced3 <- tweet_tokens_reduced3 %>%
  tokens_remove("")

# Resulat für einzelne Tweets (gab es Treffer?)

result.tweets3 <- dfm(tweet_tokens_reduced3, dictionary = corona_dictionary)

## Kategorisieren der Tweets

# dfm zu dataframe konvertieren um die Tweets den kategorien zuzuweisen

df.result.tweets.categories3 <- result.tweets3 %>% 
  convert(to = "data.frame") %>% 
  cbind(docvars(result.tweets3))

# Kategorien zuweisen (Treffer == 1, Kein Treffer == 0)

df.result.tweets.categories3 <- df.result.tweets.categories3 %>%
  mutate(gesundheit = ifelse(gesundheit > 0, 1,0))

df.result.tweets.categories3 <- df.result.tweets.categories3 %>%
  mutate(wirtschaft = ifelse(wirtschaft > 0, 1, 0))

## Tweets ohne Treffer löschen

doubles3 <- df.result.tweets.categories3 %>%
  filter(gesundheit == 1 & wirtschaft == 1)

df.result.tweets.categories.ges3 <- df.result.tweets.categories3 %>%
  filter(gesundheit == 1)

df.result.tweets.categories.wir3 <- df.result.tweets.categories3 %>%
  filter(wirtschaft == 1)

## Anzahl Tweets pro Partei erstellen

df.count_gesundheit3 <- df.result.tweets.categories.ges3 %>%
  group_by(Party_Short) %>%
  summarise(count = n()) %>%
  ungroup()

df.count_wirtschaft3 <- df.result.tweets.categories.wir3 %>%
  group_by(Party_Short) %>%
  summarise(count = n()) %>%
  ungroup()

## counts zu dataframes hinzufügen und variable Themenfokus erstellen

df.count_gesundheit3 <- df.count_gesundheit3 %>%
  left_join(corona_data_parties_count3, by = c("Party_Short")) 

df.count_gesundheit3$Themenfokus <- "Risiken Gesundheit"

df.count_wirtschaft3 <- df.count_wirtschaft3 %>%
  left_join(corona_data_parties_count3, by = c("Party_Short"))

df.count_wirtschaft3$Themenfokus <- "Risiken Wirtschaft"

## Anteil relativ ausrechnen

df.count_gesundheit3 <- df.count_gesundheit3 %>%
  mutate(percent = count/n*100)

df.count_wirtschaft3 <- df.count_wirtschaft3 %>%
  mutate(percent = count/n*100)

## In einem dataframe zusammenführen

df.ratio.overall3 <- rbind(df.count_gesundheit3,df.count_wirtschaft3)

## Prozente ausrechnen 

df.ratio.overall3.per <- df.ratio.overall3 %>%
  group_by(Party_Short, Themenfokus) %>%
  summarize(percent3 = mean(percent))

## Barplot

plot.bar <- df.ratio.overall3.per %>%
  ggplot(aes(fill=Themenfokus, y=percent3, x=Party_Short)) +
  geom_bar(position="dodge", stat="identity") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 22, face="bold"), axis.title=element_text(size=18)) +
  theme(legend.position = "bottom", text = element_text(size = 20)) +
  labs(title = "Die Politik richtet den Fokus nach dem Lockdown auf wirtschaftliche Risiken", x = "", y = "Anteil an allen Tweets") +
  scale_y_continuous(labels=function(x) paste0(x,"%")) +
  coord_flip() +
  scale_fill_brewer(palette = "Dark2", direction=-1)

plot.bar
#ggsave(plot.bar, file = "plot.bar.png", width = 13, height = 7)