Babynamen in den USA¶
Die US-Meldebehörden haben die Namen aller seit 1880 geborenen US-Staatsbürger registriert. Der Datensatz ist öffentlich unter www.ssa.gov/oact/babynames/limits.html zugänglich. Aus Datenschutzgründen sind nur Namen, die mindestens 5 Mal verwendet wurden, im Datensatz aufgeführt.
Vorbereitungen¶
Lade den Datensatz der U.S.-Babynamen von www.ssa.gov/oact/babynames/limits.html herunter (die nationalen Daten).
Entpacke die Datei.
Aufgabe 1¶
Lies die Datei ‚yob2000.txt‘ mit `polars`pandas ein:
import polars as pl
df = pl.read_csv("babynames/yob2000.txt",
has_header=False,
new_columns=["name", "geschlecht", "anzahl"]
)
Aufgabe 2¶
Inspiziere die Daten mit:
df.shape
und
df.head()
Aufgabe 3¶
Berechne die Anzahl Geburten insgesamt:
df["anzahl"].sum()
Probiere statt sum() auch die Funktionen mean(), std() und describe()
Aufgabe 4¶
Zähle die Anzahl unterschiedlicher Jungen- und Mädchennamen:
df["geschlecht"].value_counts()
Aufgabe 5¶
Wähle die Mädchennamen aus:
f = df.filter(geschlecht="F")
Untersuche diese Teilmenge wie in Aufgabe 3.
Aufgabe 6¶
Ermittle Namen die besonders häufig vorkommen:
top = df.filter(pl.col("anzahl") > 10000)
Gib die Namen aus.
Aufgabe 7¶
Finde einen bestimmten Namen in der Tabelle, z.B. deinen eigenen.
Aufgabe 8¶
Erstelle eine neue Spalte mit dem Jahr:
df = df.with_columns(jahr=2000)
Erstelle eine neue Spalte mit dem prozentualen Anteil für jeden Namen:
df = df.with_columns(perc = 100 * df["anzahl"] / df["anzahl"].sum())
Sichte das Ergebnis.
Aufgabe 10¶
Hier ist ein Stück Code, der alle Jahrgänge einliest:
import os
daten = []
pfad = "daten/"
for fn in os.listdir(pfad):
if fn.startswith("yob"):
df = pl.read_csv(pfad + fn,
has_header=False,
new_columns=["name", "geschlecht", "anzahl"]
)
df = df.with_columns(jahr=int(fn[3:7]))
daten.append(df)
df = pl.concat(daten)
Du solltest eine riesige Tabelle mit den Daten aller Jahrgänge erhalten.
Prüfe die Anzahl Zeilen und Spalten mit df.shape. Es sollten vier Spalten und über 2 Mio Zeilen sein.
Aufgabe 11¶
Untersuche die Beliebtheit der Vornamen einiger US-Promis im Verlauf der letzten 130 Jahre. Gib Übereinstimmungen für einen Namen mit Jahr und Anzahl auf dem Bildschirm aus.
Folgende Promis könnten interessant sein:
Name |
Kommentar |
|---|---|
Lance |
Mensch auf dem Mond |
Madonna |
Hitsingle „Like a Prayer“ |
Barack |
Präsident |
Katrina |
Hurrikan in New Orleans |
Luke |
Jedi |
Frida |
Malerin, Biographie als Broadway-Musical |
Arielle |
Meerjungfrau, Biographie von Walt Disney verfilmt |
Harley |
Motorrad |
Khaleesi |
Berufsbezeichnung bei „Game of Thrones“ |
Wednesday |
Wochentag |
Du kannst einen Teildatensatz mit folgenden Zeilen plotten. Filtere dazu nach Name und ein Geschlecht.
promi = df.filter(...)
sns.lineplot(promi, x="jahr", y="anzahl")
Aufgabe 12¶
Hier sind einige weitere Ideen. Du kannst mit den zusätzlichen Spalten weitere Pivot-Tabellen generieren.
Der Anfangsbuchstabe als Spalte:¶
dd = dd.with_columns(first=dd["name"].str.slice(0, 1))
Länge des Namens¶
dd = dd.with_columns(length=dd["name"].str.len_chars())
Hier ist ein Beispiel für eine Längenstatistik:
lengthstat = dd.pivot(on="geschlecht", index="length", values="anzahl", aggregate_function="len")