Teaser: Datenanalyse mit R

Seminar Inhaltsanalyse mit kĂŒnstlicher Intelligenz

Autor:in
Zugehörigkeit

Marko Bachl

Freie UniversitÀt Berlin

Veröffentlichungsdatum

01. 07. 2024

EinfĂŒhrung

Dieses interaktive Dokument bietet einen ersten Einstieg in die Datenanalyse mit R. Der Code ist in R geschrieben und wird mit WebR im Browser ausgefĂŒhrt. Das Format eignet sich gut zur EinfĂŒhrung, da Sie nichts installieren mĂŒssen und die AusfĂŒhrung selbst auf (halbwegs aktuellen) Smartphones und Tablets möglich ist.

Wenn Sie tiefer in die Datenanalyse mit R einsteigen möchten, empfehle ich Ihnen die Installation von R und RStudio auf einem lokalen Rechner. Dies ist sinnvoll, da Sie in der WebR-Anwendung lokale Dateien nicht direkt einlesen und den erstellten Code nicht direkt speichern können. Zum Einstieg finden Sie ein R-Skript mit den hier prĂ€sentierten Code-Ausschnitten in Blackboard🔒 im Ordner Code.

In dieser einzelnen Seminarsitzung können wir nur absoluten Grundlagen besprechen, die Sie zur Analyse der Daten aus Ihrer Inhaltsanalyse benötigen. Wenn Sie am IfPuK tiefer in die Datenanalyse einsteigen möchten, können Sie in einem der nĂ€chsten Semester den Kurs Datenanalyse mit R von Dr. LĂŒck-Benz besuchen. Unter dem ersten Link finden Sie das gesamte Kursmaterial, sodass Sie sich auch eigenstĂ€ndig einarbeiten können. DarĂŒber hinaus finden Sie im Internet unzĂ€hlige Ressourcen aller Art, die Ihnen bei der Einarbeitung in R helfen können. FĂŒr jeden Geschmack, Lerntyp, und jedes Vorwissen ist etwas dabei.

Hinweise zur Benutzung dieses interaktiven Dokuments

  • Wenn Sie den vorgegebenen Code einfach ausfĂŒhren möchten, klicken Sie auf den Play-Button (“Run Code”).
  • Die Code-Felder sind interaktiv, dass heißt, Sie können den Code verĂ€ndern und erneut ausfĂŒhren.
  • Die Schritte des vorgegebenen bauen aufeinander auf:
    • Sie mĂŒssen die vorherigen Schritte durchfĂŒhren, um die nachfolgenden Schritte ausfĂŒhren zu können.
    • Wenn Sie den Code in einem Schritt verĂ€ndern, mĂŒssen Sie ggf. die nachfolgenden Schritte ebenfalls anpassen und erneut ausfĂŒhren.

Pakete laden

R ist eine Programmiersprache, die durch Pakete erweitert werden kann. Pakete enthalten Funktionen, die spezielle Aufgaben erledigen. In diesem Dokument verwenden wir nur Funktionen aus den Paketen base und stats, die in R standardmĂ€ĂŸig enthalten sind. Daher mĂŒssen wir keine zusĂ€tzlichen Pakete installieren.

ZusĂ€tzliche Pakete mĂŒssen vor der erstmaligen Verwendung mit der Funktion install.packages() installiert werden. In diesem Dokument sind die Pakete bereits installiert und können direkt geladen werden. Dies geschieht mit der Funktion library().

Daten einlesen

Zuerst mĂŒssen die Daten eingelesen werden. Hierzu verwenden wir die Funktion read.csv2(). Diese Funktion liest Daten aus einer CSV-Datei ein, in der die Spalten mit ; getrennt sind. Die Daten werden in einem data.frame gespeichert. Ein data.frame ist eine Tabelle, die aus Zeilen und Spalten besteht. Jede Spalte enthĂ€lt eine Variable (bei uns: eine Kategorie), jede Zeile enthĂ€lt einen Fall (bei uns: ein Kommentar).

Wir speichern den Datensatz in einem Objekt mit dem Namen daten. Das geschieht mit dem sogenannten Zuweisungsoperator. In R können Sie dafĂŒr das Zeichen = oder <- verwenden.

