Pandas-Daten-Binning (cut / qcut)
Daten-Binning (auch Bucketing genannt) ist der Prozess der Diskretisierung kontinuierlicher Variablen, der häufig in der Datenvorverarbeitung, im Feature Engineering und in der Datenanalyse verwendet wird.
cut gleichbreites Binning
cutTeile die Daten in Intervalle gleicher Breite auf.
Beispiel
import pandas as pd
import numpy as np
# Altersdaten erstellen
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Originaldaten:")
print(ages.tolist())
print()
# Gleichbreites Binning (5 Intervalle)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Kind", "Jugend", "Mittleren Alters", "Jungsenioren", "Senioren"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Ergebnis des gleichbreiten Binnings:")
print(age_bins)
print()
# Rechte Grenze einschließen
age_bins2 = pd.cut(ages, bins=4)
print("Automatisches Binning mit gleicher Breite:")
print(age_bins2)
import numpy as np
# Altersdaten erstellen
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Originaldaten:")
print(ages.tolist())
print()
# Gleichbreites Binning (5 Intervalle)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Kind", "Jugend", "Mittleren Alters", "Jungsenioren", "Senioren"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Ergebnis des gleichbreiten Binnings:")
print(age_bins)
print()
# Rechte Grenze einschließen
age_bins2 = pd.cut(ages, bins=4)
print("Automatisches Binning mit gleicher Breite:")
print(age_bins2)
Kategorien und Grenzen zurückgeben
Beispiel
import pandas as pd
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Intervallindizes zurückgeben
result = pd.cut(ages, bins=4, labels=False)
print("Intervallindizes:")
print(result)
print()
# Intervallgrenzen zurückgeben
result = pd.cut(ages, bins=4, retbins=True)
print("Intervallgrenzen:")
print(result[1])
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Intervallindizes zurückgeben
result = pd.cut(ages, bins=4, labels=False)
print("Intervallindizes:")
print(result)
print()
# Intervallgrenzen zurückgeben
result = pd.cut(ages, bins=4, retbins=True)
print("Intervallgrenzen:")
print(result[1])
qcut Binning mit gleicher Häufigkeit
qcutTeilen Sie die Daten in Intervalle mit ungefähr derselben Anzahl von Datenpunkten auf.
Beispiel
import pandas as pd
import numpy as np
# Ungleichmäßig verteilte Daten
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Originaldaten:")
print(data.tolist())
print()
# Binning mit gleicher Breite (kann zu ungleichmäßiger Verteilung führen)
cut_result = pd.cut(data, q=4)
print("Binning mit gleicher Breite:")
print(cut_result.value_counts())
print()
# Binning mit gleicher Häufigkeit (ungefähr dieselbe Anzahl von Datenpunkten pro Intervall)
qcut_result = pd.qcut(data, q=4)
print("Binning mit gleicher Häufigkeit:")
print(qcut_result.value_counts())
import numpy as np
# Ungleichmäßig verteilte Daten
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Originaldaten:")
print(data.tolist())
print()
# Binning mit gleicher Breite (kann zu ungleichmäßiger Verteilung führen)
cut_result = pd.cut(data, q=4)
print("Binning mit gleicher Breite:")
print(cut_result.value_counts())
print()
# Binning mit gleicher Häufigkeit (ungefähr dieselbe Anzahl von Datenpunkten pro Intervall)
qcut_result = pd.qcut(data, q=4)
print("Binning mit gleicher Häufigkeit:")
print(qcut_result.value_counts())
Quantile festlegen
Beispiel
import pandas as pd
data = pd.Series(range(1, 101))
# Nach festgelegten Quantilen aufteilen
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Nach Quantilen aufgeteilt:")
print(result.value_counts().sort_index())
data = pd.Series(range(1, 101))
# Nach festgelegten Quantilen aufteilen
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Nach Quantilen aufgeteilt:")
print(result.value_counts().sort_index())
Übung: Datenanalyse
Beispiel
import pandas as pd
import numpy as np
# Kundenausgabendaten simulieren
np.random.seed(42)
customers = pd.DataFrame({
"Kunden-ID": range(1, 101),
"Ausgabenbetrag": np.random.exponential(500, 100) + 100
})
# In verschiedene Ausgabenstufen einteilen
customers["Spending level"] = pd.cut(
customers["Spending amount"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Niedrig", "Mittel", "Hoch", "VIP"]
)
# Kunden in jeder Stufe zählen
print("Verteilung der Ausgabenstufen:")
print(customers["Spending level"].value_counts())
print()
# Durchschnittliche Ausgaben pro Stufe berechnen
print("Durchschnittliche Ausgaben pro Stufe:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))
import numpy as np
# Kundenausgabendaten simulieren
np.random.seed(42)
customers = pd.DataFrame({
"Kunden-ID": range(1, 101),
"Ausgabenbetrag": np.random.exponential(500, 100) + 100
})
# In verschiedene Ausgabenstufen einteilen
customers["Spending level"] = pd.cut(
customers["Spending amount"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Niedrig", "Mittel", "Hoch", "VIP"]
)
# Kunden in jeder Stufe zählen
print("Verteilung der Ausgabenstufen:")
print(customers["Spending level"].value_counts())
print()
# Durchschnittliche Ausgaben pro Stufe berechnen
print("Durchschnittliche Ausgaben pro Stufe:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))