Zeitlicher Wandel am Beispiel der Debatten um Auslandseinsätze der Bundeswehr

12.07.2019 - Gruppe 4 - Reading time ~9 Minutes

Einführung

Gruppe 4 beschäftigte sich mit der Darstellung und Untersuchung von zeitlichem Wandel. Anhand einer konkreten Forschungsfrage versuchten wir festzustellen, ob und wo eine Veränderung der Bundestagsdebatten zum Thema Auslandseinsätze der Bundeswehr über Zeit stattgefunden hat. Die aufgeworfene Forschungsfrage lautet demnach auch:

Wie verändern sich die Debatten über die Auslandseinsätze der Bundeswehr im Deutschen Parlament?

Annäherung an das Thema

Quelle: https://sakurai-cartoons.de/images/g_augenrechts.gif; letzter Zugriff: 11.07.19.

Quelle: https://sakurai-cartoons.de/images/g_augenrechts.gif; letzter Zugriff: 11.07.19.

Frei nach den Worten des ehemaligen französischen Präsidenten George Clémenceau, der Krieg sei eine zu ernste Sache, ihn den Generälen zu überlassen, und dem Prinzip der Parlamentsarmee gilt mit Blick auf bewaffnete Auslandseinsätze der Bundeswehr der Parlamentsvorbehalt. Anfang der 1990er Jahre vollzog sich in Deutschland eine kontroverse Debatte um solche Out of Area-Einsätze. Zwischen 1990 und 1991 beteiligte sich die Bundeswehr unter anderem an Operationen im Mittelmeer und Persischen Golf, in der Türkei und Kambodscha. Die damalige Debatte wurde insbesondere durch das wegweisende Urteil des Bundesverfassungsgerichts vom 12. Juli 1994 geprägt, nachdem die FDP- und SPD-Fraktionen ein Organstreitverfahren angestrengt hatten. Nach dieser Entscheidung des BVerfG darf die Bundeswehr gem. Art. 24 GG auch außerhalb des NATO-Gebietes eingesetzt werden (vgl. Az. 2 BvE 3/92 u.a. - BVerfGE 90, 286). Seitdem beteiligt sich die Bundeswehr regelmäßig an bewaffneten Einsätzen außerhalb der Landes- und Bündnisgrenzen.

Eine Übersicht aller Einsätze findet sich hier.

Jeder dieser Mandate muss vom Parlament genehmigt und bei Fortsetzung entsprechend verlängert werden (Prinzip der Parlamentsarmee). Es wird somit regelmäßig im Deutschen Bundestag über Beginn, Aus- oder Fortsetzung von bewaffneten Einsätzen der Bundeswehr diskutiert. Wir vermuten, dass sich im Vergleich zu den ersten Debatten um die Jahrtausendwende herum, die Diskussion über Auslandseinsätze heute weniger polarisiert weniger polarisieren.

Ob dies tatsächlich der Fall ist versuchten wir anhand einer Sentimentanalyse herauszufinden.

Fallauswahl

Zunächst galt es den zu untersuchenden zeitlichen Rahmen festzulegen. Dabei diskutierten wir, ob wir einen durchgängigen und dafür längeren Zeitraum betrachten sollten oder den Fokus auf zwei zeitlich auseinanderliegenen Legislaturperioden zu legen sei.

Die Entscheidung fiel auf letztere Option. Wir beschlossen die aggregierten GermaParl-Datensätze der Legislaturperioden 14 und 18 als Ausgangsmaterial für die Untersuchung zu verwenden.

Warum diese beiden Legislaturperioden?

Die 14. Legislaturperiode dauerte vom 26.Oktober 1998 bis zum 17.Oktober 2002. Neben den Regierungsparteien SPD und Bündnis90/Die Grüne waren CDU, CSU, FDP, PDS im Bundestag vertreten. In diese Legislaturperiode fiel u.a.:

  • die Beteiligung der Luftwaffe im Rahmen der Operation Allied Force am Kosovo-Krieg.
  • Beginn des KFOR-Einsatzes. Gebilligt vom Bundestag am 11. Juni 1999.
  • Beginn des Afghanistan-Einsatzes im Rahmen des US-geführten “Kampf gegen den internationalen Terrorismus” Damit verbunden: Bundeskanzler Gerhard Schröder stellt am 16. November 2001 nach Art. 68 Abs. 1 GG die Vertrauensfrage, verbunden mit der konkreten Sachfrage (der Beteiligung am Afghanistaneinsatz).

