The Good, the Bad and the Ugly: Daten effektiv visualisieren und kommunizieren

Keine Kommentare

Dieser Artikel begleitet meinen Vortrag The Good, the Bad and the Ugly: Daten effektiv visualisieren und kommunizieren, den ich am 20.10.2020 auf der data2day gehalten habe.

Datenvisualisierung ist ausschlaggebend für Verständnis und Kommunikation

Datenvisualisierung ist ein entscheidender Teil jeder Analyse. Sei es, „für sich selber“, um Zusammenhänge und Ergebnisse besser zu verstehen oder um Ergebnisse anderen zu präsentieren und zu „verkaufen“. Denn gute Graphen machen Daten intuitiv zugänglich, sie erzählen eine Geschichte und zeigen deutlich Muster, Trends oder Ausreißer. Deshalb ist die Explorative Datenanalyse (EDA) normalerweise der erste Schritt jeder Datenanalyse und -modelierung. Denn nur, wenn wir unsere Daten verstehen, können wir passende Vorverarbeitungsschritte und Analysemethoden, Statistiken oder Deep Learning auswählen. Und da Menschen Zahlen deutlich besser visuell in einem Graphen begreifen können als in Tabellen, sollten wir die Macht von Datenvisualiserungen nutzen! Vor allem, wenn wir Visualisierungen für Berichte oder Veröffentlichungen erstellen, ist es entscheidend, dass sie sowohl faktisch korrekt, als auch optisch ansprechend sind.

Data visualization is part art and part science. The challenge is to get the art right without getting the science wrong and vice versa. (Wilke 2019)

Ziel einer guten Abbildung ist es, dass sie auf einen Blick verständlich ist und eine eindeutige Aussage präsentiert. Schlechte Graphen reichen von einfach nur häßlich bis hin zu (absichtlich?) irreführend oder gar falsch. In diesem Artikel erkläre ich, was gute Graphen (nicht) ausmacht und wie wir sie mit Hilfe der Grammar of Graphics erstellen können. Und ich stelle einige der am häufigsten verwendeten Diagrammarten vor, zusammen mit Negativbeispielen „aus der Wildnis“.

Der komplette Folien von diesem Vortrag sind hier zu sehen:

Klicken Sie auf den unteren Button, um den Inhalt von docs.google.com zu laden.

Inhalt laden

Was macht einen guten Graphen aus?

1. Daten

Der wichtigste Aspekt und Grundlage jedes Graphen sind die verwendeten Daten! Sie müssen korrekt sein und wir sollten immer überprüfen, ob eventuell (Mess-) Fehler vorliegen. Wie zum Beispiel in dieser Abbildung:

weather forecast

https://www.reddit.com/r/shittydataisbeautiful/comments/fhz3b9/the_weather_network_seems_to_know_something_the/

Offensichtlich liegt hier ein Fehler in der Vorhersage vor, denn Temperaturen von -100°C, noch dazu an einem isolierten Tag, sind wirklich sehr unwahrscheinlich! Und nicht nur zeigt dieser Graph offensichtlich falsche Daten; durch diesen Ausreißerwert wird der Rest der Daten in der Darstellung so stark gestaucht, dass die Kurven nicht mehr gut zu sehen sind und Werte verschiedener Tage nur noch schwer verglichen werden können.

Zu den Best Practices der Datenvisualisierung gehört es außerdem, die Datenquelle anzugeben.

2. Übersichtlichkeit & Farben

Ein guter Graph ist gerade so komplex, wie nötig, um seine Message auf einen Blick zu transportieren; er sollte übersichtlich sein und keinen „Chartjunk„*enthalten. Als Chartjunk bezeichnete Edward Tufte alles an visuellen Elementen in einer Abbildung, die entweder nicht nötig sind, um den Graphen zu verstehen oder sogar von der zentralen Information ablenken (Tufte 1983). Drei Beispiele für Abbildungen mit Chartjunk sind in dieser Abbildung zu sehen:

