8  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.

8.1 Varianz

Die Varianz (engl. variance, mit Betonung auf der ersten Silbe) der Daten \(x_1,\ldots,x_n\) ist definiert als \[ s^2 = \frac{1}{n}\sum_{i=1}^n (x_i-\bar x)^2 \] Da Quadratterme addiert werden, kann die Varianz nie negativ sein. Sie ist strikt positiv, wenn nicht alle Werte \(x_i\) gleich sind. Eine alternative Schreibweise für die Varianz erhält man, wenn man die binomische Formel auflöst und die Terme geeignet zusammenfasst. Es ergibt sich dann \[ s^2 = \left(\frac{1}{n}\sum_{i=1}^n x_i^2\right) - \bar x^2 \] So wie der Mittelwert kann auch die Varianz nur für metrische Variablen sinnvoll berechnet werden.

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 \(x_1,\ldots,x_n\) stärker streuen als \(y_1,\ldots,y_m\), wenn \(s_X^2\) größer ist als \(s_Y^2\). Trotz ihrer schlechten Interpretierbarkeit ist die Varianz ein besonders wichtiges Streuungsmaß, denn sie hat viele nützliche Eigenschaften, auf die wir im Laufe des Semesters zurückkommen werden.

Leider gibt es noch eine zweite Definition der Varianz, die im Zusammenhang mit statistischen Schätzungen eine Rolle spielt. Sie lautet \[ \hat\sigma^2=\frac{1}{n-1}\sum_{i=1}^n (x_i-\bar x)^2 \] und unterscheidet sich nur durch den anderen Vorfaktor (nämlich mit \(n-1\) im Nenner anstelle von \(n\)). Offenbar gilt \[ s^2 = \frac{n-1}{n}\hat\sigma^{2}, \qquad \hat\sigma^{2} = \frac{n}{n-1}s^{2}. \] Will man verbal deutlich machen, welche dieser beiden Varianzdefinitionen man meint, nennt man \(s^2\) die Populationsvarianz (oder deskriptive Varianz) und \(\hat\sigma^{2}\) die Stichprobenvarianz (oder korrigierte Varianz).

In diesem Kurs ist mit Varianz immer die Populationsvarianz \(s^2\) gemeint.

In R gibt es die Funktion var. Mit ihr berechnet man für einen Datenvektor die Stichprobenvarianz \(\hat\sigma^{2}\). Für die Populationsvarianz gibt es keine R-Standardfunktion. Da der Unterschied zwischen den beiden Varianzdefinitionen aber vernachlässigbar ist, wenn viele Beobachtungen vorliegen (d.h. wenn \(n\) groß ist), ignorieren wir den Unterschied meist einfach.

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 unserer Fakultätslizenz aus der Datenbank Refinitiv Eikon herausgezogen wurde. 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)
kurs <- read_csv("../data/aktienkurse.csv", 
                 show_col_types = FALSE)
tail(kurs)
# A tibble: 6 × 5
  date         BMW   VOW   ALV   MUV
  <date>     <dbl> <dbl> <dbl> <dbl>
1 2024-02-23  107.  124   246.  423.
2 2024-02-26  107.  123.  246.  422.
3 2024-02-27  108.  124.  248   422.
4 2024-02-28  109.  126.  249.  425.
5 2024-02-29  109.  125.  254.  430.
6 2024-03-01  110.  119.  252.  425.

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 \(K_t\) der Kurs einer Aktie am Tag \(t\), dann ist die Rendite (in Prozent) \[ R_t = \frac{K_t-K_{t-1}}{K_{t-1}}\times 100. \] Der um einen Tag verzögerte Kurs \(K_{t-1}\) wird in R mit der Funktion 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 <- kurs %>% filter(!is.na(r_BMW))

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.