Die 18. Legislaturperiode reichte vom 22. Oktober 2013 bis zum 24. Oktober 2017. Die Regierung wurde hier von einer “Großen Koalition” aus CDU/CSU und SPD gestellt. Weitere im Bundestag vertretene Parteien waren Bündnis90/Die Grünen und DieLINKE. In diesen Zeitraum fiel u.a.:

  • Das Ende der des ISAF-Einsatzes in Afghanistan am 14. Dezember 2014 & Beginn der Mission “Resolute Support”
  • Mandatsverlängerung versch. Einsätze (KFOR, UNIFIL, EU NAVFOR Somalia (Operation Atalanta), EUTM Mali etc.)
  • Verlängerung und Ausweitung des MINUSMA-Einsatzes von 150 auf 650 Soldaten.
  • Beginn EUNAVFOR Med (Operation Sophia), Anit-IS-Einsatz (Counter Daesh)
  • Ukrainekrise 2014
Abkürzungsverzeichnis
BVerfG Bundesverfassungsgericht
EU NAVFOR Eurpean Union Naval Force
EUTM Eurpean Union Training Mission
ISAF International Security Assistance Force
KFOR Kosovo Force
MINUSMA Mission multidimensionnelle intégrée des Nation Unies pour la stabilisation au Mali
UNIFIL United Nations Interim Force in Lebanon

Unser Vorgehen

Schritt 1: Laden der Pakete

Zuerst müssen, wie immer, die Pakete über den library-Befehl geladen werden (und evtl. vorher installiert werden.)

library(tidyverse) # Rundumpaket - Paketsammlung zur Datenanalyse
## Registered S3 method overwritten by 'rvest':
##   method            from
##   read_xml.response xml2
## ── Attaching packages ─────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.0     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(quanteda) # Paket zur Verarbeitung und Analyse von Textdaten als Korpus
## Package version: 1.4.3
## Parallel computing: 2 of 4 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
## 
##     View
library(ggplot2) # für Visualisierung der Daten -> tidyverse enthält ggplot2

Schritt 2: Daten laden

In einem zweiten Schritt werden die entsprechenden Daten geladen. Wir nutzen die GermaParl-Datensätze, LP14_agg und LP18_agg. Nicht vergessen den richtigen Pfad anzugeben. Alternativ können die Daten auch manuell geladen werden.

#GermaParl Daten
##LP14 laden
#load("C:/Users/EKreuzinger/Desktop/Studium/Uni Göttingen/1. SoSe 19/M.MSZ.12-02/Gruppe 4/LP/lp14_agg.rda")
load("../../../daten/polmineR/lp_14_agg.rda")

##LP18 laden
#load("C:/Users/EKreuzinger/Desktop/Studium/Uni Göttingen/1. SoSe 19/M.MSZ.12-02/Gruppe 4/LP/lp18_agg.rda")
load("../../../daten/polmineR/lp_18_agg.rda")

Schritt 3: Zusammenfügen beider Datensätze

Anschließend inspizieren wir die Datensätze. Der gleiche Aufbau der Datensätze bietet es an, beide in einer neuen Variablen zusammenzufügen.

#Inspektion LP14
#View(lp_14_agg)
names(lp_14_agg)
##  [1] "speaker_cumsum"      "turn_id"             "lp"                 
##  [4] "year"                "speaker"             "session"            
##  [7] "date"                "interjection"        "party"              
## [10] "parliamentary_group" "role"                "agenda_item"        
## [13] "agenda_item_type"    "url"                 "src"                
## [16] "lemma"               "pos"                 "word"

#Inspektion LP18
#View(lp_18_agg)
names(lp_18_agg)
##  [1] "speaker_cumsum"      "turn_id"             "lp"                 
##  [4] "year"                "speaker"             "session"            
##  [7] "date"                "interjection"        "party"              
## [10] "parliamentary_group" "role"                "agenda_item"        
## [13] "agenda_item_type"    "url"                 "src"                
## [16] "lemma"               "pos"                 "word"

#Zusammenfügen der Datensätze
lp_bind <- rbind(lp_14_agg, lp_18_agg) %>% 
  rename(text = lemma) #Umbenennung der lemma-Variable in "text" für die Korpus-Funktion

