17  Daten beschreiben

ie Funktionen zur Ermittlung der Kennzahlen von Datenrahmen werden durch die Bibliothek rstatix bereitgestellt. rstatix ist eine Bibliothek, die die am häufigsten verwendeten statistischen Operationen und Tests in Abstimmung mit den tidyverse-Bibliotheken bereitstellt.

Achtung

rstatix ist eine eigenständige Bibliothek und muss separat mit install.packages() oder pak::pkg_install() installiert werden.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rstatix)

Attache Paket: 'rstatix'

Das folgende Objekt ist maskiert 'package:stats':

    filter

17.1 Universelle Kennwerte

In R ergibt sich dieser Wert direkt aus dem Datenrahmen: Der Stichprobenumfang entspricht der Anzahl der Datensätze in unserem Stichprobenobjekt. Diese Anzahl bestimmen wir mit Hilfe der count()-Funktion oder innerrhalb einer Transforrmation mit mutate() mit Hilfe der n()-Funktion.

Beispiel 17.1 (Beispieldaten für die universellen Kennwerte)  

stichprobe = read_csv2('data_ab_missing.csv')
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 156 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
chr (1): Angebot
dbl (3): Punkte, Interesse, Bedeutung

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Der Stichprobenumfang ist einer der drei allgemeinen Kennwerte, die jede Stichprobe beschreiben. Wir bestimmen zuerst die numerischen Kennwerte unserer Beispielstichprobe.

Wichtig

Die beiden universellen Kennwerte werden beim Import ebenfalls angezeigt. Diese Werte stehen für das automatisierte Reporting nicht zur Verfügung. Deshalb müssen diese Kennwerte noch einmal bestimmt werden.

# Stichprobenumfang
stichprobe |> 
    count() |> 
    pull() -> stichprobenumfang

stichprobenumfang
[1] 156
stichprobe |> 
    names() |> 
    length()
[1] 4

Dabei erkennen wir, dass der Stichprobenumfang 156 beträgt. Wir erkennen zusätzlich, dass wir 4 Vektoren in unserem Stichprobenobjekt vorliegen haben. Die Funktion dim() funktioniert auch für Datenrahmen, so dass die beiden Kennwerte auch mit dieser Funktion bestimmt werden können. Das Ergebnis dim() Funktion gibt als ersten Wert immer den Stichprobenumfang und als zweiten Wert den Umfang der Umfang der Vektoren zurück.

stichprobe |> 
    dim()
[1] 156   4

17.2 Variablenumfang und fehlende Werte

Neben dem Stichprobenumfang werden zusätzlich die Variablenumfänge ermittelt. Der Variablenumfang bezeichnet die Anzahl der gemessenen Merkmalsausprägungen. Damit ist die Gesamtzahl der gemessenen Werte für ein Merkmal in einem Vektor gemeint. Für diesen Wert müssen die nicht vorhandene Werte aus der Variable entfernt werden. Diese Werte sind in R mit dem Wert NA gekennzeichnet.

Die NA-Werte werden in R mithilfe der drop_na()-Funktion aus einem Datenrahmen entfernt. Die Funktion drop_na() entfernt alle Datensätze, in denen ein Vektor keinen Wert enthält. Das ist für den Variblenumfang nicht erwünscht.

Statdessen werden die fehlenden Werte bei einer Aggregaion mit na.omit() ausgeblendet.

Praxis

Die Variablenumfänge werden normalerweise gemeinsam mit den Lagemassen des Merkmals präsentiert.

stichprobe |>
    summarise(
        n_Punkte = Punkte |> na.omit() |> length(),
        n_Angebot = Angebot |> na.omit() |> length(),
        n_Interesse = Interesse |> na.omit() |> length(),
        n_Bedeutung = Bedeutung |> na.omit() |> length()
    )
# A tibble: 1 × 4
  n_Punkte n_Angebot n_Interesse n_Bedeutung
     <int>     <int>       <int>       <int>
1      153       152         151         150

17.3 Lagemasse

R stellt als Programmiersprache für die Data Sciences zentrale Funktionen zur Beschreibung von Daten direkt bereit. Es ist deshalb in der Regel nicht notwendig, die Formeln für die Lagemasse zu implementieren. Tabelle 17.1 liestet die Funktionen für die einzelnen Lagemasse.

