...

Deskriptive Statistik und Datenvisualisierung in R

In diesem Beitrag geht es um Deskriptive Statistik und Visualisierung in R. R ist eine freie und unglaublich vielseitige Programmiersprache, die Dir alles an die Hand gibt, um Daten nicht nur statisch auszuwerten, sondern auch eindrucksvoll zu visualisieren.

In diesem Blogpost lernst Du, welche deskriptiven Kennzahlen wichtig sind und wie Du sie in R berechnest. Außerdem schauen wir uns Visualisierungsmöglichkeiten in R an – von den traditionellen plot()-Funktionen bis hin zum eleganten ggplot2.

Wir gehen dabei ganz praxisnah vor: Schritt für Schritt und mit leicht anpassbaren Code-Beispielen. Und das Ganze in der Du-Form, weil wir es hier gemütlich-unkompliziert angehen wollen.

Wofür Deskriptive Statistik?

Deskriptive Statistik beschäftigt sich damit, Daten kompakt und übersichtlich darzustellen, damit Du schnell verstehst, was in Deinem Datensatz los ist. Dazu gehören:

  • Lageparameter (z.B. Mittelwert $ \bar{x} $, Median, Modus)
  • Streuungsmaße (z.B. Standardabweichung $s$, Varianz $s^2$, Spannweite, Interquartilsabstand)
  • Zusammenfassende Kennzahlen für Verteilungen (Schiefe, Wölbung)
  • Tabellarische und grafische Übersicht (Häufigkeitstabellen, Histogramme, Boxplots etc.)

Gerade wenn Du später hypothesengeleitete Analysen (z.B. Regressionen, Signifikanztests) durchführen willst, ist eine solide explorative Datenanalyse das A und O. Nur so merkst Du schnell, ob in Deinen Daten Ausreißer schlummern, ob die Verteilungen plausibel sind, oder ob Du vielleicht Probleme mit fehlenden Werten hast.

Grundlegende Datentypen und Datenstrukturen in R

Bevor wir loslegen mit Kennzahlen, müssen wir kurz klären, in welchen Strukturen Daten in R vorliegen.

Datentyp bezeichnet die Art von Werten, z.B. numerisch (Zahlen), Zeichenketten (Strings) oder logische Werte (TRUE/FALSE).

In R gibt es u.a.:

  • numeric: reelle Zahlen (z.B. 3.1415)
  • integer: ganze Zahlen (z.B. 42)
  • character: Zeichenketten (z.B. „Hallo“)
  • logical: TRUE oder FALSE

Datenstruktur beschreibt die Art und Weise, wie Werte in R organisiert sind.

Typische Strukturen:

  • Vektoren (1D [Dimension])
  • Matrizen (2D, rein numerisch)
  • Data Frames (2D, können Mischtypen enthalten)
  • Listen (sehr flexibel, können alles Mögliche enthalten)

Beispiel: Erstelle einen kleinen Vektor

mein_vektor <- c(3, 7, 2, 9, 12)
mein_vektor
# [1] 3 7 2 9 12

Beispiel: Einfaches Data Frame

# Wir definieren zwei Vektoren
alter <- c(25, 30, 22, 29)
groesse <- c(170, 175, 168, 180)

# Wir machen ein data.frame
df <- data.frame(alter, groesse)
df
# alter groesse
#1 25 170
#2 30 175
#3 22 168
#4 29 180

Jetzt haben wir ein Data Frame mit 4 Zeilen (Probanden) und 2 Spalten (Alter und Größe).

Wichtige deskriptive Kennzahlen

Du hast Daten. Und jetzt? Im ersten Schritt willst Du sie beschreiben. Das heißt, Du schaust: Wo liegt mein Schwerpunkt (z.B. Mittelwert) und wie stark streuen die Werte (z.B. Varianz)?

Lageparameter

Lageparameter geben an, wo sich Daten auf der Zahlengeraden „zentrieren“. Dazu gehören u.a. Mittelwert, Median und Modus.

  1. Mittelwert ($\bar{x}$)
    • Wird berechnet als $\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i$
    • Sehr verbreitet, reagiert allerdings stark auf Ausreißer.
  2. Median
    • Teilt die geordneten Daten in zwei Hälften (50% sind kleiner/gleich, 50% sind größer/gleich).
    • Unempfindlicher gegenüber Ausreißern.
  3. Modus
    • Am häufigsten vorkommender Wert. Vor allem interessant bei kategorialen Daten, z.B. „Rot, Blau, Blau, Blau, Grün …“ $\rightarrow$ Modus = „Blau“.

R-Code für Lageparameter