Ich habe die Daten bereits fĂŒr die Analyse aufbereitet. Sie können die Daten daher direkt ĂŒber einen Link einlesen. Sie finden die DatensĂ€tze hier: https://bachl.github.io/raw_data/.

FĂŒgen Sie den Link zur CSV-Datei Ihrer AG in die Funktion read.csv2() ein. Der Link muss in AnfĂŒhrungszeichen stehen. FĂŒhren Sie dann den Code aus.

Daten ansehen

Wenn wir ein Objekt in R ansehen wollen, können wir einfach dessen Namen in die Konsole eingeben. Das funktioniert auch mit data.frame-Objekten.

Geben Sie den Namen des Objekts, daten, in die folgende Konsole ein und fĂŒhren Sie den Code aus.

Wir können zwar erahnen, wie dieser Datensatz aufgebaut ist. Allerdings ist der Datensatz viel zu groß, um ihn sinnvoll in einem Fenster anzuzeigen. Daher verwenden wir die Funktion str(), um uns die Struktur des Datensatzes anzeigen zu lassen.

Ändern Sie Befehl in der Konsole, indem Sie die Funktion str() ergĂ€nzen, sodass der Name des Objekts innerhalb der Klammer steht. FĂŒhren Sie dann den Code nochmals aus.

Wir sehen nun die Zahl der FĂ€lle (“obs.”, Zeilen im Datensatz) und der Variablen (“variables”, Spalten im Datensatz). DarĂŒber hinaus sehen wir die Namen der Variablen und deren Datentypen. Die Datentypen sind wichtig, da sie bestimmen, welche Operationen auf den Variablen durchgefĂŒhrt werden können. Mit int (Integer, Ganzzahl) und num (Numeric, Dezimalzahl) können wir rechnen. Variablen vom Typ chr (Character, Zeichenkette) können wir nur auszĂ€hlen. Zudem sehen wir die AusprĂ€gungen der Variablen in den ersten FĂ€llen.

In unserem Beispiel gibt es, wie hĂ€ufig in der Inhaltsanalyse, viele Variablen vom Typ chr. Unsere Analyse wird sich daher auf das AuszĂ€hlen von AusprĂ€gungen in den Vergleichsgruppen beschrĂ€nken. Wir erstellen Kreuztabellen und fĂŒhren \(\chi^2\)-Tests durch.

Eine Variable auszÀhlen

Wir verwenden die Funktion table() aus dem Paket base, um die HÀufigkeit von AusprÀgungen einer Variable zu zÀhlen. Die Funktion table() benötigt ein Argument: die Variable, die wir auszÀhlen wollen.

Eine Variable aus einem data.frame wird mit dem Operator $ ausgewÀhlt. Der Operator wird zwischen den Namen des data.frame und der Variable geschrieben: daten$VARIABLENNAME_HIER.

FĂŒgen Sie den Namen einer Variablen aus dem Datensatz in die Funktion table() ein und fĂŒhren Sie den Code aus.

Wenn alles funktioniert hat, sehen wir nun die AusprÀgungen der Variable und ihre absoluten HÀufigkeiten.

Wir können die Tabelle nicht nur anzeigen lassen, sondern auch in ein neues Objekt abspeichern. Das wird spÀter hilfreich sein, wenn wir weiter mit der Tabelle arbeiten wollen.

Speichern Sie die Tabelle in einem neuen Objekt, indem Sie den Namen und den Zuweisungsoperator ergĂ€nzen und den Code erneut ausfĂŒhren.

Dieses Objekt können wir nun weiterverwenden, z.B., um die AusprÀgungen nach HÀufigkeiten zu sortieren oder die HÀufigkeiten in Prozent auszugeben.

Wenn wir die Tabelle nach HÀufigkeit der AusprÀgungen sortieren wollen, können wir die Funktion sort() verwenden. sort() benötigt zwei Argumente: die Tabelle, die wir sortieren wollen, und das Argument decreasing, das angibt, ob die Sortierung absteigend (TRUE) oder aufsteigend (FALSE) erfolgen soll.

