9 Streuungsmaße
Neben der Information, wo die Daten liegen, ist es oft auch von Interesse zu sagen, wie stark die Daten streuen. Es gibt eine ganze Reihe von verschiedenen Streuungsmaßen. Wir behandeln im folgenden die Varianz, die Standardabweichung, die mittlere absolute Abweichung und die Spannweite.
9.1 Varianz
Die Varianz (engl. variance, mit Betonung auf der ersten Silbe) der Daten
Wenn die Daten eine Einheit haben, z.B. in Euro gemessen werden, dann ist die Einheit der Varianz das Quadrat der Einheit, also “Quadrat-Euro”. Das ist natürlich inhaltlich nicht interpretierbar. Trotzdem können wir sagen, dass
Leider gibt es noch eine zweite Definition der Varianz, die im Zusammenhang mit statistischen Schätzungen eine Rolle spielt. Sie lautet
In diesem Kurs ist mit Varianz immer die Populationsvarianz
In R gibt es die Funktion var
. Mit ihr berechnet man für einen Datenvektor die Stichprobenvarianz
Die Varianz spielt eine besonders wichtige Rolle im Portfoliomanagement und in der Finanzmarktökonometrie, darum wird als Beispiel ein Datensatz mit Aktienkursen betrachtet.
Beispiel:
Wir laden den Datensatz aktienkurse
, der mit Hilfe des Pakets tidyquant
erzeugt wurde und von der Learnweb-Seite heruntergeladen werden kann. Die Option show_col_types=FALSE
verhindert, dass es eine Rückmeldung über die automatische Bestimmung der Datentypen gibt. Wenn man diese Information haben möchte, kann man diese Option entweder weglassen oder auf TRUE
setzen.
library(tidyverse)
<- read_csv("../data/aktienkurse.csv",
kurs show_col_types = FALSE)
tail(kurs)
# A tibble: 6 × 5
date BMW VOW ALV MUV
<date> <dbl> <dbl> <dbl> <dbl>
1 2025-01-17 77.1 95.4 306. 498
2 2025-01-20 79.3 96.8 306. 498
3 2025-01-21 79.3 96.8 306. 498
4 2025-01-22 78.2 96.3 306. 522.
5 2025-01-23 77.4 98.3 311. 522
6 2025-01-24 77.4 98.3 311. 522
Es handelt sich um die Tageskurse der Aktiengesellschaften BMW, Volkswagen (VOW) Allianz (ALV) und Münchener Rückversicherung (MUV). Die Kurse wurden durch den Datenprovider so angepasst, dass Dividendenzahlungen, Aktiensplits etc. in den Kursverlauf eingerechnet wurden. Sei lag
erzeugt. Der folgende Code erzeugt die Renditen der vier Aktien und fügt sie dem Dataframe hinzu:
<- kurs %>%
kurs mutate(r_BMW = (BMW-lag(BMW))/lag(BMW)*100,
r_VOW = (VOW-lag(VOW))/lag(VOW)*100,
r_ALV = (ALV-lag(ALV))/lag(ALV)*100,
r_MUV = (MUV-lag(MUV))/lag(MUV)*100)
Da für den ersten Tag kein Vortag existiert, werden die Renditen für den ersten Tag auf “missing” gesetzt, sie haben den Wert NA
(not available). Wir löschen die erste Beobachtung mit dem filter
-Befehl aus dem Dataframe.
<- kurs %>% filter(!is.na(r_BMW)) kurs
Mit diesem Befehl werden alle Zeilen gelöscht, in denen die Rendite von BMW fehlt. Das ist in diesem Datensatz nur die erste Zeile. Anstelle von r_BMW
hätte man auch eine der anderen Renditen einsetzen können, weil es in diesem Datensatz keinen anderen Tage mit fehlenden Werten gibt.
Nun berechnen wir für jede Aktie die Varianz der Tagesrenditen.
%>% summarise(v_BMW = var(r_BMW),
kurs v_VOW = var(r_VOW),
v_ALV = var(r_ALV),
v_MUV = var(r_MUV))
# A tibble: 1 × 4
v_BMW v_VOW v_ALV v_MUV
<dbl> <dbl> <dbl> <dbl>
1 3.10 4.81 2.09 2.24
In dem betrachteten Zeitraum hatte die Volkswagenaktie die höchste Varianz der Tagesrenditen, war also die risikoreichste Aktie. Die Renditen der beiden Versicherungsgesellschaften Allianz und Münchener Rück haben deutlich weniger geschwankt.
In der Funktion var
kann man die Option na.rm=TRUE
setzen, wenn in den Daten fehlende Werte vorkommen. Sie werden dann für die Berechnung der Varianz entfernt, so wie wir es schon bei den Lagemaßen kennen gelernt haben.
Die Varianzfunktion var
kann auch direkt auf einen Datenvektor angewendet werden - ohne die summarise
-Funktion. Für die BMW-Aktie würde das so aussehen:
var(kurs$r_BMW)
[1] 3.101761
bzw. wenn fehlende Werte vorkommen
var(kurs$r_BMW, na.rm=TRUE)
[1] 3.101761
9.2 Standardabweichung
Die Standardabweichung (engl. standard deviation)
Analog zur Populationsvarianz (bzw. deskriptiven Varianz) sprechen wir von der Populationsstandardabweichung (oder deskriptiven Standardabweichung) und von der Stichprobenstandardabweichung (oder korrigierten Standardabweichung), wenn explizit deutlich gemacht werden soll, ob die Varianz mit dem Nenner
Die Funktion zur Berechnung der Standardabweichung in R ist sd
(für standard deviation). Es handelt sich um die Stichprobenstandardabweichung (also mit dem Nenner
Beispiel:
Für die vier Aktien aus dem Beispiel von oben erhalten wir
%>% summarise(s_BMW = sd(r_BMW),
kurs s_VOW = sd(r_VOW),
s_ALV = sd(r_ALV),
s_MUV = sd(r_MUV))
# A tibble: 1 × 4
s_BMW s_VOW s_ALV s_MUV
<dbl> <dbl> <dbl> <dbl>
1 1.76 2.19 1.44 1.50
Selbstverständlich kann man auch hier für einen Datenvektor, der aus dem Dataframe herausgezogen wurde, die Standardabweichung berechnen, ohne die summarise
-Funktion auf den Dataframe anzuwenden:
sd(kurs$r_ALV)
[1] 1.444867
Wie bei praktisch allen R-Funktionen zur Berechnung von Kennzahlen gibt es auch hier die Möglichkeit, fehlende Werte durch die Option na.rm=TRUE
für die Berechnung zu entfernen.
sd(kurs$r_ALV, na.rm=TRUE)
[1] 1.444867
9.3 Lineare Transformationen
Wir haben im Kapitel über Lagemaße gesehen, dass der Mittelwert ein linearer Operator ist. Wenn alle Daten linear transformiert werden, ändert sich der Mittelwert gemäß der gleichen linearen Transformation. Das gilt für die Varianz und die Standardabweichung nicht.
Wir betrachten wieder die lineare Transformation
Die Antwort lässt sich Schritt für Schritt herleiten, wobei wir das Ergebnis
Da die Standardabweichung die positive Wurzel aus der Varianz ist, ergibt sich sofort
9.4 Median der absoluten Abweichungen
Der Median der absoluten Abweichungen (manchmal auch mittlere absolute Abweichung, engl. median absolute deviation) ist definiert als der Median der absoluten Abstände der Werte mad
den Median der absoluten Abweichungen, allerdings standardmäßig mit einem zusätzlichen Faktor, den wir für unsere Definition auf 1 setzen müssen. Der Befehl lautet dann für einen Datenvektor x
mad(x, constant = 1)
Beispiel:
Angewendet auf den Dataframe kurs
ergibt sich der Median der absoluten Abweichungen der vier Renditen als
%>% summarise(MAD_BMW = mad(r_BMW, constant=1),
kurs MAD_VOW = mad(r_VOW, constant=1),
MAD_ALV = mad(r_ALV, constant=1),
MAD_MUV = mad(r_MUV, constant=1))
# A tibble: 1 × 4
MAD_BMW MAD_VOW MAD_ALV MAD_MUV
<dbl> <dbl> <dbl> <dbl>
1 0.882 1.10 0.656 0.681
An diesen Werten erkennt man wieder, dass die Rendite der beiden Versicherungsunternehmen weniger streut als die der Autounternehmen.
9.5 Spannweite
Die Spannweite (engl. range) ist ein sehr grobes Streuungsmaß. Sie ist definiert als der Abstand des größten Werts range
. Sie liefert als Output einen Vektor der Länge 2, das erste Element ist der kleinste Wert diff
berechnen kann oder noch einfacher über die Differenz max(x)-min(x)
.
Beispiel:
Für die vier Aktien sind die kleinsten und größten Werte:
%>% summarise(min_BMW = min(r_BMW),
kurs max_BMW = max(r_BMW),
min_VOW = min(r_VOW),
max_VOW = max(r_VOW),
min_ALV = min(r_ALV),
max_ALV = max(r_ALV),
min_MUV = min(r_MUV),
max_MUV = max(r_MUV))
# A tibble: 1 × 8
min_BMW max_BMW min_VOW max_VOW min_ALV max_ALV min_MUV max_MUV
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -13.0 14.5 -17.1 15.8 -15.3 15.8 -17.7 20.2
Obwohl die Streuung der BMW-Rendite sowohl bei der Messung durch die Varianz oder Standardabweichung als auch bei der Messung durch die mittlere absolute Abweichung größer war als die Streuung der Rendite von Allianz oder Münchner Rück, sind die extremen Werte geringer. Die BMW-Renditen lagen alle im dem Intervall [-13,14.5], der stärkste Rückgang der Münchener-Rück-Aktie betrug hingegen sogar -17.7.
Die Spannweiten der Aktien sind:
%>% summarise(Range_BMW = diff(range(r_BMW)),
kurs Range_VOW = diff(range(r_VOW)),
Range_ALV = diff(range(r_ALV)),
Range_MUV = diff(range(r_MUV)))
# A tibble: 1 × 4
Range_BMW Range_VOW Range_ALV Range_MUV
<dbl> <dbl> <dbl> <dbl>
1 27.4 33.0 31.1 37.9