Statistische Gruppenvergleiche in R elegant visualisieren: ggstatsplot

Mit dem R-Paket ggstatsplot kann man sehr leicht Gruppenvergleiche mit statistischen Kennzahlen grafisch darstellen. Unterstützt werden Tests für abhängige und unabhängige Stichproben, parametrische und nichtparametrische Tests, robuste Tests sowie Bayes-Verfahren.

logo-ggstatsplot

Man kann viel Zeit damit verbringen, statistische Grafiken publikationsfähig aufzubereiten. Standard-Darstellungen von Gruppenvergleichen enthalten keine statistischen Informationen: z. B. eine Kennzeichnung, welche von mehreren Gruppen sich statistisch signifikant unterscheiden, oder Details zu den verwendeten Tests.

ggstatsplot: Informative Grafiken mit sehr wenig Aufwand!

Hier kommt das ggstatsplot-Paket von Indrajeet Patil ins Spiel: Man kann mit sehr geringem Aufwand sehr informative Darstellungen erzeugen.

Doch der Reihe nach … Welche Daten wollen wir darstellen?

Billboard: Top 100 Songs jeden Jahres von 1960 bis 2016

Die Daten entnehmen wir bequem dem billboard-Paket von Mikkel Freltoft Krogsholm. Sie enthalten die Top 100 Songs jeden Jahres von 1960 bis 2016. Unsere simple erste Aufgabe lautet, die durchschnittliche Song-Position von zwei Künstlern mittels t-Test zu vergleichen. Im Beispiel: Maroon 5 und Pink.

Maroon 5
Maroon 5
Quelle: Wikimedia Commons, Eva Rinaldi.
Foto von 2011

Pink
Pink
Quelle: Wikimedia Commons, User Andemaya.
Olympiastadion, München, 26.7.2019

Wie das Diagramm aussehen könnte …

So könnte es idealer Weise aussehen – wie viel Arbeit mag da wohl drinstecken?

t-Test: Grafik mit statistischen Details
Gruppenvergleich: Boxplot, Violin-Plot, einzelne Datenpunkte und Details zum statistischen Test und Parametern. Erstellt mit R und ggstatsplot, das auf ggplot2 basiert

Der Vergleich der durchschnittlichen Songpositionen zwischen Maroon 5 und Pink fällt nicht signifikant aus (p = 0,329). Wir erhalten Boxplots in Kombination mit Violin-Plots sowie den einzelnen Datenpunkten, sodass wir die Verteilungen visuell detailliert vergleichen können. Auch wichtige Kennzahlen sind publikationsfähig und ausführlich dargestellt: Neben dem eigentlichen t-Test (hier mit Welch-Korrektur für den Fall ungleicher Varianzen in den Gruppen) erhalten wir auch die Effektstärke, ein Konfidenzintervall dazu sowie in der Fußzeile den Bayes-Faktor.

Wie schafft man das in R?

Wie es üblicherweise abläuft …

Bevor wir uns die erfreulich simple Lösung anschauen, zunächst zum Kontrast den Fall, wie es häufig abläuft (ich wünschte, ich hätte ggstatsplot früher kennen gelernt!).

Es wird ein statistischer Test berechnet, hier der t-Test (die Daten wurden zuvor nach den beiden Bands gefiltert) …

library(tidyverse)
library(billboard)
data("wiki_hot_100s")

# ... Etwas Datenaufbereitung
top100 <- wiki_hot_100s %>% 
  mutate(across(c(no, year), as.numeric)) %>%      # NAs introduced by coercion
  filter(year > 1999)

Maroon5_Pink <- top100 %>% 
  filter(artist %in% c("Maroon 5", "Pink"))

t.test(no ~ artist, data = Maroon5_Pink)

… der eine typische Statistik-Programm-Ausgabe liefert, die nicht unbedingt 1:1 so publiziert werden dürfte (Anklicken zum Vergrößern):

t-Test: Typische Base R-Ausgabe (Anklicken zum Vergrößern)

Dann visualisiert man den Gruppenvergleich, etwa mit einem Boxplot:

ggplot(Maroon5_Pink,
       aes(x = artist, y = no,
           color = artist)) +
  geom_boxplot(outlier.color = NA) +
  geom_jitter(width = 0.3, height = 0) +
  theme_bw(base_size = 15) +
  theme(legend.position = "none") +
  labs(title = "Average Song Positions: Maroon 5 vs. Pink",
       caption = "Data: wiki_hot_100s from the billboard R package")

