# 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")
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")
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)
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.
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")
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("")
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.
## 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)
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
# 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)
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)
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)