kurs %>% summarise(v_BMW = var(r_BMW),
                   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.09  4.72  2.18  2.28

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.091846

bzw. wenn fehlende Werte vorkommen

var(kurs$r_BMW, na.rm=TRUE)
[1] 3.091846

8.2 Standardabweichung

Die Standardabweichung (engl. standard deviation) \(S\) ist definiert als die (positive) Wurzel aus der Varianz, d.h. \[ s=\sqrt{s^2} \] Die Einheit der Standardabweichung entspricht der Einheit der Daten, also z.B. Euro. Die Standardabweichung kann als typische Größenordnung der Abweichung vom Mittelwert interpretiert werden. In der Finanzmarktökonometrie nennt man die Standardabweichung von Renditen meist Volatilität.

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 \(n\) oder \(n-1\) berechnet wird.

Die Funktion zur Berechnung der Standardabweichung in R ist sd (für standard deviation). Es handelt sich um die Stichprobenstandardabweichung (also mit dem Nenner \(n-1\) in der Varianz). Auch hier gilt, dass der Unterschied zwischen den beiden Definitionen vernachlässigbar ist, wenn viele Beobachtungen vorliegen (\(n\) groß). Wir werden den Unterschied darum meist schlicht und einfach ignorieren.

Beispiel:

Für die vier Aktien aus dem Beispiel von oben erhalten wir

kurs %>% summarise(s_BMW = sd(r_BMW),
                   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.17  1.48  1.51

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.477294

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.477294

8.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 \[ y_i = ax_i+b \] für reelle \(a\) und \(b\). Wie verhält sich die Varianz \(s_Y^2\) zu der Varianz \(s_X^2\)?

Die Antwort lässt sich Schritt für Schritt herleiten, wobei wir das Ergebnis \(\bar y=a\bar x+b\) nutzen, \[\begin{align*} s_Y^2 &= \frac{1}{n}\sum_{i=1}^n (y_i-\bar y)^2 \\ &= \frac{1}{n}\sum_{i=1}^n (ax_i+b-(a\bar x+b))^2 \\ &= \frac{1}{n}\sum_{i=1}^n (ax_i-a\bar x)^2 \\ &= \frac{1}{n}\sum_{i=1}^n a^2(x_i-\bar x)^2 \\ &= a^2\frac{1}{n}\sum_{i=1}^n (x_i-\bar x)^2 \\ &= a^2 s_X^2 \end{align*}\] Die Varianz der \(y_1,\ldots,y_n\) ergibt sich also, indem man die Varianz der \(x_1,\ldots,x_n\) mit dem Quadrat des multiplikativen Faktors \(a\) multipliziert. Beachten Sie, dass durch das Quadrieren auch bei einem negativen \(a\) die Varianz positiv bleibt. Multipliziert man alle Beobachtungen mit \(a=-1\), ändert sich die Varianz nicht, weil \((-1)^2=1\) ist. Die Verschiebung um \(b\) hat keinerlei Einfluss auf die Varianz.

Da die Standardabweichung die positive Wurzel aus der Varianz ist, ergibt sich sofort \[ s_Y=|a|\cdot s_X. \] Daraus folgt, dass die Einheit der Varianz von \(Y\) wiederum die Einheit der Beobachtungen \(x_1,\ldots,x_n\) ist, z.B. Euro.

8.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 \(x_i\) vom Median \(\tilde x_{0.5}\), d.h. \[ MAD = Median(|x_1 - \tilde x_{0.5}|,\ldots,|x_n - \tilde x_{0.5}|). \] In R berechnet die Funktion 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

kurs %>% summarise(MAD_BMW = mad(r_BMW, constant=1),
                   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.876    1.04   0.663   0.688

An diesen Werten erkennt man wieder, dass die Rendite der beiden Versicherungsunternehmen weniger streut als die der Autounternehmen.

8.5 Spannweite

Die Spannweite (engl. range) ist ein sehr grobes Streuungsmaß. Sie ist definiert als der Abstand des größten Werts \(x_{max}\) vom kleinsten Wert \(x_{min}\), \[ Range = x_{max}-x_{min}. \] In R berechnet man die Spannweite mit Hilfe der Funktion range. Sie liefert als Output einen Vektor der Länge 2, das erste Element ist der kleinste Wert \(x_{min}\), das zweite ist \(x_{max}\). Die Größe \(Range\) ergibt sich dann als die Differenz, die man z.B. mit Hilfe der Funktion 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:

kurs %>% summarise(min_BMW = min(r_BMW),
                   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   -19.8    19.0   -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:

kurs %>% summarise(Range_BMW = diff(range(r_BMW)),
                   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      38.9      31.1      37.9