from pathlib import Path
import numpy as np
import pandas as pd
pd.options.plotting.backend = "plotly"
DATA = Path("/tmp/Daten_FSP/") # noqa: S108
Selbstlernphase: SOEP kennenlernen#
Diese Woche lernen Sie die SOEP Daten genauer kennen. Ziel dieses Notebooks ist es, sie an die Datenstruktur heranzuführen. Die behandelten Themen wurden zu Illustrationszwecken gewählt.
Für das SOEP gibt es verschiedene Websites, die Informationen enthalten. Der SOEP-Companion ist oft eine gute erste Anlaufstelle, um sich einen Überblick zu verschaffen. Außerdem ist es wichtig zu wissen, dass die SOEP Rohdaten aus vielen verschiedenen Datensätzen auf Individuen- oder Haushaltsebene bestehen. Eine Liste der Datensätze finden Sie hier.
Wir laden als erstes den Datensatz pgen.
pgen = pd.read_pickle(DATA / "pgen_2019.pkl") # noqa: S301
Verschaffen Sie sich einen groben Überblick. Welche Variablen enthält dieser Datensatz? Sie können die eben genannten Websites zurate ziehen.
pgen.columns
Wie Sie sehen sind die Variablennamen oft nicht aussagekräfitg. Schauen wir uns manche Variablen genauer an.
pgen[["cid", "hid", "pid"]]
Diese Variablen sind essentiell um Informationen aus verschiedenen Datensätzen zu verknüpfen. Finden Sie heraus wofür diese vier Variablen stehen. Sie können dafür diese Website nutzen. Was ist der Unterschied zwischen cid
und hid
?
Wie viele Beobachtungen und Variablen enthält der Datensatz?
pgen.shape
Wie viele verschiedene (!) Individuen und wie viele verschiedene aktuelle Haushalte sind in diesem Datensatz enthalten?
Tipp: Mittels der Methode nunique()
erhalten Sie die Anzahl an Merkmalsausprägungen, nähere Infos hier.
Welche Variable wird benötigt, um eine Beobachtung zu identifizieren? Erstellen Sie eine
Variable pgen_sorted
, welche den Datensatz mit entsprechen gesetztem und sortierten
Index enthält.
Als beispielhalte Übungsaufgabe möchten wir die Arbeitszeit von Frauen und Männern vergleichen. Suchen Sie dafür folgende Spalten heraus.
wöchentliche vereinbarte Arbeitszeit
wöchentliche tatsächliche Arbeitszeit
Erstellen Sie eine Variable pgen_arbeit
aus pgen_sorted
, welche aus dem Datensatz
nur die zwei von Ihnen identifizierten Spalten enthält.
Bennen Sie die beiden Spalten mit der Arbeitszeit um. Dazu können Sie folgende Vorlage verwenden:
pgen_arbeit = pgen_arbeit.rename(
columns={
"Spalte 1": "vereinbarte Arbeitszeit",
"Spalte 2": "tatsächliche Arbeitszeit"
}
)
Wenn wir nun versuchen die Überstunden zu berechnen als:
pgen_arbeit["überstunden"] = (
pgen_arbeit["tatsächliche Arbeitszeit"]
- pgen_arbeit["vereinbarte Arbeitszeit"]
)
resultiert das in einer Fehlermeldung.
Der Grund hierfür ist, dass die Variablen nicht nur angegebene Stunden, sondern auch
verschiedene missing values z.B. "[-1] keine Angabe"
beinhalten. Schauen Sie auf der
Website welche verschiedenen
missings es gibt. Der Einfachheit halber wollen wir hier alle gleich np.nan
setzten.
Das erlaubt uns den Datentyp zu float (einer Fließkommazahl, die typische Art, reele
Zahlen zu approximieren) zu ändern. Ergänzen Sie den folgenden Code entsprechend.
pgen_arbeit[["tatsächliche Arbeitszeit", "vereinbarte Arbeitszeit"]] = (
pgen_arbeit[["tatsächliche Arbeitszeit", "vereinbarte Arbeitszeit"]].replace(
{
"[-1] keine Angabe": np.nan,
...
}
)
).astype("float")
Sie können sich eine zusammenfassende Statistik der Spalten anschauen:
pgen_arbeit["vereinbarte Arbeitszeit"].describe()
Nun können wir uns ein Histogramm der beiden Arbeitszeitmaße anschauen.
pgen_arbeit.plot.hist(
x=["tatsächliche Arbeitszeit", "vereinbarte Arbeitszeit"],
histnorm="percent",
nbins=50,
)
Zuletzt schauen wir uns die Verteilung der Arbeitsstunden nach Geschlecht an.
Die Geschlechtsinformation ist jedoch nicht im pgen Datensatz enthalten. Um diese zu erhalten, müssen wir den pequiv Datensatz an unseren derzeitigen Datensatz joinen.
pequiv = pd.read_pickle(DATA / "pequiv_2019.pkl") # noqa: S301
Suchen Sie mithilfe der Website den
Variablennamen der Geschlechtsvariable im pequiv Datensatz. Überschreiben Sie den
Datensatz, sodass er nur die Variablen pid
und die von Ihnen gefundene Variable
enthält.
Um die beiden Datensätze zu joinen setzen wir wie immer den passenden Index.
pequiv = pequiv.set_index(["pid"])
data_merged = pgen_arbeit.join(pequiv)
data_merged
Wir ersetzen wieder die fehlenden Werte und passen den Datentyp an. Hier behalten wir nur Individuen, die weiblich oder männlich angegeben haben.
data_merged["geschlecht"] = (
data_merged["d11102ll"]
.replace(
{
"[2] Female": "weiblich",
"[1] Male": "maennlich",
},
)
.astype(str)
)
data_merged = data_merged[data_merged["geschlecht"].isin(["weiblich", "maennlich"])]
Erstellen Sie nun ein Histogram, welches die vereinbarte Arbeitszeit beider Geschlechter darstellt. Falls Sie den Output interpretieren möchten, bedenken Sie, dass Individuen, die keiner Erwerbstätigkeit nachgehen, hier nicht enthalten sind.