Dieses Lehrskript möchte eine Einführung in die Anwendung statistischer Verfahren zur Auswertung von empirischen Daten mithilfe der Programmiersprache R bieten. Es bezieht sich direkt auf die Inhalte des Moduls BASOZ 33 Statistik und enthält darüber hinaus auch grundlegende Informationen für das Modul BASOZ 31c Quantitative Methoden der empirischen Sozialforschung im B.A. Soziologie. Das Skript hat den Anspruch, die Lehr- und Lerninhalte kurz und prägnant wiederzugeben und ihre Anwendung mithilfe von R verständlich zu machen – dafür fokussiert es auf die kurze Erklärung zentraler Begriffe, auf die Darstellung der Umsetzung in R und auf Anwendungsbeispiele. Es bietet einen Einstieg in die Statistik mit R und RStudio, behandelt die Thematik jedoch nicht in aller Tiefe bzw. Ausführlichkeit.
Als kompaktes Lehrmaterial ergänzt das Skript die für BASOZ 33
Statistik vorgesehenen Lehrbücher:
Moderne Datenanalyse mit R von Sebastian Sauer, das in
der 1. Auflage
hier
heruntergeladen werden kann (bei Zugriff über die Thüringer
Universitäts- und Landesbibliothek (ThULB) Jena) und
Statistik. Eine interdisziplinäre Einführung mit interaktiven Elementen von Hans-Joachim Mittag und Katharina Schüller, das in der 7. Auflage hier (ebenso bei Zugriff über die ThULB) heruntergeladen werden kann.
Im Lehrskript führen direkte Verweise zu den entsprechenden
Lehrbuchkapiteln, in denen die Inhalte i. d. R. ausführlicher und mit
weiteren Beispielen erläutert werden. Das Lehrskript möchte den Einstieg
in das Verständnis von R und die Arbeit mit R erleichtern und dient als
„Brücke“ für den Übergang zu den ausführlichen Abhandlungen im Lehrbuch.
Weitere nützliche Materialien, die z. T. weitere Beschreibungen und/oder
andere Schwerpunktthemen bieten, sind
das digitale Lehrbuch R für empirische Wissenschaften
(kurz: remp) von Jan Philipp Nolte, das
hier
zu finden ist
oder das ILMES (Internet-Lexikon der Methoden der empirischen Sozialforschung), das hier abrufbar ist.
Das Lehrskript vermittelt wesentliche Kenntnisse zur Ausführung von statistischer Datenanalyse mithilfe der Programmiersprache R und der Benutzer*innenoberfläche RStudio. Da das Lehrskript als sogenanntes RNotebook aufgebaut ist, können alle vorgestellten R-Anwendungen direkt innerhalb des Skriptes nachvollzogen werden. Dies ist möglich, weil Codeblöcke den RCode, aber auch den dazugehörigen Output darstellen.
Das Lehrskript arbeitet mit zwei Datensätzen. Der erste basiert auf Daten der PISA-Erhebung im Jahre 2022 und wird auf Moodle bereitgestellt. Der zweite Datensatz ist ein sogenannter fiktiver Datensatz zum Gender-Pay-Gap. Ein Exkurs mit Informationen zu den Datensätzen findet im Kapitel 2.9.2 statt.
Das Lehrskript gliedert sich in mehrere Themenblöcke, die in Teilen aufeinander aufbauen. Im Fokus des 2. Kapitels stehen die Grundlagen im Umgang mit R und RStudio. Es werden die Schritte zur Installation des Programmes, der Aufbau der Benutzer*innenoberfläche sowie die grundlegende Struktur des Programmiersprache R vermittelt. Kapitel 3 thematisiert die Grundlagen und Verfahren der deskriptiven Statistik. Dies umfasst sowohl Kenntnisse zur Beschreibung der Verteilung von Daten und zur Erfassung von Zusammenhängen innerhalb von Daten als auch die Möglichkeiten der Darstellung dieser. Darauf aufbauend blickt Kapitel 4 Von Daten zu Erkenntnissen: Kreuztabellen als Analysewerkzeug und zielt stark auf das Verständnis und die Analyse des Zusammenhanges zweier Variablen ab. Kapitel 5 hat die Grundlagen der Regression zum Inhalt. Im Kapitel wird kurz die Regression als statistische Methode zur Modellierung von Zusammenhängen vorgestellt, um anschließend ihre Anwendung mit R zu erläutern. Daran knüpft Kapitel 6 Von Daten zu Erkenntnissen: Regressionstabellen als Analysewerkzeug an, indem es auf Anwendung, Verständnis und Interpretation eines Regressionsbeispiels fokussiert.
Dieses Kapitel zielt darauf ab, Grundlagen des Einstiegs und Umgangs mit R und RStudio zu vermitteln. Die Inhalte bilden beim ersten Kontakt mit R die notwendige Voraussetzung, um die folgenden Kapitel gut verstehen und die vorgestellten statistischen Verfahren in R anwenden zu können. Es befähigt dazu, sowohl die in den folgenden Kapiteln aufgeführten Inhalte zu verstehen als auch eigenständig Befehle und Funktionen in RStudio auszuführen.
Dafür wird zunächst erläutert, worum es sich bei der Programmiersprache R und dem Programm RStudio (Kapitel 2.1) handelt und wie beide Anwendungen auf eigenen Rechnern installiert werden können (Kapitel 2.2). Im Anschluss werden der Aufbau der Benutzer*innenoberfläche (Kapitel 2.3) und die Grundlagen der Programmiersprache R mit Syntax, Operatoren, Funktionen und Packages erklärt (Kapitel 2.4). Dies wird ergänzt durch weiterführende Hinweise zur Nutzung der Help-Funktion (Kapitel 2.5) und zu Packages zur Funktionenerweiterung von R (Kapitel 2.6). Im Anschluss widmen wir uns der Zuweisung von Werten zu Variablen (Kapitel 2.7) und der Unterscheidung von Datentypen in RStudio (Kapitel 2.8), um darauf aufbauend auf den Umgang mit Datensätzen in RStudio (Kapitel 2.9 und 2.10) einzugehen.
R ist eine Programmiersprache, die u. a. gut für die statistische Datenanalyse und grafische Darstellung von Daten geeignet ist. Als Open-Source-Software ist R kostenfrei zugänglich, was sich in der weit verbreiteten Nutzung von R in Forschung und Lehre wiederspiegelt. RStudio ist die grafische Benutzer*innenoberfläche bzw. die sogenannte Entwicklungsumgebung, über welche die Programmiersprache R ausgeführt werden kann. Für Interessierte: Das Lehrbuch Moderne Datenanalyse mit R bietet im Kapitel 2 Hallo, R spannende Einblicke in die Geschichte von R.
Wann immer RStudio gestartet wird, startet R automatisch im Hintergrund. RStudio wird mithilfe von Befehlen in Form von Funktionen bedient. Der sogenannte Code, der dadurch entsteht, wird als Skript (bzw. im Englischen script) bezeichnet. In RStudio können entsprechende Skripte erstellt und dokumentiert bzw. gespeichert werden. Dies ermöglicht jederzeit auf den bisherigen Code sowie Zwischenergebnisse der Datenanalyse (z. B. Berechnungen) zuzugreifen, diese weiterzuverwenden und den bisherigen Code weiterzuführen. R bzw. RStudio verfügt in der sogenannten Base-Version über einen Grundumfang an Funktionen. Dieser Funktionsumfang lässt sich durch sogenannte packages, die in der RStudio Benutzer*innenoberfläche heruntergeladen und installiert werden können (Kapitel 2.7), erweitern. Um den Ausführungen des Lehrskripts folgen und selbst RStudio bedienen zu können, ist es wichtig, sich alle genannten Begriffe, die in den nächsten Kapiteln noch näher erklärt werden, gut einzuprägen.
Die Installationsdatei für R kann hier heruntergeladen werden, indem im ersten „Kasten“ mit dem Titel „Download and Install R“ der für das eigene Betriebssystem passende Link (Linux/macOS/Windows) ausgewählt und anschließend die Installationsdatei heruntergeladen wird (Hinweis: für Windows wird die „base“-Version empfohlen, bei macOS ist das Alter des Gerätes entscheidend). Das Online-Lehrbuch von Nolte bietet hier weiterführende Hinweise zur Installation von R, aber auch RStudio.
Die Installationsdatei für RStudio kann hier heruntergeladen werden. Es handelt sich hierbei um die kostenfreie RStudio-Desktop Version, die für den universitären Gebrauch ausreicht. Unter der Überschrift „All Installers and Tarballs“ kann die für das eigene Betriebssystem passende Installationsdatei heruntergeladen werden.
Um RStudio nutzen zu können, muss zwingend R im Vorfeld installiert werden. Sobald beide Programme erfolgreich auf Ihrem Rechner installiert sind, genügt es in Zukunft RStudio zu öffnen – R wird dann im Hintergrund automatisch ausgeführt.
Nach dem Öffnen von RStudio (über das Desktop-Symbol oder in den Programmen des Endgerätes) oder ggfls. dem Login auf den R-Server gelangen Sie in die Benutzer*innenoberfläche von RStudio. Die Abbildung 1 zeigt den Workspace von RStudio bei erstmaligem Öffnen des Programms, der sich in verschiedene Abschnitte bzw. Fenster gliedert. Links befindet sich die Console (rote Markierung), rechts oben das Environment (blaue Markierung) und darunter einen Abschnitt mit mehreren Reitern, der im Folgenden Informationspace (gelbe Markierung) genannt wird.
Bei erstmaligem Öffnen von RStudio fehlt für die Arbeit in
RStudio noch das Script-Fenster. Um dieses hinzuzufügen, klicken Sie
oben links auf das grün hinterlegte Kreuz vor einem weißen Quadrat und
wählen im Dropdown-Menü RScript aus (Abbildung 2). Ihre
Benutzer*innenoberfläche enthält nun vier Fenster unterschiedlicher
Größe (Abbildung 3).
Im RScript werden die auszuführenden Befehle zeilenweise als
Code niedergeschrieben und so dokumentiert. Es können mehrere Scripte
nebeneinander geöffnet werden. Im Script geschriebene Befehle werden
über die Tastenkombination Strg+Enter (bei Windows) und Command+Enter
(bei macOS) ausgeführt, d. h. „an die „Console gesendet“.
Ausgeführte Befehle werden in der Console ggfls. zusammen mit dem Ergebnis des Befehls angezeigt. Grundsätzlich ist es möglich, Befehle auch direkt in der Console zu schreiben und auszuführen. Entsprechende Befehle sind jedoch nicht Teil des Scripts und damit nicht dauerhaft dokumentiert. Es wird daher empfohlen Befehle immer über das Script auszuführen.
Im Environment werden die Datensätze, die Sie einlesen, erstellen und bearbeiten (Kapitel 2.9), angezeigt. Auch Zwischenergebnisse von ausgeführten Berechnungen können gezielt im Environment hinterlegt werden, um später auf diese zugreifen und mit ihnen weiterarbeiten zu können.
Der Informationspace enthält verschiedene hilfreiche Reiter, zwischen denen gewechselt werden kann. Im Help-Reiter können über die Suchfunktion (Lupe) Erklärungen zu einzelnen Befehlen und deren Aufbau aufgerufen werden. Im Plots-Reiter werden von Ihnen mittels Befehlen generierte Grafiken und Darstellungen angezeigt. Der Packages-Reiter gibt Auskunft über installierte Packages und darüber ob diese für die Verwendung aktiviert sind. Zudem können weitere Packages in diesem Fenster installiert werden.
Um den Ausführungen des Lehrskript zu folgen und selbst den Umgang mit RStudio zu erproben, ist es wichtig, dass Sie sich die Bezeichnungen der Abschnitte/Fenster einprägen.
Was in einem RScript niedergeschrieben wird, wird als Code bezeichnet. Code besteht aus Befehlen und Kommentaren. Befehle sind Anweisungen, die in einer bestimmten Schreibweise und Sprache (Syntax) formuliert werden und die von R ausführt werden können. R unterscheidet zwischen Groß- und Kleinschreibung, deswegen ist es sinnvoll auf eine einheitliche Schreibweise zu achten. Befehle können beispielsweise einfache Rechenoperationen oder auch komplexe Funktionen sein. Kommentare können dem Script hinzugefügt werden, um dieses zu strukturieren (Überschriften und Unterüberschriften) und um Befehle und/oder deren Ergebnisse zu erläutern. Kommentare werden durch ein Rautezeichen (#) eingeleitet. Im Script werden sie – wenn das Rautezeichen gesetzt ist – durch RStudio automatisch farblich hervorgehoben und nicht in der Console ausgeführt, wenn sie mit dem zugehörigen Befehl an diese übermittelt werden.
Wenn Befehle ausgeführt werden sollen, werden diese i. d. R. im
RScript verfasst und anschließend mittels Strg+Enter ausgeführt, d. h.
an die Console übermittelt. Auf diese Weise können, wie im folgenden
Codeblock deutlich wird, über R auch einfache Rechenoperationen
durchgeführt werden. In der Console kennzeichnet > den ausgeführten
Befehl. Darunter wird das Ergebnis des Befehls ausgegeben, wobei die
Ergebniszeilen in Klammern nummeriert werden (hier: [1]).
Sie werden im Verlauf dieses Lehrskripts und der Arbeit mit R noch
Befehle kennenlernen, die mehr als einzeilige Ergebnisse
produzieren.
2+3
[1] 5
3*4
[1] 12
Die folgende Tabelle fasst grundlegende einfache Rechenoperationen und ihre Schreibweise in R-Syntax zusammen.
| Einfache Rechenoperationen | Eingabe in R |
| Addition | 1+2 |
| Subtraktion | 2-1 |
| Multiplikation | 2*2 |
| Division | 3/2 |
| Potenzieren | 2^3 oder 2**3 |
Weitere Rechenoperationen oder komplexere Befehle werden in R als
Funktionen niedergeschrieben und ausgeführt. Grundlegend folgen
Funktionen folgendem Aufbau: function(x)
Der Ausdruck function steht stellvertretend für die Funktionsbezeichnung, die oft aber nicht immer mit der Operation bzw. den Operationen, die sie ausführt, in Verbindung steht. So zieht beispielsweise die Funktion sqrt die Wurzel (square root) oder mean berechnet einen Mittelwert. Funktionen führen mitunter mehrere Operationen nacheinander aus: Beispielsweise bildet mean zunächst die Summe der vorgesehenen Werte und dividiert diese anschließend durch ihre Anzahl.
Zu einer vollständigen Funktion gehört neben der Funktionsbezeichnung
auch eine Angabe, auf welche Argumente sich diese bezieht. Die Angabe
der Argumente erfolgt nach der Funktionsbezeichnung in Klammern. Eine
Funktion kann auf ein Argument oder mehrere Argumente, beispielsweise
function(x, y, z), angewendet werden.
Der folgende Codeblock zeigt die RSyntax für die beiden bereits
genannten Funktionsbeispiele: sqrt und
mean.
sqrt(9)
[1] 3
mean(c(5,4,6))
[1] 5
Zuerst wurde die Funktion sqrt auf den Wert 9 als Argument angewandt und dementsprechend die Wurzel aus 9 gezogen und 3 als das Ergebnis der Berechnung ausgegeben. Darunter wurde die Funktion mean auf mehrere Argumente angewandt, konkret auf die Werte 5, 4 und 6. Das Ergebnis der Funktion mean, d. h. der Addition dieser drei Argumente und die anschließende Division durch ihre Anzahl, ergibt 5. (Hinweis: Um die Funktion mean auszuführen, müssen die Argumente, über die combine-Funktion zu einem Vektor verbunden werden.)
R verfügt über eine einfach zugängliche Hilfefunktion, über die
Details zu Befehlen aufgerufen werden können. Sollten Sie die korrekte
Syntax eines Befehls nicht (mehr) kennen (z. B. was in einer Klammer
stehen muss oder wo Kommata notwendig sind) können Sie auf die
help-Funktion zurückgreifen. Die Hilfefunktion gibt darüber hinaus auch
Auskunft, unter welchen Bedingungen einzelne Befehle ausgeführt werden
können. Angesteuert wird die Hilfefunktion für einen bestimmten Befehl
über ein ? oder help vor der
Funktionsbzeichnung. Zur Hilfefunktion für sqrt gelangen
Sie also über
?sqrt
oder
help(sqrt)
Es bietet sich an, diese help-Funktion direkt in die Console zu schreiben. Nach der Ausführung werden im Informationspace unter dem Reiter Help die gewünschten Informationen angezeigt.
Soll der Funktionsumfang von R bzw. RStudio erweitert werden, passiert dies in der Regel durch sogenannte Packages. Packages sind Erweiterungen für R, die häufig zusätzliche Funktionen enthalten. Prinzipiell kann jede sachkundige Person R-Packages schreiben und in den „R-Appstore“ oder auf weiteren Portalen wie beispielsweise Github hochladen. R-Packages können von dort kostenfrei heruntergeladen oder direkt in RStudio gesucht und installiert werden. Aufgrund der Vielzahl an existierenden Packages und der Tatsache, dass keine zentrale „Prüfung“ oder „Kontrolle“ von Packages erfolgt, ist es wichtig, bedacht mit ihnen umzugehen. Im Lehrskript finden folgende Packages Verwendung:
Um Packages direkt in RStudio zu installieren, kann man im Reiter
Packages den Button Install nutzen. Alternativ können Sie auch direkt
mittels eines Befehls das gewünschte Package installieren. Dieses
Vorgehen bietet sich an, wenn Sie ein RScript schreiben, um dort die
Installation der notwendigen Packages zu dokumentieren. Der Befehl zur
Installation ist wie folgt aufgebaut:
install.packages("package_name")
Für das Package mit dem Namen tidyverse lautet der
Befehl demnach wie folgt:
install.packages("tidyverse")
Um ein Package schließlich zu verwenden, muss es noch geladen bzw.
gestartet werden. Der Befehl dafür lautet:
library(package_name)
Für das package tidyverse dementsprechend:
library(tidyverse)
Sinngemäß steht dieser Befehl dafür, dass ein installiertes Programm (das Package), das sich in der „Bücherei mit Programmen“ (Library) befindet, nun auch aus dem Schrank genommen, d. h. gestartet wird. Sobald ein Package geladen ist, erscheint ein Haken im Kasten vor dem entsprechenden Package im Packages-Reiter. Wenn beim Versuch eine Funktion auszuführen eine Fehlermeldung in R auftaucht, kann es sinnvoll sein, in einem ersten Schritt zu prüfen, ob das nötige Package installiert und auch anschließend geladen wurde.
Wird RStudio bzw. R geschlossen, werden auch alle geladenen Packages geschlossen. Sie bleiben installiert, müssen bei erneutem Öffnen von RStudio jedoch neu geladen werden.
Folgend finden Sie alle notwendigen Befehle, um die im Lehrskript verwendeten packages zu installieren und zu laden.
install.packages("dplyr")
library(dplyr)
install.packages("gmodels")
library(gmodels)
install.packages("ggplot2")
library(ggplot2)
Es kann von Interesse sein, herauszufinden, welche Befehle in einem
bestimmten Package sind oder auch in welchem Package ein bestimmter
Befehl ist. Eine Liste aller Befehle, die in einem installierten Package
enthalten sind, öffnet sich beim Klick auf den Namen eines Packages im
Packages-Reiter. Wurde ein Package geladen, kann auch über die Hilfe
Einsicht in das Package genommen werden, z. B. für
tidyverse
??tidyverse
Ist der Name eines Befehls bekannt, aber unbekannt, in welchem
Package er zu finden ist, kann der Befehl help.search Abhilfe schaffen.
Für den Befehl ggplot2 würde die Suche wie folgt
lauten:
help.search("ggplot2")
Im Informationspace unter Help werden dann die verschiedenen
Packages, in denen der Befehl enthalten ist, zusammen mit einer kurzen
Beschreibung des jeweiligen Befehls angezeigt. Durch Klicken auf den
unterstrichenen Befehl öffnen sich weitere Informationen zum Befehl und
der entsprechenden Syntax. Manche Befehle sind unter gleichem Namen,
aber mit unterschiedlicher Funktion, in verschiedenen Packages
enthalten, z. B. filter. Hier ist es wichtig, deutlich zu
machen, welcher Befehl genau gemeint ist bzw. aus welchem Package der
Befehl ausgeführt werden soll. R verwendet hierfür eine spezifische
Schreibweise: package-Name::Befehl-Name
Soll also der filter-Befehl aus dem Package dplyr ausgeführt werden,
lautet die Syntax wie folgt: dplyr::filter
Wenn der Befehl bereits geladen wurde, finden Sie das übergeordnete
Package auch über: find("Befehlname") z. B. für den Befehl
ggplot.
find("ggplot")
Bei der Arbeit mit Daten und Datensätzen in R bzw. RStudio sind
Zuweisungen ein wichtiges Grundprinzip. Damit Daten im Environment –
sozusagen dem Arbeitsgedächtnis in RStudio – abgespeichert werden, muss
eine Zuweisung stattfinden. Eine Zuweisung wird in R über den
Zuweisungspfeil (<-) ausgeführt. Über den
Zuweisungspfeil wird das, was links vom Pfeil steht, dem, was rechts vom
Pfeil steht, zugeordnet. Hinter dem Pfeil können verschiedene Datentypen
oder auch Rechenoperationen stehen.
Beispielsweise kann dem Objekt a der Wert 5 zugeordnet
werden oder dem Objekt b das Ergebnis der Rechnung 5*2:
a <- 5
b <- 5*2
Zuweisungen können nicht nur für Zahlen, sondern auch für Buchstaben bzw. Worte durchgeführt werden. Hier ist jedoch darauf zu achten, dass diese in Anführungszeichen zu setzen sind, weil es sich um einen spezifischen Datentypus handelt. Ein Beispielbefehl schaut dann wie folgt aus:
c <- "Frühling"
Wenn a und b als Objekte eine Zuweisung
erhalten haben, dementsprechend im „Arbeitsgedächtnis“ gespeichert
wurden, kann mit diesen Objekten weitergearbeitet werden. Sie können
auch für neue Zuweisungen genutzt werden, beispielsweise indem man sie
für Rechenoperationen nutzt:
d <- a*b
print(d)
[1] 50
Wenn die Befehle für die Zuordnung an die Console übergeben werden,
erscheinen die Objekte a, b, c
und d im Environment, d. h. sie wurden im
„Arbeitsgedächtnis“ gespeichert (Abbildung 4).
In R kann mit verschiedenen Datentypen gearbeitet werden. Dies ist auch notwendig, da Datensätze häufig nicht nur Zahlen enthalten, sondern beispielsweise auch Wörter bzw. Buchstaben. Die einzelnen Datentypen haben spezifische Bezeichnungen in R, welche in der folgenden Tabelle aufgeführt sind.
| Datentyp | Beispiel | Beschreibung |
| Numeric | 2.5, 3.14 | Ganze und reele Zahlen |
| Character | “Frühling”, “Herbst” | Buchstaben oder Zeichenfolgen, Hinweis: immer in Anführungenzeichen |
| Factor | 3427 | Nominal skalierte Zahlenfolge, z. B. eine Personen-ID |
| Double | .3333334 | „floating point value“ |
| Integre | -1, 0, 1 | Ganze Zahlen |
| logical/boolean | TRUE, FALSE | Abfrage von „wahr“ oder „falsch“ |
Mit Daten des Typs numeric, d. h. ganzen und reelen
Zahlen, können Rechenoperationen in R ausgeführt werden. Die
Dezimalstellen nach dem Komma werden in R bzw. RStudio durch einen Punkt
getrennt. Characters sind Buchstaben oder Zeichenfolgen, d.h. häufig
Wörter. In R heben sie sich von anderen Datentypen dadurch ab, dass sie
in Anführungszeichen (beide oben!) geschrieben werden. Dies trifft neben
character-Daten auch auf factor-Daten zu. Diese bestehen zwar aus
Ziffern bzw. Zahlen, sind jedoch nominal skaliert. Mit ihnen sind – wie
auch mit character-Daten keine sinnvollen Rechenoperationen – möglich.
Eine Variable des Datentyps factor kann beispielsweise das Geschlecht
sein. Wenn beispielsweise 0 für „männlich“, 1 für „weiblich“ und 2 für
„divers“ steht, können die Zahlen nicht sinnvoll addiert, subtrahiert,
dividiert oder multipliziert werden, da die Geschlechter, für die sie
stehen nicht addiert, subtrahiert, dividiert oder multipliziert werden
können.
Wenn Sie herausfinden möchten, welchen Datentyp eine Variable hat,
hilft Ihnen die Funktion class() weiter.
class(b)
[1] “numeric”
class(c)
[1] “character”
Datensätze sind das Kernstück angewandter Statistik bzw. quantitativer Methoden der empirischen Sozialforschung. Sie enthalten die (empirisch) erhobenen Daten, aus denen Informationen mittels statistischer Verfahren „herausgelesen“ werden sollen. In RStudio können Datensätze eigens angelegt (Kapitel 2.9.1) oder aber bereits bestehende Datensätze eingelesen werden (Kapitel 2.9.3). Kapitel 2.9.3 befasst sich mit einigen gängigen Dateiformaten, in denen Daten potenziell vorliegen können. Weitere Möglichkeiten des Datenimports finden Sie im Lehrbuch von Sauer im Kapitel 6 Datenimport und -export.
Eine in R sehr wichtige Datenstruktur sind sogenannte Vektoren.
Vektoren bündeln Elemente eines Datentyps in einer geordneten
Reihenfolge. Erstellt werden Vektoren mit dem Befehl c(),
wobei c für „combine“ steht. Im Codeblock wird für die Beispielvektoren
x und jahreszeiten deutlich, dass die
einzelnen Elemente, die in einem Vektor gebündelt werden sollen, durch
Kommata getrennt werden. Im Environment werden Informationen über die
erstellten Vektoren angegeben: x enthält Elemente des
Datentyps numeric (num), jahreszeiten des
Datentyps character (chr). Der Typ des Vektors
entspricht dem Datentyp der enthaltenen Elemente. x enthält
fünf Elemente [1:5], jahreszeiten vier
Elemente [1:4] (Abbildung 5).
x <- c(2,4,6,8,10)
jahreszeiten <- c("Frühling","Sommer","Herbst","Winter")
Die für einen Datensatz typische Struktur aus Spalten und Zeilen
entsteht, wenn mehrere Vektoren miteinander verbunden werden. Diese
Struktur wird auch als Matrix (Plural: Matrizen) bezeichnet und ist im
Gegensatz zu den eindimensionalen Vektoren mehrdimensional. Die
Verbindung der Vektoren zu einer Matrix gelingt über den Befehl
cbind(), in dem c hier für „column“ steht. Es werden also
Spalten zusammengebunden.
Im folgenden Codeblock werden die Vektoren x und
jahreszeiten zu einer Datenmatrix verknüpft. Auffällig ist
die in der Console angezeigte Fehlermeldung, die auftritt, weil die
Anzahl der Elemente von x und jahreszeiten
voneinander abweicht. Da jahreszeiten nur 4 Elemente hat,
x jedoch 5 Elemente besitzt, kann nicht für jedes Element
von x auch ein Element von jahreszeiten
zugeordnet werden. Die erstellte Datenmatrix erscheint, wie in Abbildung
6 deutlich wird, nun auch unter Data im Environment über den Values
(Vektoren).
data <- cbind(x,jahreszeiten)
## Warning in cbind(x, jahreszeiten): number of rows of result is not a multiple
## of vector length (arg 2)
Die in einer Datenmatrix enthaltenen Daten können über den
Befehl View() eingesehen werden. Achtung: View muss hier
großgeschrieben werden, damit der Befehl funktioniert.
View(data)
Wird die Datenmatrix über den View-Befehl aufgerufen,
öffnet sich im Script-Feld ein neuer Reiter mit dem Namen des
Datensatzes (Abbildung 7). In der erzeugten Datenmatrix wird deutlich,
dass dem Element 10 aus dem Datenvektor x das
Element Frühling aus dem Datenvektor
jahreszeiten zugeordnet wurde. Grund dafür ist die, bereits
durch die Fehlermeldung deutlich gewordene, unterschiedliche Anzahl der
Elemente der beiden Vektoren. Es ist daher wichtig, darauf zu achten,
dass nur Vektoren mit einer gleichen Anzahl an Elementen miteinander
verbunden werden.
Sofern einzelne Elemente in einem Vektor fehlen, z. B. weil in einem
Fragebogen keine Antwort gegeben wurde, kann dieses fehlende Element
durch NA (not applicable, deutsch: nicht anwendbar)
gekennzeichnet werden. Im folgenden Codeblock wird dies für das fehlende
Element in jahreszeiten vorgenommen. Anschließend muss der
überschriebene jahreszeiten-Vektor erneut mit
x zur Datenmatrix data verbunden werden. Die
Fehlermeldung bleibt nun aus und im environment ist durch
[1:5] erkenntlich, dass jahreszeiten nun 5
Elemente enthält.
jahreszeiten <- c("Frühling","Sommer","Herbst","Winter", NA)
data <- cbind(x,jahreszeiten)
Enthält eine Datenmatrix fehlende Elemente, die mit NA gekennzeichnet
wurden, wird dies auch bildlich verdeutlicht, indem NA
ausgegraut wird (Abbildung 8). Es ist besonders wichtig, fehlende Werte
als solche zu kennzeichnen, damit diese in späteren Operationen mit den
Daten als solche erkannt und beispielsweise nicht in
Ergebnisberechnungen einbezogen werden.
Verstanden zu haben, wie Datensätze in R angelegt werden, hilft
dabei, mit bereits bestehenden Datensätzen, die in R eingelesen werden
sollen, umzugehen. Diese Aufgabe wird Ihnen vermutlich häufiger
begegnen, als das Erzeugen von Datensätzen innerhalb von R. Im Folgenden
wird kurz der Beispieldatensatz, der für die in den nächsten Kapiteln
beschriebenen Inhalte und Vorgänge genutzt wird, vorgestellt.
Pisa 2022-Datensatz
PISA steht als Akronym für Programme for International Student Assessment (auf Deutsch in etwa: Programm für Internationale Schüler*innenbewertung). Seit 2000 misst dieser internationale Schulleistungstest Kompetenzen von 15-Jährigen Schüler*innen in den Bereichen Lesen, Naturwissenschaft und Mathematik, um u. a. Aussagen über die Qualität des Bildungswesens eines Staates im internationalen Vergleich zu erhalten. Die Datenerhebung findet alle 3 Jahre statt und erfolgt wechselnd mit einem besonderen Fokus auf eine der drei Kompetenzen. Im Jahr 2022 lag der Schwerpunkt auf der Erfassung der Mathematikkompetenzen (Lewalter et al., 2023).
Seit 2015 führen Schüler*innen per Stichprobenauswahl festgelegter Schulen eine kognitive, computerbasierte Testung sowie einen Onlinefragebogen aus. Daneben füllen – ebenfalls online – sowohl Schulleitungen als auch Lehrkräfte einen angepassten Kontextfragebogen aus. Die Datenerhebung startete papierbasiert in 2000. Heute erfolgt jedoch nur noch die Erfassung des Elternfragebogens in Papierform (Lewalter et al., 2023).
Für das vorliegende Lehrskript wurden ein eigens vorgesehener Datensatz aus in Deutschland erhobenen PISA 2022-Daten erstellt. Dieser ist geeignet, einen ersten Eindruck vom Aufbau und der Struktur von Datensätzen zu vermitteln. Für den Lehrskript-Datensatz wurden originale PISA-Daten imputiert, d.h. mittels statistischer Verfahren wurden fehlende Daten wie beispielsweise Antwortausfälle durch plausible Werte ersetzt und der Datensatz damit vervollständigt.
Fiktiver Gender-Pay-Gap-Datensatz
Kapitel 4 und 5 dieses Lehrskriptes arbeiten mit einem weiteren Datensatz, der fiktive Daten zum Gender-Pay-Gap enthält. Der Gender-Pay-Gap bezeichnet den durchschnittlichen Einkommensunterschied zwischen Männern und Frauen, wobei Frauen im Durchschnitt weniger verdienen. Der unbereinigte Gender-Pay-Gap bezeichnet den durchschnittlichen Lohnunterschied zwischen Männern und Frauen. Die Berechnungsgrundlage wird oft auf Basis des Brutto-Stundenlohnes berechnet.
Der fiktive Datensatz kann unter diesem Link abgerufen werden. Dieser Datensatz beinhaltet eine fiktive Stichprobe, fiktiv meint, dass die Variablen keine realen Werte beinhalten und somit nicht der Realität entsprechen. Es werden nur vollzeitarbeitende Frauen und Männer abgebildet. Insgesamt umfasst der Datensatz 400 Fälle mit Informationen zu Geschlecht, Schulabschluss, Hochschulabschluss, Alter, dem Einkommen, sowie Informationen, ob die Person in einem frauen- oder männerdominierten Berufsfeld arbeitet. Im Datensatz gibt es keine fehlenden Werte.
Soll ein Datensatz in RStudio eingelesen werden, wird dringend empfohlen, RStudio angemessen „darauf vorzubereiten“. Dies passiert, indem ein sogenanntes working directory angelegt wird. Das working directory ist der Ordner auf Ihrem Rechner, in dem sich der Datensatz befindet.
Daten über das Environment in R importieren
Über das Menü im environment und das Icon Import können in RStudio Daten der gängigsten Formate (Text, Excel, SPSS, …) importiert werden (Abbildung 9). Werden Daten auf diesem Weg mittels der RStudio-Oberfläche importiert, laufen im Hintergrund trotzdem Befehle, teilweise unter Nutzung verschiedener packages ab. Sind diese nicht bereits installiert, fragt RStudio, ob eine Installation stattfinden soll.
CSV-Dateien importieren
Ein weiteres gebräuchliches Format für Daten ist CSV. Die Abkürzung steht für comma separed values. Im Sinne des Namens handelt es sich um ein Textdokument (.txt) in dem Daten (values) durch Komma getrennt aufgelistet sind. Die Daten können ebenfalls über das Menü im environment importiert werden. Besondere Aufmerksamkeit ist nur geboten, weil RStudio an der amerikanischen Schreibweise orientiert ist: Komma als Spaltentrennung und Punkt als Dezimaltrennzeichen. Deutsch formatierte CSV-Dateien nutzen jedoch das Semikolon (Strichpunkt) als Spaltentrennung und das Komma als Dezimaltrennzeichen. Dementsprechend braucht RStudio bei der deutschen Schreibweise spezifizierte Befehle, um die Daten richtig zu importieren.
Daten im R-Format importieren
Noch einfacher als der Import anderer Dateiformate über die
RStudio-Oberfläche erfolgt das Laden von Daten im R-Format. Dateien
dieses Formates haben die Endungen .rda oder .RData. Diese Dateien
können direkt über das Menü mittels File > Open File…
geöffnet werden. Von RStudio wird dann der Befehl load()
ausgeführt, wobei in Klammern der Dateiname inkl. Endung steht.
Es empfiehlt sich, den load-Befehl direkt in das RSkript aufzunehmen. Der nötige Dateipfad zum Finden des Datensatzes auf dem eigenen Rechner wird, wie der folgende Code-Chunk für den Pisa-Datensatz zeigt, in Klammern angegeben.
load("Daten/data/pisa2022.RData")
Pisa2022-Datensatz einlesen und umbenennen
Der Pisa-Datensatz liegt im Format .RData im Moodle-Kurs. Er muss von
dort heruntergeladen und anschließend in RStudio, wie im vorherigen
Absatz beschrieben, importiert werden. Wenn der Datensatz importiert
wird, wird er zunächst unter dem Namen dataComplete im
Environment angezeigt. Um ihm einen verständlicheren Namen zu geben und
dataComplete wieder aus dem Environment zu entfernen,
werden nacheinander folgende Befehle ausgeführt:
pisa2022 <- dataComplete #erzeugt einen Datensatz mit dem Objektnamen pisa2022, der identisch mit dem Datensatz dataComplete ist.
rm(dataComplete) #hiermit löschen wir den Datensatz dataComplete aus dem Environment, da wir mit pisa2022 arbeiten.
Bevor mittels statistischer Verfahren und Methoden Informationen aus
dem geladenen Datensatz gewonnen werden können, muss dieser häufig erst
für die Analyse vorbereitet bzw. aufbereitet werden. Hilfreiche
Funktionen zum Aufbereiten eines Datensatzes enthalten die packages
tidyverse und dplyr. Tidyverse
enthält selbst mehrere packages, u. a. dplyr, deswegen
genügt es tidyverse zu installieren und zu laden, um auch auf
dplyr zugreifen zu können.
Es gibt zahlreiche Gründe, die eine Aufbereitung von Datensätzen nötig machen. Einige auf den PISA-Datensatz bezogene Anwendungen für die Aufbereitung sind beispielsweise:
Filtern: Der vollständige PISA-Datensatz enthält die Daten aller
teilnehmenden Länder. Möchte man beispielsweise nur mit den Daten der
Schüler*innen aus Deutschland arbeiten, muss der Datensatz gefiltert
werden. Um dies zu erreichen, werden aus dem internationalen Datensatz
nur diejenigen Schüler*innen als Teilmenge herausgenommen – d.h.
gefiltert –, die in Deutschland zur Schule gehen.
Selektieren: Der vollständige PISA-Datensatz enthält mehrere
hundert Variablen, d.h. mehrere hundert Spalten. Wenn einige dieser
Variablen für die eigene Untersuchung nicht benötigt werden, kann man
die gewünschten Variablen, d. h. Spalten selektieren und erhält so einen
weitaus übersichtlicheren Datensatz.
Sortieren: Für manche Analysen kann es notwendig sein, die
einzelnen Daten im Datensatz zu sortieren: Beispielsweise wenn man die
Schüler*innen im Datensatz entsprechend ihrer Mathematikkompetenzen
auflisten möchte, sodass am Anfang des Datensatzes der*die Schüler*in
mit den geringsten und am Ende der*die Schüler*in mit den höchsten
Kompetenzen steht.
Gruppieren: Bestimmte Teilgruppen eines Datensatzes einzeln zu
analysieren oder miteinander zu vergleichen, ist möglich, indem ein
Datensatz gruppiert wird. Beim PISA-Datensatz kann es beispielsweise
interessant sein, separat auf Schülerinnen und Schüler zu blicken und
einen Geschlechtervergleich anzustellen.
Für alle genannten Arten der Aufbereitung gibt es spezifische
Funktionen in dplyr, die im Folgenden nach einem kurzen
Exkurs zum dplyr-package kurz vorgestellt werden.
Das dplyr-package findet in der quantitativen
empirischen Sozialforschung breite Anwendung. Ein wesentlicher Grund
dafür sind die Möglichkeiten der sogenannten „Datenmanipulation“, die
das package bietet. Datenmanipulation meint keine böswillige
Manipulation, sondern u. a. die auch im folgenden beschriebene
Aufbereitung von Datensätzen nach den jeweiligen Bedürfnissen der
Forscher*innen, um ihre Forschungsfragen gut erforschen und beantworten
zu können.
Das dplyr-package arbeitet mit dem sogenannten
Pipe-Operator %>% oder |> (beide
Zeichenfolgen machen dasselbe). Die Pipe (dt. Pfeife) ist eine
Zeichenkombination, die ermöglicht, mehrere einzelne Befehlsschritte
nacheinander auszuführen. Dabei bleiben die Schritte nachvollziehbar und
der Code gut lesbar. Erklärungen zum Verständnis und der Anwendung der
Pipe finden sich bei Nolte im
Kapitel
6.1 und bei Sauer im
Kapitel
7.3 Die Pfeife.
Für das erste Kennenlernen von R reicht häufig der
Standardbefehlsumfang von R aus. Konkrete Forschungsvorhaben und -fragen
erfordern jedoch nicht selten Spezifizierungen im Code, für die
dplyr häufig eine Möglichkeit bietet.
Der das Lehrskript begleitende Beispieldatensatz ist bereits ein aus dem internationalen PISA-Datensatz gefilterter Datenausschnitt. Er beinhaltet nur Daten von Schüler*innen, die in Deutschland zur Schule gehen. Nichtsdestotrotz kann aus dem Beispieldatensatz noch einmal eine Teilmenge an Daten herausgefiltert werden. Beispielsweise kann ein Unterdatensatz nur für Schüler*innen ohne akademische Bildungsherkunft gewünscht werden, um gezielt diese Gruppe an Schüler*innen weiter zu untersuchen.
Im package dplyr steht die Funktion
filter() zur Verfügung, um einen solchen
Teilmengenzuschnitt zu erreichen. Zuerst müssen wir dplyr
öffnen, sofern es schon installiert wurde.Auf unsere Teilmenge der
Schüler*innen ohne akademische Bildungsherkunft bezogen lautet der
filter-Befehl dann:
library(dplyr)
## Warning: Paket 'dplyr' wurde unter R Version 4.5.3 erstellt
##
## Attache Paket: 'dplyr'
## Die folgenden Objekte sind maskiert von 'package:stats':
##
## filter, lag
## Die folgenden Objekte sind maskiert von 'package:base':
##
## intersect, setdiff, setequal, union
df_nichtakademisch <- pisa2022 %>%
filter(bild_herk == "nichtakademische Bildungsherkunft")
Durch die Zuweisung des ausgeführten filter-Befehls wird
ein neuer Dataframe (d. h. ein Datensatz in Tabellenform mit Zeilen und
Spalten) unter dem Namen df_nichtakademisch im environment
hinzugefügt. Dieser Teilmengenzuschnitt enthält nur noch die 3.661
Schüler*innen mit nichtakademischer Bildungsherkunft (Abbildung 10).
Während filter() die einzelnen Zeilen, also im
Beispieldatensatz die einzelnen Schülerinnen mit ihren jeweiligen Daten
anspricht, bezieht sich select() auf die Spalten des
Datensatzes. Es können also einzelne Variablen für alle befragten und
geprüften Schüler*innen aus dem Datensatz selektiert werden.
Soll beispielsweise ein schlanker Dataframe erstellt werden, der nur die Schüler*innen-ID und die Mathematik-, Lese- und naturwissenschaftlichen Kompetenzen der jeweiligen Schüler*innen enthält, wird dies mit folgendem Befehl erreicht:
df_kompetenzen <- pisa2022 %>%
select(sus_id, mathekomp, lesekomp, naturkomp)
Im neu entstandenen Dataframe sind weiterhin alle 6.116 Schüler*innen enthalten, allerdings nur deren jeweilige ID und ihre Punkte in den drei Kompetenzbereichen (Abbildung 11).
Die Reihenfolge, in der die Schüler*innen im Datensatz angeordnet
sind, kann mithilfe von arrange() verändert werden. Dies
wird notwendig, wenn beispielsweise die Schüler*innen entsprechend ihrer
Mathematikkompetenzen aufsteigend, d. h. Schüler*innen mit niedrigen
Kompetenzen zuerst und Schüler*innen mit hohen Kompetenzen zuletzt,
sortiert werden sollen. Der entsprechende Befehl, angewendet auf den
neuen schlanken Dataframe, lautet:
df_kompetenzen <- pisa2022 %>%
arrange(mathekomp)
Der bisherige Datensatz df_kompetenzen wird dann in
aufsteigender Reihenfolge der Mathekompetenzen sortiert (Abbildung
12).
Die gegenteilige Reihenfolge, d. h. eine absteigende Sortierung,
wird über den Zusatz eines Minuszeichens im Befehl erreicht:
df_kompetenzen <- pisa2022 %>%
arrange(-(mathekomp))
Wenn Teil- oder Subgruppen der Schüler*innen genauer betrachtet
und/oder miteinander verglichen werden sollen, kann auf die Funktion
group_by() zurückgegriffen werden. Die Funktion ermöglicht
es, den Datensatz entsprechend einer oder mehrerer Variablen („Spalten“)
in Gruppen zu teilen.
Bisher wurden die Befehle zum Filtern, Sortieren und Selektieren so
angewandt, dass ein neuer zugeschnittener Teildatensatz erstellt wurde.
Die Befehle können aber auch mit anderen Befehlen kombiniert werden und
so nur „kurzzeitig“ für einen bestimmten Zweck auf den gesamten
Datensatz angewandt werden. Wenn beispielsweise untersucht werden soll,
ob die durchschnittlichen Lesekompetenzen der Schüler anders als die der
Schülerinnen sind, kann der Befehl zur Ermittlung des arithmetischen
Mittels (siehe Kapitel 3.2.1) getrennt für die beiden Gruppen angewendet
werden. Dieses Vorhaben lässt sich mit dem group_by-Befehl
durchführen. Sofern die Variable, die für die Gruppierung
ausschlaggebend sein soll, keine Faktor-Variable (also eine
nominalskalierte Zahl) ist, muss zunächst eine entsprechende Umwandlung
vorgenommen werden.
pisa2022$geschlecht <- as.factor(pisa2022$geschlecht) #group_by kann nicht auf Character-Variablen angewendet werden, deswegen Umwandlung in Faktor-Variable
Anhand des Befehls für die nach Geschlecht gruppierte Ausgabe des
arithemtischen Mittels der Lesekompetenzen kann auch die Anwendung der
Pipe %>% aufzeigt werden:
knitr::kable( #knitr::kable dient der schönen Formatierung
pisa2022 %>% #der Datensatz pisa2022 soll...
group_by(geschlecht) %>% #erst nach Geschlecht in Gruppen geteilt werden,..
summarise( #um dann das arithemtische Mittel für die jeweiligen Gruppen zu berechnen.
mean_lesekomp = mean(lesekomp)
)
)
| geschlecht | mean_lesekomp |
|---|---|
| männlich | 474.4382 |
| weiblich | 492.0163 |
Wie im Output ersichtlich, gibt RStudio dann eine sogenannte
tibble mit dem gewünschten Ergebnis aus. Es zeigt sich: Die
mittleren Lesekompetenzen der Schülerinnen sind etwas höher als die der
Schüler.
Wer mit Daten arbeitet, ist in den allermeisten Fällen mit fehlenden Werten konfrontiert. Dass Werte bzw. Daten in Datensätzen fehlen, kann verschiedene Ursachen haben. Wenn beispielsweise befragte Personen bestimmte Fragen nicht beantworten wollen, überspringen sie diese möglicherweise oder nutzen Antwortoptionen wie „keine Antwort“. Daneben können auch Fehler beim Datenexport zu fehlenden Daten führen. Fehlende Werte sind aus vielerlei Hinsicht von großer Bedeutung bei der Datenauswertung: Sie können zu einer Verkleinerung der Stichprobe und damit der Aussagekraft der Daten führen. Sie können Teil des Forschungsinteresses werden, wenn fehlende Werte beispielsweise systematisch auftreten. Und sie können dazu führen, dass einzelne Befehle im Rahmen der Datenauswertung nicht fehlerfrei ausgeführt werden können.
Verschiedenste Bedingungen (darunter auch die Ursachen) entscheiden darüber, wie sinnvoller Weise mit fehlenden Werten umgegangen werden sollte. Forscher*innen müssen sich entscheiden zwischen: Fälle mit fehlenden Werten aus dem Datensatz löschen oder fehlende Werte ersetzen (sogenannte Imputation). Beides sollte wissenschaftlich fundiert stattfinden.
Beide Datensätze, die in diesem Lehrskript Anwendung finden, wurden bereits im Vorfeld bereinigt, d. h. die fehlenden Werte wurden imputiert oder die betreffenden Fälle herausgelöscht. Das Kapitel 9 Praxisprobleme der Datenaufbereitung im Lehrbuch von Sauer beschreibt ein mögliches Vorgehen in beiden Fällen.