http://www.exceluser.com/blog/1133/good-examples-of-bad-charts-chart-junk-from-a-surprising-source.html

Jedem, der regelmäßig Zeitungen liest, wird auffallen, dass Chartjunk extrem häufig vorkommt und besonders gerne von Populärmedien verwendet wird, um eine Abbildung aufzupeppen. In vielen Fällen kann man harmlosen Chartjunk als „künstlerische Freiheit“ durchgehen lassen, je seriöser man eine Abbildung aber gestalten möchte, desto mehr sollte man auf ihn verzichten.

Zur Übersichtlichkeit gehört auch die Wahl geeigneter Farben und deutlicher Kontraste. Zu viele, bunte oder grelle Farben machen einen Plot visuell abstoßend und lassen ihn überladen und verwirrend aussehen. Außerdem sollte man bei der Farbauswahldarauf achten, dass es auch Farbenblinden möglich ist, den Graph zu lesen. Dazu sollte sowohl eine geeignete Farbpalette genutzt werden, als auch redundante Feature, wie unterschiedliche Formen, Muster oder Linienarten, die es erlauben, den Graphen auch ohne Farbinformationen zu lesen.

3. Beschriftung & Achsen

Einen guten Graphen kann man auf einen Blick verstehen, das heißt, er sollte selbsterklärend sein. Essenziell dafür ist die korrekte Beschriftung mit Titel, Achsenlabeln (mit Einheiten!), Legenden und Bildunterschriften! Auch die Anzahl der Achsen-Ticks sollte passend gewählt werden. Und vor allem: die Abstände zwischen Achsen-Ticks bei numerischen Werten muss regelmäßig sein, das heißt, auf gar keinen Fall darf der Abstand zwischen den Ticks variieren, wie auf der y-Achse in dieser furchtbaren Abbildung zu sehen ist:

chartjunk

https://www.reddit.com/r/shittydataisbeautiful/comments/fvjhdp/the_yaxis_on_this_graph_of_coronavirus_cases

The Grammar of Graphics

Die wichtigsten Aspekte guter Graphen kennen wir nun. Aber wie erstellt man gute Graphen am besten?
Es gibt viele Möglichkeiten, Graphen zu generieren: von Hand zeichnen, mit Excel oder mit verschiedenen Programmiersprachen, wie R, Python, Java, etc. Der beste Weg, wenn auch mit einer höheren Einstiegshürde verbunden, ist das Nutzen von Programmiersprachen. Denn damit gelingt es am einfachsten, sicherzustellen, dass die Daten sauber vorliegen und nachvollziehbar verarbeitet wurden. Mit Excel können zwar auch Graphen erstellt werden, allerdings hat das Programm einige Tücken: Unter Anderem formattiert Excel Zellen automatisch, was zu Fehlern in den Daten führen kann. Und es macht das Reproduzieren von Abbildungen sehr schwer, denn es wird nicht dokumentiert, welche Schritte in welcher Reihenfolge manuell durchgeführt wurden.

R und Python sind besonders gut geeignet, denn sie sind die am meisten benutzten Programmiersprachen für die Generierung von Abbildungen und bieten Pakete, mit denen das Analysieren von Daten und das Erstellen von Graphen sehr effizient möglich ist. Hier stelle ich die (meiner Meinung nach) beste Variante vor, Graphen strukturiert zu generieren: mit den Paketen ggplot2 für R oder plotnine für Python (basiert auf ggplot2).

Mit ggplot2 hat Hadley Wickham eine Implementierung der 1999 von Leland Wilkinson beschriebenen Grammar of Graphics für die Programmiersprache R geschaffen, die ich unten an Codebeispielen zeigen werde (Wilkinson et al. 1999; Wickham 2010). Diese Grammar of Graphics beschreibt ein Framework für die strukturierte Erstellung von Graphen, bestehend aus aufeinander aufbauenden Schichten (Wickham and Grolemund 2017). Nachfolgend zeige ich für ein paar Beispiele. Eine Übersicht über alle möglichen Optionen sind im ggplot2-Cheatsheet zu finden.

