Problemstellung
Ein Kunde verwaltet eine grosse Datenbank, die sowohl seine angebotenen Produkte als auch die Personen und Organisationen enthält, die diese Produkte kaufen. Über viele Jahre hinweg haben sich zahlreiche doppelte Einträge (Doubletten) von Personen und Organisationen angesammelt. So kann beispielsweise eine Person als Eigentümer:in eines Produkts eingetragen sein, während eine Doublette derselben Person als Rechnungsempfänger:in für dieses Produkt aufgeführt ist.
Der Kunde wollte auf ein neues System migrieren, das keine Doubletten zulässt. Meine Aufgabe war es, das Ausmass dieser doppelten Einträge zu bewerten und Strategien zur Behebung der Situation zu entwickeln. In diesem Beitrag werde ich mich auf die erste Phase dieses Projekts konzentrieren: die Untersuchung und Visualisierung der Daten.
Herausforderungen und Lösungen
Aus Sicherheitsgründen war die Datenbank selbst nicht direkt zugänglich. Stattdessen musste man LINQ-Queries ausführen und die Daten als Excel-Dateien erhalten. Ich verwendete die Python-Module pandas und openpyxl, um die verschiedenen Queries einzulesen, zu verarbeiten und zusammenzuführen, damit sie leicht analysiert werden konnten. Pandas ist ein sehr beliebtes Tool für die Arbeit mit Tabellendaten, das jeder Data Scientist beherrschen sollte. Mit Pandas können Sie Tabellen durchsuchen, filtern und anderweitig manipulieren. Openpyxl erweitert die Fähigkeiten von Pandas, um das proprietäre Excel-Format zu bearbeiten. Wenn Sie jedoch viele Tabellen haben, die alle miteinander in Beziehung stehen, kann es schnell mühsam werden, die Informationen zwischen ihnen manuell zu verarbeiten. Um dieses Problem für bestimmte Analysen zu lösen, wurde die networkx library verwendet, die die Darstellung von Daten als Graph ermöglicht – ein Netzwerk aus sogenannten Nodes und Edges. Auf diese Weise lassen sich bestimmte “Cluster” extrahieren, wie z. B. eine Organisation und alle mit ihr verbundenen Mitarbeiter:innen.
Identifizierung von Doubletten
Diese Aufgabe hängt stark von der zugrunde liegenden Datenstruktur ab. Mein Kunde definierte beispielsweise als Voraussetzung dafür, dass eine Person als Doublette gilt, dass sie den gleichen Vor- und Nachnamen sowie die gleiche Adresse hat. Zu den optionalen Schritten gehören das Entfernen von Akzenten (z. B. könnte es eine “Amélie” und eine “Amelie” als Doublette geben) oder die Einbeziehung von abgekürzten Vornamen (“John Doe” und “J. Doe” könnten ebenfalls Doubletten sein). Diese Operationen können mit den in Pandas eingebauten Werkzeugen zur String-Manipulation durchgeführt werden.
Als Nächstes musste ich entscheiden, welche der Doublette als “Master”-Eintrag gelten sollte. Dieser Master-Eintrag wäre derjenige mit den meisten Verknüpfungen zu anderen Datenbanktabellen, den meisten Berechtigungen und dem vollständigsten Profil, wodurch die Bereinigungsschritte, die bei der Deaktivierung der Nicht-Master- Doubletten erforderlich sind, minimiert würden. Angesichts der vielen Faktoren, die zu berücksichtigen sind, habe ich mich für ein Punktesystem entschieden, das jedem Eintrag eine bestimmte Anzahl Punkte zuweist. So würde beispielsweise eine Person, die bereits eine E-Mail-Adresse für die Anmeldung angegeben hat, mehr Punkte erhalten als eine neu angelegte Person. Die Anzahl der Datenbankverweise von und auf diese Person würde ebenfalls zu ihrer Punktzahl beitragen. Die unterschiedliche Gewichtung dieser Faktoren wurde durch eine Anpassung der entsprechenden Punkte berücksichtigt. Schliesslich wurden die Punktzahlen in eine einfache binäre Entscheidung umgewandelt: Der Eintrag mit der höchsten Punktzahl wurde als Master (True) markiert, während alle anderen Duplikate als False markiert wurden.
Visualisierung
Angesichts der komplexen Verbindungen zwischen verschiedenen Produkten, Organisationen und Personen wurde klar, dass eine Visualisierung dieser Graphen hilfreich sein würde.
Zu diesem Zweck habe ich graphviz verwendet, eine Open-Source-Software zur Visualisierung von Graphen, die als Python-Modul verfügbar ist. Es lässt sich gut mit Pandas integrieren, so dass man einfach Tabellen mit den Nodes und Edges des Graphen eingeben und Diagramme im SVG-Format erstellen kann.
Um die Sache interaktiver und für nichttechnische Benutzer:innen zugänglicher zu machen, habe ich Streamlit verwendet, um eine grafische Benutzeroberfläche zu erstellen. Mit Streamlit können Sie jeden Python-Code in eine einfache Webanwendung verwandeln, in der die Benutzer:innen mit Eingabefeldern und Schaltflächen interagieren und Diagramme oder Tabellen der Daten anzeigen können.
Das Bild unten zeigt ein Beispiel, bei dem der Benutzer:innen die ID eines bestimmten Unternehmens eingibt, verschiedene Filteroptionen auswählt und als Anzeige ein Diagramm erhält, das zeigt, wie dieses Unternehmen mit verschiedenen anderen Unternehmen, Personen und Produkten verbunden ist.
Endgültiges Produkt
Ursprünglich ein Nebenprodukt der Erforschungsphase, wurde die Webanwendung “Graph Viewer” weiter ausgebaut. Sie kann nun alle Schritte der Datenaggregation, Datenverarbeitung, Suche und Visualisierung durchführen.
Der Graph Viewer wurde auf einem Server installiert und wird nun aktiv von Nutzer:innen eingesetzt, die sich sehr positiv über seine Fähigkeit geäussert haben, die komplexen Organisationsstrukturen ihrer Kund:innen zu verstehen.
Bei meiner Aufgabe der Datenbereinigung half mir der Graph Viewer, bestimmte sich wiederholende Muster in den Daten zu erkennen, die spezifische Bereinigungsverfahren erforderten (z. B. Unternehmen, in denen eine Person doppelt aufgeführt ist, einmal als Mitarbeitende und einmal als Administrator:in, die zu einer Person zusammengefasst werden sollten).
Durch die Integration dieses Tools in meinen Skriptprozess konnte ich die Skripte zur Extraktion dieser Duplikate visuell überprüfen, verfeinern und debuggen.
Autor: Felix Schlegel