Erkennen und ausschließen von Ausreißern in der Pandas-Daten-frame
Habe ich ein pandas dataframe mit wenigen Spalten.
Jetzt weiß ich, dass gewisse Zeilen sind-Ausreißer, basierend auf einer bestimmten Spalte Wert.
Beispielsweise Spalten - 'Vol' hat alle Werte um 12xx und ein Wert 4000 (Ausreißer).
Nun würde ich gerne ausschließen, die Zeilen, die 'Vol' - Spalte wie diese.
Also, im Grunde brauche ich einen filter auf die Daten-Frames so, dass wir wählen Sie alle Zeilen aus, in denen die Werte einer bestimmten Spalte sind innerhalb von sagen wir 3 Standardabweichungen vom Mittelwert.
Was ist ein eleganter Weg, dies zu erreichen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mehrere Spalten in den dataframe und möchten, entfernen Sie alle Zeilen, die "Ausreißer" in mindestens einer Spalte den folgenden Ausdruck machen würde, in einem Schuss.
Beschreibung:
Spalte, bezogen auf die Spalte Mittelwert und die Standardabweichung.
egal, nur wenn es unter der Schwelle.
- Einschränkung.
Verwenden
boolean
Indizierung, wie innumpy.array
Für eine Serie ist es ähnlich:
DataFrame.abs()
FYI, auchDataFrame.clip()
clip()
, Jeff, die Umrisse werden nicht entfernt:df.SOME_DATA.clip(-3std,+3std)
weisen die outliners entweder +3std oder -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Aber im Gegensatz zu der Anwendung auf eine Reihe oder Spalte hat, diese ersetzen wird "Ausreißer" mitnp.nan
und halten die Form der DataFrame, so dass eine interpolation erforderlich sein könnten, füllen Sie die fehlenden Werte.Für jede Ihrer dataframe Spalte, die Sie bekommen konnte quantile mit:
werden und dann der filter mit:
Diese Antwort ist ähnlich wie die von @tanemaki, verwendet aber eine
lambda
Ausdruck stattscipy stats
.Filtern der DataFrame, wo nur EINE Spalte (z.B. "B") ist innerhalb von drei Standardabweichungen:
Für jede Reihe in der dataframe, Sie könnte verwenden
between
undquantile
zu entfernen Ausreißer.Da habe ich nicht gesehen, eine Antwort, die sich mit numerische und nicht-numerische Attribute, hier ist eine Ergänzung der Antwort.
Möchten Sie vielleicht fallen die Ausreißer nur auf numerische Attribute (kategoriale Variablen können kaum Ausreißer).
Funktion definition
Ich verlängert @tanemaki Vorschlag, um Daten zu behandeln, wenn nicht-numerische Attribute sind auch vorhanden:
Nutzung
Beispiel
Vorstellen, ein dataset
df
mit einigen Werten über Häuser: alley -, land-Kontur -, Verkaufspreis, ... E. g: Daten-DokumentationErsten, die Sie wollen, visualisieren Sie die Daten auf einem Punktdiagramm (mit z-score-Schwelle=3):
reduce=False
wurde als veraltet markiert, dapandas
version 0.23.0scipy.stats
Methodentrim1()
undtrimboth()
geschnitten, um die "Ausreißer" in eine einzelne Zeile, nach den ranking-und eine eingeführte Prozentsatz der zu entfernenden Werte.trimboth
war am einfachsten für mich.Weitere option ist, um wandeln Sie Ihre Daten so, dass die Wirkung von Ausreißern abgeschwächt. Sie können dies tun, indem winsorizing Ihre Daten.
Wenn Sie wie die Verkettung von Methoden, Sie können Ihre Boolesche Bedingung, die für alle numerischen Spalten wie diese:
Jeder Wert jeder Spalte wird konvertiert
True/False
basierend auf, ob Ihr weniger als drei Standardabweichungen entfernt vom Mittelwert oder nicht.le(3)
seit seiner entfernen - Ausreißer. Auf diese Weise erhalten SieTrue
für die Ausreißer. Außer, dass +1 und diese Antwort sollte weiter obenDa ich in einem sehr frühen Stadium meiner Daten Wissenschaft Reise, ich bin der Behandlung von Ausreißern mit dem code unten.
ein komplettes Beispiel, mit den Daten und 2 Gruppen folgt:
Importe:
Daten Beispiel für 2 Gruppen: G1:Gruppe 1. G2: Gruppe 2:
Text Lesen Daten pandas dataframe:
Definieren die Ausreißer mit Standardabweichungen
Definieren gefilterten Daten Werte und der Ausreißer:
Drucken Sie das Ergebnis:
Meine Funktion zum löschen von Ausreißern
Ich lieber clip eher als Tropfen. im folgenden clip wird inplace bei der 2. und 98 pecentiles.
Holen Sie sich die 98 und 2. Perzentil als die Grenzen unserer Ausreißer
Können Sie boolean-Maske:
Ausgabe:
Löschen und ablegen von Ausreißern, die ich glaube, ist statistisch falsch.
Es macht die Daten vom original abweichen Daten.
Auch macht die Daten ungleich geformt und damit beste Weg ist, zu reduzieren oder zu vermeiden den Effekt von Ausreißern durch log-Transformation der Daten.
Dieser arbeitete für mich: