Im heutigen Beitrag möchte ich eine einfache Anleitung zur Datenvisualisierung in Python erstellen und zeigen, wie der Prozess in seinem gesamten Ablauf ausschauen kann. Um eine Visualisierung zu erstellen, werden wir das Beispiel aus dem vorherigen Artikel zu Straßenverkehrsunfällen in Deutschland benutzen.
Die Kunst der Datenvisualisierung ist eine Wissenschaft für sich. Die Softwareprodukte, die uns bei der Datenvisualisierungen unterstützen, können vom Prinzip in zwei Sorten geteilt werden.
Zum einem gibt es Software wie Excel oder Tableau. Hier sehen die Visualisierungen relativ schnell gut aus und können auch vergleichsweise einfach erstellt werden. Im Fall von Tableau geht es sogar bereits mit einem Drag-and-Drop Verfahren. Eine Anleitung zur Datenvisualisierung in Tableau habe ich hier geschrieben. Diese (relative) Einfachheit hat allerdings auch ihre Nachteile. Diese Softwareprodukte sind nicht kostenfrei und sie sind ziemlich unflexibel. Sie arbeiten mit gewissen Vorlagen, das heißt die Daten müssen auf das jeweilige System stark angepasst werden.
Wenn wir eine größere Flexibilität für unsere Datenvisualsierungen benötigen, kommen wir um Programmiersprachen wie Python nicht herum. In Python sind Visualisierungen zunächst nicht so einfach zu erstellen wie vielleicht mit Excel. Auch sind sie nicht so schön wie in Tableau. Die Eingangsschwelle liegt höher. Wenn sie allerdings erstmal überwunden ist, bietet Python deutlich mehr Alternativen und Spielraum. Last but not least, Python ist eine Open-Source-Anwendung.
Um eine Visualisierung mit Python zu erstellen, müssen ein paar (offensichtliche) Bedingungen erfüllt sein. Zu diesen Schritten werde ich in Zukuft einen weiteren Beitrag verfassen. Heute spreche ich sie nur kurz in ein paar Punkten an.
Es muss softwaretechnisch Folgendes auf dem PC installiert sein:
Für das Beispielprojekt nutze ich die Daten des Statistischen Bundesamts Destatis. Konkret geht es um die Tabelle 0007 – Verkehrstatistiken in der GENESIS Datenbank. Die Datenbank verfügt über ein sehr breites Angebot an Daten zu Verkehrstatistiken. Allerdings können die GENESIS-Tabellen auch Probleme bereiten. Zum einen ist es teiweise schwierig nachzuvollziehen, was die einzelnen Kolumnen bedeuten. Zum anderen kann man oft die einzelnen augewählten Datenreihen nicht herunterladen, sondern nur die Gesamtheit an Daten und hat am Ende eine größere Tabelle als eigentlich benötigt. Dies bedeutet mehr Arbeit in Excel und Python bei der Datenbereinigung.
Aus der GENESIS-Datenbank habe ich die Daten zu Verkehrsunfällen mit Kindern unter 15 Jahre alt als CSV-Datei heruntergeladen.
Obwohl ich versucht habe die Daten als reine Textdateien herunterzuladen, enthielt die CSV-Datei dennoch diverse Formatierungen der GENESIS Datenbank. Diese Formatierungen habe ich in Excel manuel gelöscht.
Zusätzlich ist es in GENESIS, wie bereits geschrieben, nicht immer möglich nur die gewünschten Daten als Tabelle herunterzuladen. Man erhält weitere Daten in der Tabelle dazu. So sah beispielsweise die Tabelle in ihrer Ursprungsform in meinem Fall aus:
Die Tabelle enthält viel mehr Informationen, als ich für meine Zwecke brauche. Hier möchte ich einfach nur die getöteten Kinder unter 15 im Straßenverkehr von 2008 bis 2018 erfassen. Aus diesem Grund musste ich die Tabelle manuell im Excel verändern. Hier das Endergebnis:
Bei größeren Datenmengen empfiehlt sich eine direkte Bereinigung in Python. Das Problem dabei sind immer die zusätzlichen Formatierungen. Ihre Enfernung geht oft schneller in Excel.
Im zweiten Schritt kann die Tabelle mittels Pandas mit folgendem Code als dataframe geöffnet werden.
# downloading data df = pd.read_csv('verkehr_stat.csv',sep=';', encoding='latin-1')
Der Befehl zum Abrufen der CSV-Datei ist immer gleich. Allerdings können sich die Zusatzelemente wie „encoding“ verändern. Hier muss man ein wenig testen, was funktioniert, damit das Dokument gut lesbar wird.
Die Tabelle in Python schaut jetzt folgendermaßen aus:
Jahr | Art | Statistik | Zahl | Kinder_ges | |
---|---|---|---|---|---|
0 | 2008 | Fußgänger | Getötete | 23 | 11139106 |
1 | 2008 | Fußgänger | Insgesamt | 7927 | 11139106 |
2 | 2008 | Insgesamt | Getötete | 102 | 11139106 |
3 | 2008 | Insgesamt | Insgesamt | 31648 | 11139106 |
4 | 2009 | Fußgänger | Getötete | 23 | 11022634 |
5 | 2009 | Fußgänger | Insgesamt | 7706 | 11022634 |
6 | 2009 | Insgesamt | Getötete | 90 | 11022634 |
7 | 2009 | Insgesamt | Insgesamt | 30845 | 11022634 |
8 | 2010 | Fußgänger | Getötete | 28 | 10941201 |
9 | 2010 | Fußgänger | Insgesamt | 7304 | 10941201 |
Im dritten Schritt werden die Daten in der Tabelle so aufgearbeitet, dass wir nur die Kennzahlen darin haben, die wir tatsächlich visualisieren möchten. Hier zeigt sich die Flexibilität Pythons, denn die Möglichkeiten sind vielfältig.
Das Ziel ist es, die Zahl der getöteten Kinder unter 15 in Deutschland zwischen den Jahren 2008 und 2018 darzustellen.
Hierzu erstellen wir einen neuen Datensatz aus dem vorherigen Dataframe (df).
gesamt_stat = df[df['Art'] == 'Insgesamt'] # Ausfiltern von Fußgängerstatistiken gesamt_get = gesamt_stat[gesamt_stat['Statistik'] == 'Getötete'] # Ausfiltern von gesamten Unfällen
Der neue Datensatz gesamt_get enthält dann nur die Angaben zu der Gesamtzahl der im Straßenverkehr getöteten Kinder unter 15 in Deutschland zwischen den Jahren 2008 und 2018.
gesamt_get
Jahr | Art | Statistik | Zahl | Kinder_ges | |
---|---|---|---|---|---|
2 | 2008 | Insgesamt | Getötete | 102 | 11139106 |
6 | 2009 | Insgesamt | Getötete | 90 | 11022634 |
10 | 2010 | Insgesamt | Getötete | 104 | 10941201 |
14 | 2011 | Insgesamt | Getötete | 86 | 10773006 |
18 | 2012 | Insgesamt | Getötete | 73 | 10682903 |
22 | 2013 | Insgesamt | Getötete | 58 | 10642432 |
26 | 2014 | Insgesamt | Getötete | 72 | 10686723 |
30 | 2015 | Insgesamt | Getötete | 84 | 10881126 |
34 | 2016 | Insgesamt | Getötete | 66 | 11048568 |
38 | 2017 | Insgesamt | Getötete | 61 | 11171759 |
42 | 2018 | Insgesamt | Getötete | 79 | 11290815 |
Im Anschluß können wir die Daten mittels Matplotlib visualisieren. Hierzu reicht der folgende Code:
plt.plot('Jahr', 'Zahl', data=gesamt_get) plt.xlabel('Jahr') plt.ylabel('Kinder unter 15') plt.title('Getötete Kinder unter 15 im Straßenverkehr')
plt.plot('Jahr', 'Zahl', data=gesamt_get) plt.plot - sagt dem Matplotlib, dass wir ein Plot erstellen möchten
plt.xlabel('Jahr') - Bestimmen, welche Daten die X-Achse abbilden plt.ylabel('Kinder unter 15') - Bestimmen, welche Daten die Y-Achse abbilden plt.title('Getötete Kinder unter 15 im Straßenverkehr') - Titelnennung
Mit diesem Code erhält man folgende Visualisierung:
Die Viusalisierungen mit Matplotlib sehen optisch nicht so schön aus wie die Grafiken in beispielsweise Tableau. Allerdings haben sich auch Python-Pakete weiterentwickelt und es gibt neuere Anwendungen, wie beispielsweise Seaborn, die eine schönere Farbenpalette anbieten.
Das Unschlagbare an Python bleibt die Flexibilität und Bequemlichkeit alles zusammen in einem Jupyter Notebook zu gestalten.
Der schwierigste Teil, insbesondere im Vergleich zu Excel und Tableau, ist die Installation der Software und die ersten Schritte. Sobald man jedoch die erste Anwendung bedienen kann, bietet Python viel mehr Möglichkeiten als andere Softwareprodukte.
Der Code für das gesamte Projekt befindet sich auf meiner Github-Seite (Link).
Bei Fragen zu den Datenvisualisierungen könnnen Sie mich gerne unter info@datenverstehen.de kontaktieren oder eine Nachricht in den Kommentaren schreiben.
Bild von Photo Mix auf Pixabay
Eine erfolgreiche Webseite geht auch immer mit einer hohen Conversion Rate (Konversionsrate) einher. Denn schließlich…
"The winner takes it all, The loser has to fall , It's simple and it's…
Generative KI-Chats wie ChatGPT, Bard und ähnliche Systeme erfreuen sich derzeit großer Beliebtheit. Diese sprachbasierten…
Für "Informatik Aktuell" habe ich einen Artikel über die Funktionsweise der Transformer verfasst, einschließlich ihrer…
Menschen haben oft Probleme Folgewirkungen ihrer Entscheidungen in ihrer Komplexität zu erfassen. Sie treffen oft…
Vor Kurzem durfte ich ein wenig Input über Survivorship Bias für den Artikel in Spiegel…
View Comments