FĂŒgen Sie das Objekt, in dem Sie die Tabelle gespeichert haben, in die Funktion sort() ein, geben Sie an, ob Sie eine absteigende oder aufsteigende HĂ€ufigkeit wĂŒnschen, und fĂŒhren Sie den Code aus.

Um eine einfache AuszÀhlung mit einer Variable in Prozent anzeigen zu lassen, verwenden wir die Funktion prop.table(). prop.table() benötigt in diesem Fall einen Input: die Tabelle, die wir umwandeln wollen.

Ersetzen Sie sort() durch prop.table() und entfernen Sie ggf. das Argument decreasing. FĂŒhren Sie den Code erneut aus.

Die Ausgabe zeigt nun die AusprĂ€gungen der Variablen und ihre Anteile. Die vielen Nachkommastellen sind nicht sehr ĂŒbersichtlich. Wir können die Tabelle mit der Funktion round() auf zwei Nachkommastellen runden. round() benötigt zwei Argumente: die Werte, die wir runden wollen, und das Argument digits, das angibt, auf wie viele Nachkommastellen gerundet werden soll.

Um in R mehrere Funktionen nacheinander auf ein Objekt anzuwenden, können wir den Pipe-Operator |> verwenden. Der Pipe-Operator gibt die Ausgabe einer Funktion an die nĂ€chste Funktion weiter, wo diese in der Regel als erstes Argument verwendet wird. Dadurch entsteht recht gut lesbarer Code, da |> als “und dann” gelesen werden kann.

FĂŒgen Sie |> round(digits = 2) zum Befehl in der Konsole hinzu und fĂŒhren Sie den Code erneut aus.

Wir können auch mehrere Funktionen mit dem Pipe-Operator verketten. FĂŒgen Sie |> sort(decreasing = TRUE) zum Befehl in der Konsole hinzu und fĂŒhren Sie den Code erneut aus, um die Tabelle in relativen HĂ€ufigkeiten nach absteigender HĂ€ufigkeit zu sortieren. Mit |> können wir ĂŒbrigens Befehle ĂŒber mehrere Zeilen verteilen, was der Lesbarkeit zugute kommt.

Schließlich können wir die Tabelle auch direkt als Diagramm darstellen. Wenn wir die sortierte Tabelle mit Prozentwerten als Balkendiagramm darstellen wollen, können wir einfach die Funktion barplot() mit einem weiteren Pipe-Operator anhĂ€ngen.

FĂŒgen Sie |> barplot() zum Befehl in der Konsole hinzu und entfernen Sie die Zeile round(digits = 2) |>, da die Werte fĂŒr die grafische Darstellung nicht gerundet sein sollen. FĂŒhren Sie dann den Code erneut aus.

Zwei Variablen auszÀhlen: Kreuztabelle

Um die Verteilung der AusprÀgungen eine Variable in den durch eine zweite Variable gebildeten Gruppen zu untersuchen, erstellen wir eine Kreuztabelle. Dazu verwenden wir die Funktion table() erneut, diesmal mit zwei Variablen.

Es ist ĂŒblich, die abhĂ€ngige Variable in den Zeilen und die unabhĂ€ngige Variable in den Spalten der Tabelle anzuordnen. Dazu fĂŒgen wir zuerst die abhĂ€ngige, dann die unabhĂ€ngige Variable in die Funktion table() ein. Wir wollen die Kreuztabelle wieder in einem Objekt speichern.

FĂŒgen Sie die Namen der abhĂ€ngigen und unabhĂ€ngigen Variablen in die Funktion table() ein und wĂ€hlen Sie einen geeigneten Namen fĂŒr das Objekt. Schreiben Sie den Objektnamen nochmals in Zeile 2. FĂŒhren Sie dann den Code aus.

Wir sehen nun die Verteilung der abhĂ€ngigen Variable in den Gruppen der unabhĂ€ngigen Variable in absoluten HĂ€ufigkeiten. Falls die Vergleichsgruppen nicht gleich groß sind, ist das wenig informativ. Mit der Funktion prop.table() können wir wieder relative HĂ€ufigkeiten zeigen. In einer Kreuztabelle mĂŒssen wir mit dem Argument margin angeben, ob wir Zeilen- oder Spaltenprozente berechnen wollen. margin = 1 berechnet die Zeilenprozente, margin = 2 die Spaltenprozente. Wenn die unabhĂ€ngige Variable wie ĂŒblich in den Spalten steht, berechnen wir Spaltenprozente.

