[[1]]
[1] 1 2 3
[[2]]
[1] "a"
[[3]]
[1] TRUE FALSE TRUE
[[4]]
[1] 2.3 5.9 1.1 4.8 11.0
Data Science 1 - Programmieren & Visualisieren
Saskia Otto
Universität Hamburg, IMF
Wintersemester 2023/2024
Datenstrukturen in R lassen sich bzgl. ihrer Dimensionalität und der Homogenität bzw. Heterogenität ihrer Datentypen in fünf verschiedene Objekttypen unterscheiden:
Dimensionen | Homogen | Heterogen |
---|---|---|
1D | (Atomarer) Vektor | Liste |
2D | Matrix | ‘Data frame’ (& ‘Tibbles’) |
>2D | ‘Array’ |
list()
erstellt:Quelle: R for Data Science von Wickam & Grolemund, 2017 (lizensiert unter CC-BY-NC-ND 3.0 US).
Eine nützliche Funktion zum Anzeigen der Objektstruktur ist str()
:
Quelle: R for Data Science von Wickam & Grolemund, 2017 (lizensiert unter CC-BY-NC-ND 3.0 US).
Matrizen sind 2-dimensionale Objekte dessen Elemente alle den gleichen Datentyp haben müssen. Sie werden vor allem in der numerischen Modellierung verwendet.
matrix()
erstellt:Arrays sind multi-dimensionale Objekte des gleichen Datentyps. Sie werden in der Datenanalyse in R aber eher selten genutzt und daher hier nicht näher beschrieben.
data.frame()
erstellen, welche Vektoren mit Namen als Input nimmt:as.data.frame()
und wieder zurück mit as.matrix()
(solange der Datentyp gleich ist):length()
in 2- und multi-dimensionalen Objekten lässt sich verallgemeinern zu
names()
zeigt in ‘data frames’ den Spaltennamen an:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
[Zeilen, Spalten]
Teile einer Matrix mittels Positionsindexierung auswählen und neu abspeichern:
$
$
ist eine Kurzschreibweise (‘shorthand notation’) zum Extrahieren von benannten Elementen in einer Liste.df[Zeilenabfrage, Spalten]
Auswahl aller Spalten und der Zeilen, wo die Werte in Spalte ‘x_neu’ >= 5 sind.
$
Operator anhängen00:40
PlantGrowth
- ObjekttypSchauen Sie sich folgenden Datensatz an:
PlantGrowth
- ObjektstrukturSchauen Sie sich die Struktur vom PlantGrowth
Datensatz an:
'data.frame': 30 obs. of 2 variables:
$ weight: num 4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
$ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...
Funktion | Statistik |
---|---|
sum() |
Summe |
mean() |
Arithmetischer Mittelwert |
median() |
Median |
min() |
Minimalwert |
max() |
Maximalwert |
range() |
Bereich zwischen Minimum und Maximum |
var() |
Varianz |
sd() |
Standardabweichung |
quantile() |
Quantilen |
cov() |
Kovarianz |
cor() |
(Pearsons) Korrelationskoeffizient |
summary() |
Berechnet unterschiedliche Statistiken |
Es gibt keine built-in Funktion für den Standardfehler und den Variationskoeffizienten sowie die Schiefe und Kurtosis!
summary()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
library(tidyverse) # laedt 9 Pakete
#### Eigene Funktionen
# Variantionskoeffizient
cv <- function(x) {
sd(x)/mean(x)
}
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import von CSV-Dateien
# Import des weiten (falsch strukturierten) Datensatzes --> KLAPPT NICHT
iris <- read.csv("iris.csv", sep = ";")
iris <- read.delim("iris.csv", sep = ";", header = FALSE)
# Import des in Calc transponierten (und dann als CSV-Datei gespeicherten)
# Datensatzes --> KLAPPT
iris <- read.csv("iris_transponiert.csv")
#### Datensichtung
iris
# View(iris)
head(iris)
tail(iris)
class(iris)
nrow(iris)
ncol(iris)
dim(iris)
names(iris)
typeof(iris$Sepal.Length)
typeof(iris$Species)
# Diese Funktion fasst die obigen zusammen --> IMMER VERWENDEN!
str(iris)
#### Aufgabe aus Uebungswoche 1: Daten zuerst nach Artnamen alphabetisch
# sortieren und dann innerhalb der Arten nach Kelchblattlaenge absteigend
arrange(iris, Species, desc(Sepal.Length))
# ------------ Alternative Variante (ohne Vorbehandlung in Calc) ---------------
# --> weiten Datensatz mit Funktion aus 'readr' Paket einlesen und anpassen
#### Import
iris2 <- read_delim("iris.csv", delim = ";", col_names = FALSE)
iris2
class(iris2) # ein tibble
#### Datenaufbereitung
iris2 <- t(iris2)
class(iris2)
iris2_names <- iris2[1, ]
iris2 <- iris2[-1, ]
iris2
colnames(iris2) <- iris2_names
rownames(iris2) <- NULL
iris2 <- iris2 |>
as.data.frame() |>
mutate(across(Sepal.Length:Petal.Width, as.double))
# Pruefen ob die Umwandlung richtig ist
head(iris2)
str(iris2)
# ------------------- Numerische deskriptive Statistik -------------------------
#### Berechnung verschiedener Statistiken pro Variable (hier Kronblattlaenge)
# Lageparameter
mean(iris$Petal.Length)
median(iris$Petal.Length)
# Streuungsparameter
min(iris$Petal.Length)
max(iris$Petal.Length)
range(iris$Petal.Length)
var(iris$Petal.Length)
sd(iris$Petal.Length)
sd(iris$Petal.Length)/sqrt(length(iris$Petal.Length))
cv(iris$Petal.Length) # mit eigener Funktion (siehe oben)
quantile(iris$Petal.Length, probs = c(0.25, 0.5, 0.75))
#### Berechnung der Statistiken fuer mehrere Spalten -> hier in einer Schleife
# Leere Liste erstellen
meine_statistiken <- vector("list", length = 4)
names(meine_statistiken) <- names(iris)[1:4]
# for-Schleife mit 4 Iterationen (fuer Spalte 1-4 in iris)
for (i in 1:4) {
meine_statistiken[[i]] <- c(
Min = min(iris[[i]]),
unteres_Quartil = quantile(iris[[i]], probs = 0.25),
Median = median(iris[[i]]),
Mittelwert = mean(iris[[i]]),
oberes_Quartil = quantile(iris[[i]], probs = 0.75),
Max = max(iris[[i]]),
Varianz = var(iris[[i]]),
Standardabweichung = sd(iris[[i]]),
Standardfehler = sd(iris[[i]])/sqrt(length(iris[[i]])),
Variationskoeffizient = cv(iris[[i]])
)
}
meine_statistiken
#### Shortcut-Funktion: summary()
summary(iris)
# Bei Faktoren ist die summary Anzeige anders als beim Typ 'character'
iris |>
mutate(Species = as.factor(Species)) |>
summary()
#### Eigene (gruppierte) Statistiken fuer verschiedene Spalten mit 'tidyverse'
iris |>
summarise(mean_sl = mean(Sepal.Length))
iris |>
summarise(across(Sepal.Length:Petal.Width, .fns = list(mean = mean, sd = sd)))
# Statistiken gruppiert nach Species berechnen geht fast genauso
iris |>
group_by(Species) |>
summarise(mean_sl = mean(Sepal.Length))
iris |>
group_by(Species) |>
summarise(across(Sepal.Length:Petal.Width, .fns = list(mean = mean, sd = sd)))
# ------------------- Grafische deskriptive Statistik --------------------------
#### Berechnung von Mittelwert und Standardabweichung
iris_summary <- iris |>
group_by(Species) |>
summarise(
PL_mean = mean(Petal.Length),
PL_sd = sd(Petal.Length)
) |>
# die Artnamen anpassen (hier Gattungsnamen anfuegen) und als Faktor speichern
mutate(Species = factor(paste0("Iris ", Species))) |>
# nun die Reihenfolge der Faktorstufen nach PL_mean sortieren
mutate(Species = fct_reorder(.f = Species, .x = PL_mean, .desc = TRUE))
# Datensatz pruefen
iris_summary
# Grafik erstellen mit dem 'ggplot2' Paket (in 'tidyverse enthalten')
iris_summary |>
ggplot(aes(x = Species, y = PL_mean)) +
geom_col(fill = "#004586") +
geom_errorbar((aes(ymin = PL_mean - PL_sd, ymax = PL_mean + PL_sd)),
width = 0.2) +
ylab("Blütenblattlänge (in cm)") +
xlab("Schwertlilienart (Gattung Iris)") +
theme_bw()
Beispiel der Übungsaufgabe in Woche 3
(Beim folgenden Code-Fenster sind oben rechts 2 Buttons versteckt: Fullscreen und In die Zwischenablage kopieren
\(\rightarrow\) einfach mit der Maus rüber hovern und Button wählen.)
# AUFGABE: Fuellen Sie die Luecken '...' und fuehren Sie den Code in R aus.
# Bitte vorab pruefen ob das readODS bzw. readxl Paket installiert werden muss!
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
...(tidyverse)
#### Eigene Funktionen
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import von Calc- und Excel-Dateien (ODS- und XLSX-Format)
# Import einer ODS-Datei mit dem 'readODS' Paket
kabeljau <- readODS::read_ods("DS1_W03_Streudiagramm_Kabeljau.ods",
sheet = "Daten_Visualisierung")
# Struktur anzeigen lassen
...(kabeljau)
# Import einer XLSX-Datei mit z.B. dem 'readxl' Paket
kabeljau2 <- readxl::read_excel("DS1_W03_Streudiagramm_Kabeljau.xlsx",
sheet = "Daten_Visualisierung")
# Struktur anzeigen lassen
...(kabeljau2)
#### Datensichtung und -transformation
# Anpassen der Spaltennamen
...(kabeljau) <- c("verzehr", "wachstum")
...(kabeljau) # Struktur nochmal pruefen
# Wertebereich pruefen mit der 'Zusammenfassung'-Funktion
...(kabeljau)
# ---------------------- Lineare Regression: Berechnung ------------------------
# (-> Lektion L03 in DSB-02-Datenexploration mit R)
#### Manuelle Berechnung
# Um Tipparbeit zu sparen, speichern wir die Spalten als einzelne Vektoren
x <- kabeljau... # richtige Indexierung für die Spalte 'verzehr'
y <- kabeljau... # richtige Indexierung für die Spalte 'wachstum'
# Steigungsparameter b berechnen
b <- ...(x = x, y = y)/ ...(x) # der shortcut mit der Kovarianz und Varianz
b
# Achsenabschnitt a berechnen
a <- ...(y) - b*...(x)
a
# Das Bestimmtheitsmass R^2 berechnen
y_obs <- ... # die vorhergesagten Werte
ss_gesamt <- ...( (y - ...(y))^2 ) # Summenquadrate Gesamt
ss_regression <- ...( (y_obs - ...(y))^2 ) # Summenquadrate der Regression
R2 <- round(.../..., 4) # was wird durch was geteilt?
R2
##### Zum Vergleich die Regression automatisch berechnen mit lm()
# Erstellung des Modells
mod <- lm(formula = wachstum ~ verzehr, data = kabeljau)
mod
# Ausgabe nur der beiden Koeffizienten
coef(mod)
# Ausgabe aller wichtigen Statistiken des Modells, inklusive von R^2
# (mehr dazu in Data Science 2)
summary(mod)
# ------------------- Lineare Regression: Visualisierung ----------------------
#### Visualisierung mit den Basisfunktionen (-> Lektion L02 und L03 in DSB-02)
# Sog. high-level Funktion plot()
plot(x = kabeljau$verzehr, y = kabeljau$wachstum,
pch = 15, cex = 1.2, col = "#004586",
xlab = "Verzehr/Konsum (J/g/Tag", ylab = "Wachstum (J/g/Tag")
# Sog. low-level Funktionen, die Elemente in den angezeigten Plot einfuegen
abline(a = a, b = b)
title(
main = paste0("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
sub = paste0("Bestimmtheitsmaß R^2 = ", R2)
) # (paste0() verkettet Zeichen miteinander)
#### Visualisierung mit ggplot2 (-> siehe swirl-Kurs DSB-04)
kabeljau |>
ggplot(aes(x = verzehr, y = wachstum)) + # initiert Plot
geom_point(colour = "#004586", shape = 15, size = 3) +
# Punktelemente hinzufuegen
geom_abline(slope = b, intercept = a) +
# Achsenbeschriftung anpassen und Titel hinzufuegen
labs(x = "Verzehr/Konsum (J/g/Tag", y = "Wachstum (J/g/Tag",
title = str_c("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
subtitle = str_c("Bestimmtheitsmaß R^2 = ", R2)) +
# das Layout anpassen
theme_classic()
… im swirl-Kurs werden Sie direkt an die Hand genommen und Stück für Stück angeleitet.
Siehe auch DSB cheatsheet
Basic R functions (auf Moodle).
Siehe auch DSB cheatsheet
Basic R functions (auf Moodle).
Dann machen Sie doch einfach die nächsten swirl Lektionen auch schon…
Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de
Diese Arbeit is lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.
Kurswebseite: Data Science 1