Freigeben über


Tutorial: Bereinigen von Daten mit funktionalen Abhängigkeiten

In diesem Tutorial verwenden Sie funktionale Abhängigkeiten für die Datenbereinigung. Eine funktionale Abhängigkeit ist dann vorhanden, wenn eine Spalte in einem semantischen Modell (einem Power BI-Dataset) eine Funktion einer anderen Spalte ist. Beispielsweise kann eine Spalte Postleitzahl die Werte in einer Spalte Ort bestimmen. Eine funktionale Abhängigkeit manifestiert sich als 1:n-Beziehung zwischen den Werten in zwei oder mehr Spalten in einem DataFrame. In diesem Tutorial wird anhand des Synthea-Datasets gezeigt, wie funktionale Beziehungen helfen können, Probleme mit der Datenqualität zu erkennen.

In diesem Tutorial lernen Sie Folgendes:

  • Wenden Sie Fachwissen an, um Hypothesen zu funktionalen Abhängigkeiten in einem semantischen Modell zu formulieren.
  • Machen Sie sich mit Komponenten der Python-Bibliothek von Semantic Link (SemPy) vertraut, die bei der Automatisierung der Analyse der Datenqualität helfen. Zu diesen Komponenten gehören:
    • FabricDataFrame: eine Pandas-ähnliche Struktur, die um zusätzliche semantische Informationen erweitert wurde.
    • Nützliche Funktionen, welche die Auswertung von Hypothesen zu funktionalen Abhängigkeiten automatisieren und Verstöße gegen Beziehungen in Ihren semantischen Modellen identifizieren.

Voraussetzungen

  • Wählen Sie im linken Navigationsbereich Arbeitsbereiche aus, um Ihren Arbeitsbereich zu suchen und auszuwählen. Dieser Arbeitsbereich wird zu Ihrem aktuellen Arbeitsbereich.

Das Notebook für das Tutorial

Das Notebook data_cleaning_functional_dependencies_tutorial.ipynb begleitet dieses Tutorial.

Um das zugehörige Notebook für dieses Tutorial zu öffnen, befolgen Sie die Anweisungen unter Vorbereiten Ihres Systems für Data-Science-Tutorials zum Importieren des Notebooks in Ihren Arbeitsbereich.

Wenn Sie den Code lieber von dieser Seite kopieren und einfügen möchten, können Sie auch ein neues Notebook erstellen.

Fügen Sie unbedingt ein Lakehouse an das Notebook an, bevor Sie mit der Ausführung von Code beginnen.

Einrichten des Notebooks

In diesem Abschnitt richten Sie eine Notebookumgebung mit den erforderlichen Modulen und Daten ein.

  1. Für Spark 3.4 und höher ist der semantische Link bei Verwendung von Fabric in der Standardlaufzeit verfügbar und muss nicht installiert werden. Wenn Sie Spark 3.3 oder darunter verwenden oder auf die neueste Version von Semantic Link aktualisieren möchten, können Sie den Befehl ausführen:

python %pip install -U semantic-link  

  1. Importieren Sie ggf. die Module, die Sie später benötigen:

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    from sempy.samples import download_synthea
    
  2. Pullen Sie die Beispieldaten. In diesem Tutorial verwenden Sie das Synthea-Dataset mit synthetischen medizinischen Datensätzen (zur Einfachheit eine Version mit geringem Umfang):

    download_synthea(which='small')
    

Untersuchen der Daten

  1. Initialisieren Sie einen FabricDataFrame mit dem Inhalt der Datei providers.csv:

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Suchen Sie mit der find_dependencies-Funktion von SemPy nach Problemen mit der Datenqualität, indem Sie ein Diagramm der automatisch erkannten funktionsbezogenen Abhängigkeiten zeichnen:

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Screenshot: Diagramms mit den funktionalen Abhängigkeiten.

    Das Diagramm der funktionalen Abhängigkeiten zeigt, dass NAME und ORGANIZATION von Id bestimmt werden (erkennbar an den durchgezogenen Pfeilen). Dies ist zu erwarten, da Id eindeutig ist:

  3. Vergewissern Sie sich, dass Id eindeutig ist:

    providers.Id.is_unique
    

    Der Code gibt True zurück, um zu bestätigen, dass Id eindeutig ist.

Detaillierte Analyse funktionaler Abhängigkeiten

Das Diagramm mit funktionalen Abhängigkeiten zeigt auch, dass ORGANIZATION wie erwartet ADDRESS und ZIP bestimmt. Es wäre zu erwarten gewesen, dass ZIP auch CITY bestimmt, aber der gestrichelte Pfeil gibt an, dass die Abhängigkeit nur ungefähr ist und auf ein Problem mit der Datenqualität verweist.

