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.
Wie das Diagramm aussehen könnte …
So könnte es idealer Weise aussehen – wie viel Arbeit mag da wohl drinstecken?
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):
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().
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.
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:
- 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!
Wieso ist im Nachbau y= year und im Paket y=no ? Macht das erste überhaupt Sinn?
Danke für den Hinweis! Habe den „Nachbau“ – das simple ggplot2-Diagramm – korrigiert.