FĂŒgen Sie |> prop.table(margin = 2) zum Befehl in der Konsole hinzu und fĂŒhren Sie den Code erneut aus. Um die Ergebnisse ĂŒbersichtlicher zu gestalten, können Sie danach zusĂ€tzlich |> round(digits = 2) ergĂ€nzen.

Um die Kreuztabelle mit relativen HĂ€ufigkeiten zu visualisieren, können wir wieder |> barplot() anhĂ€ngen. Entfernen Sie das Runden und fĂŒhren Sie dann den Code erneut aus.

Einige nĂŒtzliche Optionen fĂŒr das Balkendiagramm:

  • legend = TRUE fĂŒgt eine Legende hinzu.
  • Damit die Legend nicht ĂŒber die Balken gelegt wird, können wir mit xlim = c(0, XXX) rechts Platz schaffen.
  • Mit col = c("red", "green", "blue") (oder anderen Farben) können wir die Balken einfĂ€rben.
  • Mit beside = TRUE können wir die Balken nebeneinander statt ĂŒbereinander darstellen.
  • las = 2 dreht die Beschriftung der x-Achse um 90 Grad.
  • cex.names = 0.8 verkleinert die Beschriftung der Balken.

Allgemein ist das Anpassen von Grafiken mit base R etwas gewöhnungsbedĂŒrftig. Mit Internet- oder KI-UnterstĂŒtzung findet man aber in der Regel irgendwann die richtigen Optionen. Eine mĂ€chtige Alternative ist das Paket ggplot2, das ich sehr empfehle, hier aber den Rahmen sprengen wĂŒrde. Sie können sich hier einlesen: ggplot2: Elegant Graphics for Data Analysis.

\(\chi^2\)-Test

Mit dem \(\chi^2\)-Test können wir prĂŒfen, ob die Verteilung der abhĂ€ngigen Variable in den Gruppen der unabhĂ€ngigen Variable signifikant voneinander abweicht. Der \(\chi^2\)-Test wird mit der Funktion chisq.test() durchgefĂŒhrt, die auf das Objekt angewendet wird, in das wir die Kreuztabelle gespeichert haben.

FĂŒgen Sie den Namen des Objekts, in dem Sie die Kreuztabelle gespeichert haben, in die Funktion chisq.test() ein und fĂŒhren Sie den Code aus.

Der \(\chi^2\)-Test gibt die Teststatistik, die Freiheitsgrade und den daraus abgeleiteten p-Wert aus.

Zusatz: FĂ€lle ausschließen und Teilstichproben auswĂ€hlen

AG 5 hat eine Kriterien definiert, nach denen entschieden wird, ob ein Kommentar ĂŒberhaupt analysiert werden soll. Dazu muss der Tweet “suitable” sein (nach Variable VA01_value) und “pro Biden” oder “pro Trump” Stellung beziehen (nach Variable VA02_value). Die anderen Arbeitsgruppen wollen möglicherweise ebenfalls nur bestimmte FĂ€lle analysieren.

Dazu können wir die Funktion subset() verwenden. subset() akteptiert drei Argumente:

  • x: den Datensatz, den wir filtern wollen,
  • subset: den Filter fĂŒr die Zeilen (hier: Kommentare),
  • select: den Filter fĂŒr die Spalten (hier: Kategorien).

Um den Filter von AG 5 anzuwenden, muss VA01_value gleich "suitable" und die Variable VA02_value nicht gleich "Others" sein. Wir speichern den bereinigten Datensatz in einem neuen Objekt.

GebrĂ€uchliche logische Operatoren fĂŒr die Auswahl von FĂ€llen sind: == (gleich), != (ungleich), > (grĂ¶ĂŸer), < (kleiner), >= (grĂ¶ĂŸer oder gleich), <= (kleiner oder gleich). Mit & (und) und | (oder) können mehrere Bedingungen verknĂŒpft werden.

ZusÀtzliche Konsole