Schritt 4: Auswahl relevanter Daten

Die Auswahl der Daten basiert in diesem Beispiel auf praktischen Überlegungen. Entfernt werden “unnötige” Daten, wie URL, interjection, parliamentary_group, turn_id, pos, src, agenda_item_type, agenda_item, word.

lp_filtered <- lp_bind %>% # erstellt einen neuen Dataframe, der folgende Spalten der Datensätze enthält...
  select(speaker_cumsum, lp, year, speaker, session, date, party, role, text) # ausgewählte Spalten
#summary(lp_filtered)

Schritt 5: Filter

Basierend auf Schlüsselwörtern filtern wir die Daten, die wir benötigen. Unser Thema ist relativ spezifisch: Wenn über das Thema gesprochen wird, werden meistens die Begriffe “Bundeswehr” und “Auslandeinsatz” erwähnt. Entsprechend der konkreten Situation der deutschen Auslandseinsätzen wählen wir zusätzlich konkreten Ortsnamen. Wir legen zwei Keyword-Ebenen fest, und grenzen die Daten von groß nach klein ein. Wir haben erwogen, eine kwic-Analyse anstelle dieser Methode zu verwenden. Die Kombination (filter und str_detect) ist jedoch einfacher und übersichtlicher und behält direkt die Variablen der Originaldaten bei.

lp_kleiner_1 <- lp_filtered %>% 
  filter(str_detect(text, "[Bb]undeswehr[a-z]{0,4}")) #Keyword_groß_Ebene

lp_kleiner_2 <- lp_kleiner_1 %>% 
  filter(str_detect(text, "[Aa]uslandseins[aä]tz[a-z]{0,4}|Kosovo|Afghanistan|Mali|Westafrika|Westsahara|Libyen|Sudan|Irak|Somalia")) #Keyword_klein_Ebene

Schritt 6: Quanteda Korpus

Erstellen eines Korpus aus den gefilterten Daten mit Hilfe des corpus-Befehls

#Korpus
bw_corp <- corpus(lp_kleiner_2)
head(bw_corp)
## Corpus consisting of 6 documents and 8 docvars.

Schritt 7: Wörterbuch

Nach der Überlegung ein bereits vorhandenes Wörterbuch zu verwenden, entschieden wir uns dafür ein eigenes Wörterbuch zu erstellen. An dieser Stelle ist hervorzuheben, dass hier das Wörterbuch nicht perfekt ist. Hier gilt es noch zu validieren! Neben dem Validieren der Wörter, die letztlich stets im Kontext des konkreten Datensatzes nochmals zu überprüfen sind, könnte man alternativ auch noch das Rauh-Wörterbuch verwenden, um so einen Vergleich ziehen zu können und möglicherweise weitere Erkenntnisse zu erhalten.

# Eigenes Dictionary

positiv <- c("humanitär", "zivil", "Unterstützung", "Hilfe")
# positive Begriffe
negativ <- c("Fehler", "Krieg", "bewaffnet", "Verbrechen") 
#negative Begriffe

bw_dict <- dictionary(list(
  positiv = c(positiv),
  negativ = c(negativ)
))

#Dictionary anwenden
dfm_dict <- dfm(bw_corp,
  dictionary = bw_dict)

Schritt 8: Auswertung

Die Auswertung der uns nun zur Verfügung stehenden Daten erfolgte in zwei Schritten: 1. über die Polarität als absolute Häufigkeit der vom Dictionary erfassten positiven bzw. negativen Wörter. 2. über die Berechnung eines normierten Polaritätswertes.

Zuerst haben wir die Daten über die Jahre hinweg verglichen.

# Polaritätswerte - Jahre
dfm_polarity <- dfm(bw_corp,
                    groups = "year",
                    dictionary = bw_dict)
dfm_polarity %>%
  head()
## Document-feature matrix of: 6 documents, 2 features (0.0% sparse).
## 6 x 2 sparse Matrix of class "dfm"
##       features
## docs   positiv negativ
##   1998      60      19
##   1999     415     185
##   2000     113      57
##   2001     212     105
##   2002      75      74
##   2013      36       5