Werden die Lagemasse für für mehrere Merkmale gleichzeitig bestimmt, dann handelt es sich um eine gruppierte Operation. Der Index dieser Operation wird über die Vektornamen gebildet. Dabei dürfen nur Vektoren von gleichen Datentyp zusammengefasst werden.

Merke

Alle Lagemasse sind Aggregationen.

Tabelle 17.1: R-Funktionen für die Lagemasse
Mass Funktion
Mittelwert mean()
Median median()
Standardabweichung sd()
Varianz var()
Interquartilsabstand IQR()
 Mittlere Absolute Abweichung mad()
Quartile quantile()
Standardfehler sd(x) / sqrt(length(x))

Der Standardfehler hat in Base-R keine eigene Funktion, sondern muss über die Standardabweichung hergeleitet werden.

Die statistischen Kennwerte lassen sich also leicht mit der Aggregation in Beispiel 17.2 bestimmen.

Beispiel 17.2 (Alle Kennwerte bestimmen)  

stichprobe |>
    summarise(
        n = Punkte |> na.omit() |> length(),
        mn = Punkte |> mean(na.rm = TRUE),
        sd = Punkte |> sd(na.rm = TRUE),
        se = sd/sqrt(n),
        min = Punkte |> min(na.rm = TRUE),
        max = Punkte |> max(na.rm = TRUE),
        q1 = Punkte |> quantile(.25, na.rm = TRUE),
        md = Punkte |> median(na.rm = TRUE),
        q3 = Punkte |> quantile(.75, na.rm = TRUE),
        mad = Punkte |> mad(na.rm = TRUE),
        iqr = Punkte |> IQR(na.rm = TRUE)
    )
# A tibble: 1 × 11
      n    mn    sd    se   min   max    q1    md    q3   mad   iqr
  <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1   153  199.  69.7  5.64  16.5  395.  158.  196.  250.  68.8  92.2

Noch einfacher lassen sich die Kennwerte mit der Funktion get_summary_stats() aus der Bibliothek rstatix ermitteln (Beispiel 17.3). Ein wichtiger Vorteil dieser Funktion ist, dass sie ungültige Werte korrekt entfernt.

Beispiel 17.3 (Alle Kennwerte mit rstatix bestimmen)  

stichprobe |>
    get_summary_stats(Punkte)
# A tibble: 1 × 13
  variable     n   min   max median    q1    q3   iqr   mad  mean    sd    se
  <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Punkte     153  16.5  395.   196.  158.  250.  92.2  68.8  199.  69.7  5.64
# ℹ 1 more variable: ci <dbl>

Für ordinalskalierte Daten sind nicht alle Kennwerte zulässig. Deshalb dürfen für diese Daten nur die zulässigen Werte berichtet werden. Der Funktion get_summary_stats() müssen deshalb die zulässigen Kennwerte angegeben werden (Beispiel 17.4).

Beispiel 17.4 (Alle Kennwerte für ordinalskalierte Daten bestimmen)  

kennwerte_ordinal = c(
    "n", "min", "max", "median", "mad", "iqr", "q1", "q3"
)

stichprobe |>
    get_summary_stats(
        -Punkte, # Alle Vektoren ausser Punkte
        show = kennwerte_ordinal
    )
# A tibble: 2 × 9
  variable      n   min   max median   mad   iqr    q1    q3
  <fct>     <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
1 Interesse   151     1     7      4  1.48   1.5     3   4.5
2 Bedeutung   150     1     6      3  1.48   2       2   4  
Wichtig

Ordinalskalierte Daten müssen als numerische Werte kodiert vorliegen, damit die Kennwerte bestimmt werden können. Damit die Kennwerte interpretiert werden können, müssen alle verwendeten Kodierungstabelle ebenfalls berichtet werden.

17.3.1 Kennwerte über das Datenschema bestimmen

Das Datenschema ist ein zentraler Teil der technischen Dokumentation eines Projekts. Liegt das Datenschema als Tabelle vor und die Skalierungen sind in einer eigenen Spalte dokumentiert, dann kann das Datenschema zur Beschreibung der Daten eingesetzt werden.

