r:de:introduction
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
r:de:introduction [2024/06/20 17:12] – [Datentypen] astefanowitsch | r:de:introduction [2024/06/22 17:16] (current) – astefanowitsch | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | Einstieg in die Statistik mit R | + | ====== |
- | + | ||
- | ====== | + | |
===== Was ist R? ===== | ===== Was ist R? ===== | ||
Line 7: | Line 5: | ||
R ist | R ist | ||
* eine auf statistische Verfahren spezialisierte erweiterbare Programmiersprache aber auch | * eine auf statistische Verfahren spezialisierte erweiterbare Programmiersprache aber auch | ||
- | * eine interaktive, | + | * eine interaktive, |
- | + | ||
- | Wenn Sie R öffnen, sehen Sie nur eine Eingabeaufforderung (''>'' | + | |
- | + | ||
- | ===== Funktionen ===== | + | |
- | + | ||
- | Die Funktionen haben typischerweise die Form | + | |
- | + | ||
- | < | + | |
- | name.funktion(datenstruktur, | + | |
- | </ | + | |
- | + | ||
- | wobei '' | + | |
- | + | ||
- | Ein einfaches Beispiel ist die '' | + | |
- | + | ||
- | < | + | |
- | print(" | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | print(3.141592653589793116, | + | |
- | </ | + | |
- | + | ||
- | Der erste Befehl gibt den Satz " | + | |
- | + | ||
- | Der zweite Befehl gibt die genannte Zahl aus, allerdings nur die Stelle vor dem Dezimalkomma und die ersten drei Nachkommastellen, | + | |
- | + | ||
- | > AUFGABE: Ändern Sie den Wert des Parameters '' | + | |
- | + | ||
- | ===== Datentypen ===== | + | |
- | + | ||
- | Wir sehen in den beiden Befehlen auch schon zwei verschiedene Arten von Daten: | + | |
- | + | ||
- | - Text hat den Datentyp '' | + | |
- | - Zahlen (verschiedene Datentypen: '' | + | |
- | + | ||
- | Außer Funktionen der o.g. Form können wir auch mathematische Operatoren wie //Plus// ('' | + | |
- | + | ||
- | Nehmen wir an, in einer Prüfungsordnung steht, dass Hausarbeiten eine Länge von 40000 Zeichen haben sollen. Wenn Sie wissen, dass die durchschnittliche Wortlänge in geschriebenen englischen Texten 4.729511018095062802 ist, können Sie ausrechnen, wieviele Wörter die Hausarbeit etwa haben muss, wenn Sie sie in englischer Sprache verfassen: | + | |
- | + | ||
- | < | + | |
- | 40000 / 4.729511018095062802 | + | |
- | [1] 8457.534 | + | |
- | </ | + | |
- | + | ||
- | > AUFGABE: Die durchschnittliche Wortlänge in deutschen Texten ist 6.1216408854526553895. Berechnen Sie, wie viele Wörter die Hausarbeit etwa haben muss, wenn Sie sie auf Deutsch schreiben. (('' | + | |
- | + | ||
- | > AUFGABE: Wie viel länger wird ein englischer Text ungefähr, wenn Sie ihn ins Deutsche übersetzen? | + | |
- | + | ||
- | Mathematische Operatoren funktionieren nur mit Zahlen (Typen '' | + | |
- | + | ||
- | < | + | |
- | " | + | |
- | Fehler in " | + | |
- | nicht-numerisches Argument für binären Operator | + | |
- | </ | + | |
- | + | ||
- | Das gilt auch, wenn der Text aus Zahlen besteht — wie oben erwähnt, behandelt R alles als Text, was in Anführungszeichen steht: | + | |
- | + | ||
- | < | + | |
- | " | + | |
- | Fehler in " | + | |
- | nicht-numerisches Argument für binären Operator | + | |
- | </ | + | |
- | + | ||
- | ===== Variablen ===== | + | |
- | + | ||
- | Wie eingangs gesagt, ist R (auch) eine Programmiersprache. Wie es für Programmiersprachen typisch ist, können wir unsere Daten (z.B. Text oder Zahlen) auch in sogenannten Variablen ablegen. Eine Variable können wir uns als einen Behälter mit einem Etikett (dem Variablennamen) vorstellen, in dem verschiedene Dinge liegen können; auf diese verschiedenen Dinge können wir uns immer beziehen, in dem wir den Variablennamen nennen. Variablen können beliebige Namen haben, solange diese nicht mit einer Zahl beginnen oder mit dem Namen einer Funktion identisch sind. | + | |
- | + | ||
- | In R legen wir Daten in einer Variable ab (bzw. weisen einer Variable unsere Daten als Wert zu), indem wir ein Pfeilsymbol aus einem " | + | |
- | + | ||
- | Um z.B. die o.g. Durchschnittslängen für Wörter in englischen und deutschen Texten in Variablen namens '' | + | |
- | + | ||
- | < | + | |
- | wl_en <- 4.729511018095062802 | + | |
- | wl_deu <- 6.1216408854526553895 | + | |
- | </ | + | |
- | oder | + | |
- | + | ||
- | < | + | |
- | 4.729511018095062802 -> wl_en | + | |
- | 6.1216408854526553895 -> wl_deu | + | |
- | </ | + | |
- | + | ||
- | Um die gewünschte Länge der Hausarbeit in der o.g. fiktiven Prüfungsordnung in einer Variable mit dem Namen '' | + | |
- | + | ||
- | < | + | |
- | gewuenschte_laenge_hausarbeit <- 40000 | + | |
- | </ | + | |
- | + | ||
- | Nun können wir mit den Variablen rechnen als seien es Zahlen | + | |
- | + | ||
- | < | + | |
- | gewuenschte_laenge_hausarbeit / wl_en | + | |
- | [1] 6534.196 | + | |
- | </ | + | |
- | + | ||
- | Auch einen Text können wir einer Variable als Wert zuweisen: | + | |
- | + | ||
- | < | + | |
- | gewuenschte_laenge_hausarbeit <- " | + | |
- | </ | + | |
- | + | ||
- | Damit können wir aber dann nicht rechnen – wenn wir den Befehl erneut ausführen, erhalten wir eine Fehlermeldung: | + | |
- | + | ||
- | < | + | |
- | gewuenschte_laenge_hausarbeit / wl_en | + | |
- | Fehler in gewuenschte_laenge_hausarbeit/ | + | |
- | nicht-numerisches Argument für binären Operator | + | |
- | </ | + | |
- | + | ||
- | > AUFGABE: a.) In wiefern ist '' | + | |
- | Mehr zu Naming Conventions in R finden Sie unter https:// | + | |
- | + | ||
- | Wie das Wort // | + | |
- | + | ||
- | < | + | |
- | 6.2 -> wl_en | + | |
- | </ | + | |
- | + | ||
- | Wenn wir nun die oben durchgeführte Rechnung erneut durchführen, | + | |
- | + | ||
- | < | + | |
- | gewuenschte_laenge_hausarbeit / wl_en | + | |
- | [1] 6451.613 | + | |
- | </ | + | |
- | + | ||
- | Das ist natürlich richtig so, denn der Wert der Variable '' | + | |
- | + | ||
- | + | ||
- | ====== Datenstrukturen ====== | + | |
- | + | ||
- | Wir haben von " | + | |
- | + | ||
- | = der Vektor (// | + | |
- | = die Kreuztabelle (// | + | |
- | = die Tabelle (//data frame//) | + | |
- | + | ||
- | ===== Vektoren ===== | + | |
- | + | ||
- | Vektoren sind (anders als der Name erwarten lässt), geordnete Listen von Daten desselben Typs. Sie werden mit der Funktion '' | + | |
- | + | ||
- | Der folgende Befehl erzeugt einen solchen Vektor, der die Wortanzahl der 23 Kapitel von Jane Austens _Pride and Predjudice_ (Band 1) enthält, und weist ihn einer Variable mit dem Namen pp_v1 zu. | + | |
- | + | ||
- | < | + | |
- | pp_v1 <- c(855, 800, 1710, 1067, 964, 2358, 1999, 1939, 1744, 2227, 1615, 667, 1707, 1124, 1705, 3403, 1283, 5193, 1921, 1653, 2009, 1736, 1622) | + | |
- | </ | + | |
- | + | ||
- | > AUFGABE: a) Erzeugen Sie einen Vektor mit den Einwohnendenzahlen der fünf größten deutschen Städte und nennen Sie ihn '' | + | |
- | + | ||
- | Vektoren sind praktisch, um nicht für jeden Wert einer Reihe zusammenhängender Datenpunkte (hier: Wortlänge der Kapitel bzw. Anzahl der Einwohnenden) eine eigene Variable erzeugen zu müssen. Für die Kapitel in Band 1 von _Pride and Predjudice_ bräuchten wir 23 Variablen, z.B. wie die folgenden: | + | |
- | + | ||
- | < | + | |
- | pp_v1_ch1 <- 855 | + | |
- | pp_v1_ch2 <- 800 | + | |
- | pp_v1_ch3 <- 1710 | + | |
- | pp_v1_ch4 <- 1067 | + | |
- | pp_v1_ch5 <- 964 | + | |
- | pp_v1_ch6 <- 2358 | + | |
- | pp_v1_ch7 <- 1999 | + | |
- | pp_v1_ch8 <- 1939 | + | |
- | pp_v1_ch9 <- 1744 | + | |
- | pp_v1_ch10 <- 2227 | + | |
- | pp_v1_ch11 <- 1615 | + | |
- | pp_v1_ch12 <- 667 | + | |
- | pp_v1_ch13 <- 1707 | + | |
- | pp_v1_ch14 <- 1124 | + | |
- | pp_v1_ch15 <- 1705 | + | |
- | pp_v1_ch16 <- 3403 | + | |
- | pp_v1_ch17 <- 1283 | + | |
- | pp_v1_ch18 <- 5193 | + | |
- | pp_v1_ch19 <- 1921 | + | |
- | pp_v1_ch20 <- 1653 | + | |
- | pp_v1_ch21 <- 2009 | + | |
- | pp_v1_ch22 <- 1736 | + | |
- | pp_v1_ch23 <- 1622 | + | |
- | </ | + | |
- | + | ||
- | Das wird schnell unübersichtlich, | + | |
- | + | ||
- | Wir können auf die einzelnen Elemente eines Vektors zugreifen, indem wir den Namen des Vektors gefolgt von einer Position in eckigen Klammern verwenden. Um zum Beispiel die Wortanzahl des 5. Kapitels zu erhalten, geben wir Folgendes ein: | + | |
- | + | ||
- | < | + | |
- | pp_v1[5] | + | |
- | </ | + | |
- | + | ||
- | Mit diesem Variablennamen können wir auch Berechnungen durchführen, | + | |
- | + | ||
- | Wir können zum Beispiel ausrechnen, wie lange es bei einer durchschnittlichen Lesegeschwindigkeit von 150 Wörtern pro Minute dauern würde, das Kapitel zu lesen: | + | |
- | + | ||
- | < | + | |
- | pp_v1[5] / 150 | + | |
- | </ | + | |
- | + | ||
- | Wenn wir bei solchen Berechnungen den Namen des Vektors selbst verwenden, erhalten wir übrigens einen neuen Vektor, der das Ergebnis der Berechnung für jedes Element des Vektors enthält: | + | |
- | + | ||
- | < | + | |
- | pp_v1 / 150 | + | |
- | </ | + | |
- | + | ||
- | R erkennt also, dass hier eine Berechnung durchgeführt wird, für die eine einzelne Zahl benötigt wird. Da der Vektor mehrere Zahlen enthält, geht R automatisch davon aus, dass die Berechnung für jede dieser Zahlen durchgeführt werden soll. | + | |
- | + | ||
- | Es gibt aber auch eine Reihe von Funktionen, die wir speziell auf solche Vektoren anwenden können, z.B. | + | |
- | + | ||
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | + | ||
- | Die Länge des längsten Kapitels in Band 1 von _Pride and Predjudice_ erhalten wir z.B. mit | + | |
- | + | ||
- | < | + | |
- | max(pp_v1) | + | |
- | </ | + | |
- | + | ||
- | die Länge des kürzesten Kapitels mit | + | |
- | + | ||
- | < | + | |
- | min(pp_v1) | + | |
- | </ | + | |
- | + | ||
- | und die durchschnittliche Länge mit | + | |
- | + | ||
- | < | + | |
- | mean(pp_v1) | + | |
- | </ | + | |
- | + | ||
- | > AUFGABE: Ermitteln Sie die Gesamtlänge des Bandes. (('' | + | |
- | + | ||
- | > AUFGABE: Verwenden Sie die Variable '' | + | |
- | + | ||
- | Falls Sie auch die Wortlängen der Kapitel im zweiten und dritten Band von Pride and Prejudice haben möchten, sind hier die Funktionen für die entsprechenden Vektoren: | + | |
- | + | ||
- | < | + | |
- | pp_v2 <- c(1939, 1520, 2341, 1268, 1456, 2397, 1233, 1568, 1504, 1870, 2111, 3007, 2025, 1375, 1042, 1645, 1683, 2280, 1837) | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | pp_v3 <- c(d) | + | |
- | </ | + | |
- | + | ||
- | Sie können diese Vektoren übrigens mit dem Befehl '' | + | |
- | + | ||
- | < | + | |
- | pp_all <- c(pp_v1, pp_v2, pp_v3) | + | |
- | </ | + | |
- | + | ||
- | Nun können Sie z.B. ausrechnen, wie lang der Roman insgesamt ist: | + | |
- | + | ||
- | < | + | |
- | sum(pp_all) | + | |
- | </ | + | |
- | + | ||
- | > AUFGABE: Berechnen Sie die durchschnittliche Kapitellänge des gesamten Romans. (('' | + | |
- | + | ||
- | Wir können solche Funktionen auch direkt in einer Berechnung verwenden, R verwendet an der betreffenden Stelle dann das Ergebnis der Funktion. | + | |
- | + | ||
- | Zum Beispiel: | + | |
- | + | ||
- | < | + | |
- | pp_v1 - mean(pp_v1) | + | |
- | </ | + | |
- | + | ||
- | R berechnet hier zunächst das Ergebnis der Funktion '' | + | |
- | + | ||
- | ===== Data Frames (Tabellen) ===== | + | |
- | + | ||
- | Vektoren sind oft nützlich, aber sie haben ein Problem: sie enthalten nur Werte (in unserem Fall, Zahlen), aber keine Information darüber, worauf sich diese Zahlen beziehen. Wenn wir z.B. die Gesamtlänge von Romanen miteinander vergleichen wollen würden, würden wir normalerweise eine Tabelle wie die folgende anlegen: | + | |
- | + | ||
- | ^ Title ^ Author | + | |
- | | Les Miserables | + | |
- | | War and Peace | Leo Tolstoy | + | |
- | | The Lord of the Rings | J. R. R. Tolkien | 564187 | | + | |
- | | ... | + | |
- | + | ||
- | Solche Tabellen können wir auch innerhalb von R verwenden. Sie heißen dort "Data Frames" | + | |
- | + | ||
- | < | + | |
- | title <- c("Les Miserables", | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | author <- c(" | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | length <- c(568751, 567246, 564187) | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | data.frame(title, | + | |
- | </ | + | |
- | + | ||
- | Bei nur drei Zeilen ist das vorstellbar, | + | |
- | + | ||
- | ==== Einlesen extern erzeugter Tabellen ==== | + | |
- | + | ||
- | Um eine solche Tabelle in R einzulesen, gibt es verschiedene Möglichkeiten. Die beste ist die, die Tabelle zunächst als csv-Datei abzuspeichern, | + | |
- | + | ||
- | In einer solchen Datei entspricht jede Zeile einer Zeile der Tabelle, die Spalten der Tabelle sind durch Kommas (oder manchmal auch Semikolons oder Tabulatoren) getrennt. Text sollte (wie bei R) in geraden Anführungszeichen stehen (normalerweise werden doppelte Anführungszeichen verwendet, aber einfache gehen auch). Innerhalb solcher Anführungszeichen dürfen Kommas, Tabulatoren oder Semikolons vorkommen, ohne, dass sie als Spaltengrenze interpretiert werden. | + | |
- | + | ||
- | Die o.g. Tabelle würde also so aussehen: | + | |
- | + | ||
- | < | + | |
- | " | + | |
- | "Les Miserables"," | + | |
- | "War and Peace"," | + | |
- | "The Lord of the Rings"," | + | |
- | </ | + | |
- | + | ||
- | Unter https:// | + | |
- | + | ||
- | Speichern Sie diese Tabelle auf Ihrem Computer an einer Stelle, an der Sie sie leicht wiederfinden, | + | |
- | + | ||
- | Um solche csv-Dateien in R einzulesen, verwenden Sie den Befehl '' | + | |
- | + | ||
- | In unserer Tabelle sind die Antworten: 1) Ja, die Tabelle enthält eine Kopfzeile, 2) es wird das Komma verwendet, um Spalten zu trennen, und 3) Text wird durch doppelte Anführungszeichen gekennzeichnet. | + | |
- | + | ||
- | Wir können die Tabelle also wie folgt einlesen: | + | |
- | + | ||
- | < | + | |
- | read.table(file=" | + | |
- | </ | + | |
- | + | ||
- | '' | + | |
- | + | ||
- | Wenn Sie den Pfad zu Ihrer Datei nicht kennen, können Sie anstelle des Dateinamens die Funktion '' | + | |
- | + | ||
- | < | + | |
- | read.table(file=file.choose(), | + | |
- | </ | + | |
- | + | ||
- | Übrigens kann R eine Datei auch aus dem Internet einlesen. Nennen Sie dann statt des Dateipfades die URL, z.B.: | + | |
- | + | ||
- | < | + | |
- | read.table(file=" | + | |
- | </ | + | |
- | + | ||
- | Die Funktion '' | + | |
- | + | ||
- | ==== Arbeiten mit Tabellen ==== | + | |
- | + | ||
- | Wenn wir die Tabelle eingelesen haben, können wir uns mit dem Befehl '' | + | |
- | + | ||
- | < | + | |
- | head(novels) | + | |
- | </ | + | |
- | + | ||
- | (wenn Sie mehr oder weniger Zeilen sehen wollen, können Sie als Parameter noch eine Zahl zum Befehl hinzufügen, | + | |
- | + | ||
- | < | + | |
- | head(novels, | + | |
- | </ | + | |
- | + | ||
- | Wie bei einem Vektor können Sie sich auch bei einem Data Frame einzelne Elemente anzeigen lassen. Da die Tabelle, anders als ein Vektor, zwei Dimensionen hat, müssen Sie dabei hinter dem Namen des Data Frame immer zwei Werte in eckicken Klammern angeben (getrennt duch ein Komma): die Zeilennummer und die Spaltennummer (bei der Nummerierung zählt die Kopfzeile nicht mit). | + | |
- | + | ||
- | Z.B., um sich den Autor des beliebtesten Buches anzeigen zu lassen: | + | |
- | + | ||
- | < | + | |
- | novels[1, | + | |
- | </ | + | |
- | + | ||
- | Oder um sich die Länge des drittbeliebtesten Buches anzeigen zu lassen: | + | |
- | + | ||
- | < | + | |
- | novels[3, | + | |
- | </ | + | |
- | + | ||
- | Wenn Sie die Zahl hinter dem Komma weglassen, bekommen Sie eine ganze Zeile angezeigt: | + | |
- | + | ||
- | < | + | |
- | novels[28, | + | |
- | </ | + | |
- | + | ||
- | Wenn Sie die Zahl vor dem Komma weglassen, bekommen Sie eine ganze Spalte angezeigt. | + | |
- | + | ||
- | < | + | |
- | novels[, | + | |
- | </ | + | |
- | + | ||
- | Diese verhält sich dann übrigens wie ein Vektor, sie können damit entsprechende Berechnungen durchführen: | + | |
- | + | ||
- | < | + | |
- | mean(novels[, | + | |
- | </ | + | |
- | + | ||
- | Wenn unser Data Frame eine Kopfzeile hat, können wir einzelne Spalten auch aufrufen, indem wir den Namen des Data Frame gefolgt von einem Dollar-Zeichen gefolgt vom Namen der betreffenden Spalte eingeben: | + | |
- | + | ||
- | < | + | |
- | novels$Length | + | |
- | </ | + | |
- | Auch in dieser | + | In 7 Übungseinheiten führt |
- | ===== Kreuztabellen | + | ===== Übungseinheiten |
- | Uns fehlt noch die zweite der oben genannten Datenstrukturen: die Kreuztabelle. Wie Sie Kreuztabellen | + | * [[r:de: |
+ | * [[r: | ||
+ | * [[r: | ||
+ | * [[r: | ||
+ | * [[r: | ||
+ | * [[r: | ||
+ | * [[r: | ||
r/de/introduction.1718896363.txt.gz · Last modified: 2024/06/20 17:12 by astefanowitsch