Datenanalyse und -visualisierung mit pandas und Jupyter Notebook in Python 3
Einführung
Das Python-Paket pandas wird zur Datenmanipulation und -analyse verwendet und ist so konzipiert, dass Sie intuitiv mit gekennzeichneten oder relationalen Daten arbeiten können.
Das pandas-Paket bietet Tabellenkalkulationsfunktionen, aber da Sie mit Python arbeiten, ist es viel schneller und effizienter als ein herkömmliches grafisches Tabellenkalkulationsprogramm.
In diesem Tutorial werden wir die Erstellung eines großen Datensatzes, die Funktionen groupby() und pivot_table() von pandas und schließlich die Visualisierung von Daten behandeln.
Um ein gewisses Verständnis für das pandas-Paket zu bekommen, können Sie unser Tutorial "Eine Einführung in das pandas-Paket und seine Datenstrukturen in Python 3" lesen.
Voraussetzungen
Dieser Leitfaden behandelt, wie man mit Daten in pandas auf einem lokalen Desktop oder einem entfernten Server arbeitet. Die Arbeit mit großen Datensätzen kann speicherintensiv sein, daher benötigt der Computer in beiden Fällen mindestens 2 GB Arbeitsspeicher, um einige der Berechnungen in diesem Leitfaden durchzuführen.
Für dieses Tutorial werden wir Jupyter Notebook verwenden, um mit den Daten zu arbeiten. Wenn Sie es noch nicht haben, sollten Sie unserem Tutorial folgen, um Jupyter Notebook für Python 3 zu installieren und einzurichten.
Daten einrichten
Für dieses Tutorial werden wir mit den Daten der Sozialversicherungsbehörde der Vereinigten Staaten zu Babynamen arbeiten, die als 8 MB ZIP-Datei von der Website der Sozialversicherungsbehörde verfügbar sind.
Lass uns unsere Python 3 Programmierumgebung auf unserem lokalen Rechner oder auf unserem Server aus dem richtigen Verzeichnis aktivieren:
- cd environments
- . my_env/bin/activate
Lass uns jetzt ein neues Verzeichnis für unser Projekt erstellen. Wir können es names nennen und dann in das Verzeichnis wechseln:
- mkdir names
- cd names
Innerhalb dieses Verzeichnisses können wir die ZIP-Datei von der Website der Sozialversicherung mit dem curl-Befehl herunterladen:
- curl -O https://www.ssa.gov/oact/babynames/names.zip
Sobald die Datei heruntergeladen ist, lassen Sie uns überprüfen, ob wir alle Pakete installiert haben, die wir verwenden werden:
numpyzur Unterstützung mehrdimensionaler Arraysmatplotlibzur Visualisierung von Datenpandasfür unsere Datenanalyse- Seaborn, um unsere matplotlib-statistischen Grafiken ästhetischer zu gestalten.
Wenn Sie eines der Pakete noch nicht installiert haben, installieren Sie sie mit pip, wie folgt:
- pip install pandas
- pip install matplotlib
- pip install seaborn
Das numpy Paket wird ebenfalls installiert, wenn Sie es noch nicht haben.
Jetzt können wir Jupyter Notebook starten:
- jupyter notebook
Sobald Sie sich in der Weboberfläche von Jupyter Notebook befinden, sehen Sie dort die names.zip Datei.
Um eine neue Notizbuchdatei zu erstellen, wählen Sie Neu > Python 3 aus dem Dropdown-Menü oben rechts:
Das öffnet ein Notizbuch.
Lass uns damit beginnen, die Pakete zu importieren, die wir verwenden werden. An der Spitze unseres Notizbuchs sollten wir Folgendes schreiben:
import numpy as np
import matplotlib.pyplot as pp
import pandas as pd
import seaborn
Wir können diesen Code ausführen und in einen neuen Codeblock wechseln, indem wir ALT + ENTER eingeben.
Lass uns auch Python Notebook sagen, dass es unsere Grafiken inline halten soll:
matplotlib inline
Lass uns den Code ausführen und fortfahren, indem wir ALT + ENTER eingeben.
Von hier aus werden wir das Zip-Archiv entpacken, den CSV-Datensatz in pandas laden und dann die pandas DataFrames zusammenfügen.
Entpacken Sie das Zip-Archiv
Um das ZIP-Archiv in das aktuelle Verzeichnis zu entpacken, importieren wir das zipfile-Modul und rufen dann die ZipFile-Funktion mit dem Namen der Datei auf (in unserem Fall names.zip):
import zipfile
zipfile.ZipFile('names.zip').extractall('.')
Wir können den Code ausführen und fortfahren, indem wir ALT + ENTER eingeben.
Wenn Sie nun in Ihr names-Verzeichnis zurückblicken, haben Sie .txt-Dateien mit Namensdaten im CSV-Format. Diese Dateien entsprechen den Datenjahren, die auf File vorhanden sind, von 1881 bis 2015. Jede dieser Dateien folgt einer ähnlichen Benennungskonvention. Die Datei von 2015 wird zum Beispiel yob2015.txt genannt, während die Datei von 1927 yob1927.txt heißt.
Um das Format einer dieser Dateien zu betrachten, lassen Sie uns Python verwenden, um eine zu öffnen und die obersten 5 Zeilen anzuzeigen:
open('yob2015.txt','r').readlines()[:5]
Führen Sie den Code aus und fahren Sie mit ALT + ENTER fort.
['Emma,F,20355\n',
'Olivia,F,19553\n',
'Sophia,F,17327\n',
'Ava,F,16286\n',
'Isabella,F,15504\n']
Die Art und Weise, wie die Daten formatiert sind, beginnt mit dem Namen (wie in Emma oder Olivia), gefolgt vom Geschlecht (wie F für weibliche Namen und M für männliche Namen) und dann der Anzahl der in diesem Jahr geborenen Babys mit diesem Namen (es gab 20.355 Babys namens Emma, die 2015 geboren wurden).
Mit diesen Informationen können wir die Daten in pandas laden.
CSV-Daten in pandas laden
Um Daten im CSV-Format in pandas zu laden, verwenden wir die Funktion pd.read_csv(), wobei wir den Namen der Textdatei sowie die von uns festgelegten Spaltennamen übergeben. Wir weisen dies einer Variablen zu, in diesem Fall names2015, da wir die Daten aus der Geburtsjahr-Datei 2015 verwenden.
names2015 = pd.read_csv('yob2015.txt', names = ['Name', 'Sex', 'Babies'])
Drücke ALT + ENTER, um den Code auszuführen und fortzufahren.
Um sicherzustellen, dass dies funktioniert hat, lassen Sie uns den oberen Teil der Tabelle anzeigen:
names2015.head()
Wenn wir den Code ausführen und mit ALT + ENTER fortfahren, sehen wir eine Ausgabe, die so aussieht:
Unser Tisch hat jetzt Informationen über die Namen, das Geschlecht und die Anzahl der mit jedem Namen geborenen Babys, nach Spalten organisiert.
Verketten von pandas Objekten
Das Verketten von pandas-Objekten ermöglicht es uns, mit allen separaten Textdateien im names-Verzeichnis zu arbeiten.
Um diese zu verkettieren, müssen wir zuerst eine Liste initialisieren, indem wir eine Variable einem unbefüllten Listendatentyp zuweisen:
all_years = []
Sobald wir das getan haben, verwenden wir eine for-Schleife, um über alle Dateien nach Jahr zu iterieren, die von 1880 bis 2015 reichen. Wir fügen +1 zum Ende von 2015 hinzu, damit 2015 in der Schleife enthalten ist.
all_years = []
for year in range(1880, 2015+1):
Innerhalb der Schleife werden wir jede der Textdateiwerte zur Liste hinzufügen, wobei wir einen String-Formatter verwenden, um die unterschiedlichen Namen dieser Dateien zu verarbeiten. Diese Werte werden wir an die year Variable übergeben. Wieder werden wir Spalten für Name, Geschlecht und die Anzahl der Babys spezifizieren:
all_years = []
for year in range(1880, 2015+1):
all_years.append(pd.read_csv('yob{}.txt'.format(year),
names = ['Name', 'Sex', 'Babies']))
Darüber hinaus werden wir eine Spalte für jedes der Jahre erstellen, um diese geordnet zu halten. Dies können wir nach jeder Iteration tun, indem wir den Index von -1 verwenden, um auf sie zu verweisen, während sich die Schleife fortschreitet.
all_years = []
for year in range(1880, 2015+1):
all_years.append(pd.read_csv('yob{}.txt'.format(year),
names = ['Name', 'Sex', 'Babies']))
all_years[-1]['Year'] = year
Schließlich fügen wir es mit einer Verkettung unter Verwendung der Funktion pd.concat() dem pandas Objekt hinzu. Wir werden die Variable all_names verwenden, um diese Informationen zu speichern.
all_years = []
for year in range(1880, 2015+1):
all_years.append(pd.read_csv('yob{}.txt'.format(year),
names = ['Name', 'Sex', 'Babies']))
all_years[-1]['Year'] = year
all_names = pd.concat(all_years)
Wir können die Schleife jetzt mit ALT + ENTER ausführen und dann die Ausgabe überprüfen, indem wir die letzten Zeilen der resultierenden Tabelle aufrufen:
all_names.tail()
Unser Datensatz ist jetzt vollständig und bereit, weitere Arbeiten damit in pandas durchzuführen.
Daten Gruppieren
Mit pandas können Sie Daten nach Spalten mit der .groupby()-Funktion gruppieren. Mit unserer all_names-Variablen für unseren vollständigen Datensatz können wir groupby() verwenden, um die Daten in verschiedene Kategorien zu unterteilen.
Lass uns den Datensatz nach Geschlecht und Jahr gruppieren. Wir können das folgendermaßen einrichten:
group_name = all_names.groupby(['Sex', 'Year'])
Wir können den Code ausführen und mit ALT + ENTER fortfahren.
An diesem Punkt, wenn wir einfach die group_name Variable aufrufen, erhalten wir diese Ausgabe:
<pandas.core.groupby.DataFrameGroupBy object at 0x1187b82e8>
Dies zeigt uns, dass es sich um ein DataFrameGroupBy Objekt handelt. Dieses Objekt enthält Anweisungen, wie die Daten gruppiert werden, gibt jedoch keine Anweisungen dazu, wie die Werte angezeigt werden.
Um Werte anzuzeigen, müssen wir Anweisungen geben. Wir können beispielsweise .size(), .mean() und .sum() berechnen, um eine Tabelle zurückzugeben.
Lass uns mit .size() anfangen:
group_name.size()
Wenn wir den Code ausführen und mit ALT + ENTER fortfahren, wird unsere Ausgabe folgendermaßen aussehen:
Sex Year
F 1880 942
1881 938
1882 1028
1883 1054
1884 1172
...
Diese Daten sehen gut aus, könnten aber leserlicher sein. Wir können sie leserlicher machen, indem wir die .unstack-Funktion anhängen:
group_name.size().unstack()
Jetzt, wenn wir den Code ausführen und fortfahren, indem wir ALT + ENTER eingeben, sieht die Ausgabe wie folgt aus:
Was diese Daten uns sagen, ist, wie viele weibliche und männliche Namen es für jedes Jahr gab. Im Jahr 1889 gab es beispielsweise 1.479 weibliche Namen und 1.111 männliche Namen. Im Jahr 2015 gab es 18.993 weibliche Namen und 13.959 männliche Namen. Dies zeigt, dass es im Laufe der Zeit eine größere Vielfalt an Namen gibt.
Wenn wir die Gesamtzahl der geborenen Babys ermitteln möchten, können wir die .sum()-Funktion verwenden. Lassen Sie uns das auf einen kleineren Datensatz anwenden, dem names2015-Datensatz aus der einzelnen yob2015.txt-Datei, die wir zuvor erstellt haben:
names2015.groupby(['Sex']).sum()
Lass uns ALT + ENTER eingeben, um den Code auszuführen und fortzufahren:
Dies zeigt uns die Gesamtzahl der männlichen und weiblichen Babys, die 2015 geboren wurden, wobei jedoch nur Babys gezählt werden, deren Name in diesem Jahr mindestens 5 Mal verwendet wurde.
Die pandas .groupby()-Funktion ermöglicht es uns, unsere Daten in sinnvolle Gruppen zu segmentieren.
Pivot-Tabelle
Pivot-Tabellen sind nützlich zur Zusammenfassung von Daten. Sie können automatisch Daten in einer Tabelle sortieren, zählen, summieren oder im Durchschnitt berechnen. Dann können sie die Ergebnisse dieser Aktionen in einer neuen Tabelle der zusammengefassten Daten anzeigen.
In pandas wird die Funktion pivot_table() verwendet, um Pivot-Tabellen zu erstellen.
Um eine Pivot-Tabelle zu erstellen, rufen wir zuerst das DataFrame auf, mit dem wir arbeiten möchten, dann die Daten, die wir anzeigen möchten, und wie sie gruppiert sind.
In diesem Beispiel arbeiten wir mit den all_names Daten und zeigen die Babydaten, gruppiert nach Namen in einer Dimension und Jahr in der anderen:
pd.pivot_table(all_names, 'Babies', 'Name', 'Year')
Wenn wir ALT + ENTER eingeben, um den Code auszuführen und fortzufahren, sehen wir die folgende Ausgabe:
Da dies viele leere Werte zeigt, möchten wir möglicherweise Name und Jahr als Spalten beibehalten, anstatt in einem Fall als Zeilen und im anderen als Spalten. Wir können dies erreichen, indem wir die Daten in eckigen Klammern gruppieren:
pd.pivot_table(all_names, 'Babies', ['Name', 'Year'])
Sobald wir ALT + ENTER eingeben, um den Code auszuführen und fortzufahren, zeigt diese Tabelle jetzt nur noch Daten für Jahre an, die für jeden Namen aufgezeichnet sind:
Name Year
Aaban 2007 5.0
2009 6.0
2010 9.0
2011 11.0
2012 11.0
2013 14.0
2014 16.0
2015 15.0
Aabha 2011 7.0
2012 5.0
2014 9.0
2015 7.0
Aabid 2003 5.0
Aabriella 2008 5.0
2014 5.0
2015 5.0
Zusätzlich können wir Daten gruppieren, um Name und Geschlecht als eine Dimension und Jahr als die andere zu haben, wie folgt:
pd.pivot_table(all_names, 'Babies', ['Name', 'Sex'], 'Year')
Wenn wir den Code ausführen und mit ALT + ENTER fortfahren, sehen wir die folgende Tabelle:
Pivot-Tabellen ermöglichen es uns, neue Tabellen aus bestehenden Tabellen zu erstellen, sodass wir entscheiden können, wie wir die Daten gruppieren möchten.
Daten visualisieren
Durch die Verwendung von pandas mit anderen Paketen wie matplotlib können wir Daten innerhalb unseres Notizbuchs visualisieren.
Wir werden Daten zur Popularität eines bestimmten Namens über die Jahre visualisieren. Um dies zu tun, müssen wir Indizes festlegen und sortieren, um die Daten neu zu bearbeiten, die es uns ermöglichen, die sich ändernde Popularität eines bestimmten Namens zu sehen.
Das pandas Paket erlaubt es uns, hierarchische oder mehrstufige Indizes durchzuführen, mit denen wir Daten mit einer beliebigen Anzahl von Dimensionen speichern und manipulieren können.
Wir werden unsere Daten mit Informationen zu Geschlecht, dann Name und dann Jahr indexieren. Wir werden auch den Index sortieren wollen:
all_names_index = all_names.set_index(['Sex','Name','Year']).sort_index()
Geben Sie ALT + ENTER ein, um auszuführen und zu unserer nächsten Zeile fortzufahren, wo wir das Notebook anweisen, den neuen indizierten DataFrame anzuzeigen:
all_names_index
Führen Sie den Code aus und fahren Sie mit ALT + ENTER fort, und die Ausgabe wird so aussehen:
Als nächstes wollen wir eine Funktion schreiben, die die Beliebtheit eines Namens im Laufe der Zeit darstellt. Wir nennen die Funktion name_plot und übergeben sex und name als ihre Parameter, die wir aufrufen werden, wenn wir die Funktion ausführen.
def name_plot(sex, name):
Wir werden jetzt eine Variable namens data einrichten, um die Tabelle zu halten, die wir erstellt haben. Wir werden auch das pandas DataFrame loc verwenden, um unsere Zeile anhand des Wertes des Index auszuwählen. In unserem Fall möchten wir, dass loc auf einer Kombination von Feldern im MultiIndex basiert, die sich sowohl auf die Geschlecht- als auch auf die Name-Daten beziehen.
Lass uns diesen Bau in unsere Funktion schreiben:
def name_plot(sex, name):
data = all_names_index.loc[sex, name]
Schließlich wollen wir die Werte mit matplotlib.pyplot, das wir als pp importiert haben, darstellen. Dann werden wir die Werte der Geschlechts- und Namensdaten gegen den Index plotten, der für unsere Zwecke Jahre sind.
def name_plot(sex, name):
data = all_names_index.loc[sex, name]
pp.plot(data.index, data.values)
Drücken Sie ALT + ENTER, um auszuführen und in die nächste Zelle zu wechseln. Wir können jetzt die Funktion mit dem Geschlecht und dem Namen unserer Wahl aufrufen, wie zum Beispiel F für einen weiblichen Namen mit dem Vornamen Danica.
name_plot('F', 'Danica')
Wenn Sie jetzt ALT + ENTER eingeben, erhalten Sie die folgende Ausgabe:
Beachten Sie, dass je nach dem verwendeten System möglicherweise eine Warnung über eine Schriftartsubstitution angezeigt wird, das Diagramm jedoch dennoch korrekt dargestellt wird.
Wenn wir die Visualisierung betrachten, können wir sehen, dass der Frauenname Danica um 1990 einen kleinen Anstieg in der Beliebtheit hatte und kurz vor 2010 seinen Höhepunkt erreichte.
Die Funktion, die wir erstellt haben, kann verwendet werden, um Daten von mehr als einem Namen darzustellen, sodass wir Trends über die Zeit hinweg bei verschiedenen Namen sehen können.
Lass uns beginnen, indem wir unser Diagramm ein wenig größer machen:
pp.figure(figsize = (18, 8))
Als nächstes erstellen wir eine Liste mit allen Namen, die wir darstellen möchten:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
Jetzt können wir die Liste mit einer for-Schleife durchlaufen und die Daten für jeden Namen plotten. Zuerst werden wir diese geschlechtsneutralen Namen als weibliche Namen ausprobieren:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('F', name)
Um diese Daten leichter verständlich zu machen, lassen Sie uns eine Legende einfügen:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('F', name)
pp.legend(names)
Wir werden ALT + ENTER eingeben, um den Code auszuführen und fortzufahren, und dann werden wir die folgende Ausgabe erhalten:
Während jeder der Namen langsam als weibliche Namen an Popularität gewinnt, war der Name Jamie in den Jahren um 1980 überwältigend populär als weiblicher Name.
Lass uns die gleichen Namen plotten, aber diesmal als männliche Namen:
pp.figure(figsize = (18, 8))
names = ['Sammy', 'Jesse', 'Drew', 'Jamie']
for name in names:
name_plot('M', name)
pp.legend(names)
Wiederholen Sie, geben Sie ALT + ENTER ein, um den Code auszuführen und fortzufahren. Das Diagramm sieht so aus:
Diese Daten zeigen eine größere Beliebtheit von Namen, wobei Jesse im Allgemeinen die beliebteste Wahl ist und besonders in den 1980er und 1990er Jahren beliebt war.
Von hier aus können Sie weiterhin mit Namensdaten spielen, Visualisierungen über verschiedene Namen und deren Beliebtheit erstellen und andere Skripte erstellen, um verschiedene Daten zu betrachten und zu visualisieren.
Schlussfolgerung
Dieses Tutorial hat Ihnen Möglichkeiten vorgestellt, mit großen Datensätzen zu arbeiten, angefangen von der Einrichtung der Daten, über das Gruppieren der Daten mit groupby() und pivot_table(), das Indizieren der Daten mit einem MultiIndex bis hin zur Visualisierung von pandas-Daten mit dem matplotlib-Paket.
Viele Organisationen und Institutionen stellen Datensätze zur Verfügung, mit denen Sie weiter lernen können, wie man pandas und Datenvisualisierung verwendet. Die US-Regierung stellt beispielsweise Daten über data.gov bereit.
Sie können mehr darüber erfahren, wie man Daten mit matplotlib visualisiert, indem Sie unseren Leitfäden zu Wie man Daten in Python 3 mit matplotlib plottet und Wie man die Wortfrequenz mit matplotlib und Python 3 grafisch darstellt, folgen.