Hinweis: outlier.color = NA sorgt dafür, dass eventuelle Ausreißer nicht doppelt dargestellt werden: von geom_boxplot() sowie von geom_jitter().

Boxplot: Maroon5 vs. Pink mit einzelnen Datenpunkten, erstellt in R mit ggplot2
Boxplot: Maroon5 vs. Pink mit einzelnen Datenpunkten, erstellt in R mit ggplot2

Das mag seinen Zweck erfüllen, enthält jedoch keine Angaben zum statistischen Test wie oben. Entweder man packt diese Infos in den Text, oder man bearbeitet aufwändig das Bild außerhalb von R nach … Wie geht es einfacher?

Einfach und elegant: ggstatsplot – informative statistische Gruppenvergleiche

Hier nun endlich der Code, der das obige Diagramm erzeugt hat:

library(ggstatsplot)
ggbetweenstats(Maroon5_Pink,
               x = artist, y = no,
               title = "Average Song Positions: Maroon 5 vs. Pink",
               caption = "Data: wiki_hot_100s from the billboard R package")

Die Funktion lautet ggbetweenstats() und ist denkbar einfach anzuwenden. Natürlich gibt es diverse Einstellmöglichkeiten, die in der Hilfe ausführlich dokumentiert sind. Siehe

# Funktionshilfe
?ggbetweenstats

# Hilfe zum Paket
help(package = "ggstatsplot")

Erweiterung: Drei Gruppen, ein signifikanter Gruppenunterschied

Wie sieht es bei mehreren Gruppen aus, wenn es sowohl signifikante als auch nicht signifikante Gruppenunterschiede gibt? Wir nehmen Britney Spears mit in den Vergleich auf:

top100 %>% 
filter(artist %in% c("Maroon 5", "Pink", "Britney Spears")) %>%
ggbetweenstats(x = artist, y = no,
title = "Average Song Positions: Maroon 5, Pink, and Britney Spears")

Die Syntax bleibt denkbar einfach mit der ggbetweenstats()-Funktion.

ggstatsplot: 3 Gruppen im Vergleich
Bei multiplen Gruppenvergleichen ist die sog. Alpha-Fehler-Kumulierung zu beachten. Games-Howell-Test, p-Werte mit der Holm-corrected-Methode ermittelt.

Der Vergleich zwischen Britney Spears und Maroon 5 fällt signifikant aus (p = 0,03), die anderen beiden Vergleiche jedoch nicht (Britney Spears vs. Pink sowie Maroon 5 vs. Pink). So einfach kann es sein!

Das ggstatsplot-Paket

Abschließend noch einige Worte zum ggstatsplot-Paket. Es ist sehr gut dokumentiert, siehe oben. ggbetweenstats() ist nur ein Beispiel; weitere Funktionen lauten:

logo-ggstatsplot

  • ggwithinstats bei Messwiederholungen
  • gghistostats, ggdotplotstats
  • ggpiestats, ggbarstats, ggscatterscats

Weitere Leistungsmerkmale:

  • ggstatsplot unterstützt parametrische, nicht-parametrische, robuste sowie Bayes-Verfahren
  • Statt des Diagramms mit all den statistischen Informationen kann man auch nur den Ausdruck (expression) mit den statistischen Kennwerten zurückgeben lassen, siehe Funktionsparameter output

Das ggstatsplot-Paket nutzt im Hintergrund eine Reihe weiterer R-Pakete. Einige davon gehören zum sogenannten easystats, einer Paket-Sammlung, die verschiedene Aspekte der statistischen Datenanalyse erleichtert, wie etwa ggsignif, parameters, performance. So kann Statistik richtig Spaß machen!

Hier ein Beispiel aus easystats, das großartige reports-Paket:

Und nun viel Freude und Erfolg bei Euren statistischen Analysen!

Andy Field: Discovering Statistics Using R

R für Data Science: Daten importieren, bereinigen, umformen, modellieren und visualisieren (2. Auflage)

3 Gedanken zu „Statistische Gruppenvergleiche in R elegant visualisieren: ggstatsplot“

Freue mich über Kommentare!

Wir benutzen Cookies um die Nutzerfreundlichkeit der Webseite zu verbessen. Durch Deinen Besuch stimmst Du dem zu.