Wenn Excel aufgibt: Datenvisualisierung kann zu komplex für Excel werden

Ms Excel ist ein beliebtes Werkzeug der Datenanalyse, auch für Datenvisualisierung. Es gibt einige Beispiele, dass andere Werkzeuge, wie R, zu ansehnlicheren Diagrammen führen können, s. diesen Post. In diesem Post geht es um eine verwandte Frage: Gibt es Diagramme, die nicht – oder nur sehr aufwendig – mit Excel zu erstellen sind?

Die Meine Antwort lautet: Ja, die gibt es. Betrachten wir ein Beispiel.

Bayesianische Modelle visualisieren

Als Hintergrund dient uns eine Analyse (s. auch diese Folien), die bayesianische Modell anwendet, um den AfD-Wahlerfolg bei der Bundestagswahl zu analysieren.

Dieses Bild soll reproduziert werden:

Liebe Excel-Lovers! Ich glaube, dieses Bild ist schwierig mit Excel zu erstellen; mit R ist es zwar nicht trivial, aber vermutlich deutlich einfacher.

Setup

Laden wir einige hilfreiche R-Pakete:

library(tidyverse)

Dann laden wir die Daten herunter von https://osf.io/2yhr9/. Die Datei heißt model_error_md_iqr.csv.

Hat man das getan, so kann man die Datein in R importieren. Der Pfad hängt dabei von Ihrem Download-Ordner ab, bzw. vom Ort, an dem Sie die Datei gespeichert haben:

model_error_md_iqr <- read_csv("/Users/sebastiansaueruser/Documents/Publikationen/blog_ses/data_se/data/afd/model_error_md_iqr.csv")

Erster Blick in die Daten

Die Datei ist eine Tabelle, sie stellt den Wahlerfolg der AfD (Anteil gültiger Zweitstimmen) bei der Bundestagswahl 2017 den Vorhersagen verschiedener statistischer Modelle gegenüber. Für jedes Modell (model) ist der Vorhersagefehler error und der IQR iqr für diesen Fehler angegeben. Diese Datei ist Ergebnis eines reht aufwändigen Prozesses, der in diesem Post nachgelesen werden kann.

glimpse(model_error_md_iqr)
#> Observations: 3,289
#> Variables: 5
#> $ afd_prop <dbl> 0.06835254, 0.06534854, 0.08539446, 0.07409066, 0.069...
#> $ id       <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16...
#> $ model    <chr> "m9_stan", "m9_stan", "m9_stan", "m9_stan", "m9_stan"...
#> $ error    <dbl> 0.5176016, 0.3931657, 0.3428500, 0.2688421, 0.6453240...
#> $ iqr      <dbl> 0.033840350, 0.025914236, 0.001095887, 0.015214717, 0...

Medianer Fehler pro Modell

Berechnen wir den medianen Error pro Modell, um zu wissen, welches Modell summarisch am besten abschneidet in der Vorhersage:

model_error_md_iqr %>% 
  group_by(model) %>%
  summarise(error_md = median(error)) -> model_error_md_summarized

model_error_md_summarized
#> # A tibble: 11 x 2
#>    model     error_md
#>    <chr>        <dbl>
#>  1 m10_stan    0.0879
#>  2 m11a_stan   0.154 
#>  3 m11c_stan   0.0324
#>  4 m11d_stan   0.0984
#>  5 m12_stan    0.0158
#>  6 m13_stan    0.0152
#>  7 m14_stan    0.0218
#>  8 m15_stan    0.0150
#>  9 m16_stan    0.0312
#> 10 m9_stan     0.480 
#> 11 m9a_stan    0.189

best_model_name <- model_error_md_summarized[which.min(model_error_md_summarized$error_md), 1] %>% simplify()
best_model_name
#>      model 
#> "m15_stan"

Ok, das beste Modell heißt also m15_stan. Fügen wir zum Dataframe model_error_md_summarized eine Spalte mit dieser Information hinzu:

model_error_md_summarized %>% 
  mutate(best_model = ifelse(model == best_model_name, TRUE, FALSE)) -> model_error_md_summarized

model_error_md_summarized
#> # A tibble: 11 x 3
#>    model     error_md best_model
#>    <chr>        <dbl> <lgl>     
#>  1 m10_stan    0.0879 FALSE     
#>  2 m11a_stan   0.154  FALSE     
#>  3 m11c_stan   0.0324 FALSE     
#>  4 m11d_stan   0.0984 FALSE     
#>  5 m12_stan    0.0158 FALSE     
#>  6 m13_stan    0.0152 FALSE     
#>  7 m14_stan    0.0218 FALSE     
#>  8 m15_stan    0.0150 TRUE      
#>  9 m16_stan    0.0312 FALSE     
#> 10 m9_stan     0.480  FALSE     
#> 11 m9a_stan    0.189  FALSE