1. Daten

Auch für die Grammar of Graphics sind Daten das wichtigste und grundlegende Element. Hier verwende ich einen Beispieldatensatz mit verschiedenen Größen-Messwerten dreier Pinguinarten (Gorman 2014). Die zentrale Funktion des ggplot2-Pakets heißt ggplot() und nimmt einen Datensatz als Input. Diese Funktion erstellt zunächst ein leeres Koordinatensystem, auf das wir mit den nachfolgenden Schichten aufbauen und so Schritt für Schritt unseren Graphen erstellen, verändern und erweitern können.

2. Ästhetiken

Als zweites Argument definieren wir in der ggplot()-Funktion die Ästhetiken (aes()). Ästhetiken beschreiben graphische Elemente, wie X- und Y-Werte, Größe, Farben, Formen, etc. Für ein einfaches Punktdiagramm müssen wir mindestens die X- und Y-Positionen angeben. Dafür müssen wir uns zunächst überlegen, welche Daten (Variablen) wir abbilden möchten. Zum Beispiel hier die Pinguin-Schnabellänge auf der X-Achse gegen Flossenlänge auf der Y-Achse:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm))

Auch mit gesetzten Ästhetiken bekommen wir noch keinen richtigen Graphen angezeigt, dafür benötigen wir die nächste Schicht, die sogenannten Geometriken. Da Ästhetiken und Geometriken sehr eng miteinander in Zusammenhang stehen und teilweise gegenseitig voneinander abhängen, zeige ich zusätzliche Aesthetiken weiter unten.

3. Geometriken

Geometrische Objekte oder Geometriken beschreiben wie die Daten, die wir in den Ästhetiken festgelegt haben, dargestellt werden sollen. Das kann zum Beispiel ein Punktdiagramm (geom_point()) oder ein Liniendiagramm (geom_line()) sein, dass in dieser Schicht nun auch als Graph ausgegeben wird:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm)) +
     geom_point(alpha = 0.7)

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm)) +
     geom_line()

Ein Liniendiagramm ist hier allerdings nicht sinnvoll für die Daten; mehr dazu im Abschnitt Diagrammtypen – Liniendiagramme. Weitere Geometriken sind unter anderem Balkendiagramme (geom_bar()) oder Box-Plots (geom_boxplot()). Geometriken und Ästhetiken hängen insofern voneinander ab, dass der Datentyp, den die Variablen der Ästhetiken haben, nur bestimmte Geometriken zulässt oder sinnvoll macht. So bieten sich Punkt- und Liniendiagramme für kontinuierliche X- und Y-Achsen an (rationale Zahlen, Zeiten oder Datum). Für Balkendiagramme müssen die Daten der X-Achse kategorisch sein. Bevor ich im Zuge späterer Schichten noch einmal auf weiter auf Geometriken und Aesthetiken eingehen werde, will ich zunächst Facetten vorstellen.

4. Facetten

Facetten bedeutet das Aufteilen eines Graphen in mehrere Subplots. In unserem Beispieldatensatz sind Messwerte von drei verschiedenen Pinguinarten gesammelt. Das Punktdiagramm oben erlaubt uns allerdings keine Unterscheidung der drei Arten, was aber natürlich eine wichtige Zusatzinformation in den Daten ist. Deshalb sollten wir diese in unserem Graphen darstellen. Eine Möglichkeit dies zu tun, ist mittels Facetten:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm)) +
     geom_point(alpha = 0.7) +
     facet_wrap(vars(species), ncol = 3)

Nun sehen wir die Punkte für jede Pinguinart in einem eigenen Subplot. Facetten können für ein oder mehrere kategorische Variablen erstellt werden, wobei mehr als zwei Facetten in der Regel unübersichtlich werden. Per default verwendet ggplot2 die selben X- und Y-Achsen-Dimensionen, um die Subplots vergleichbar zu machen. Allerdings ist es mit Facetten in diesem Fall nicht ganz so einfach, die drei Arten zu vergleichen. Alternativ können wir die drei Pinguinarten mittels verschiedener Farben sichtbar machen. Diese Möglichkeit fällt unter Skalierung.

