{ "cells": [ { "cell_type": "markdown", "id": "descending-vacuum", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "id": "impossible-patient", "metadata": {}, "source": [ "R ist eine Open Source Softwareumgebung und eine Programmiersprache für statistische Berechnungen und Graphiken, die für alle gängigen Betriebssysteme verfügbar ist. Sie wird u.a. auch mit der Anaconda-Distribution ausgeliefert, die Sie bereits aus früheren Modulen Ihres Studiums kennen.\n", "\n", "R verfügt über eine sehr aktive Community, die die Software ständig weiterentwickelt und durch frei verfügbare Bibliotheken in ihrer Funktionalität erweitert. Dadurch sind neue statistische Verfahren häufig wesentlich schneller verfügbar als in proprietärer Software.\n", "\n", "Im Kontext dieses Kurses arbeiten wir mit Jupyter Notebooks, da sich diese durch die Kombination von beschreibendem bzw. erläuternden Text und ausführbaren Codeblöcken besonders eignen. Für aufwendige Datenanalysen ist aber auch die integrierte Entwicklungsumgebung R Studio empfehlenswert, die es ermöglicht auch immer einen Blick auf die aktuell verwendeten Daten zu haben. Auch [R Studio](https://www.rstudio.com/products/rstudio/) ist Teil der Anaconda-Distribution, ein austesten ist also ohne großen Aufwand möglich.\n", "\n", "In diesem Jupyter Notebook erhalten Sie nun eine kurze Einführung in die Arbeit mit R, bevor wir dann in den nachfolgenden Jupyter Notebooks die Aufbereitung und Auswertung von Daten aus empirischen Erhebungen thematisieren." ] }, { "cell_type": "markdown", "id": "homeless-dominant", "metadata": {}, "source": [ "## R als Taschenrechner\n", "\n", "Wie Sie es auch von Python her kennen, können Sie in Codezeilen auch bei der Nutzung eines R-Kernels Rechenoperationen ausführen. Im Unterschied zur Arbeit mit Python sehen Sie für jede Operation, die einen Rückgabewert erzeugt, selbigen im Ausgabebereich unterhalb der Codezelle des Jupyter Notebooks." ] }, { "cell_type": "code", "execution_count": null, "id": "intelligent-surgeon", "metadata": {}, "outputs": [], "source": [ "5+2 #Addition\n", "5-2 #Subtraktion\n", "5*2 #Multiplikation\n", "5/2 #Division\n", "(5+2)*(5-2) #Berechnungen mit Klammern" ] }, { "cell_type": "markdown", "id": "separated-majority", "metadata": {}, "source": [ "Komplexere Berechnungen, die nicht über die einfache Verknüpfung von Zahlenwerten und Rechenoperatoren zu realisieren sind, werden in Funktionen realisiert, in denen die Berechnungsroutine hinterlegt ist. Auch hier werden Sie viele Parallelen zu Python und anderen Programmiersprachen erkennen können. Der Aufruf von Funktionen erfolgt über den Funktionsnamen, der immer von runden Klammern gefolgt ist:\n", "\n", "```R\n", "funktionsname() #Aufruf der Funktion \"funktionsname\"\n", "```\n", "Innerhalb der Klammern können mit Hilfe von Übergabeparametern Werte an die Funktion übergeben werden. Darüber hinaus können auch Optionen, die von der Funktion bereitgestellt werden, ausgewählt werden. In unserem Kontext sind dies i.d.R. Angaben zur Berechnungsvariante oder dem Umgang mit bestimmten Werten.\n", "```R\n", "funktionsname(daten_fuer_die_berechnung, weitere_optionen)\n", "```\n", "Schauen wir uns ein Beispiel an: Die Funktion `log()` berechnet Logarithmus eines übergebenen Werts. Voreingestellt ist hier die Berechnung des natürlichen Logarithmus." ] }, { "cell_type": "code", "execution_count": null, "id": "racial-julian", "metadata": {}, "outputs": [], "source": [ "log(5) #Berechnen des natürlichen Logarithmus der Zahl 5" ] }, { "cell_type": "markdown", "id": "hydraulic-perry", "metadata": {}, "source": [ "Soll der Logarithmus zu einer anderen Basis berechnet werden, ist eine entsprechende Angabe mittels des Übergabeparameters `base` möglich." ] }, { "cell_type": "code", "execution_count": null, "id": "colonial-hollow", "metadata": {}, "outputs": [], "source": [ "log(5, base = 2)" ] }, { "cell_type": "markdown", "id": "critical-carol", "metadata": {}, "source": [ "## Verwenden der Hilfe\n", "Gerade zu Beginn wissen Sie nicht immer, welche Optionen eine Funktion bietet. Aber auch später, insbesondere bei der Arbeit mit neuen Bibliotheken, werden Sie die Funktionsweise und Einstellungsmöglichkeiten von Funktionen immer wieder nachschauen müssen. Die erste Anlaufstelle in diesem Zusammenhang ist die Dokumentation. Diese können Sie -- wie auch in Python -- recht einfach durch das Voranstellen eines `?` vor die jeweilige Funktion oder das Objekt erreichen. Sie müssen jedoch bei Funktionen die runden Klammern für den Funktionsaufruf weglassen.\n", "\n", "Neben einer Beschreibung der Funktion finden Sie auch Beispiele für die Nutzung der Funktion und natürlich Erläuterungen zu den möglichen Optionen, die Sie über die Übergabeparameter spezifizieren können." ] }, { "cell_type": "code", "execution_count": null, "id": "deluxe-quarter", "metadata": {}, "outputs": [], "source": [ "?log #Aufruf der Hilfe für die Funktion log." ] }, { "cell_type": "markdown", "id": "vertical-midwest", "metadata": {}, "source": [ "**Aufgabe:**\n", "Rufen Sie die Hilfe zur Funktion `round` auf und finden Sie heraus, was diese Funktion tut. Was für Einstellungen können Sie mit Hilfe der Übergabeparameter vornehmen? Runden Sie das Ergebnis der Berechnung des natürlichen Logarithmus der Zahl 5 `log(5)` auf zwei Stellen nach dem Komma." ] }, { "cell_type": "code", "execution_count": null, "id": "environmental-marketplace", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "paperback-school", "metadata": {}, "source": [ "## Variablen und Vektoren\n", "Bisher haben wir die Werte für die verschiedenen Anweisungen immer direkt eingegeben. Sie können sich vorstellen, dass dies im Kontext statistischer Auswertungen wenig praktikabel und zudem äußerst fehleranfällig ist. Die Daten werden daher in Variablen abgelegt bzw. mit diesen verknüpft. Sie können sich dieses Vorgehen ähnlich wie das Ablegen in einer beschrifteten Schublade vorstellen. Sie können diese bei Bedarf öffnen und an den dort abgelegten Inhalt gelangen. Auch dieses Vorgehen kennen Sie bereits aus der Arbeit mit Python. \n", "\n", "### Variablen anlegen\n", "\n", "Die Zuweisung von Werten zu Variablen kann in R über zwei verschiedene Notationen realisiert werden. Bereits bekannt dürfte Ihnen die Zuweisung mittels eines Gleichheitszeichens sein. Diese Art der Zuweisung wird bei der Zuweisung von Werten zu Übergabeparametern verwendet. Außerhalb des Kontextes von Übergabeparametern ist in R jedoch die Pfeilnotation üblicher: `variable <- wert`. In den meisten Fällen lässt sich jedoch auch das Gleichzeichen als Zuweisungsoperator verwenden. Nur in sehr wenigen Ausnahmefällen funktioniert dies nicht. Dies können wir an dieser Stelle aber getrost außer Acht lassen. \n", "\n", "Beachten Sie bitte, dass eine Zuweisung keine Rückgabe bzw. Ausgabe erzeugt, es also zunächst so aussieht, als ob nichts passieren würde. Wollen Sie die \"Schublade\" öffnen, sich also den mit einer Variablen verknüpften Inhalt ansehen. Erreichen Sie dies in R über den einfachen Variablenaufruf (Namen der Variablen in die Codezelle schreiben)." ] }, { "cell_type": "code", "execution_count": null, "id": "actual-willow", "metadata": {}, "outputs": [], "source": [ "a = 5 #Zuweisung mit \"=\"\n", "b <- 2 #Zuweisung mit \"<-\"" ] }, { "cell_type": "code", "execution_count": null, "id": "personal-salon", "metadata": {}, "outputs": [], "source": [ "a #Rückgabe (hier auch Ausgabe bzw. Anzeige) des in der Variable a gespeicherten Werts\n", "b #Rückgabe der Variable b" ] }, { "cell_type": "markdown", "id": "collaborative-plane", "metadata": {}, "source": [ "### Vektoren anlegen\n", "Üblicher Weise arbeiten wir im Kontext statistischer Auswertungen nicht auf der Ebene einzelner Merkmalsausprägungen (=Werte). In R lassen sich mehrere Werte gleichen Datentyps in Vektoren ablegen. Das Zusammenfügen und ggf. in einen einheitlichen Datentyp umwandeln übernimmt die Funktion `c` (=combine). " ] }, { "cell_type": "code", "execution_count": null, "id": "immune-houston", "metadata": {}, "outputs": [], "source": [ "v <- c(5,2) #Zuweisen mehrerer Werte als Vektor (c: combine)\n", "v #Aufruf der Variable 'v'" ] }, { "cell_type": "markdown", "id": "addressed-politics", "metadata": {}, "source": [ "Auch mit Vektoren können Sie Rechenoperationen durchführen. Dabei wird normalerweise die Berechnung separat für jeden einzelnen Wert im Vektor vorgenommen. Es gibt aber auch Operationen, die auf den Vektor als Ganzes angewendet werden (z.B. Berechnung des Skalarprodukts zweier Vektoren)." ] }, { "cell_type": "code", "execution_count": null, "id": "worthy-lighter", "metadata": {}, "outputs": [], "source": [ "#Addieren der einzelnen Werte im Vektor mit der Zahl 5\n", "v + 5 \n", "#Multiplizieren der einzelnen Werte im Vektor mit dem in 'a' abgespeicherten Wert.\n", "a * v " ] }, { "cell_type": "markdown", "id": "polyphonic-spice", "metadata": {}, "source": [ "Werden Rechenoperationen mit zwei Vektoren gleicher Länge durchgeführt, werden jeweils die Elemente an denselben Positionen im Vektor miteinander verrechnet." ] }, { "cell_type": "code", "execution_count": null, "id": "vulnerable-graduate", "metadata": {}, "outputs": [], "source": [ "c(2,3,4) * c(10,20,30)" ] }, { "cell_type": "markdown", "id": "continued-barrel", "metadata": {}, "source": [ "### Vektoren beschriften\n", "Die Werte in Vektoren lassen sich auch mit Bezeichnern versehen, also benennen. Dies stellt sicher, dass Sie bei Auswertungen den Überblick behalten, welche Werte sich bspw. auf welche Merkmalsausprägung beziehen." ] }, { "cell_type": "code", "execution_count": null, "id": "civic-sensitivity", "metadata": {}, "outputs": [], "source": [ "#Vektor mit Anzahl (absoluten Häufigkeiten) anlegen\n", "statistik_macht_spass <- c(25 ,25)\n", "\n", "#Beschriften der Elemente im Vektor \"statistik_macht_spass\"\n", "names(statistik_macht_spass) <- c(\"ja\", \"nein\")\n", "\n", "\n", "#Aufrufen/Ausgeben des beschrifteten Vektors\n", "statistik_macht_spass" ] }, { "cell_type": "code", "execution_count": null, "id": "metropolitan-volume", "metadata": {}, "outputs": [], "source": [ "#Beschriftungen werden weitergegeben an resultierende Vektoren weitergegeben\n", "#Hier berechnen wir den relativen Anteil (=relative Häufigkeiten)\n", "statistik_macht_spass/sum(statistik_macht_spass)" ] }, { "cell_type": "markdown", "id": "65bc5c54", "metadata": {}, "source": [ "**Aufgabe**\n", "Legen Sie einen beschrifteten Vektor für die Angaben zum Geschlecht in der nachfolgenden Tabelle an. Berechnen Sie den relativen Anteil.\n", "\n", "|weiblich|männlich|divers|\n", "|--------|--------|------|\n", "|214|247|39|" ] }, { "cell_type": "code", "execution_count": null, "id": "cd53ced6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "competent-swaziland", "metadata": {}, "source": [ "### Zugriff auf Vektorelemente\n", "\n", "Für das Erzeugen von numerischen Folgen in Form von Vektoren gibt es ein paar Shortcuts. Zum einen der `:`-Operator und zum anderen die Funktion `seq()`. Beide sind insbesondere bei der Erzeugung von IDs oder aber beim Zugriff auf Elemente in Vektoren hilfreich." ] }, { "cell_type": "code", "execution_count": null, "id": "behavioral-airport", "metadata": {}, "outputs": [], "source": [ "#Erzeugen von Vektoren mit den Zahlen von 1 bis 5 \n", "zahlen_von_eins_bis_fuenf <- 1:5; zahlen_von_eins_bis_fuenf\n", "#Alternativ mit seq\n", "seq(from = 1, to = 5, by = 1) #Hier können unterschiedliche Schrittweiten über den Parameter by angegeben werden" ] }, { "cell_type": "markdown", "id": "hundred-tennis", "metadata": {}, "source": [ "Natürlich können Sie auch auf einzelne Elemente in Vektoren zugreifen. Dies erfolgt über den Index der einzelnen Werte. Die Indizes in R beginnen jedoch im Gegensatz zu vielen anderen Programmiersprachen mit dem Wert 1 und nicht mit 0. Entsprechend hat das letzte Element in einem Vektor einen Indexwert, der identisch mit der Länge des Vektors ist. Analog zu vielen anderen Programmiersprachen werden die Indexwerte in eckigen Klammern im Anschluss an den Bezeichner angegeben." ] }, { "cell_type": "code", "execution_count": null, "id": "offshore-november", "metadata": {}, "outputs": [], "source": [ "#Zugriff auf das erste Element im Vektor\n", "zahlen_von_eins_bis_fuenf[1]\n", "\n", "#Zugriff auf das 5. (hier letzte) Element im Vektor\n", "zahlen_von_eins_bis_fuenf[5]" ] }, { "cell_type": "markdown", "id": "wicked-sheffield", "metadata": {}, "source": [ "Mit einem Vektor aus Indexwerten können Sie auch gleichzeitig auf mehrere Elemente zugreifen. In diesem Zusammenhang werden häufig die oben vorgestellten Shortcuts für das Erzeugen von Zahlenfolgen verwendet." ] }, { "cell_type": "code", "execution_count": null, "id": "about-vermont", "metadata": {}, "outputs": [], "source": [ "#Zugriff auf die Elemente 2 bis 4\n", "zahlen_von_eins_bis_fuenf[c(2,3,4)]\n", "#kürzer\n", "zahlen_von_eins_bis_fuenf[2:4]" ] }, { "cell_type": "markdown", "id": "significant-times", "metadata": {}, "source": [ "Sie können die Werte an einzelnen Positionen im Vektor natürlich auch verändern. Dies erfolgt ebenfalls mittels einer Zuweisung. Neben der Neuzuweisung einzelner Werte zu einem einzelnen Vektorelement ist auch die gleichzeitige Neuzuweisung zu mehreren Vektorelementen möglich." ] }, { "cell_type": "code", "execution_count": null, "id": "heavy-torture", "metadata": {}, "outputs": [], "source": [ "#Zuweisung zu einem einzelnen Vektorelement\n", "zahlen_von_eins_bis_fuenf[1] <- 5; zahlen_von_eins_bis_fuenf\n", "\n", "#Zuweisung zu mehreren Vektorelementen. Allen wird derselbe Wert zugewiesen.\n", "zahlen_von_eins_bis_fuenf[2:4] <- 4; zahlen_von_eins_bis_fuenf\n", "\n", "#Zuweisung zu mehreren Vektorelementen. Jedes Vektorelement erhält einen anderen Wert. \n", "#Wichtig: Die Anzahl der Vektorelemente muss auf beiden Seiten identisch sein.\n", "zahlen_von_eins_bis_fuenf[2:4] <- c(4, 3, 2); zahlen_von_eins_bis_fuenf" ] }, { "cell_type": "markdown", "id": "a4152cc2", "metadata": {}, "source": [ "**Aufgabe**\n", "Legen Sie einen Vektor mit folgenden Werten an: 1, 3, 5, 7, 9. Ändern Sie anschließend die beiden letzten Werte, indem Sie diese mit den Werten 8 und 10 überschreiben." ] }, { "cell_type": "code", "execution_count": null, "id": "e342058d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "critical-array", "metadata": {}, "source": [ "## Dataframe\n", "\n", "### Anlegen eines Dataframe\n", "\n", "Mehrere Vektoren lassen sich zu einem Dataframe zusammenfassen. Voraussetzung dafür ist, dass die Vektoren die gleiche Länge besitzen. Daten für statistische Auswertungen werden i.d.R. in diesem Datenformat gespeichert. Die Vektoren enthalten dabei die Werte einzelner Merkmale (=Variablen) und bilden die Spalten. In den Zeilen finden sich die Angaben, die sich auf ein Untersuchungsobjekt beziehen." ] }, { "cell_type": "code", "execution_count": null, "id": "usual-equity", "metadata": {}, "outputs": [], "source": [ "#Anlegen eines Vektors für die ID\n", "id <- 1:5 \n", "\n", "#Anlegen eines Vektors für die Variable Vorkenntnisse\n", "vorkenntnisse <- c(\"ja\", \"nein\", \"nein\", \"ja\", \"keine Angabe\")\n", "\n", "#Anlegen eines Vektors für die Variable Anzahl Stunden zur Vorbereitung des Lernstoffs\n", "vorbereitung_in_stunden <- c(25, 32, 41, 29, 47)\n", "\n", "#Zusammenfassen in einem Dataframe\n", "#Die Angabe der Spaltennamen (ID, Vorkenntnisse, Vorbereitung) ist optional.\n", "#Über den Parameter stringsAsFactors kann angegeben werden, ob Zeichenketten als Faktoren (=kategoriale Variablen) behandelt werden sollen\n", "data_sample_1 <- data.frame(ID = id, Vorkenntnisse = vorkenntnisse, Vorbereitung = vorbereitung_in_stunden, stringsAsFactors = TRUE)\n", "data_sample_1" ] }, { "cell_type": "markdown", "id": "technological-characterization", "metadata": {}, "source": [ "Die Funktion `str()` liefert Angaben zur internen Struktur der übergebenen Variable. Für einen Dataframe wird neben den Datentypen einzelner Variablen auch die Anzahl der Beobachtungen (hier: `5 obs.`) und die Anzahl der Variablen angegeben. Für unsere kategoriale Variable `Vorkenntnisse` wurden drei sogenannte Levels (=Merkmalsausprägungen) angelegt. Jedem der Faktorlevel ist eine Zahl zugeordnet, die Werte werden also automatisch kodiert. Da R die Bedeutung der einzelnen Zeichenketten nicht kennt, erfolgt die Zuordnung alphabetisch: \"ja\" = 1, \"keine Angabe\" = 2, \"nein\" = 3. Diese Zuordnung ist nicht wirklich sinnvoll, wie wir dies ändern, werden wir aber zu einem späteren Zeitpunkt thematisieren." ] }, { "cell_type": "code", "execution_count": null, "id": "still-fountain", "metadata": {}, "outputs": [], "source": [ "#Zusammenfassung inkl. Kodierung der einzelnen Spalten\n", "str(data_sample_1)" ] }, { "cell_type": "markdown", "id": "0e1d3227", "metadata": {}, "source": [ "**Aufgabe:** \n", "Legen Sie einen Dataframe an, der die Daten der nachfolgenden Tabelle enthält und lassen Sie sich die interne Struktur ausgeben.\n", "\n", "|ID|Alter|Studiengang|\n", "|--|-----|-----------|\n", "|1 |23 |DDM |\n", "|2 |30 |IW |\n", "|3 |27 |DDM |\n", "|4 |32 |DDM |\n", "|5 |26 |IW |" ] }, { "cell_type": "code", "execution_count": null, "id": "1f004b7e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "owned-facial", "metadata": {}, "source": [ "### Zugriff auf DataFrame-Elemente\n", "Wie auch bei Vektoren kann auf einzelne Elemente in einem Dataframe über die zugehörigen Indexwerte zugegriffen werden. Bei einem Dataframe haben wir jedoch mit den Zeilen und Spalten zwei Dimensionen, die sich auch beim Zugriff widerspiegeln. In den eckigen Klammern können zwei Werte übergeben werden, der erste steht dabei für den Zeilenindex und der zweite für den Spaltenindex. Bleibt eine Indexpositionen leer, so wird die gesamte Zeile bzw. die gesamte Spalte ausgewählt.\n", "\n", "```R\n", "data_frame[zeile, spalte]\n", "```" ] }, { "cell_type": "code", "execution_count": null, "id": "strong-knife", "metadata": {}, "outputs": [], "source": [ "#Auswahl von Zeilen (hier Zeile 1)\n", "data_sample_1[1,]\n", "\n", "#Auswahl von Zeilen (hier Zeilen 2 bis 4)\n", "data_sample_1[2:4,]" ] }, { "cell_type": "code", "execution_count": null, "id": "finite-holder", "metadata": {}, "outputs": [], "source": [ "#Auswahl von Spalten (hier Spalte 3)\n", "data_sample_1[,3]\n", "\n", "#Auswahl von Spalten (hier Spalten 1 und 3)\n", "data_sample_1[,c(1,3)]" ] }, { "cell_type": "code", "execution_count": null, "id": "neutral-union", "metadata": {}, "outputs": [], "source": [ "#Auswahl einer Zelle (Zeile 1, Spalte 3)\n", "data_sample_1[1,3]\n", "\n", "#Auswahl mehrerer Zellen\n", "data_sample_1[1:2, c(1,3)]" ] }, { "cell_type": "markdown", "id": "significant-closer", "metadata": {}, "source": [ "Da im Kontext statistischer Auswertungen häufig der Zugriff auf Variablen notwendig ist und gerade bei Studien mit vielen Variablen das Verwenden von Indexwerten schnell zu Fehlern führen kann (z.B. durch falsches Auszählen der Indexposition einer Variablen), gibt es für den Zugriff auf Variablen noch weitere Alternativen: Zum einen kann der Variablenname über ein `$` an den Dataframe angehängt werden. Zum anderen kann der Variablenname als Zeichenkette in den eckigen Klammern verwendet werden. Diese Variante ist immer dann zu verwenden, wenn in den Spaltennamen Leerzeichen enthalten sind. Auch bietet diese Variante die Möglichkeit mehrere Variablen anhand ihres Names auszuwählen." ] }, { "cell_type": "code", "execution_count": null, "id": "automotive-import", "metadata": {}, "outputs": [], "source": [ "#Alternative zur Auswahl von Spalten (Vorschläge und Autovervollständigung über \"Tab\")\n", "data_sample_1$Vorkenntnisse\n", "\n", "#Weitere Alternative zur Auswahl von Spalten, mit der Option mehrere Spalten gleichzeitig zu wählen\n", "data_sample_1[,c(\"ID\",\"Vorkenntnisse\")]" ] }, { "cell_type": "markdown", "id": "welcome-closing", "metadata": {}, "source": [ "Auch eine komplexere Auswahl von Elementen aus einem Dataframe ist möglich. Dies kommt z.B. zur Anwendung, wenn bestimmte Auswertungen nur mit einem Teil der Stichprobe erfolgen sollen. Dazu lassen sich mit booleschen Ausdrücken Bedingungen formulieren." ] }, { "cell_type": "code", "execution_count": null, "id": "sonic-booth", "metadata": {}, "outputs": [], "source": [ "#Auswahl aller Untersuchungsobjekte, bei denen für die Variable Vorkenntnisse der Wert \"ja\" hinterlegt ist.\n", "#(Beachten Sie das doppelte Gleichheitszeichen für die Prüfung auf Gleichheit im Gegensatz zur Zuweisung mit einem \n", "#einfachen Gleichheitszeichen)\n", "data_sample_1[data_sample_1$Vorkenntnisse == \"ja\",] #Spaltenindex leer: alle Spalten auswählen" ] }, { "cell_type": "code", "execution_count": null, "id": "saving-budget", "metadata": {}, "outputs": [], "source": [ "#Auswahl aller Werte der Variablen \"Vorkenntnisse\", die mehr als 30 Stunden Vorbereitungszeit angegeben haben.\n", "data_sample_1[data_sample_1$Vorbereitung < 30,\"Vorkenntnisse\"]" ] }, { "cell_type": "code", "execution_count": null, "id": "ideal-magnet", "metadata": {}, "outputs": [], "source": [ "#Verknüfung mehrerer Bedingungen (| steht für or)\n", "data_sample_1[data_sample_1$Vorkenntnisse == \"ja\" | data_sample_1$Vorkenntnisse == \"nein\",]" ] }, { "cell_type": "code", "execution_count": null, "id": "cooked-typing", "metadata": {}, "outputs": [], "source": [ "#Verknüfung mehrerer Bedingungen (& steht für and)\n", "data_sample_1[data_sample_1$Vorkenntnisse == \"ja\" & data_sample_1$Vorbereitung <= 25,]" ] }, { "cell_type": "markdown", "id": "1a4eed2f", "metadata": {}, "source": [ "**Aufgabe:**\n", "Wählen Sie alle Studierenden aus dem Dataframe der vorhergehenden Aufgabe aus, die den Studiengang DDM studieren." ] }, { "cell_type": "code", "execution_count": null, "id": "583af6b1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "respective-prisoner", "metadata": {}, "source": [ "## Faktoren\n", "Wie zuvor bereits erwähnt, steht für kategoriale Daten in R der Datentyp `Factor` zur Verfügung. Dieser kann unsortiert sein und so nominale Daten abbilden oder für die Arbeit mit ordinalskalierten Daten mit einer festen Ordnung versehen werden. Intern werden bei Faktoren numerische Werte gespeichert, die wie die Indizies stets bei 1 beginnen. Jedem Faktorlevel wird dabei ein Label zugeordnet. Für die Erzeugung oder Anpassung von Faktoren wird die Funktion `factor()` verwendet." ] }, { "cell_type": "code", "execution_count": null, "id": "sharp-backup", "metadata": {}, "outputs": [], "source": [ "#Erzeugen eines Faktors basierend auf den vorkommenden Werten in einer Vektor mit Zeichenketten\n", "test_factor <- factor(c(\"ja\", \"nein\", \"ja\",\"ja\", \"nein\", \"ja\",\"jaja\", \"nein\", \"ja\"))\n", "test_factor" ] }, { "cell_type": "code", "execution_count": null, "id": "premium-blood", "metadata": {}, "outputs": [], "source": [ "#Erzeugen eines Faktors basierend auf den vorkommenden Werten in einer Vektor mit Zeichenketten \n", "#mit Vorgabe der zuzuordnenden Label (nicht vorkommende Werte werden als fehlende Werte behandelt)\n", "test_factor <- factor(c(\"ja\", \"nein\", \"ja\",\"ja\", \"nein\", \"ja\",\"jaja\", \"nein\", \"ja\"), levels = c(\"ja\", \"nein\"))\n", "test_factor " ] }, { "cell_type": "code", "execution_count": null, "id": "civil-director", "metadata": {}, "outputs": [], "source": [ "#Erzeugen eines Faktors basierend auf den vorkommenden Werten in einem Vektor mit Zeichenketten \n", "#mit Vorgabe der zuzuordnenden Label für jeden einzelnen Wert (hier: \"jaja\" wird zu \"ja\")\n", "test_factor <- factor(c(\"ja\", \"nein\", \"ja\", \"ja\", \"nein\", \"ja\", \"jaja\", \"nein\", \"ja\"), \n", " levels = c(\"ja\", \"nein\", \"jaja\"), #Vorkommende Level\n", " labels = c(\"ja\", \"nein\", \"ja\")) #Abzubilden auf folgende Label (hier Reduktion der Levels)\n", "test_factor " ] }, { "cell_type": "markdown", "id": "provincial-pizza", "metadata": {}, "source": [ "Wie wir gesehen haben, erfolgt die automatische Zuordnung der Faktorlevel alphabetisch. Häufig werden jedoch andere Zuordnungen gewünscht, um Ergebnisse intuitiver verständlich zu machen oder z.B. fehlende Werte, die in Textform hinterlegt sind (\"keine Angabe\"), ans Ende der Kodierungsliste zu setzen. Spätestens bei ordinalen Daten besteht jedoch die Notwendigkeit die Merkmalsausprägungen in die korrekte Rangfolge zu bringen." ] }, { "cell_type": "code", "execution_count": null, "id": "scheduled-rehabilitation", "metadata": {}, "outputs": [], "source": [ "ordered_test_factor <- factor(c(\"extra small\", \"extra small\", \"small\", \"large\", \"small\", \"medium\", \"extra large\"))\n", "\n", "#Anzeige der angelegten Faktorlevel in der kodierten Reihenfolge: 'extra large' 'extra small' 'large' 'medium' 'small'\n", "levels(ordered_test_factor)" ] }, { "cell_type": "code", "execution_count": null, "id": "looking-terminal", "metadata": {}, "outputs": [], "source": [ "#Angabe der levels in der gewünschten Reihenfolge beim Anlegen des Faktors\n", "ordered_test_factor <- factor(c(\"extra small\", \"extra small\", \"small\", \"large\", \"small\", \"medium\", \"extra large\"),\n", " levels = c(\"extra small\", \"small\", \"medium\", \"large\", \"extra large\"), #gewünschte Reihenfolge\n", " ordered =TRUE) #geordnet = ordinal\n", "ordered_test_factor" ] }, { "cell_type": "code", "execution_count": null, "id": "imperial-secondary", "metadata": {}, "outputs": [], "source": [ "#Angabe der Levels nachträglich ändern\n", "ordered_test_factor <- factor(ordered_test_factor, levels = c(\"extra large\", \"large\", \"medium\", \"small\", \"extra small\"))\n", "ordered_test_factor\n", "\n", "#Einfacher geht das Umkehren der Reihenfolge noch mit rev (=reverse)\n", "ordered_test_factor <- factor(ordered_test_factor, levels = rev(levels(ordered_test_factor)))\n", "ordered_test_factor" ] }, { "cell_type": "code", "execution_count": null, "id": "tired-portfolio", "metadata": {}, "outputs": [], "source": [ "#Statt die Zeichenketten einzugeben, die durch Tippfehler schnell fehlende Werte verursachen können,\n", "#kann auch mit dem Index gearbeitet werden\n", "ordered_test_factor <- factor(ordered_test_factor, levels = levels(ordered_test_factor)[c(1,3,5,2,4)])\n", "ordered_test_factor" ] }, { "cell_type": "markdown", "id": "demanding-wallet", "metadata": {}, "source": [ "## Daten einlesen\n", "Üblicherweise werden die Daten nicht manuell in R angelegt, sondern liegen bereits in Dateien vor. Im Folgenden betrachten wir daher verschiedene Möglichkeiten, Daten aus verschiedenen gängigen Dateiformaten einzulesen.\n", "\n", "### csv-Dateien einlesen\n", "Beginnen wir mit dem Einlesen von csv-Dateien. Hier gilt im Vorfeld festzustellen, ob die Datei in einem deutschen csv-Format gespeichert wurde oder in dem üblicheren englischen Format. Das deutsche Format unterscheidet sich insofern vom englischen Format, dass eine deutsche csv-Datei keine kommaseparierte Datei im eigentlichen Sinn ist, da als Trennzeichen das Semikolon verwendet wird. Hintergrund ist die Verwendung des Kommas als Dezimaltrennzeichen." ] }, { "cell_type": "code", "execution_count": null, "id": "amateur-exercise", "metadata": {}, "outputs": [], "source": [ "#csv-Dateien einlesen, Zeichenketten als Faktoren (kategoriale Variablen) behandeln\n", "#Es wird automatisch angenommen, dass die erste Zeile die Spaltenköpfe enthält. Ist dies nicht \n", "#der Fall, muss dies über den Parameter header=FALSE entsprechend angegeben werden.\n", "sample_data <- read.csv(\"data/sample_data.csv\", stringsAsFactors = TRUE, fileEncoding=\"UTF8\")\n", "\n", "#Überprüfen, ob das Einlesen wie gewünscht funktioniert hat\n", "str(sample_data)\n", "\n", "#Die Funktion head liefert die ersten Zeilen zurück. Sie können natürlich auch den gesamten Dataframe aufrufen, \n", "#dann wird aber der vollständige Dateiinhalt unter der Codezelle angezeigt. Dies kann u.U. sehr lang sein.\n", "head(sample_data)" ] }, { "cell_type": "code", "execution_count": null, "id": "figured-career", "metadata": {}, "outputs": [], "source": [ "#csv-Dateien (deutsches csv-Format) einlesen (csv2 statt csv)\n", "#Wer den Dateipfad nicht per Hand eingeben möchte, kann die Funktion file.choose() verwenden. \n", "#Hier öffnet sich ein Fenster für die Auswahl der Datei (Achtung: Funktioniert nicht zwingend bei allen Betriebssystemen)\n", "sample_data_german_format <- read.csv2(file.choose(), stringsAsFactors = TRUE, fileEncoding = \"UTF8\") #sample_data_german_format.csv\n", "\n", "#Überprüfen, ob das Einlesen wie gewünscht funktioniert hat\n", "str(sample_data_german_format)\n", "\n", "#Die Funktion head liefert die ersten Zeilen zurück. Sie können natürlich auch den gesamten Dataframe aufrufen, \n", "#dann wird aber der vollständige Dateiinhalt unter der Codezelle angezeigt. Dies kann u.U. sehr lang sein.\n", "head(sample_data_german_format)" ] }, { "cell_type": "markdown", "id": "generous-entry", "metadata": {}, "source": [ "**Aufgabe:**\n", "Wandeln Sie die Variable Bildungsabschluss in einen `ordered factor` um. Beachten Sie dabei auch die Reihenfolge der Faktorlevel. Selektieren Sie aus den zuvor eingelesenen Daten alle Spalten zu den Datensätzen der über 50-jährigen Männer und speichern Sie diese in einem neuen Dataframe ab. Wenn Sie 122 Einträge erhalten, dann haben Sie alles richtig gemacht." ] }, { "cell_type": "code", "execution_count": null, "id": "functional-granny", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "determined-henry", "metadata": {}, "source": [ "### Einlesen von Dateien aus SPSS\n", "Daten aus sozialwissenschaftlicher Forschung liegen nicht selten als sav-Dateien vor. Diese stammen aus dem Statistikprogramm SPSS, welches ebenfalls weit verbreitet ist. Die benötigte Funktionalität zum Einlesen von SPSS-Dateien findet sich in der Bibliothek `haven`. Diese sollte bereits Teil Ihrer Installation sein, Sie muss daher lediglich geladen werden. Dies geschieht in R über die Funktion `library()`. Als Übergabeparameter wird der Name der zu ladenden Bibliothek wahlweise auch als Zeichenkette angegeben.\n", "\n", "Nachfolgend verwenden wir folgenden Forschungsdatensatz aus einer Studie zur Nutzung von Social Media und onlinebasierten Anwendungen in der Wissenschaft aus dem Jahr 2014 zu Demonstrationszwecken. Sie finden diesen im Forschungsdaten-Repository der Gesis, können aber auch jeden anderen Datensatz aus SPSS verwenden.\n", "\n", "Verwendeter Datensatz: [Pscheida, Daniela; Albrecht, Steffen; Herbst, Sabrina; Minet, Claudia; Köhler, Thomas; Leibniz-Forschungsverbund 2.0 (2015): Nutzung von Social Media und onlinebasierten Anwendungen in der Wissenschaft 2014. Unter Mitarbeit von Technische Universität Dresden Medienzentrum und GESIS](https://doi.org/10.4232/1.12262)." ] }, { "cell_type": "code", "execution_count": null, "id": "identified-hearts", "metadata": {}, "outputs": [], "source": [ "#Falls die Bibliothek bei Ihnen doch nicht verfügbar sein sollte, ist eine Installation mit der auskommentierten Anweisung möglich.\n", "#Sollte dies bei Ihnen nicht klappen, finden Sie weitere Hinweise zur Installation von Bibliotheken am Ende des Jupyter Notebooks\n", "#install.packages(\"haven\")\n", "\n", "#Laden der Bibliothek haven mit der Funktionalität zum Arbeiten mit SPSS-Dateien\n", "library(haven) #genauso möglich: libray(\"haven\")\n", "\n", "#Einlsen der SPSS-Datei. Die Daten sollen in einem Dataframe gespeichert werden, daher kapseln wir die Funktion\n", "#in der Funktion as.data.frame().\n", "social_media_survey <- as.data.frame(read_spss(\"data/ZA5972_v1-0-0.sav\"))\n", "str(social_media_survey)\n", "head(social_media_survey)" ] }, { "cell_type": "code", "execution_count": null, "id": "buried-stage", "metadata": {}, "outputs": [], "source": [ "str(social_media_survey$Anteil_Lehre_kat)" ] }, { "cell_type": "markdown", "id": "elder-claim", "metadata": {}, "source": [ "Um die Daten verwenden zu können, ist i.d.R. eine sorgfältig Aufbereitung notwendig, insbesondere bei kategorialen Variablen. In diesem Zusammenhang sollte immer die Dokumentation der ursprünglichen Erhebung herangezogen werden, insbesondere das Codebook. Weitere Details dazu finden Sie im nächsten Jupyter Notebook." ] }, { "attachments": { "image-2.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "binary-significance", "metadata": {}, "source": [ "# Installieren von R packages in die Anancoda-Umgebung\n", "Wenn die Installation weitere Bibliotheken (packages) aus dem Jupyter Notebook heraus bei Ihnen nicht funktioniert, dann müssen Sie zunächst in den Anaconda-Promt wechseln.\n", "\n", "![image-2.png](attachment:image-2.png)\n", "\n", "Dort wechseln Sie in Ihr `R`-environment. Wenn Sie der Standardanleitung gefolgt sind, heißt dies wahrscheinlich `env-r` oder `env_r`. Anschließend geben Sie den Befehl `conda install r-` also für `haven` `conda install r-haven` ein. Sie werden nun noch einmal gefragt, ob Sie mit der Installation fortfahren wollen. Dies bestätigen Sie bitte. Nach erfolgreicher Installation können Sie die Bibliothek verwenden." ] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.6.1" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }