Einführung in R: Erste Schritte

, , 2021

```{r setup, include=FALSE} ## include this at top of your RMarkdown file for pretty output ## make sure to have the printr package installed: install.packages('printr') knitr::opts_chunk$set(echo = TRUE, results = TRUE, message = FALSE, warning = FALSE) #library(printr) ``` # 1. Einleitung ### 1.1. Was ist `R` und warum sollten wir es lernen? `R` ist eine Open-Source-Programmiersprache, die zu den beliebtesten Sprachen in den *Data science* gehört. Im Vergleich zu anderen Programmen die für die empirische Forschung in den Sozialwissenschaften genutzt werden, wie SPSS und Stata, hat `R` besondere Vorteile: * `R` ist eine Programmier**sprache**. Von daher ist `R` deutlich vielseitiger als Statistik**programme** wie SPSS oder STATA. `R` ermöglicht nicht nur die statistische Analyse von empirischen Daten, sondern auch die praktische Implementierung von *Data science*-Werkzeugen (z.B. quantitativen Textanalyse, Cloud computing mit Amazon AWS, Machine Learning Anwendungen (umgangssprachlich: die Nutzung von künstlicher Intelligenz)). * Die Anwendungsbereiche von `R` wird ständig aktualisiert und erweitert. `R` ist **open-source**, weshalb jede und jeder zur stetigen Entwicklung einen Beitrag leisten kann. Insbesondere die Entwicklung von Paketen ist hier zu nennen (dazu später mehr). WissenschaftlerInnen sowie Fachleute aus der Wirtschaft verwenden `R`, weshalb in den aller meisten Fällen alle neuen Methoden, Techniken und Anwendungen bereits zur Verwendung in `R` verfügbar. Ihr könnt euch `R` also als einen App-Store für *Data science*-Anwendungen vorstellen. + Da `R` von den NutzerInnen stetig weiterentwickelt wird, finden sich im Internet zu allen `R`-bezogenen Fragen die passenden Antworten. Neben der einfachen Suche bei *Google* (am besten immer R als Präfix nutzen und dann erst das gesuchte Thema nennen) sind vor allem , und die **zentralen Anlaufstellen**. In deutscher Sprache ist zu nennen. Das ist aber weniger eine konkrete Hilfeseite, sondern eher ein R-Lexikon. * `R` ist kostenlos. Das Problem ist, dass das Erlernen von `R` nicht intuitiv ist. `R` hat eine steile Lernkurve: schwer am Anfang und mit der Zeit und steigender Erfahrung immer zugänglicher. Dennoch ist das Erlernen von `R` nicht so schlimm, wie oft befürchtet wird, und dank der steigenden Popularität der *Data science* gibt es jetzt viele Anlaufpunkte, die das Erlernen und die Anwendung von R erleichtern (für eine Liste von Einführungen und Tutorials siehe: ). ### 1.2. Zweck dieses Tutorials Der Schwerpunkt dieses Tutorials liegt darauf, euch den Einstieg in `R` zu erleichtern. Hier wird also noch nicht darauf eingegangen, wie `R` und die `R`-Syntax funktionieren. Es ist also kein Problem, wenn Ihr den verwendeten Code noch nicht versteht. Hier soll der Fokus vor allem darauf liegen, `R` zum laufen zu bringen, euch mit der Syntax vertraut zu machen und erste Spielereien anzustellen. # 2. Erste Schritte mit `R` Ihr müsst zwei Programme installiert haben, damit ihr den hier präsentierten Code auch an eurem Computer ausführen könnt: * 1) `R` ist die Software, die zur Ausführung des Code verwendet wird. * 2) `RStudio` ist eine grafische Benutzeroberfläche (GUI), die die Arbeit mit `R` wesentlich erleichtert. `RStudio` funktioniert nicht ohne eine vorherige Installation von `R`. Beide Programme können kostenlos heruntergeladen werden und sind für alle relevanten Betriebssysteme (Windows, MacOS und Linux) verfügbar. ### 2.1. `R` installieren `R` könnt ihr von der CRAN (comprehensive R Archive Network) Website herunterladen (siehe: ). ### 2.2. `RStudio` installieren Die `RStudio`-Website enthält Download-Links und Installationsanweisungen (siehe: ) . Ihr müsst die kostenlose Open-Source-Lizenz für `RStudio` Desktop installieren. ### 2.3. Verwenden von `RStudio` Nachdem `R` und `RStudio` installiert wurden, kann `RStudio` gestartet werden. Wenn alles korrekt installiert wurde, wird `RStudio` automatisch auch `R` starten. Wenn `RStudio` zum ersten Mal geöffnet wird, werden wahrscheinlich drei separate Fenster zu sehen sein. Der erste Schritt ist jetzt ein `R`-Skript zu öffnen. `R`-Skripte sind die zentralen Arbeitsflächen. Um ein `R`-Skript zu öffnen, müsst ihr mit der Maus die Symbolleiste (oben links) ansteuern und folgendes wählen: * Datei `->` Neue Datei `->` R-Skript Ihr seht jetzt vier Fenster: * Oben links ist der Texteditor für die Datei, in der gerade gearbeitet wird. Meistens handelt es sich dabei um ein `R`-Skript (wie das gerade geöffnete). * Oben rechts sind entweder die Datensätze, Variablen, Objekte und Werte zu sehen, mit denen gerade gearbeitet wird (Umgebung / Environment), oder ihr seht die Eingabenhistorie (Geschichte / History), die alle bis zu diesem Zeitpunkt ausgeführten Kommandos/Funktionen auflistet. * Unten links ist die Konsole, in der Code eingegeben und ausgeführt oder aber die Ausgabe/Ergebnisse von ausgeführten Codes angesehen werden kann. * Unten rechts ist ein interaktives Feld, in den Dateien, die auf dem lokalen Computer gespeichert sind, gesucht und geöffnet werden können, Hilfe zu Funktionen anzeigt oder Visualisierungen angesehen werden können. Theoretisch kann ein `R`-Code direkt in die Konsole eingeben werden (unten links). Das Problem ist jedoch, dass `R` die eingebenen Funktionen/Kommandos direkt wieder "vergisst". Von daher sollte **immer** in einem `R`-Skript gearbeitet werden (oben links). Auf diese Weise kann der Überblick über die Arbeitsschritte behalten und der Arbeitsfortschritt gespeichert werden. ### 2.4. Ausführen von Code aus dem `R`-Skript Kopiert den folgenden Beispielcode und fügt ihn in euer `R`-Skript ein. Ihr müsst die Syntax vorerst nicht verstehen. Konzentriert euch einfach auf die Ausführung. ```{r eval=FALSE} # R kann als over-powered Taschenrechner genutzt werden 3 + 3 2 * 5 6 / 2 # Oder wir schreiben kleine Texte "Institut für Politikwissenschaft" "Arbeitsbereich Vergleichende Regierungslehre und Politisches System Deutschlands" # Oder wir nutzen eine der vielen Funktionen. Hier die befehlen wir R die in den Klammern aufgelisteten Werte zu summieren. sum(1,2,3,4,5) ``` Ihr könnt Codes in einem `R`-Skript ausführen, indem ihr Strg + Enter drück (Mac: Command + Enter). Das kann auf zwei Arten geschehen: * Wenn ihr einen Codeteil markiert (so dass er hervorgehoben wird), könnt ihr Strg + Enter (Mac: Command + Enter) drücken, um die Auswahl auszuführen. Markiert jetzt die ersten drei Zeilen (die drei mathematischen Operationen) und drückt Strg + Enter (Mac: Command + Enter). * Wenn keine Auswahl getroffen wurde, aber der Textcursor sich im Editor befindet, könnt ihr Strg + Enter (Mac: Command + Enter) drücken, um die Zeile, auf der sich der Cursor befindet, auszuführen. Dadurch bewegt sich der Cursor automatisch in die nächste Zeile, so dass der Code von oben nach unten durchlaufen werden kann, wobei jede Zeile einzeln durchlaufen werden kann, Beginnt jetzt mit der ersten Zeile und drückt neunmal Strg + Enter (Mac: Command + Enter), um jede Zeile einzeln auszuführen. ### 2.5. Zuweisen von Werten Führt die folgenden Code-Zeilen einzeln **in eurer Console** (nicht im Skript) aus: ```{r} # R kann als Taschenrechner genutzt werden 3 + 3 2 * 5 sum(1,2,3,4,5) ``` Ihr solltet jetzt sehen, dass `R` die Eingaben automatisch verarbeitet. Aus 3 + 3 wird "6", aus 2 * 5 wird "10" und die Auswertung der Funktion sum(1,2,3,4,5) führt zu dem Ergebnis "15". Auf die Verwendung von `R` als Taschenrechner und die Ausführung von Funktionen gehen wir später genauer ein. Eine weitere wichtige Sache, die ihr über die `R`-Syntax wissen müsst, ist wie Vektoren Werte zugewiesen werden können. Umgegangssprachlich ausgedrückt ist die Zuordnung von Werten der zentrale Weg, wie man `R` dazu bringt, sich Dinge zu merken und zu speichern (als Werte im Umfeld / Environment, oben rechts). Dies funktioniert für alle Arten von Werten, von einzelnen Zahlen, Buchstaben, Sätzen bis hin zu ganzen Datensätzen, auf die gleiche Weise. Für die Zuordnung nutzen wir einen Pfeil (<-). Gebt den folgenden Code in euer Skript ein und führt ihn aus: ```{r eval=T} x <- 2 y <- "some text" ``` Hier haben wir uns die Zahl 2 als x und den Text "some text" als y gemerkt. Wenn ihr in `RStudio` arbeitet, könnt ihr diese Namen und Werte jetzt auch im Fenster oben rechts unter dem Reiter Umgebung / Environment sehen. Wir können nun die Namen verwenden, um die Werte abzurufen oder um diese Werte in neuen Befehlen zu verwenden: ```{r} x * 5 ``` Hier haben wir `R` den Befehl gegeben den Wert der mit x gespeichert wurde mit 5 zu multiplizieren. Beachtet bitte, dass ihr die Zeile ## [1] 10 nicht tippen solltet: In diesem Tutorial zeigen Zeilen, die mit ## beginnen, die Ausgabe von Befehlen an (x(also 2) * 5 = 10). ### 2.6. Verwenden von `RStudio`-Projekten Es ist am besten, wir ihr alle Skripte die ihr in diesem Seminar anfertigt in einem `RStudio`-Projekt verwaltet. Im wesentlichen handelt es sich hierbei um einen Ordner, in dem die `R`-Dateien und Daten für das Projekt gespeichert werden, an dem gerade gearbeitet wird. Projekte sind nicht unbedingt nötig, aber sie sind praktisch. Um ein neues Projekt zu erstellen, müsst ihr mit der Maus die Symbolleiste (oben links) ansteuern und folgendes wählen: * Datei `->` Neues Projekt Folgt den Anweisungen, um ein neues Verzeichnis mit einem neuen Projekt zu erstellen. Findet einen sinnvollen Namen für das Projekt. Wie wäre es zum Beispiel mit "IPW: Quantitative Text Analyse"? Öffnet jetzt ein neues R-Skript und speichert es sofort (wählt in der Symbolleiste oben links Datei `->` Speichern oder drückt Ctrl + S (Mac: Command + S)). Nennt die Datei "r_basics". In der rechten unteren Ecke, unter dem Reiter "Dateien", seht ihr nun die dem Projekt hinzugefügte Datei. Die Erweiterung .R zeigt an, dass es sich bei der Datei um ein `R`-Skript handelt. # 3. Erste (gewollte) Überforderung: Textanalyse in R Um euch einen Vorgeschmack auf einige der interessanteren Dinge zu geben, die wir in diesem Seminar machen werden, werdet ihr jetzt ein Projekt zur Analyse von Texten mit dem **quanteda**-Paket einrichten. Im Moment ist es weniger wichtig zu verstehen, was jede einzelne Codezeile genau macht, sondern das ihr ein Gefühl für die Arbeit mit `R` bekommt. Außerdem sollt ihr erste Einblicke bekommen, wie man Texte analysieren kann. ### 3.1. Installieren und Laden des Quanteda-Pakets Wie bereits erwähnt, ist eine der Stärken an `R` das Nutzen von Paketen. In diesem Fall werden wir das Paket **quanteda** verwenden. Quanteda ist ein Paket zur automatischen Textanalyse (mehr Infos: ). Viele `R`-Pakete befinden sich im CRAN-Netzwerk. Das ermöglicht es uns, ein neues Paket sicher und einfach aus `R` heraus herunterzuladen und zu installieren. Wir brauchen nur eine einzige Zeile Code auszuführen. Zum Beispiel installiert die folgende Codezeile das ggplot2-Paket, welche die Möglichkeiten der Datenvisualisierung in `R` erweitert. ```{r eval=FALSE} install.packages('ggplot2') ``` Meistens können die Pakete ohne Probleme installiert werden. Es gibt jedoch einige Ausnahmen. Für quanteda zum Beispiel, sind bestimmte Software notwendig, die eventuell nicht Vor-Installiert sind. Um das auszuschließen, stellt sicher, dass ihr die `R` Version 4.0.0 (oder höher) installiert habt. Um die verwendete Version zu überprüfen, gebt `version` in eure Konsole (unten links) ein. Falls ihr ein Update durchführen müsst, besucht die `R`-Website (siehe oben). MacOS-Benutzer erhalten möglicherweise die Frage, ob das Paket aus dem Quellcode installieren werden soll. In diesem Fall solltet ihr "n" oder "nein" in die Konsole eingeben ("ja" funktioniert nur, wenn bestimmte Software installiert ist). Installiert jetzt das quanteda-Paket mit dem folgenden Code: ```{r eval=FALSE} install.packages('quanteda') ``` Nach der Fertigstellung wurde das Paket auf dem Computer installiert. Ihr braucht diesen Befehl also nicht zu wiederholen (außer ihr wechselt euren Computer). Um quanteda in einem R-Skript zu verwenden, müsst ihr R jedoch explizit mitteilen, dass das Paket geladen werden soll. Dazu nutzt den folgenden Befehl: ```{r eval=T} library(quanteda) ``` ### 3.2. Der erste Kontakt: Die Antrittsreden der US Präsidenten In der Quantitativen Textanalyse wird häufig der Begriff Korpus oder Corpus verwendet. Dieser Begriff bezeichnet eine Sammlung von Texten. Für dieses Tutorial wird ein Demo-Korpus verwendet, der die die Antrittsreden der US-Präsidenten enhält und bei der Installation von quanteda mitgeliefert wird. Im quanteda-Paket führt der Korpus den Namen `data_corpus_inaugural`. Um mit dem Korpus arbeiten zu können, müssen wir ihn in unserem Environment / Umfeld als Datenobjekt speichern. Wie ihr bereits wisst, können wir Datensätze mit dem `<-` einen Namen zuordnen und so speicher. Der Einfachheit halber ordnen wir dem Korpus den Namen `corp` zu: ```{r eval=T} corp <- data_corpus_inaugural # Da ihr das quanteda-Paket geladen habt (mit library(quanteda)) und dort der Demo-Korpus data_corpus_inaugural gespeichert ist, kann R direkt auf die dort gespeichert Texte zugreifen corp ``` Nach der Ausführung des Codes lässt uns quanteda wissen, dass der Korpus 58 Dokumente und 3 Variablen (so genannte Docvars, Dokumentenvariablen) enthält. Die Docvars sind Variablen über die Dokumente, in diesem Fall der Vor- und Nachname des Präsidenten, das Jahr der Rede und die Partei die der jeweilige Präsident angehörte. Diese Variablen können wir mit der Funktion `docvars()` einsehen (hier in diesem Tutorial-Dokument sind nur die ersten Zeilen des Outputs zu sehen.) ```{r eval=T} docvars(corp) ``` ### 3.3. Die Document-Term-Matrix Damit wir Texte mit unserem Computer analysieren zu können, müssen wir die Textdaten so transformieren, dass wir Berechnungen durchführen können. Die Transformation von Texten in eine **Document-Term-Matrix** (DTM) nimmt hier eine zentrale Position ein. Dabei handelt es sich um eine Matrix, in der die Dokumente in den Zeilen dargestellt werden. Die Begriffe/Wörter werden den Spalten zugeordnet, die somit angeben wie oft jeder Begriff/jedes Wort in jedem Dokument vorkommt. Dies wird auch als **"Bag-of-Words"**-Darstellung von Texten bezeichnet (mehr dazu in den kommenden Sitzungen), da Dokumente auf Worthäufigkeiten reduziert werden (die Matrix zeigt nur an, wie oft ein Wort in einem Text vorkommt). Während dieses Format viele wichtige Informationen bezüglich der Wortstellung und der Syntax ignoriert, hat die Forschung gezeigt, dass viele interessante Elemente von Texten allein durch die Betrachtung der Worthäufigkeiten gemessen werden können. Wenn wir eine DTM erstellen, gibt es einige Standardtechniken zur Vorverarbeitung der Daten. Konkret wollen wir Wörter herausfiltern, die nicht interessant sind, wie z.B. Füll-/Stoppwörter (z.B. der, die, das, wer, wie, was). Außerdem wollen wir zum Beispiel alle Großbuchstaben zu Kleinbuchstaben transformieren, Sonderzeichen (z.B. @ oder #), Interpunktion und Zahlen entfernen und vieles mehr (mehr dazu in den kommenden Sitzungen). Für dieses Tutorial werden wir alle Buchstaben in Kleinbuchstaben transformieren (*tolower*), englische Stoppwörter (*remove = stopwords('english')*) und die Interpunktion entfernen (*remove_punct = TRUE*). Wir werden die `dfm`-Funktion aus dem quanteda-Paket verwenden. DFM steht für **Document Feature Matrix**, was eine allgemeinere Form einer Document-Term-Matrix ist (ein Merkmal kann ein Begriff sein, aber auch andere Dinge). Wir ordnen der Matrix den namen `speeches` zu: ```{r eval=T} speeches <- dfm(corp, tolower = TRUE, remove = stopwords('english'), remove_punct = TRUE) speeches ``` Wir haben jetzt eine DTM mit 58 Dokumenten und 5.405 Begriffen. Die DTM ist zu 89,2% *sparse*, was bedeutet, dass 89,2% der Zellen in der DTM den Wert Null haben. Eine Null ensteht, wenn ein Wort nicht in einem Dokument auftaucht. Dieser Wert ist normal, weil einzelne Dokumente (Reihen) nur einen kleinen Teil aller Wörter die in den Dokumenten verwendet wurden (Spalten) enthalten. Die gesamte DTM ist ziemlich groß und unübersichtlich. Mit der folgenden Codezeile lassen wir uns nur eine Teilmenge ausgeben. Die ersten 10 Dokumente und deren erste 10 Begriffe: ```{r eval=T} speeches[1:10,1:10] ``` Wir sehen hier zum Beispiel, dass das Wort "senat", einmal in der Rede von George Washington aus dem Jahr 1789 und einmal in der Rede von John Adams aus dem Jahr 1797 vorkommt. ### 3.4. Word clouds Um eine grundlegende Vorstellung davon zu bekommen, worüber die US Präsidenten gesprochen haben, können wir mit der quanteda-Funktion `textplot_wordcloud()` eine Word cloud erstellen. Das Hauptargument für diese Funktion ist die von uns erstellte DTM. Als zusätzliches Argument setzen wir `min_count` (die minimale Wortanzahl) auf 50, um alle Wörter zu ignorieren, die weniger als 50 Mal in den Reden benutzt wurden. ```{r eval=T} textplot_wordcloud(speeches, min_count = 50) ``` Das können noch etwas verbessern. Zum Beispiel können wir die Anzahl der Reden verringern und nur Reden nach 1945 oder nur die Reden von Obama als Grundlage der Darstellung verwenden: ```{r eval=T} m_obama <- dfm_subset(speeches, President=="Obama") m_postwar <- dfm_subset(m_obama, Year > 1945) ``` Beachtet bitte, dass dadurch nicht andere Jahre oder Präsidenten aus unserer bestehenden DTM gelöscht wurden, sondern zwei neue DTMs `m_obama` und `m_postwar` erstellt wurden. Diese neuen DTMs enhalten jetzt die von uns ausgewählten Reden (alle nach 45 und nur die von Obama). Lasst uns eine davon darstellen! Zusätzlich zur Wortgröße verwenden wir jetzt auch Farben, um die Unterschiede in der Worthäufigkeit hervorzuheben. Der Befehl `max_words = 100` begrenzt die Anzahl der angezeigten Wörter in der word cloud auf 100 (das vereinfacht die Dartstellung nochmals). ```{r eval=T} textplot_wordcloud(m_postwar, max_words = 100, color = c('lightblue', 'skyblue2','purple3', 'purple4','darkred')) ``` Nutzt jetzt die verschiedenen DTMs und versucht euch eigenständig an die Erstellung einer Word cloud oder anderen Darstellungsmöglichkeiten. Nutz dafür die Google Suche und findet weitere Darstellungsmöglichkeiten heraus (am besten mit dem Präfix `R` oder in diesem Fall noch passender `quanteda`). ### 3.5. Keyword in context Die Word cloud stellt die Wörter dar, die am häufigsten vorkommen. Es fehlt aber natürlich der Textkontext. Um eine Vorstellung von dem Kontext zu erhalten, in dem die Wörter verwendet werden, kann die **Keyword in context** (kwic) Methode hilfreich sein. In quanteda könnt ihr die `kwic()`-Funktion ganz einfach auf das Korpusobjekt `corp` anwenden (für den Textkontext hilt die DTM nicht weiter, da hier jegliche Satzstruktur aufgebrochen wurde). Hierfür müssen wir lediglich ein Wort das uns interessiert einfügen. Nehmen wir als Beispiel das Wort "Terror". Der angezeigte Output zeigt die Textstellen vor und nach dem definierten Keyword an. Wie viele Wörter vor und nach dem Keyword angezeigt werden definieren wir mit dem Argument `window = `. ```{r eval=T} kwic(corp, pattern ="terror", window = 10) # "pattern =" definiert das Wort und "window =" die Anzahl der "Kontextwörter" die vor und nach dem Wort angezeigt werden sollen. ``` Für die KWIC-Methode verwenden wir den den Korpus (corp) und nicht die DTM, da die DTM nicht mehr über Informationen zur Wortfolge verfügt (sie kann also keinen Kontext anzeigen). Um eine KWIC-Liste für eine Teilmenge von Dokumenten, z.B. nur die Reden Obamas, zu erhalten, müssen wir den Befehl `corpus_subset` verwenden. So können wir die Reden von Obama identifizieren: ```{r eval=T} corp_obama <- corpus_subset(corp, President == "Obama") # Hier subsetten wir den gesamten Korpus und wählen nur die Reden von Obama aus. kwic(corp_obama, pattern ="economy", window = 10) # Hier wenden wir die kwic-Funktion auf das Obama-subset an und wollen uns den Kontext (10 Wörter vor und nach) das Keywords "economy" anzeigen lassen. ``` ### 3.6. Korpus-Vergleich Sind wir jetzt daran interessiert zwei Dokumenten-Korpora zu vergleichen, dann bietet sich in einem ersten Schritt der Vergleich der Worthäufigkeiten an. Zum Beispiel können wir so die Wörter in den Antrittsreden der US Präsidenten identifizieren, welche in der Rede von Obama unterrepräsentiert sind. ```{r eval=T} tk <- textstat_keyness(speeches, docvars(speeches, 'President') == "Obama") textplot_keyness(tk, show_legend = F) ``` In diesem Plot/dieser Graphik sehen wir 20 Begriffe, die in Obamas Reden überrepräsentiert sind. Dies sind die Top 20 Begriffe mit den blauen Balken. Am stärksten überrepräsentiert sind die Begriffe "journey", "generat(ion)", "job" und "creed". Die 20 Begriffe mit den grauen Balken sind die unterrepräsentierten Begriffe. Über- bzw. Unterrepräsentation bezieht sich in diesem Beispiel auf die relative Häufigkeit der Begriffe in allen 58 Reden des Korpus.