Beispiel 17.5 zeigt ein reduziertes Datenschema für die geladenen Daten. Normalerweise würde dieses Schema aus einer Datei geladen werden.

Beispiel 17.5 (Reduziertes Datenschema für die Daten)  

# datenSchema = read_csv("datenschema.csv")
datenSchema = tribble( 
    ~Name, ~Skalierung,
    "Punkte", "metrisch",
    "Angebot", "nominal",
    "Interesse", "ordinal",
    "Bedeutung", "ordinal"
)

Nachdem das Schema geladen wurde, können die Namen der Vektoren des gleichen Skalenniveaus gefiltert werden und an die Selektorfunktion all_of() übergeben werden (s. Beispiel 17.6). Auf diese Weise wird der Funktion get_summary_stats() mitgeteilt, für welche Vektoren die Kennwerte bestimmt werden sollen.

Beispiel 17.6 (Verwendung des Datenschames zur Beschreibung der Daten)  

# Metrisch-skalierte Kennwerte
stichprobe |> 
    get_summary_stats(
        datenSchema |> 
            filter(Skalierung == "metrisch") |> 
            pull(Name) |>
            all_of()
    )
# A tibble: 1 × 13
  variable     n   min   max median    q1    q3   iqr   mad  mean    sd    se
  <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Punkte     153  16.5  395.   196.  158.  250.  92.2  68.8  199.  69.7  5.64
# ℹ 1 more variable: ci <dbl>
# Ordinalskalierte Kennwerte
stichprobe |> 
    get_summary_stats(
        datenSchema |> 
            filter(Skalierung == "ordinal") |> 
            pull(Name) |>
            all_of()
        ,
        show = kennwerte_ordinal
    )
# A tibble: 2 × 9
  variable      n   min   max median   mad   iqr    q1    q3
  <fct>     <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
1 Interesse   151     1     7      4  1.48   1.5     3   4.5
2 Bedeutung   150     1     6      3  1.48   2       2   4  

17.4 Kontinenztabellen erstellen

In Kapitel 13 wurden Kontingenztabellen eingeführt und die Funktion table() für zwei unabhängige Vektoren vorgestellt.

Für Datenrahmen ist die Funktion freq_table() etwas flexibler und unterliegt nicht der Beschränkung auf zwei Vektoren. Ausserdem bestimmt die Funktion freq_table() automatisch die relativen Häufigkeiten.

Beispiel 17.7 (Kontingenztabelle für ein Merkmal)  

stichprobe |>
    freq_table(Angebot)
# A tibble: 2 × 3
  Angebot     n  prop
  <chr>   <int> <dbl>
1 A          69  45.4
2 B          83  54.6

Beispiel 17.8 (Kontingenztabelle für zwei Merkmale)  

stichprobe |>
    freq_table(Angebot, Bedeutung)
# A tibble: 12 × 4
   Angebot Bedeutung     n  prop
   <chr>       <dbl> <int> <dbl>
 1 A               1     5   7.5
 2 A               2    15  22.4
 3 A               3    12  17.9
 4 A               4    15  22.4
 5 A               5    14  20.9
 6 A               6     6   9  
 7 B               1    11  13.9
 8 B               2    12  15.2
 9 B               3    18  22.8
10 B               4    22  27.8
11 B               5     8  10.1
12 B               6     8  10.1

Vorteilhaft ist auch, dass das Ergebnis der Funktion freq_table() ein Datenrahmen ist. Dadurch können weitere Datenrahmen-Operationen verkettet werden. Im Beispiel 17.9 werden die relativen Werte in einer Kreuztabelle so gegenübergestellt, dass die unterschiedliche Bewertung der Bedeutung für die beiden Angebote leichter verglichen werden können.

Beispiel 17.9 (Kontingenztabelle für zwei Merkmale als Kreuztabelle)  

stichprobe |>
    freq_table(Angebot, Bedeutung) |>
    select(-n) |>
    pivot_wider(names_from = Angebot, values_from = prop)
# A tibble: 6 × 3
  Bedeutung     A     B
      <dbl> <dbl> <dbl>
1         1   7.5  13.9
2         2  22.4  15.2
3         3  17.9  22.8
4         4  22.4  27.8
5         5  20.9  10.1
6         6   9    10.1