Nehmen wir an, Du hast folgenden Vektor:

werte <- c(5, 2, 9, 9, 7, 12, 2, 9)
mean(werte) # Mittelwert
# [1] 6.875
median(werte) # Median
# [1] 8
# Modus? R hat keinen eingebauten Modus-Befehl,
# wir koennten uns behelfen:
modus <- names(sort(table(werte), decreasing=TRUE))[1]
modus
# [1] "9"

Ergebnis: Der Mittelwert ist $6.875$, der Median ist $8$, und der am häufigsten vorkommende Wert (Modus) ist „9“.

Streuungsmaße

Streuungsmaße geben an, wie stark die Daten um ihre Mitte variieren (streuen). Standardabweichung, Varianz, Spannweite und Interquartilsabstand sind wichtige Beispiele.

  1. Varianz ($s^2$)
    • Misst die durchschnittliche quadratische Abweichung vom Mittelwert:
    s2=1n−1∑i=1n(xi−xˉ)2s^2 = \frac{1}{n-1} \sum_{i=1}^n (x_i – \bar{x})^2s2=n−11​i=1∑n​(xi​−xˉ)2
  2. Standardabweichung ($s$)
    • Quadratwurzel der Varianz: $s = \sqrt{s^2}$
    • Praktisch, weil sie in den selben Einheiten misst wie die Daten selbst.
  3. Spannweite (Range)
    • Einfach: Größter Wert minus kleinster Wert. Sagt nicht viel über Verteilung, aber zeigt Extreme.
  4. Interquartilsabstand (IQR)
    • Differenz zwischen 3. Quartil (75%-Quantil) und 1. Quartil (25%-Quantil).
    • Robuster gegen Ausreißer als die Standardabweichung.

R-Code für Streuungsmaße

sd(werte)       # Standardabweichung
var(werte) # Varianz
range(werte) # Min und Max
IQR(werte) # Interquartilsabstand
  • sd(werte) liefert die Standardabweichung.
  • var(werte) die Varianz.
  • range(werte) ein Vektor mit (min, max). Daraus kann man die Spannweite berechnen (max-min).
  • IQR(werte) liefert den Interquartilsabstand.

Zusammenfassende Funktionen

R hat einige bequeme Befehle, die Dir verschiedene Kennzahlen auf einen Schlag ausgeben, z.B. summary().

rKopierenBearbeitensummary(werte)
# Min. 1st Qu.  Median    Mean  3rd Qu.    Max. 
# 2.00    2.75    8.00    6.88    9.00   12.00

(Beachte, dass Du hier in einem Schritt die Minima, Quartile, Median, Mean und Max siehst.)

Grafische Grundlagen mit Base R

Jetzt geht’s an die Visualisierung! Du möchtest Dir ein Bild von Deinen Daten machen? Mit R kein Problem. Zunächst schauen wir uns die sogenannten Base Graphics an, also die Funktionen, die „von Haus aus“ in R stecken.

Balkendiagramm und Histogramm

Ein Histogramm zeigt die Häufigkeitsverteilung von metrischen Daten, indem der Wertebereich in Klassen (Bins) eingeteilt wird und für jede Klasse die Häufigkeit bzw. relative Häufigkeit in Säulenform angezeigt wird.

  • Histogramm: super, um Verteilungen zu erkennen (Gipfel, Schiefe, usw.).
  • Balkendiagramm (barplot): eher bei kategorialen Daten.

Beispiel:

# Kleiner Datensatz
x <- c(2,2,3,3,3,4,4,5,6,7,9,9,10)

# Histogramm
hist(x,
main="Histogramm meiner Werte",
xlab="Werte",
col="lightblue")
  • main: Titel
  • xlab und ylab: Achsenbeschriftungen
  • col: Farbe der Säulen

Boxplot

Definition: Boxplot

Ein Boxplot (Kastendiagramm) stellt Median, Quartile und Ausreißer in komprimierter Form dar. Der Kasten geht vom 1. Quartil (25% Quantil) bis zum 3. Quartil (75% Quantil). Die dicke Linie in der Box ist der Median.

boxplot(x, 
main="Boxplot meiner Werte",
col="orange",
horizontal=TRUE)

Siehst Du Ausreißer (werden meist als Punkte oder Sternchen dargestellt)? Wie breit ist der Kasten? All das sind wichtige Anhaltspunkte in der Explorationsphase!

Streudiagramm (Scatterplot)

Willst Du zwei metrische Variablen gegeneinander plotten, kommt plot(x, y) ins Spiel:

# Beispiel: x als Alter, y als Größe
alter <- c(25, 30, 22, 29, 28)
groesse <- c(170, 175, 168, 180, 178)
plot(alter, groesse,
main="Alter vs. Größe",
xlab="Alter (Jahre)",
ylab="Größe (cm)",
pch=19,
col="darkgreen")
  • pch=19: gefüllte Kreise
  • col="darkgreen": dunkles Grün als Punktfarbe

Erweiterte Visualisierung mit ggplot2

So praktisch die Base Graphics auch sind, irgendwann sehnst Du Dich vielleicht nach mehr Eleganz und Flexibilität. Hier kommt ggplot2 (entwickelt von Hadley Wickham) ins Spiel. Das Grammar of Graphics-Konzept erlaubt Dir, Plots auf mehreren Layern aufzubauen – sehr mächtig, gerade für komplexere Diagramme.

Die Grammar of Graphics ist ein formales System, das besagt, dass jede Grafik aus Datensätzen, geometrischen Elementen (z.B. Punkte, Balken) und ästhetischen Zuordnungen (z.B. x-Achse = Alter, y-Achse = Größe) besteht. ggplot2 setzt dieses Konzept in R um.

Installation und erstes Plotbeispiel

install.packages("ggplot2")  # einmalig
library(ggplot2)

# Beispiel: mpg-Datensatz (enthalten in ggplot2)
head(mpg)
# manufacturer model displ year cyl trans ...

ggplot(data=mpg,
aes(x=displ, y=hwy)) +
geom_point()
  • aes(x=, y=) definiert die „ästhetische Zuordnung“, also welche Variable auf x bzw. y soll.
  • geom_point() sagt: „Zeige Punkte an“.

Ergebnis: Du bekommst einen Scatterplot, in dem Du schnell siehst, wie sich displ (Hubraum) auf der x-Achse zur hwy (Kraftstoffeffizienz auf der Autobahn) auf der y-Achse verhält.

Variablen in Farben und Facetten

ggplot(data=mpg, aes(x=displ, y=hwy, color=class)) + 
geom_point() +
facet_wrap(~class)
  • color=class: Die Punkte bekommen je nach Autoklasse (z.B. „suv“) eine andere Farbe.
  • facet_wrap(~class): Wir teilen den Plot in mehrere Unterplots auf, einen pro Klasse.

Boxplot in ggplot2

ggplot(data=mpg, aes(x=class, y=hwy, fill=class)) + 
geom_boxplot() +
theme_bw() +
labs(title="Boxplot von Klassen vs. Kraftstoffeffizienz")
  • fill=class: Färbe die Box nach Autoklasse.
  • theme_bw(): Einfaches weiß-schwarzes Theme (mag ich sehr).

Explorative Datenanalyse in R

Weil Du erst mal hypothesenfrei schauen möchtest: „Was geht in meinen Daten ab?“ Vielleicht stellst Du fest, dass manche Werte auffällig groß sind, oder dass bestimmte Gruppen ganz anders verteilt sind als vermutet.

Typische Schritte:

  1. Datentyp checken (numeric, factor, etc.)
  2. Missing Values prüfen
  3. Deskriptive Kennzahlen berechnen: summary(data)
  4. Diagramme malen (Histogramme, Boxplots, Scatterplots)
  5. Ausreißer untersuchen
  6. Gegebenenfalls Daten transformieren (z.B. log-Transformation, $ \log(x) $)

Beispiel-Workflow

# 1. Daten laden
my_data <- read.csv("mein_datensatz.csv")

# 2. Überblick
str(my_data) # Struktur
summary(my_data) # Schnell-Statistik

# 3. Plotten
hist(my_data$var1, main="Histogram var1")
boxplot(my_data$var2 ~ my_data$gruppe)
  • str() zeigt Dir die Variablen und deren Datentyp an.
  • summary() liefert Min, 1st Qu., Median, Mean, 3rd Qu. und Max für jede numerische Variable.
  • Mit boxplot(var2 ~ gruppe) vergleichst Du die Verteilung von var2 über verschiedene Gruppen (z.B. „männlich“ / „weiblich“ oder unterschiedliche Experimentalgruppen).

Beispielszenarien und R-Code

Lass uns ein kleines Szenario konstruieren: Angenommen, wir haben Daten zu Personen, in denen Gewicht, Körpergröße und Alter festgehalten sind. Zusätzlich haben wir ein Geschlecht (m/w) als kategoriale Variable.

Datensatz simulieren

(Keine echten Daten, rein fiktiv – aber für die Demonstration ideal.)

set.seed(123)  # Reproduzierbarkeit

