Da ich keine Antwort gesehen habe, die sich mit numerischen und nicht-numerischen Attributen beschäftigt, hier eine ergänzende Antwort.
Sie möchten vielleicht nur Ausreißer bei numerischen Attributen entfernen (kategoriale Variablen können kaum Ausreißer sein).
Funktionsdefinition
Ich habe @tanemakis Vorschlag erweitert, um Daten zu verarbeiten, wenn auch nicht-numerische Attribute vorhanden sind:
from scipy import stats
def drop_numerical_outliers(df, z_thresh=3):
# Beschränkungen werden `True` oder `False` enthalten, je nachdem, ob es sich um einen Wert unterhalb des Schwellenwerts handelt.
beschränkungen = df.select_dtypes(include=[np.number]) \
.apply(lambda x: np.abs(stats.zscore(x)) < z_thresh, reduce=False) \
.all(axis=1)
# Werte, die abgelehnt werden sollen, entfernen (direkt)
df.drop(df.index[~beschränkungen], inplace=True)
Verwendung
drop_numerical_outliers(df)
Beispiel
Stellen Sie sich einen Datensatz df
mit einigen Werten über Häuser vor: Gasse, Grundstückskontur, Verkaufspreis, ... Z.B.: Daten Dokumentation
Zuerst möchten Sie die Daten auf einem Scattergraphen visualisieren (mit Z-Score-Schwelle=3):
# Daten vor dem Entfernen der Werte über einem Z-Score von 3 plotten.
# Die Definition der Funktion scatterAreaVsPrice wurde der Übersichtlichkeit halber entfernt.
scatterAreaVsPrice(df)
![Vorher - Fläche gegen Verkaufspreis]()
# Entfernen Sie die Ausreißer bei allen Attributen
drop_numerical_outliers(train_df)
# Plotten Sie das Ergebnis. Alle Ausreißer wurden entfernt. Beachten Sie, dass die roten Punkte nicht
# dieselben Ausreißer wie im ersten Plot sind, sondern die neuen berechneten Ausreißer basierend auf dem neuen Datenrahmen.
scatterAreaVsPrice(train_df)
![Nachher - Fläche gegen Verkaufspreis]()