HOWTO · Pandas
Wie Sie geschichtete Stichproben in Pandas durchführen
Lernen Sie, wie Sie gleich große oder zur Grundgesamtheit proportionale geschichtete Stichproben aus einem Pandas DataFrame ziehen.
Auf dieser Seite
Mit Pandas können Sie Stichproben aus Gruppen ziehen, die durch eine Schichtspalte definiert sind. Wählen Sie aus jeder Gruppe gleich viele Zeilen, wenn der Vergleich zwischen den Gruppen wichtig ist. Soll die Stichprobe dagegen die Zusammensetzung der Grundgesamtheit widerspiegeln, verteilen Sie eine feste Gesamtzahl entsprechend den Gruppengrößen. Ein fester Zufallsstartwert macht eine beispielhafte Ziehung reproduzierbar.
Geschichtete Stichproben in der Statistik
Bei einer geschichteten Stichprobe wird eine Grundgesamtheit in überschneidungsfreie Gruppen, sogenannte Schichten, unterteilt. Anschließend werden aus jeder Gruppe Beobachtungen ausgewählt. Eine Schicht kann etwa eine Klassenstufe, eine Region, eine Altersgruppe oder ein anderes für die Fragestellung relevantes Merkmal sein. Durch die Ziehung innerhalb dieser Gruppen lässt sich sicherstellen, dass wichtige Gruppen in einer Stichprobe vorkommen. Sie beseitigt jedoch weder automatisch eine Auswahlverzerrung noch garantiert sie, dass die Stichprobe die Grundgesamtheit repräsentiert. Auch der Stichprobenrahmen und die Auswahl der Beobachtungen sind entscheidend.
Forschende verwenden eine Schichtung, wenn sich Gruppen in Merkmalen unterscheiden, die für eine Schätzung relevant sind. Auch bei der Erstellung von Trainings- und Testdatensätzen kann sie hilfreich sein, damit eine Kategorie in beiden Datensätzen vertreten ist. Legen Sie fest, welche Spalte die Schichten bestimmt und ob jede Gruppe gleich viele Beobachtungen oder einen ihrem Anteil an der Grundgesamtheit entsprechenden Anteil beitragen soll. Diese beiden Varianten beantworten unterschiedliche Fragen: Gleich große Anteile erleichtern den Vergleich zwischen Gruppen, während proportionale Anteile deren Größenverhältnisse beibehalten.
Geschichtete Stichproben mit Pandas erstellen
Das folgende Beispiel erstellt einen DataFrame mit zehn Schülern aus drei Klassenstufen. Für eine gleich große Stichprobe werden zwei Schüler je Klassenstufe ausgewählt. Anschließend werden proportional insgesamt sechs Schüler gezogen. Bei dieser proportionalen Zuteilung kommt das Verfahren der größten Reste zum Einsatz: Zunächst wird der exakte Quotenwert jeder Gruppe abgerundet. Die verbleibenden Plätze werden dann den Gruppen mit den größten Nachkommaresten zugeteilt. Die Gruppengrößen betragen hier 5, 3 und 2; die Stichprobe mit sechs Zeilen verteilt sich daher auf 3, 2 und 1.
import pandas as pd
students = {
"Name": [
"sanay", "shivesh", "rutwik", "preet", "yash",
"mann", "pritesh", "hritesh", "raj", "tarun",
],
"ID": ["001", "002", "003", "004", "005", "006", "007", "008", "009", "010"],
"Grade": ["A", "A", "C", "B", "B", "B", "C", "A", "A", "A"],
"Category": [2, 3, 1, 3, 2, 3, 3, 1, 2, 1],
}
df = pd.DataFrame(students)
# Take the same number from each grade.
equal_sample = df.groupby("Grade", group_keys=False).sample(n=2, random_state=7)
print("Equal-sized counts:")
print(equal_sample["Grade"].value_counts().sort_index().to_dict())
# Allocate a fixed total in proportion to each grade's population size.
target = 6
group_sizes = df["Grade"].value_counts().sort_index()
quotas = group_sizes / len(df) * target
allocation = quotas.astype(int)
places_left = target - int(allocation.sum())
remainders = (quotas - allocation).sort_values(ascending=False)
for grade in remainders.index[:places_left]:
allocation.loc[grade] += 1
proportional_sample = pd.concat(
[
group.sample(n=int(allocation.loc[grade]), random_state=7)
for grade, group in df.groupby("Grade", sort=True)
],
ignore_index=True,
)
print("Proportional counts:")
print(proportional_sample["Grade"].value_counts().sort_index().to_dict())
DataFrame.groupby() bildet die Gruppen, aus denen die Stichprobe gezogen wird. Weitere Details finden Sie in der deutschsprachigen Referenz zu Pandas groupby().
Für eine gleich große Stichprobe fordert sample(n=2) zwei Zeilen je Klassenstufe an. Die kleinste Gruppe muss daher mindestens zwei Zeilen enthalten. Ist das nicht der Fall, wählen Sie eine kleinere Anzahl je Gruppe oder passen Sie die Schichten an. Bei einer proportionalen Stichprobe gibt target die gewünschte Gesamtzahl an; der Zuteilungsschritt berücksichtigt Rundungen, sodass sich die Gruppengrößen zu dieser Gesamtzahl addieren. Bei gleichen Nachkommaresten können unterschiedliche Rundungsregeln den letzten Platz verschiedenen Gruppen zuweisen. Dokumentieren Sie deshalb die verwendete Regel, wenn die Analyse reproduzierbar sein soll.
Beide Aufrufe verwenden random_state=7. Bei gleicher Eingabe und derselben Pandas-Umgebung ergibt sich so eine reproduzierbare Ziehung. Ändern Sie den Startwert, um eine andere Zufallsstichprobe zu erhalten. Durch die Schichtung wird festgelegt, wie viele Beobachtungen aus jeder Gruppe stammen. Sie sorgt jedoch nicht für eine zufällige Auswahl innerhalb einer Gruppe, wenn die Quelldaten oder der Auswahlprozess verzerrt sind. Damit sich die Stichprobe reproduzieren lässt, sollten Sie die Schichtspalte, die Zuteilungsregel, den Stichprobenumfang und den Startwert angeben.