Das Diagramm weist noch weitere Besonderheiten auf. Beispielsweise bestimmt NAME weder GENDER noch Id, SPECIALITY oder ORGANIZATION. Jede dieser Besonderheiten kann eine Untersuchung wert sein.

  1. Sehen Sie sich die ungefähre Beziehung zwischen ZIP und CITY genauer an, und verwenden Sie die SemPy-Funktion list_dependency_violations, um eine tabellarische Liste von Verstößen anzuzeigen:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Zeichnen Sie ein Diagramm mit der SemPy-Visualisierungsfunktion plot_dependency_violations. Ein solches Diagramm ist hilfreich, wenn nur wenig Verstöße vorliegen:

    providers.plot_dependency_violations('ZIP', 'CITY')
    

    Screenshot der Darstellung von Abhängigkeitsverstößen.

    Der Plot der Abhängigkeitsverstöße zeigt Werte für ZIP auf der linken Seite und Werte für CITY auf der rechten Seite an. Eine Linie verbindet eine Postleitzahl auf der linken Seite mit einem Ort auf der rechten Seite, wenn eine Zeile mit diesen beiden Werten vorhanden ist. Die Linien enthalten einen Kommentar mit der Anzahl der entsprechenden Zeilen. Beispielsweise gibt es zwei Zeilen mit der Postleitzahl „02747-1242“: eine für den Ort „NORTH DARTMOUTH“, die andere für den Ort „DARTMOUTH“, wie im obigen Plot und im folgenden Code gezeigt:

  3. Bestätigen Sie die Beobachtungen, die Sie im Plot der Abhängigkeitsverstöße gemacht haben, indem Sie den folgenden Code ausführen:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. Der Plot zeigt auch, dass von den Zeilen, für die CITY als „DARTMOUTH“ angegeben ist, neun Zeilen den ZIP-Wert „02747-1262“ aufweisen sowie eine Zeile den ZIP-Wert „02747-1242“ und eine Zeile den ZIP-Wert „02747-2537“. Bestätigen Sie diese Beobachtungen mit dem folgenden Code:

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Es gibt weitere Postleitzahlen, die mit „DARTMOUTH“ verknüpft sind, aber diese werden im Diagramm der Abhängigkeitsverstöße nicht angezeigt, da sie nicht auf Probleme mit der Datenqualität hinweisen. Die Postleitzahl „02747-4302“ ist beispielsweise eindeutig „DARTMOUTH“ zugeordnet und daher im Diagramm der Abhängigkeitsverstöße nicht enthalten. Bestätigen Sie dies, indem Sie den folgenden Code ausführen:

    providers[providers.ZIP == '02747-4302'].CITY.value_counts()
    

Übersicht über die mithilfe von SemPy erkannten Problemen mit der Datenqualität

Im Diagramm der Abhängigkeitsverstöße können Sie sehen, dass dieses semantische Modell verschiedene interessante Probleme mit der Datenqualität enthält:

  • Einige Ortsnamen sind vollständig in Großbuchstaben geschrieben. Dieses Problem lässt sich mithilfe von Zeichenfolgenmethoden recht einfach beheben.
  • Einige Ortsnamen enthalten Qualifizierer (bzw. Präfixe), z. B. „North“ und „East“. Die Postleitzahl „2128“ beispielsweise lässt sich „EAST BOSTON“ und „BOSTON“ zuordnen. Ein ähnliches Problem tritt bei „NORTH DARTMOUTH“ und „DARTMOUTH“ auf. Sie könnten versuchen, diese Qualifizierer zu verwerfen oder die Postleitzahlen dem Ort mit dem häufigsten Vorkommen zuzuordnen.
  • Bei einigen Orten gibt es Tippfehler, z. B. „PITTSFILED“ statt „PITTSFIELD“ und „NEWBURGPORT“ statt „NEWBURYPORT“. Der Tippfehler in „NEWBURGPORT“ könnte mithilfe des häufigsten Vorkommens behoben werden. Da „PITTSFIELD“ und „PITTSFILED“ nur je einmal vorkommen, ist eine automatische Auflösung der Mehrdeutigkeit ohne externes Wissen oder die Verwendung eines Sprachmodells wesentlich schwieriger.
  • Manchmal werden Präfixe wie „West“ mit einem einzelnen Buchstaben abgekürzt: W. Dieses Problem könnte möglicherweise durch eine einfache Ersetzung behoben werden, wenn alle Vorkommen von „W“ für „West“ stehen.
  • Die Postleitzahl „02130“ ist einmal „BOSTON“ und einmal „Jamaika Plain“ einmal zugeordnet. Dieses Problem ist nicht einfach zu beheben, aber wenn mehr Daten vorhanden wären, könnte die Zuordnung zum häufigsten Vorkommen eine mögliche Lösung sein.

Bereinigen der Daten

  1. Beheben Sie die Probleme mit der Groß-/Kleinschreibung, indem Sie alle Vorkommen so ändern, dass jeweils der Anfangsbuchstabe groß und alle weiteren Buchstaben klein geschrieben werden (auf Englisch „Title Case“):

    providers['CITY'] = providers.CITY.str.title()
    
  2. Führen Sie die Erkennung von Verstößen erneut aus. Sie werden feststellen, dass einige der Mehrdeutigkeiten nicht mehr vorhanden sind (die Anzahl der Verstöße ist geringer):

    providers.list_dependency_violations('ZIP', 'CITY')
    

    An diesem Punkt könnten Sie Ihre Daten manuell verfeinern, aber eine potenzielle Aufgabe bei der Datenbereinigung ist es, Zeilen zu verwerfen, die gegen funktionale Constraints zwischen Spalten in den Daten verstoßen. Dafür verwenden Sie die drop_dependency_violations-Funktion von SemPy.

    Für jeden Wert der Determinantenvariable wählt drop_dependency_violations den am häufigsten verwendeten Wert der abhängigen Variable aus und verwirft alle Zeilen mit anderen Werten. Sie sollten diesen Vorgang nur ausführen, wenn Sie sicher sind, dass diese statistische heuristische Methode zu den richtigen Ergebnissen für Ihre Daten führt. Andernfalls sollten Sie selbst Code schreiben, um die erkannten Verstöße entsprechend Ihren Anforderungen zu behandeln.

  3. Führen Sie die Funktion drop_dependency_violations für die Spalten ZIP und CITY aus:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Listen Sie alle Abhängigkeitsverstöße zwischen ZIP und CITY auf:

    providers_clean.list_dependency_violations('ZIP', 'CITY')
    

    Der Code gibt eine leere Liste zurück, was darauf hinweist, dass es keine weiteren Verstöße gegen den funktionalen Constraint CITY -> ZIP gibt.

Sehen Sie sich weitere Tutorials zu Semantic Link und SemPy an: