Pandas & NumPy Academy · Lektion

Ausreißer erkennen und behandeln

Erkennen Sie Ausreißer mit der IQR-Methode und Z-Scores, entscheiden Sie, ob Sie sie begrenzen, entfernen oder kennzeichnen, und dokumentieren Sie Ihre Entscheidungen.

Lektion 2 von 413 Schritte

Ausreißer erkennen und behandeln ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Ausreißer?

Ein Ausreißer ist ein Datenpunkt, der sich deutlich vom Rest des Datensatzes unterscheidet. Ausreißer können echt sein (ein einzelner Unternehmenskunde mit einer Bestellung über 500.000 $ in einem Datensatz mit Bestellungen von durchschnittlich 100 $) oder fehlerhaft (ein negativer Preis oder ein Tippfehler, durch den aus 120 die Zahl 12.000 wurde). Der erste Schritt bei der Behandlung von Ausreißern besteht darin zu entscheiden, ob der Extremwert real und aussagekräftig oder ein Datenqualitätsproblem ist – die Behandlung unterscheidet sich in beiden Fällen erheblich.

import pandas as pd
import numpy as np

df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())

Visuelle Ausreißererkennung: Boxplot

Ein Boxplot ist das schnellste visuelle Werkzeug, um Ausreißer zu erkennen. Die Box umfasst den Interquartilsabstand (IQR, Q1–Q3), die Whisker reichen bis zum 1,5-Fachen des IQR, und Punkte außerhalb der Whisker werden einzeln als mutmaßliche Ausreißer dargestellt. Verwenden Sie df['revenue'].plot(kind='box') oder Seaborns sns.boxplot(), um Ausreißer sofort zu sehen, ohne Grenzwerte manuell berechnen zu müssen.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()

IQR-Grenzmethode

Bei der IQR-Grenzmethode wird der Interquartilsabstand berechnet und werden die Grenzen bei Q1 − 1,5×IQR und Q3 + 1,5×IQR festgelegt. Werte außerhalb dieser Grenzen werden als Ausreißer markiert. Der Multiplikator 1,5 ist für moderate Ausreißer üblich; verwenden Sie 3,0 nur für extreme Ausreißer. Diese Methode ist robust: Anders als bei Z-Scores wird keine Normalverteilung vorausgesetzt.

Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')

Z-Score-Methode zur Ausreißererkennung

Der Z-Score gibt an, wie viele Standardabweichungen ein Wert vom Mittelwert entfernt ist. Ein Wert mit |Z| > 3 gilt üblicherweise als Ausreißer; damit werden 99,7 % der normalverteilten Daten abgedeckt. Z-Scores reagieren jedoch empfindlich auf genau die Ausreißer, die sie erkennen sollen: Extremwerte verschieben den Mittelwert und vergrößern die Standardabweichung, wodurch andere Ausreißer möglicherweise unentdeckt bleiben.

mean = df['revenue'].mean()
std = df['revenue'].std()

df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]

print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())

Ausreißer markieren oder entfernen

Entfernen Sie Ausreißer niemals, ohne die Entscheidung zu dokumentieren und zu begründen. Markieren Sie sie stattdessen zunächst mit einer booleschen Spalte (is_outlier) und analysieren Sie anschließend, ob sie einem Muster folgen (dieselbe Region, dasselbe Produkt, derselbe Tag). Sind sie echt, behalten Sie sie bei und modellieren Sie sie ausdrücklich. Handelt es sich um Fehler, entfernen Sie sie und protokollieren Sie die Anzahl der entfernten Zeilen im Audit-Trail der Pipeline.

df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)

print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())

Ausreißer begrenzen (Winsorisieren)

Beim Begrenzen (oder Winsorisieren) werden Werte außerhalb der Grenzen durch den jeweiligen Grenzwert ersetzt, statt die Zeile zu entfernen. So bleiben alle Zeilen im Datensatz erhalten, während die Verzerrung reduziert wird, die Ausreißer in linearen Modellen und zusammenfassenden Statistiken verursachen. Verwenden Sie clip(lower=, upper=), um die Grenzen in einer einzigen vektorisierten Operation anzuwenden.

df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)

print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())

Logarithmische Transformation rechtsschiefer Daten

Verteilungen von Umsätzen und Preisen sind oft rechtsschief und haben einen langen Ausläufer großer Werte. Eine logarithmische Transformation mit np.log1p() (Logarithmus des Werts + 1 zur Verarbeitung von Nullen) komprimiert den Ausläufer und macht die Verteilung symmetrischer. Viele statistische Modelle und Visualisierungen setzen Normalverteilung voraus. Eine Log-Transformation der Umsatzspalte vor der Modellierung verbessert daher häufig die Ergebnisse.

df['log_revenue'] = np.log1p(df['revenue'])

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()

Ausreißer in mehreren Spalten

Wenn Sie viele Spalten gleichzeitig analysieren, berechnen Sie die IQR-Grenzen für Ausreißer programmgesteuert für alle numerischen Spalten. Iterieren Sie über die numerischen Spalten, berechnen Sie die Grenzen und speichern Sie die Ergebnisse in einem Dictionary. So können Sie mit wenigen Zeilen einen vollständigen Ausreißerbericht erstellen, statt die IQR-Berechnung für jede Spalte manuell zu wiederholen.

numeric_cols = df.select_dtypes(include=['number']).columns

outlier_report = {}
for col in numeric_cols:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
    outlier_report[col] = n_out

print(pd.Series(outlier_report).sort_values(ascending=False))

Bivariate Ausreißer mit Streudiagrammen

Manche Punkte sind nur in Kombination Ausreißer: Ein unit_price von 10 $ ist normal, eine quantity von 500 ist ungewöhnlich, aber nicht unmöglich. Ein unit_price von 10 $ zusammen mit einer quantity von 500 bei einem Luxusartikel ist jedoch verdächtig. Bivariate Ausreißer erscheinen in Streudiagrammen als isolierte Punkte. Verwenden Sie df.plot.scatter('quantity', 'unit_price'), um Punkte zu erkennen, die weit von der Hauptgruppe entfernt liegen.

fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()

Ausreißerentscheidungen dokumentieren

Jede Entscheidung zu einem Ausreißer sollte protokolliert werden: die Spalte, die Erkennungsmethode, den verwendeten Grenzwert, die Anzahl der markierten Zeilen und die angewendete Behandlung (beibehalten, begrenzen oder entfernen). Diese Dokumentation schützt die analysierende Person bei Codeprüfungen und Audits. Speichern Sie sie in einem Bereinigungsprotokoll-Dictionary, das zusammen mit dem Ausgabedatensatz gespeichert wird.

outlier_log = {
    'column': 'revenue',
    'method': 'IQR 1.5x',
    'lower_bound': round(lower, 2),
    'upper_bound': round(upper, 2),
    'rows_flagged': int(df['is_revenue_outlier'].sum()),
    'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
    print(f'{k}: {v}')

Behandelten Datensatz speichern

Speichern Sie den aktualisierten DataFrame, nachdem Sie Ausreißer markiert und behandelt haben. Belassen Sie das is_outlier-Kennzeichen in der Ausgabedatei, damit nachgelagerte Nutzer markierte Zeilen für bestimmte Analysen ausschließen können. Speichern Sie die begrenzte Version in einer Spalte mit einem eindeutigen Suffix (_capped) neben dem Original, damit die Bereinigung rückgängig gemacht werden kann.

cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)

Schnelltest

Testen Sie Ihr Verständnis der Konzepte zur Datenanalyse aus dieser Lektion.

Lektionszusammenfassung

In dieser Lektion haben Sie Folgendes gelernt: Ausreißer mit IQR-Grenzen und Z-Scores erkennen, entscheiden, ob Ausreißer markiert, begrenzt oder entfernt werden und logarithmische Transformationen auf rechtsschiefe Verteilungen anwenden. Als Nächstes sehen wir uns die Standardisierung uneinheitlicher Kategorienamen in Textspalten an.

Kostenlos starten

Lerne Python mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „Ausreißer erkennen und behandeln“ kostenlos?

Ja — der vollständige Text von „Ausreißer erkennen und behandeln“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Ausreißer erkennen und behandeln“?

Erkennen Sie Ausreißer mit der IQR-Methode und Z-Scores, entscheiden Sie, ob Sie sie begrenzen, entfernen oder kennzeichnen, und dokumentieren Sie Ihre Entscheidungen. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?

Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Ausreißer erkennen und behandeln“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?

Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Duplikate erkennen und entfernen
  2. Ausreißer erkennen und behandeln
  3. Inkonsistente Kategorien standardisieren
  4. Schemas validieren und Assertions
← Zurück zu Pandas & NumPy Academy