DATENVORVERARBEITUNG
Lassen Sie uns über etwas sprechen, mit dem sich jeder Datenwissenschaftler, Analyst oder neugierige Zahlenjongleur früher oder später auseinandersetzen muss: fehlende Werte. Ich weiß, was Sie jetzt denken: „Oh toll, schon wieder ein Leitfaden zu fehlenden Werten.“ Aber hören Sie mir zu. Ich werde Ihnen zeigen, wie Sie dieses Drawback mit nicht einer, nicht zwei, sondern sechs verschiedenen Imputationsmethoden angehen können, und zwar mit einem einzigen Datensatz (und das auch noch mit hilfreichen visuellen Darstellungen!). Am Ende werden Sie sehen, warum Fachwissen Gold wert ist (etwas, das selbst unsere KI-Freunde nur schwer nachbilden können).
Bevor wir uns mit unserem Datensatz und den Imputationsmethoden befassen, wollen wir uns kurz damit befassen, was fehlende Werte sind und warum sie in der Datenwissenschaft so häufig Probleme bereiten.
Was sind fehlende Werte?
Fehlende Werte, die in Pandas oft als NaN (Not a Quantity) oder in Datenbanken als NULL dargestellt werden, sind im Wesentlichen Lücken in Ihrem Datensatz. Es sind die leeren Zellen in Ihrer Tabelle, die Lücken in Ihren Umfrageantworten, die Datenpunkte, die Ihnen entgangen sind. In der Welt der Daten sind nicht alle fehlenden Werte gleich, und das Verständnis der Natur Ihrer fehlenden Werte ist entscheidend für die Entscheidung, wie Sie mit ihnen umgehen.
Warum treten fehlende Werte auf?
Fehlende Werte können sich aus verschiedenen Gründen in Ihre Daten einschleichen. Hier sind einige häufige Gründe:
- Dateneingabefehler: Manchmal handelt es sich einfach um einen menschlichen Fehler. Jemand könnte vergessen, einen Wert einzugeben, oder versehentlich einen löschen.
- Sensorstörungen: Beim IoT oder bei wissenschaftlichen Experimenten kann es vorkommen, dass ein fehlerhafter Sensor zu bestimmten Zeiten keine Daten aufzeichnet.
- Umfrage-Nichtbeantwortung: In Umfragen überspringen Befragte möglicherweise Fragen, deren Beantwortung ihnen unangenehm ist oder die sie nicht verstehen.
- Zusammengeführte Datensätze: Beim Kombinieren von Daten aus mehreren Quellen kann es vorkommen, dass für einige Einträge nicht in allen Datensätzen entsprechende Werte vorhanden sind.
- Datenbeschädigung: Während der Datenübertragung oder -speicherung können einige Werte beschädigt und unlesbar werden.
- Absichtliche Auslassungen: Einige Daten werden möglicherweise aus Datenschutzgründen oder aufgrund ihrer Irrelevanz absichtlich weggelassen.
- Probleme bei der Stichprobennahme: Bei der Methode zur Datenerfassung können bestimmte Datentypen systematisch übersehen werden.
- Zeitkritische Daten: In Zeitreihendaten können Werte für Zeiträume fehlen, in denen keine Daten erfasst wurden (z. B. Wochenenden, Feiertage).
Arten fehlender Daten
Wenn Sie wissen, mit welcher Artwork fehlender Daten Sie es zu tun haben, können Sie die am besten geeignete Imputationsmethode auswählen. Statistiker kategorisieren fehlende Daten im Allgemeinen in drei Typen:
- Völlig zufälliges Fehlen (MCAR): Das Fehlen ist völlig zufällig und ist von keiner anderen Variable abhängig. Beispielsweise, wenn eine Laborprobe versehentlich fallengelassen wurde.
- Zufälliges Fehlen (MAR): Die Wahrscheinlichkeit fehlender Daten hängt von anderen beobachteten Variablen ab aber nicht auf die fehlenden Daten selbst. So könnte es beispielsweise sein, dass Männer in einer Umfrage seltener Fragen zu Emotionen beantworten.
- Nicht zufällig vermisst (MNAR): Das Fehlen hängt vom Wert der fehlenden Daten selbst ab. Beispielsweise geben Personen mit hohem Einkommen ihr Einkommen in einer Umfrage möglicherweise seltener an.
Warum sind fehlende Werte wichtig?
Fehlende Werte können Ihre Analyse erheblich beeinflussen:
- Wenn sie nicht richtig gehandhabt werden, können sie zu Verzerrungen führen.
- Viele Algorithmen des maschinellen Lernens können fehlende Werte nicht sofort verarbeiten.
- Sie können zum Verlust wichtiger Informationen führen, wenn Instanzen mit fehlenden Werten einfach verworfen werden.
- Ein unsachgemäßer Umgang mit fehlenden Werten kann zu falschen Schlussfolgerungen oder Vorhersagen führen.
Deshalb ist es wichtig, eine solide Strategie für den Umgang mit fehlenden Werten zu haben. Und genau das werden wir in diesem Artikel untersuchen!
Zunächst einmal möchten wir unseren Datensatz vorstellen. Wir werden mit einem Golfplatz-Datensatz arbeiten, der verschiedene Faktoren verfolgt, die sich auf die Überfüllung des Platzes auswirken. Dieser Datensatz enthält von allem etwas – numerische Daten, kategorische Daten und ja, jede Menge fehlende Werte.
import pandas as pd
import numpy as np# Create the dataset as a dictionary
knowledge = {
'Date': ('08-01', '08-02', '08-03', '08-04', '08-05', '08-06', '08-07', '08-08', '08-09', '08-10',
'08-11', '08-12', '08-13', '08-14', '08-15', '08-16', '08-17', '08-18', '08-19', '08-20'),
'Weekday': (0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5),
'Vacation': (0.0, 0.0, 0.0, 0.0, np.nan, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, np.nan, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
'Temp': (25.1, 26.4, np.nan, 24.1, 24.7, 26.5, 27.6, 28.2, 27.1, 26.7, np.nan, 24.3, 23.1, 22.4, np.nan, 26.5, 28.6, np.nan, 27.0, 26.9),
'Humidity': (99.0, np.nan, 96.0, 68.0, 98.0, 98.0, 78.0, np.nan, 70.0, 75.0, np.nan, 77.0, 77.0, 89.0, 80.0, 88.0, 76.0, np.nan, 73.0, 73.0),
'Wind': (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, np.nan, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, np.nan, 1.0, 0.0),
'Outlook': ('wet', 'sunny', 'wet', 'overcast', 'wet', np.nan, 'wet', 'wet', 'overcast', 'sunny', np.nan, 'overcast', 'sunny', 'wet', 'sunny', 'wet', np.nan, 'wet', 'overcast', 'sunny'),
'Crowdedness': (0.14, np.nan, 0.21, 0.68, 0.20, 0.32, 0.72, 0.61, np.nan, 0.54, np.nan, 0.67, 0.66, 0.38, 0.46, np.nan, 0.52, np.nan, 0.62, 0.81)
}
# Create a DataFrame from the dictionary
df = pd.DataFrame(knowledge)
# Show fundamental details about the dataset
print(df.information())
# Show the primary few rows of the dataset
print(df.head())
# Show the depend of lacking values in every column
print(df.isnull().sum())
Ausgabe:
<class 'pandas.core.body.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Knowledge columns (whole 8 columns):
# Column Non-Null Rely Dtype
--- ------ -------------- -----
0 Date 20 non-null object
1 Weekday 20 non-null int64
2 Vacation 19 non-null float64
3 Temp 16 non-null float64
4 Humidity 17 non-null float64
5 Wind 19 non-null float64
6 Outlook 17 non-null object
7 Crowdedness 15 non-null float64
dtypes: float64(5), int64(1), object(2)
reminiscence utilization: 1.3+ KBDate Weekday Vacation Temp Humidity Wind Outlook Crowdedness
0 08-01 0 0.0 25.1 99.0 0.0 wet 0.14
1 08-02 1 0.0 26.4 NaN 0.0 sunny NaN
2 08-03 2 0.0 NaN 96.0 0.0 wet 0.21
3 08-04 3 0.0 24.1 68.0 0.0 overcast 0.68
4 08-05 4 NaN 24.7 98.0 0.0 wet 0.20
Date 0
Weekday 0
Vacation 1
Temp 4
Humidity 3
Wind 1
Outlook 3
Crowdedness 5
dtype: int64
Wie wir sehen können, enthält unser Datensatz 20 Zeilen und 8 Spalten:
- Datum: Das Datum der Beobachtung
- Wochentag: Wochentag (0–6, wobei 0 für Montag steht)
- Feiertag: Boolescher Wert, der angibt, ob es ein Feiertag ist (0 oder 1)
- Temp: Temperatur in Celsius
- Luftfeuchtigkeit: Luftfeuchtigkeit in Prozent
- Wind: Windverhältnisse (0 oder 1, zeigt möglicherweise Windstille oder Wind an)
- Ausblick: Wetteraussichten (sonnig, bewölkt oder regnerisch)
- Überfüllung: Prozentualer Anteil der Kursbelegung
Und sehen Sie sich das an! In jeder Spalte außer „Datum“ und „Wochentag“ fehlen Werte. Perfekt für unsere Imputationsparty.
Nachdem wir nun unseren Datensatz geladen haben, wollen wir diese fehlenden Werte mit sechs verschiedenen Imputationsmethoden angehen. Wir werden für jeden Datentyp eine andere Strategie verwenden.
Beim listenweisen Löschen, auch als vollständige Fallanalyse bezeichnet, werden ganze Zeilen entfernt, die fehlende Werte enthalten. Diese Methode ist einfach und bewahrt die Verteilung der Daten, kann jedoch zu einem erheblichen Informationsverlust führen, wenn viele Zeilen fehlende Werte enthalten.
👍 Häufige Verwendung: Die listenweise Löschung wird häufig verwendet, wenn die Anzahl der fehlenden Werte gering ist und die Daten völlig zufällig fehlen (MCAR). Sie ist auch nützlich, wenn Sie für bestimmte Analysen, die fehlende Werte nicht verarbeiten können, einen vollständigen Datensatz benötigen.
In unserem Fall: Wir verwenden die listenweise Löschung für Zeilen, die mindestens 4 fehlende Werte aufweisen. Diese Zeilen liefern möglicherweise nicht genügend zuverlässige Informationen, und ihre Entfernung kann uns helfen, uns auf die vollständigeren Datenpunkte zu konzentrieren. Wir sind jedoch vorsichtig und entfernen nur Zeilen mit erheblichen fehlenden Daten, um so viele Informationen wie möglich zu erhalten.
# Rely lacking values in every row
missing_count = df.isnull().sum(axis=1)# Preserve solely rows with lower than 4 lacking values
df_clean = df(missing_count < 4).copy()
Wir haben zwei Zeilen entfernt, die zu viele fehlende Werte enthielten. Fahren wir nun mit der Imputation der verbleibenden fehlenden Daten fort.
Bei der einfachen Imputation werden fehlende Werte durch eine zusammenfassende Statistik der beobachteten Werte ersetzt. Gängige Ansätze sind die Verwendung des Mittelwerts, Medians oder Modus der nicht fehlenden Werte in einer Spalte.
👍 Häufige Verwendung: Die Mittelwertimputation wird häufig für kontinuierliche Variablen verwendet, wenn die Daten zufällig fehlen und die Verteilung annähernd symmetrisch ist. Die Modusimputation wird typischerweise für kategoriale Variablen verwendet.
In unserem Fall: Wir verwenden die Mittelwertimputation für die Luftfeuchtigkeit und die Modusimputation für den Urlaub. Für die Luftfeuchtigkeit liefert der Mittelwert eine vernünftige Schätzung der typischen Luftfeuchtigkeit, vorausgesetzt, die fehlenden Werte sind zufällig. Für den Urlaub liefert uns der Modus den häufigsten Zustand, da es sich um eine binäre Variable handelt (Urlaub oder nicht), was eine vernünftige Schätzung für fehlende Werte ist.
# Imply imputation for Humidity
df_clean('Humidity') = df_clean('Humidity').fillna(df_clean('Humidity').imply())# Mode imputation for Vacation
df_clean('Vacation') = df_clean('Vacation').fillna(df_clean('Vacation').mode()(0))
Die lineare Interpolation schätzt fehlende Werte, indem eine lineare Beziehung zwischen bekannten Datenpunkten angenommen wird. Sie ist besonders nützlich für Zeitreihendaten oder Daten mit einer natürlichen Ordnung.
👍 Häufige Verwendung: Lineare Interpolation wird häufig für Zeitreihendaten verwendet, bei denen fehlende Werte anhand der Werte davor und danach geschätzt werden können. Sie ist auch für alle Daten nützlich, bei denen eine annähernd lineare Beziehung zwischen benachbarten Punkten erwartet wird.
In unserem Fall: Wir verwenden lineare Interpolation für die Temperatur. Da sich die Temperatur im Laufe der Zeit tendenziell allmählich ändert und unsere Daten nach Datum sortiert sind, kann die lineare Interpolation auf Grundlage der an den nächsten Tagen aufgezeichneten Temperaturen vernünftige Schätzungen für die fehlenden Temperaturwerte liefern.
df_clean('Temp') = df_clean('Temp').interpolate(technique='linear')
Beim Vorwärtsfüllen (oder „letzte Beobachtung vorwärtsgetragen“) wird der letzte bekannte Wert vorwärts weitergegeben, um Lücken zu füllen, während beim Rückwärtsfüllen das Gegenteil der Fall ist. Bei dieser Methode wird davon ausgegangen, dass der fehlende Wert wahrscheinlich dem nächsten bekannten Wert ähnelt.
👍 Häufige Verwendung: Vorwärts-/Rückwärtsfüllen wird häufig für Zeitreihendaten verwendet, insbesondere wenn der Wert wahrscheinlich konstant bleibt, bis er geändert wird (wie bei Finanzdaten) oder wenn der letzte bekannte Wert die beste Schätzung für den aktuellen Standing ist.
In unserem Fall: Wir verwenden für Outlook eine Kombination aus Vorwärts- und Rückwärtsfüllung. Wetterbedingungen halten oft mehrere Tage an, daher ist es vernünftig anzunehmen, dass ein fehlender Outlook-Wert dem Outlook des vorherigen oder folgenden Tages ähneln könnte.
df_clean('Outlook') = df_clean('Outlook').fillna(technique='ffill').fillna(technique='bfill')
Bei dieser Methode werden alle fehlenden Werte in einer Variablen durch einen bestimmten konstanten Wert ersetzt. Diese Konstante kann basierend auf Domänenwissen oder einem sicheren Standardwert gewählt werden.
👍 Häufige Verwendung: Die Imputation konstanter Werte wird häufig verwendet, wenn es einen logischen Standardwert für fehlende Daten gibt oder wenn Sie explizit kennzeichnen möchten, dass ein Wert fehlt (indem Sie einen Wert außerhalb des normalen Datenbereichs verwenden).
In unserem Fall: Wir verwenden für die Spalte „Wind“ die Imputation konstanter Werte und ersetzen fehlende Werte durch -1. Dieser Ansatz kennzeichnet imputierte Werte explizit (da -1 außerhalb des normalen 0–1-Bereichs für Wind liegt) und bewahrt die Info, dass diese Werte ursprünglich fehlten.
df_clean('Wind') = df_clean('Wind').fillna(-1)
Ok-Nächste Nachbarn (KNN) Imputation schätzt fehlende Werte, indem die Ok ähnlichsten Stichproben im Datensatz gefunden werden (genau wie KNN als Klassifizierungsalgorithmus) und ihre Werte zum Imputieren der fehlenden Daten verwendet werden. Mit dieser Methode können komplexe Beziehungen zwischen Variablen erfasst werden.
👍 Häufige Verwendung: KNN-Imputation ist vielseitig und kann sowohl für kontinuierliche als auch für kategorische Variablen verwendet werden. Sie ist besonders nützlich, wenn komplexe Beziehungen zwischen Variablen zu erwarten sind, die einfachere Methoden möglicherweise übersehen.
In unserem Fall: Wir verwenden KNN-Imputation für Überfüllung. Überfüllung hängt wahrscheinlich von einer Kombination von Faktoren ab (wie Temperatur, Urlaubsstatus usw.), und KNN kann diese komplexen Beziehungen erfassen, um genauere Schätzungen fehlender Überfüllungswerte bereitzustellen.
from sklearn.impute import KNNImputer# One-hot encode the 'Outlook' column
outlook_encoded = pd.get_dummies(df_clean('Outlook'), prefix='Outlook')
# Put together options for KNN imputation
features_for_knn = ('Weekday', 'Vacation', 'Temp', 'Humidity', 'Wind')
knn_features = pd.concat((df_clean(features_for_knn), outlook_encoded), axis=1)
# Apply KNN imputation
knn_imputer = KNNImputer(n_neighbors=3)
df_imputed = pd.DataFrame(knn_imputer.fit_transform(pd.concat((knn_features, df_clean(('Crowdedness'))), axis=1)),
columns=checklist(knn_features.columns) + ('Crowdedness'))
# Replace the unique dataframe with the imputed Crowdedness values
df_clean('Crowdedness') = df_imputed('Crowdedness')
Additionally, da haben Sie es! Sechs verschiedene Möglichkeiten, mit fehlenden Werten umzugehen, alle angewendet auf unseren Golfplatz-Datensatz.
Lassen Sie uns noch einmal zusammenfassen, wie die einzelnen Methoden mit unseren Daten umgegangen sind:
- Listenweises Löschen: Hat uns geholfen, uns auf vollständigere Datenpunkte zu konzentrieren, indem Zeilen mit vielen fehlenden Werten entfernt wurden.
- Einfache Imputation: Luftfeuchtigkeit mit Durchschnittswerten und Feiertag mit dem häufigsten Vorkommen ausgefüllt.
- Lineare Interpolation: Geschätzte fehlende Temperaturwerte basierend auf dem Pattern der umliegenden Tage.
- Vorwärts-/Rückwärtsfüllung: Geschätzte fehlende Outlook-Werte von benachbarten Tagen, welche die Beständigkeit von Wettermustern widerspiegeln.
- Konstante Wertimputation: Fehlende Winddaten mit -1 markiert, wobei die Tatsache erhalten bleibt, dass diese Werte ursprünglich unbekannt waren.
- KNN-Imputation: Geschätzte Menschenmenge basierend auf ähnlichen Tagen, wobei komplexe Beziehungen zwischen Variablen erfasst werden.
Jede Methode erzählt eine andere Geschichte über unsere fehlenden Daten und die „richtige“ Wahl hängt davon ab, was wir über unseren Golfplatzbetrieb wissen und welche Fragen wir beantworten möchten.
Die wichtigste Erkenntnis? Wenden Sie Imputationsmethoden nicht einfach blind an. Verstehen Sie Ihre Daten, berücksichtigen Sie den Kontext und wählen Sie die Methode, die für Ihre spezifische State of affairs am sinnvollsten ist.