ETL-Prozesse kurz und knapp:
- Extract: Wir ziehen Daten aus den Datenquellen.
- Transform: Wir verändern die Daten so, dass sie in unsere Datenbanken passen.
- Load: Wir laden die Daten in unsere Datenbank.
ETL steht für Extract, Transform und Load. In diesen drei Schritten werden Daten aus Datenquellen gezogen, in ein Format der Datenbank umgewandelt und in die Datenbank eingespielt.
Ein einfaches Beispiel, um den Sinn von ETL-Prozessen zu erklären, ist das Übermitteln von Datumsangaben: Wir brauchen zuerst einen Weg, um das Datum aus verschiedenen Datenquellen zu extrahieren. Das können z.B. Excel-Dateien oder auch PDF-Rechnungen sein. Unsere Tabelle hat ein festes Datumsformat (Tag.Monat.Jahr). Bei Rechnungen aus den USA wird häufig Monat/Tag/Jahr verwendet. Im Schritt Transformation benötigen wir also einen Weg, um die Daten in ein einheitliches Format zu bringen. Nachdem alles geordnet ist, können die Daten in die Datenbank geladen werden.
Extract
Wir brauchen Datenquellen, um Daten extrahieren zu können. Unterschieden wird häufig in internen und externen Datenquellen. Interne Datenquellen befinden sich innerhalb unseres Geschäftssystems. Das können eigene Datenbanken, Excel-Dateien, E-Mails oder Rechnungen sein. Externe Datenquellen erhalten wir außerhalb unseres Unternehmens. Das können öffentliche Statistiken, Marktrecherchen, Vorhersagen oder gekaufte Datenbanken sein.
Externe Datenquellen haben den Vorteil, uns komplett andere Einblicke und Zahlen zu verschaffen, die wir im normalen Geschäftsprozess schwierig bekommen würden. Der Nachteil ist aber, dass die Daten selten einheitlich mit unseren Daten sind. Das überführen in unsere Datenbanken kann damit ein Problem darstellen.
Wir wollen unpassende Daten aber nicht verwerfen, sondern später praktisch umwandeln. Daher müssen wir Daten sammeln. Das kann in vier verschiedenen Arten passieren:
- synchron: Bei jeder Änderung der Datenquelle werden Daten an die Datenbank geführt.
- periodisch: Daten werden aus der Datenquelle in regelmäßigen Abständen extrahiert.
- ereignisgesteuert: Daten werden extrahiert, wenn ein bestimmtes Ereignis geschieht (z.B., wenn eine Rechnung generiert wird).
- anfragegesteuert: Daten werden extrahiert, wenn man aktiv eine Anfrage stellt.
Die Häufigkeit der Anfragen beeinflusst die Performance unseres Systems. Die Extraktion von Daten sollte insbesondere bei Datenbanken vom Tagesgeschäft nicht hochfrequent stattfinden. Große Datenmengen zu übertragen, verlangsamt das Quellsystem zu sehr. Extraktionen sollten bei arbeitenden Systemen optimalerweise so kurz, klein und selten wie möglich stattfinden. Bei großen Datenmengen muss ein individueller Mittelweg dafür gefunden werden.
Transform
Ein perfekter Datensatz hat folgende Eigenschaften:
- Richtigkeit – die Datenwerte müssen valide sein
- Negativ-Beispiel: Das Geburtsdatum darf nicht aus Text bestehen
- Eindeutigkeit – Daten dürfen nicht in verschiedenen Formen vorkommen
- Negativ-Beispiel: Frankfurt (Oder) und Frankfurt am Main werden beide als „Frankfurt“ gespeichert.
- Konsistenz – das Format der Daten muss immer gleich sein
- Negativ-Beispiel: Geburtsdatum von Kunde A = 31.12.1990, Kunde B = 12/31/1990
- Vollständigkeit – die Datenwerte dürfen nicht fehlen
- Negativ-Beispiel: Vorname = Max, Nachname = NULL
Da das selten der Fall ist, müssen Programme geschrieben werden, die Werte korrigieren, welche gegen die genannten Eigenschaften verstoßen. Hier beginnt der Schritt der Transformation. Die extrahierten Daten werden in eine sogenannte Staging Area geladen, damit Daten nicht in arbeitenden Systemen verändert werden, was die Performance negativ beeinflussen kann. Es erlaubt uns ebenfalls Backups zu erstellen, um bei Fehlern die Datenbank unseres Tagesgeschäfts nicht erneut zu belasten.
Nachdem wir einen Ort zum Transformieren haben, beginnt das Entfernen von Anomalien. Um die oben genannten Eigenschaften Richtigkeit, Eindeutigkeit, Konsistenz und Vollständigkeit zu gewährleisten, müssen diese Anomalien korrigiert werden.
Fehlende Werte
In der Tabelle unserer Fitness-App fehlt die Adresse, das Geschlecht und das Körpergewicht eines Nutzers. Wir stehen nun vor einem Problem. Ignorieren wir die fehlenden Daten? Warten wir, mit der Hoffnung, dass die Daten nachgereicht werden? Löschen wir die ganze Zeile? Setzen wir einen Standardwert ein? Alles sind mögliche Wege zum Bearbeiten von fehlenden Werten.
Ignorieren eignet sich in Fällen, bei denen die Daten unwichtig sind. Beispiel dafür kann der Adresszusatz bei zur Straße sein. Sie ist nicht zwangsweise für jeden notwendig. Der Fakt, dass die Information fehlt kann ebenfalls eine wichtige Information sein.
Warten ist bei Bestellungen sinnvoll. Wenn die Adresse fehlt, wird der Kunde kontaktiert. Sobald er die Daten nachreicht, werden sie in der Datenbank hinzugefügt.
Das Löschen der ganzen Zeile sollte das letzte Mittel sein, das wir anwenden. Wir verlieren damit Informationen aus anderen Spalten, die uns in einer hohen Zahl immer noch gute Erkenntnisse liefern können, obwohl eine wichtige Spalte in der Zeile fehlt. Sinnvoll kann das Löschen z.B. bei doppelten Zeilen sein. Sollten sehr viele Werte innerhalb einer Spalte fehlen, dass keine sinnvolle Analyse mit den Daten möglich ist, kann es auch sinnvoll sein die gesamte Spalte zu löschen.
Standardwerte können eingesetzt werden, wenn wir z.B. Berechnungen innerhalb der gesamten Spalte durchführen möchten. Fehlt das Gewicht eines Nutzers können wir es mit einem Durchschnittswert ersetzen. Wenn wir 0 einfügen, würde das das Minimum und den Durchschnitt der gesamten Spalte beeinflussen. Bei Textdaten wie z.B. die Statur kann der Modalwert (der Wert, der am häufigsten vorkommt) übernommen werden. Es gibt auch Algorithmen, die auf Basis der restlichen Variablen in der Zeile schätzen, wie groß der Wert ist, der fehlt.
Multiple Enkodierung
Wir sehen, dass in der Tabelle unserer Fitness-App die Spalte Geschlecht voller Unregelmäßigkeiten steckt. Einige sind „männlich“/“weiblich“, andere „M“/“W“, andere „Mann“/“Frau“ – manchmal stecken sogar Rechtschreibfehler wie „weilich“ drin. In unserer Beta-Version haben wir 1 für männlich und 0 für weiblich vergeben. Davon schwirren auch noch einige Datensätze herum. Wir möchten alles vereinheitlichen und der Spalte Geschlecht nur „M“ oder „W“ erlauben.
Dafür schreiben wir ein Programm, das die Begriffe [„männlich“, „Mann“, 1] mit „M“ und [„weiblich“, „Frau“, 0] mit „W“ ersetzt. Für Rechtschreibfehler kann man Bedingungen schreiben, die für alle Rechtschreibfehler-Kombinationen eine Korrektur liefern.
Wenn Feld = „mänlich“ Dann Feld = „M“;
Wenn Feld = „mennlich“ Dann Feld = „M“;
…
Eine alternative kann ein Algorithmus sein, der berechnet, wie wahrscheinlich der Begriff „Mann“/“Frau“ oder „männlich“/“weiblich“ ist und das Geschlecht mit der höheren Wahrscheinlichkeit wird verwendet. Es gibt also unzählige Möglichkeiten, solche Fälle zu bearbeiten. Bei Härtefällen wie z.B. „wänblich“ muss überlegt werden, ob die gesamte Zeile verworfen wird oder die Zeile einfach leer bleiben kann.
Ausreißer
Ausreißer sind Werte die von den restlichen Daten auffällig abweichen. Ein Jahresgehalt von 10.000.000€ wäre bei einer Gehaltsstatistik ein Ausreißer. Diese Werte können unsere Statistiken negativ beeinflussen. Wenn wir 1000 Gehaltsdaten sammeln, von denen 999 Personen 25.000€ im Jahr verdienen und einer 10.000.000€ verdient, würde das durchschnittliche Jahresgehalt knapp 35.000€ betragen. Um solche Verzerrungen zu verhindern, existieren verschiedene Maßnahmen, um den Einfluss von Ausreißern einzudämmen:
- Validierung: Ist der Wert möglich? Alter über 130 Jahre können in der Regel ausgeschlossen werden. Der Wert kann gelöscht werden. Ein Jahresgehalt von 10.000.000€ hingegen ist unwahrscheinlich, aber möglich.
- Kürzung: Statistische Mittel wie der Z-Score oder die Boxplot Ausreißer Regel können Ausreißer ermitteln. Alle Ausreißer können über verschiedene Berechnungen ersetzt werden:
- Z-Score: Der Z-Score misst, wie viele Standardabweichungen der Ausreißer vom Durchschnitt der Daten entfernt ist. Ist der Wert über drei Standardabweichungen entfernt, kann man ihn als Ausreißer deklarieren. Der Ausreißer kann darauf genau auf den Grenzwert umpositioniert werden. Dazu ersetzen wir den Wert des Ausreißers mit dem Durchschnitt + der dreifachen Standardabweichung.
- Boxplot Ausreißer Regel: Beim Boxplot beschreibt der Interquartilsabstand (IQA) wie breit das Intervall ist, in dem die mittleren 50% der Stichprobendaten liegen. Daten die zwischen 1,5*IQA und 3*IQA vom den Quartilen 1 oder 3 entfernt sind, gelten als „milde“ Ausreißer. Sind sie über 3*IQA entfernt, kann man sie als „extreme“ Ausreißer einstufen. Wir berechnen das Quartil 1 oder 3 + 3*IQA, um den Ausreißer umzupositionieren.
Load
Am Ende werden die Daten in die Datenbank geladen. Das kann unterschiedlich erfolgen. Alte Daten können durch neue überschrieben werden. Bei Berechnungen verändert sich nur das Rechenergebnis auf Grundlage der neuen Daten (z.B. verkaufte Einheiten im Juni werden durch die Verkäufe des 30.06. erweitert). Andere Datenbanken löschen gleichzeitig Daten die hinter einem bestimmten Zeitpunkt liegen (z.B. vor 5 Jahren), wenn diese nicht mehr benötigt werden.