#Extraktion der Polaritätswerte
polarity <- convert(dfm_polarity, "data.frame") %>% # Umwandlung der DFM in einen Dataframe
  mutate(Polaritaet = ((positiv - negativ) / (positiv + negativ))) %>% # Berechnung der Polarität als Wert zwischen -1 (negativ) und +1 (positiv)
  gather(negativ, positiv, key = "Gruppe", value = "Woerter") %>% # trennt die dfm_polarity-Tabelle in drei Tabellen auf und setzt diese untereinander wieder zusammen
  rename(Jahr = document) # benennt die erste Spalte um

head(polarity) # aufgrund der Aufspaltung in positiv und negativ ist jedes Jahr zweimal in der Tabelle enthalten
##   Jahr  Polaritaet  Gruppe Woerter
## 1 1998 0.518987342 negativ      19
## 2 1999 0.383333333 negativ     185
## 3 2000 0.329411765 negativ      57
## 4 2001 0.337539432 negativ     105
## 5 2002 0.006711409 negativ      74
## 6 2013 0.756097561 negativ       5

Schritt 9: Visualisierung

Darstellung #1: Anzahl der Wörter pro Jahr

Die Visualisierung der Ergebnisse. Zunächst anhand der Gesamtzahl der Worte, aufgeteilt nach positiven und negativen.

ggplot(polarity, aes(x = Jahr, y = Woerter, colour = Gruppe, group = Gruppe)) + # Benennung der Dimensionen, Aufteilung Positiv Negativ
         geom_line(size = 1) + # Breite der Linie
         ggtitle("Sentiment-Scores: Bundestag (absolut)") # Titel der Grafik festlegen

Darstellung #2: Normiert

Die Darstellung des Zusammenhangsmaß von positiven und negativen Aussagen pro Jahr.

# Darstellung #2: Normiert auf -1/+1
ggplot(polarity, aes(x = Jahr, y = Polaritaet, group = Gruppe)) +
  geom_line(size = 1) +
  ggtitle("Sentiment-Scores: Bundestag (normiert)") # Titel der Grafik festlegen

Zusatz: Auswertung nach Sitzungen

Um detailliertere Aussagen über die Schwankung der Polarität innerhalb der untersuchten Jahre treffen zu können, haben wir zudem die Polaritätswerte über die einzelnen Sitzungen hinweg verglichen.

# Polaritätswerte - Sitzungen
dfm_polarity_si <- dfm(bw_corp,
                    groups = "session",
                    dictionary = bw_dict)
dfm_polarity_si %>%
  head()
## Document-feature matrix of: 6 documents, 2 features (25.0% sparse).
## 6 x 2 sparse Matrix of class "dfm"
##     features
## docs positiv negativ
##   3       66      18
##   5        3       0
##   6       21       3
##   7        0       0
##   8       12      10
##   10      30      10

#Extraktion der Polaritätswerte
polarity_si <- convert(dfm_polarity_si, "data.frame") %>% # Umwandlung der DFM in einen Dataframe
  mutate(Polaritaet = ((positiv - negativ) / (positiv + negativ))) %>% # Berechnung der Polarität als Wert zwischen -1 (negativ) und +1 (positiv)
  gather(negativ, positiv, key = "Gruppe", value = "Woerter") %>% # trennt die dfm_polarity-Tabelle in drei Tabellen auf und setzt diese untereinander wieder zusammen
  rename(Sitzung = document) # benennt die erste Spalte um

head(polarity_si) # aufgrund der Aufspaltung in positiv und negativ ist jede Sitzung zweimal in der Tabelle enthalten
##   Sitzung Polaritaet  Gruppe Woerter
## 1       3 0.57142857 negativ      18
## 2       5 1.00000000 negativ       0
## 3       6 0.75000000 negativ       3
## 4       7        NaN negativ       0
## 5       8 0.09090909 negativ      10
## 6      10 0.50000000 negativ      10

Visualisierung

Darstellung #3: Anzahl der Wörter pro Sitzung

ggplot(polarity_si, aes(x = Sitzung, y = Woerter, colour = Gruppe, group = Gruppe)) +
         geom_line(size = 1) +
         ggtitle("Sentiment-Scores: Bundestag (absolut)") # Titel der Grafik festlegen

Darstellung #4: Normiert

# Darstellung #2: Normiert auf -1/+1
ggplot(polarity_si, aes(x = Sitzung, y = Polaritaet, group = Gruppe)) +
  geom_line(size = 1) +
  ggtitle("Sentiment-Scores: Bundestag (normiert)") # Titel der Grafik festlegen