5. Skalierung

Mit Skalierung können wir zusätzlich zu den beiden X- und Y-Dimensionen weitere Dimensionen darstellen, ähnlich wie wir das bereits bei den Pinguinarten mit Facetten getan haben. Wir können zum Beispiel eine Farbskalierung wählen. In ggplot2 werden Skalierungen anhand zusätzlicher Variablen in den Ästhetiken angegeben:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm,
              color = species)) +
     geom_point(alpha = 0.7)

Die entsprechende Legende wird automatisch erstellt. Andere Skalierungen sind Größenskalierung, Punkt- oder Linienarten. Nicht alle Skalierungen sind für jeden Datentyp geeignet. Während Farben auch kontinuierliche rationale Zahlen darstellen können, sind Punkt- und Linienarten nur für eine begrenzte Anzahl von Kategorien möglich.

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm,
              color = sex,
              size = body_mass_g)) +
     geom_point(alpha = 0.7) +
     facet_wrap(vars(species), ncol = 3)

So können im Prinzip beliebig viele Dimensionen der Daten in einem Graphen dargestellt werden, auch wenn mehr als vier Dimensionen den Graphen in der Regel zu chaotisch und unübersichtlich wirken lassen.

Eine weitere Art der Skalierung ist die Achsenskalierung. So können wir zum Beispiel die Achsen umdrehen, so dass die Werte nicht wie per default von links/unten = niedrig nach rechts/oben = hoch dargestellt werden, sondern die hohen Werte links/unten stehen:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm)) +
     geom_jitter(alpha = 0.5) +
     facet_wrap(vars(species), ncol = 3) +
     scale_x_reverse() +
     scale_y_reverse()

6. Statistische Transformationen

Stats, kurz für statistische Transformationen, werden verwendet, um statistische Werte oder Berechnungen einem Plot hinzuzufügen oder diese zu definieren. Das können zum Beispiel Mittelwert, Median, Konfidenzintervalle, Standardabweichungen, usw. sein.

In dieser Abbildungen ist ein Balkendiagramm zu sehen, dass einen numerischen Wert zeigt:

penguins %>%
   ggplot(aes(x = species, 
              y = mean_bmg, fill = sex)) +
     geom_bar(stat = "identity", position = "dodge")

Da die Default-Statistik für Balkendiagramme in ggplot2Anzahl (count)“ ist, können dieses Verhalten mit dem stat „identity“ ändern.

Eine andere häufig verwendete Statistik sind Smoothed Conditional Means, um zum Beispiel den Zusammenhang von X- und Y-Variablen mit Glättungslinien und entsprechenden Fehlerkorridoren zu zeigen:

penguins %>%
   ggplot(aes(x = bill_length_mm, 
              y = flipper_length_mm)) +
     geom_point(alpha = 0.7) +
     facet_wrap(vars(species), ncol = 3) +
     stat_smooth(method = 'loess')

7. Koordinatensysteme

Die letzte Schicht in der Grammar of Graphics sind Koordinatensysteme. Koordinatensysteme definieren, wie die Achsen unseres Graphen angeordnet werden sollen. Meistens verläuft die X-Achse horizontal und die Y-Achse vertikal (kartesisches Koordinatensystem); es gibt aber auch Fälle in denen wir radiale oder gekrümmte Achsen haben, zum Beispiel in einem Tortendiagramm oder in einer Kartendarstellung. So ist ein Tortendiagramm nichts anderes, als ein Balkendiagramm, in dem wir das Koordinatensystem geändert haben:

penguins %>%
   ggplot(aes(x = "", y = percentage,
              fill = sex)) +
     facet_wrap(vars(species), nrow = 1) +
     geom_bar(stat = "identity", alpha = 0.8) +
     coord_polar("y", start = 0)

Diagrammtypen

