Explorative Datenanalyse (EDA) - Teil 1: Datenaufbereitung

Andreas Warntjen

28.2.2021

Inhalt

In einer explorativen Datenanalyse (EDA) betrachtet man verschiedene deskriptive Statistiken und bi-variate Zusammenhänge, um sich zum einen mit den Daten vertraut zu machen und zum anderen weitere statistische Modellierungen vorzubereiten. In diesem ersten Teil liegt der Fokus darauf, einen Überblick über die Daten zu gewinnen und sie neu zu zuschneiden (Re-Kodierung).

In diesem Bespiel nutzen wir Daten vom World Happiness Report (2019). Sie können hier abgerufen werden: https://worldhappiness.report/ed/2019/

Bibliotheken

Wir benötigen die folgenden Bibliotheken:

Daten einlesen und Überblick gewinnen

Für CSV- und Excel-Dateien stellt pandas Funktionen zum Einlesen bereit. Ein so eingelesener Datensatz wird in einem Pandas Dataframe gespeichert.

Mit dem Befehl chdir aus dem OS-Modul kann das Arbeitsverzeichnis gewechselt werden. Die Daten liegen in einem Unterverzeichnis "Data".

Eine Überblick über den Datensatz geben

Einzelne Variablen betrachten

Mit Hilfe von describe() können wir uns die Verteilung numerischer Variablen ausgeben lassen. Die Funktion kann auf den gesamten Datensatz (DataFrame) angewendet werden, eine Auswahl oder auf eine einzelne Spalte.

Um einen Eindruck von der Verteilung numerischer Variablen zu bekommen, können wir sie mit Hilfe von plot() visualisieren. Die Methode plot() für Pandas DataFrames greift im Hintergrund auf die Bibliothek matplotlib zurück, die sehr umfangreiche Visualisierungsmöglichkeiten liefert. Mit Hilfe von plot() können wir direkt auf die Hauptfunktionen von matplotlib zugreifen. Über den Parameter kind wird die Art der Grafik festgelegt. Für ein Histogram benötigen wir kind="hist.

Mit bins kann die Anzahl der Bins vorgeben werden.

Eine glattere Verteilung ergibt die Einstellung kind="density".

Fehlende Werte

Der Datensatz hat insgesamt 1704 Zeilen. Die Anzahl der non-null Werte unterscheidet sich stark zwischen den Spalten. Es gibt viele Spalten mit fehlenden Werten, wie etwa "Most people can be trusted, WVS round 2005-2009". Die Methode isnull() hilft, fehlende Werte zu identifizieren und das Muster fehlender Werte weiter zu analysieren. Mit Hilfe von any() oder sum() kann eine Liste der Spalten mit fehlenden Werte erstellt bzw. die Anzahl der fehlenden Werte pro Spalte ermittelt werden.

Um aus der Abfrage eine Liste der Spaltennamen zu generieren, lassen wir nur die Spaltennamen, die hier den Index bilden, ausgeben und konvertieren das Ergebnis in eine Liste.

Daten filtern

Einzelne Elemente eines Datensatzes können ausgewählt bzw. gefiltert werden.

Der Datensatz erhält pro Land mehrere Einträge, da es für jedes Land für mehrere Jahre Daten gibt. Mit der Funktion unique() können wir eine Liste der Länder erstellen.

Wir können auf Bedingungen filtern. Die Bedingung steht in eckigen Klammern. Sie muss den vollständigen Namen (also Datensatz und Spaltennamen) beinhalten.

Es können auch mehrere Bedingungen kombiniert werden (|= OR, & = AND, ~ = Negation). Mehrere Bedingungen werden jeweils in runde Klammern eingeschlossen. Eine Auswahl der Spalten kann zusätzlich erfolgen. Da dies unübersichtlich werden kann, empfiehlt es sich die Bedingung separat zu definieren.

Mit isin() können wir auch Filter erstellen, die prüfen ob ein Element zu einer Gruppe gehört.

Re-Kodierung: neue kategorische Variablen bilden

Neue kategorische Variable als Hierarchie

Im folgenden wollen wir uns auf einige europäische Länder begrenzen. Wir filtern den Datensatz entsprechend. Dazu erstellen wir zunächst eine neue Variable "Country Group", die verschiedene Länder in Ländergruppen zusammenfasst. Wir bilden also eine Hierarchie. Nachdem wir diese neue kategorische Variable gebildet haben, können wir uns mit value_counts() die Einträge pro Ausprägung angucken.

Es gibt 355 Einträge für europäische Ländern.

Unser neuer Datensatz df_europe hat 355 Zeilen.

Binning

Pandas hat zwei Methoden, um eine numerische Variable in mehrere Kategorien einzuteilen (binning). Mit Hilfe von cut() können die Kategorien selbst definiert werden. qcut() teilt eine numerische Variable in eine vorgegebene Anzahl gleich großer Kategorien auf.

Der Datensatz enthält eine Variable zur Lebenswertung. Mit plot können wir uns die Verteilung angucken.

Die Verteilung ist etwas bi-modal, mit vielen Werten um die 73 und um 68.

Für eine Auswertung sind die spezifischen Werte vielleicht nicht so relevant, so dass man auch eine übersichtliche Anzahl an Kategorien betrachten kann. Wenn man keine inhaltliche Gründe für eine bestimmte Aufteilung kennt, dann bietet es sich an, einfach gleich große Gruppen zu bilden.

Mit der Methode qcut() können wir auf Grundlager der numerischen Variable "Healthy life expectancy at birth" eine kategorische Variablen mit einer vorgegebenen Anzahl gleich großer Kategorien bilden. Bei vier Kategorien werden dann Gruppen entsprechend der Quartile gebildet. Die Anzahl der Kategorien wird über den Parameter q gesteuert.

MIt Hilfe von value_counts() können wir uns davon überzeugen, dass die Kategorien (fast) genau gleich groß sind.

Die Methode bildet halb-offene Intervalle, die standardmäßig auch als Namen der Kategorien benutzt werden. Man kann mittels des Parameters label auch eine eigene Liste von Namen vergeben.

Wir begrenzen den Datensatz zusätzlich noch auf bestimmte Spalten. Die Variable "Life Ladder" bezieht sich auf das subjektive Wohlergehen. Wir ändern den Namen der Spalten dementsprechend.

Die Spalte für Democratic Quality hat fehlende Werte. Wir können uns die Ländernamen und Jahre für die Zeilen mit fehlenden Werten ausgeben lassen.

Anscheinend fehlt diese Information für ein ganzes Jahr. Um diese Vermutung zu bestätigen, lassen wir uns die verschiedenen Werte für 2018 ausgeben.

Zuletzt speichern wir den kleineren und um die Region (Country group) sowie die kategorische Variable Life expectancy (quartiles) angereicherten Datensatz als CSV-Datei ab. Standardmässig wird ein Komma als Trennzeichen verwendet.

In dem zweiten Teil arbeiten wir mit den Daten für Europa weiter und betrachten einige (teilweise aggregierte) deskriptive Statistiken. Wir gucken uns auch einige bi-variate Zusammenhänge mit Hilfe von Datenvisualisierungen an. Schließlich rechnen wir eine einfache Regressionsanalyse.