Diagramm zeichnen

Damit haben wir die Datenvorbereitung abgeschlossen, plotten wir nun das Diagramm:

model_error_md_iqr %>% 
  # arrange(-error) %>% 
  ggplot(aes(x = id)) +
  facet_wrap(~model)+
  geom_hline(aes(yintercept = error_md), data = model_error_md_summarized) +
  geom_errorbar(aes(ymin = error - (iqr/2),
                    ymax = error + (iqr/2)),
                alpha = .8,
                color = "gray40") +
  geom_point(aes(y = error)) +
  geom_label(aes(label = round(error_md, 3),
                 color = best_model,
                 y = error_md), x = 1,  
            data = model_error_md_summarized, 
            hjust = 0) +
  guides(color=FALSE) +
  scale_color_manual(values = c("red", "darkgreen")) +
  labs(
    x = "Wahlkreisnummer",
    y = "Vorhersagefehler",
    title = "Vergleich der Vorhersagefehler zum AfD-Wahlerrfolg verschiedener Modelle",
    caption = "Daten: Bundestagswahl 2017; bereitgestellt vom Bundeswahlleiter")

Ein paar Erklärungen:

  • Wir haben mehrere Teildiagramme (“Facetten”) erzeugt mit facet_wrap() - für jedes der 11 Modelle eine Facette
  • Dann haben wir eine horizontale Linie gezogen (geom_hline()), um den medianen Fehler des Modells anzuzeigen.
  • Als nächstes haben wir für jeden Wahlkreis einen Fehlerbalken eingezeichnet (geom_errorbar()), um die Unsicherheit der Vorhersage darzustellen
  • Dann wurde für jedes Modell und jeden Wahlkreis der Fehlerwert als Punkt gezeichnet
  • Dann wurden noch Labels hinzugefügt, hier wurde der mediane Fehlerwert dazu gechrieben
  • Legenden für die Farben wurden unterdrückt
  • Und die Farben (grün, rot) händisch definiert.

Fazit

Wie so oft liegt die Arbeitung in der Vorbereitung der Daten; dieser Schritt war aber nicht Gegenstand dieses Posts. Eine typische Vorbereitung ist die Umwandlung eines Dataframes von breit auf lang (s. Beispiel hier).

Man beachte, dass dieses Diagramm wenig “händische” Änderung beinhaltet. So wurde das beste Modell programmatisch ermitteln, es ist nicht “fest verdrahtet”. Würde sich in den Ursprungsdaten etwas ändern, hätte also ein anderes Modell einen geringeren Fehler, so würde sich das Diagramm entsprechend ändern. Das Diagramm ist also in diesem Sinne dynamisch.

Es ist außerdem reproduzierbar, weil es nicht durch “Klicks” erzeugt wurde, sondern allein durch Syntax. Mit einem Copy-Paste kann man das Diagramm nachbauen, verbessern, überprüfen etc.

Natürlich kann man an den optischen Details noch drehen. So könnte man den Hintergrund, die Farbwahl oder die Schriftgrößen ändern, um nur ein paar Beispiele zu nennen.

Mehr davon?! - In unseren Seminaren

Sie möchten mehr über moderne Datenvisualisierung lernen?

In unseren Seminaren lernen Sie alles einiges über professionelle Datenvisualisierung.

Nähere Informationen zum Seminar: https://www.data-divers.com/leistungen/seminare/seminar-dataviser/

Zur Annmeldung: https://www.data-divers.com/leistungen/seminare/seminaranmeldung/

Dozenten:

Prof. Dr. Sebastian Sauer (zur Homepage, zum Blog)

Prof. Dr. Felix Bauer (zur Homepage)

Buch zur modernen Datenanalyse (und Datenvisualisierung) mit R

Dieses Buch erklärt ausführlich die Grundlagen der Datenvisualisierung mit R:

Liebe Excel-Freunde

Liebe Excel-Freunde, seid nicht traurig 😄. Excel ist für vieles gut - aber nicht für alles; genauso wenig wie R oder ein anderes Programm für alles gut ist. Anspruchsvollere Diagramme oder Analysen sind m.E. besser in Umgebungen mit Syntaxsprache (wie R) aufgehoben.

Unahbängig davon bin ich offen für Anregungen aus der Excel-Community, wie man dieses Diagramm mit Excel baut.