n <- 100
Geschlecht <- sample(c("m","w"), n, replace=TRUE)
Alter <- round(rnorm(n, mean=35, sd=10))
Groesse <- ifelse(Geschlecht=="m",
round(rnorm(n, mean=175, sd=7)),
round(rnorm(n, mean=165, sd=6)))
Gewicht <- ifelse(Geschlecht=="m",
round(rnorm(n, mean=78, sd=10)),
round(rnorm(n, mean=65, sd=8)))

mydata <- data.frame(Geschlecht, Alter, Groesse, Gewicht)
head(mydata)

Hier haben wir für männliche Probanden ein anderes Mittel für Körpergröße und Gewicht genommen als für weibliche, um etwas Realismus reinzubringen. Nun kannst Du z.B. summary(mydata) aufrufen:

summary(mydata)
# Geschlecht Alter Groesse Gewicht
# m:52 Min. :13.00 Min. :149 Min. :45
# w:48 1st Qu.:28.00 1st Qu.:165 1st Qu.:60
# Median :34.00 Median :169 Median :68
# Mean :34.52 Mean :170 Mean :72
# 3rd Qu.:41.75 3rd Qu.:175 3rd Qu.:81
# Max. :62.00 Max. :193 Max. :97

Du siehst: 52 Männer, 48 Frauen. Alter reicht von 13 bis 62 Jahren. Körpergröße geht von 149 bis 193 cm.

Diagramme erstellen

Boxplot nach Geschlecht

boxplot(Groesse ~ Geschlecht, data=mydata, 
main="Vergleich Groesse nach Geschlecht",
col=c("skyblue","lightpink"))

Hier erstellst Du zwei Boxplots nebeneinander: Männer vs. Frauen.

Scatterplot: Größe vs. Gewicht

plot(mydata$Groesse, mydata$Gewicht,
xlab="Groesse (cm)",
ylab="Gewicht (kg)",
main="Scatterplot: Groesse vs. Gewicht",
pch=19, col="steelblue")

Eventuell siehst Du, dass größere Menschen tendenziell mehr wiegen.

Gleicher Scatterplot in ggplot2

library(ggplot2)
ggplot(mydata, aes(x=Groesse, y=Gewicht, color=Geschlecht)) +
geom_point(size=2) +
theme_minimal() +
labs(title="Größe vs. Gewicht nach Geschlecht")

Schön bunt, und wir erkennen die Geschlechter in unterschiedlichen Farben.

Kennzahlen pro Geschlecht

Wie errechnest Du z.B. den Mittelwert pro Geschlecht? Ein Weg ist, tapply zu nutzen:

tapply(mydata$Gewicht, mydata$Geschlecht, mean)
# m w
# 77.96154 64.77083

Also Männer ø ca. 78 kg, Frauen ø ca. 65 kg (in diesem fiktiven Beispiel).

Q&A – Fragen und Antworten

Zum Schluss ein kurzer Quiz- und Übungsteil. Das ist ein fester Bestandteil, damit Du Dein Wissen gleich anwenden und überprüfen kannst.

Frage 1:

Was bedeutet deskriptive Statistik?

  • A: Statistik, die sich auf die Zusammenfassung und Beschreibung von Daten konzentriert.
  • B: Eine Methode, bei der Hypothesentests durchgeführt werden, um p-Werte zu berechnen.
  • C: Eine spezielle Regressionsform in R.

Beispielantwort: Richtig wäre A: Deskriptive Statistik fasst Daten zusammen, ohne gleich (p-Wert-)Hypothesentests durchzuführen.


Frage 2:

Wofür wird ein Boxplot verwendet?

  • A: Um Korrelationen zu testen
  • B: Um Lage- und Streuungsinformationen in einem Diagramm zusammenzufassen
  • C: Um die Fläche zwischen zwei Funktionskurven zu berechnen

Antwort: B. Boxplots zeigen Median, Quartile und Ausreißer – perfekt zur Datenexploration.


Frage 3:

Wie heißt das R-Paket, das auf dem Grammar of Graphics-Ansatz basiert und besonders flexible Grafiken ermöglicht?

  • A: dplyr
  • B: ggplot2
  • C: tidyr

Antwort: B (ggplot2).


Frage 4:

Nenne einen robusten Lageparameter, der wenig durch Ausreißer beeinflusst wird.
Lösungsvorschlag: Der Median.


Frage 5:

Was ist die Standardabweichung? (in Deinen eigenen Worten)
Beispielantwort: Die Standardabweichung ist die Quadratwurzel der Varianz. Sie zeigt, wie stark die Daten im Durchschnitt um ihren Mittelwert streuen, in derselben Einheit wie die Originaldaten.