Mit dieser Grammar of Graphics können nun alle gängigen Diagrammtypen einfach und flexibel generiert und erweitert werden. Die am häufigsten verwendeten Diagrammtypen sind:

  • Punktdiagramme

Punktdiagramme werden häufig dann verwendet, wenn wir numerische X- gegen numerische Y-Werte darstellen und somit ihre Korrelation zeigen wollen. Punkte können verschiedene Farben, Formen und Größen haben. In der Regel sind Punktdiagramme leicht zu verstehen, sie können aber auch unübersichtlich werden, wenn es zu viele überlappende Punkte gibt.

 

  • Liniendiagramme

Liniendiagramme sind meist ähnlich zu Punktdiagrammen, mit dem Unterschied, dass die (imaginären) Punkte mit Linien verbunden sind. Diese verbundenen Linien repräsentieren die gedachten Zwischenwerte zwischen zwei Messpunkten; Punkte sollten deshalb auch nur dann verbunden werden, wenn diese Annahme gegeben ist! Aus diesem Grund ist ein Liniendiagramm für das oben genannte Beispiel auch nicht sinnvoll, denn wir zeigen unabhängige Messwerte einzelner Individuen. Liniendiagramme sind vor allem für Zeitreihen sinnvoll.

 

  • Balkendiagramme

Balkendiagramme zeigen entweder die Anzahl von Ereignissen oder sie zeigen einen numerischen Wert Y für den Vergleich zwischen verschiedenen Kategorien. Insbesondere bei Balkendiagrammen finden wir viele Negativbeispiele mit irreführenden Darstellungen (vermutlich weil sie so leicht mit einfachsten Zeichenprogrammen ohne jegliche Datengrundlage zu erstellen sind). Hier zwei sehr plakative Negativbeispiele zur Coronavirus-Situation: in beiden Beispielen passen die Balkenhöhen nicht zu den Werten auf der (nicht dargestellten) Y-Achse!

I don’t even know where to begin with this one.

https://viz.wtf/post/625905143078141953/i-dont-even-know-where-to-begin-with-this-one

Covid19 report in Brazil

https://viz.wtf/post/625633360933453824/covid19-report-in-brazil

Eine Sammlung weiterer häufig verwendeter Diagrammtypen mit Abbildungen und Negativbeispielen sind in den Folien zu diesem Vortrag zu finden.

Referenzen

  • Gorman, Tony D. AND Fraser, Kristen B. AND Williams. 2014. “Ecological Sexual Dimorphism and Environmental Variability Within a Community of Antarctic Penguins (Genus Pygoscelis).” PLOS ONE 9 (3): 1–14. https://doi.org/10.1371/journal.pone.0090081.
  • Tufte, Edward R. 1983. The Visual Display of Quantitative Information. Graphics Press.
  • Wickham, Hadley, and Garrett Grolemund. 2017. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. 1st ed. O’Reilly Media, Inc. https://r4ds.had.co.nz/.
Shirin Elsinghorst

Shirin hat in der Bioinformatik promoviert. Sie wendet Analyse- & Visualisierungsmethoden verschiedenster Bereiche an – z.B. Machine Learning, klassische Statistik, Textanalyse, etc. – um Informationen aus Daten zugänglich und nutzbar zu machen.

Über 1.000 Abonnenten sind up to date!

Die neuesten Tipps, Tricks, Tools und Technologien. Jede Woche direkt in deine Inbox.

Kostenfrei anmelden und immer auf dem neuesten Stand bleiben!
(Keine Sorge, du kannst dich jederzeit abmelden.)

* Hiermit willige ich in die Erhebung und Verarbeitung der vorstehenden Daten für das Empfangen des monatlichen Newsletters der codecentric AG per E-Mail ein. Ihre Einwilligung können Sie per E-Mail an datenschutz@codecentric.de, in der Informations-E-Mail selbst per Link oder an die im Impressum genannten Kontaktdaten jederzeit widerrufen. Von der Datenschutzerklärung der codecentric AG habe ich Kenntnis genommen und bestätige dies mit Absendung des Formulars.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.