Delen via


Zelfstudie: Gegevens opschonen met functionele afhankelijkheden

In deze zelfstudie gebruikt u functionele afhankelijkheden voor het opschonen van gegevens. Er bestaat een functionele afhankelijkheid wanneer één kolom in een semantisch model (een Power BI-gegevensset) een functie van een andere kolom is. Een postcodekolom kan bijvoorbeeld de waarden in een plaatskolom bepalen. Een functionele afhankelijkheid manifesteert zich als een een-op-veel-relatie tussen de waarden in twee of meer kolommen binnen een DataFrame. In deze zelfstudie wordt de Synthea-gegevensset gebruikt om te laten zien hoe functionele relaties kunnen helpen bij het detecteren van problemen met de gegevenskwaliteit.

In deze zelfstudie leert u het volgende:

  • Pas domeinkennis toe om hypothesen te formuleren over functionele afhankelijkheden in een semantisch model.
  • Maak kennis met onderdelen van de Python-bibliotheek (SemPy) van semantische koppelingen die u helpen bij het automatiseren van gegevenskwaliteitsanalyse. Deze onderdelen zijn onder andere:
    • FabricDataFrame- een pandas-achtige structuur die is uitgebreid met aanvullende semantische informatie.
    • Nuttige functies die de evaluatie van hypothesen over functionele afhankelijkheden automatiseren en waarmee schendingen van relaties in uw semantische modellen worden geïdentificeerd.

Vereisten

  • Selecteer Werkruimten in het linkernavigatiedeelvenster om uw werkruimte te zoeken en te selecteren. Deze werkruimte wordt uw huidige werkruimte.

Volgen in het notitieblok

De notebook data_cleaning_functional_dependencies_tutorial.ipynb begeleidt deze zelfstudie.

Als u het bijbehorende notitieblok voor deze zelfstudie wilt openen, volgt u de instructies in Uw systeem voorbereiden voor zelfstudies voor gegevenswetenschap om het notebook te importeren in uw werkruimte.

Als u liever de code van deze pagina kopieert en plakt, kunt u een nieuw notitieblok maken.

Zorg ervoor dat u een lakehouse aan het notebook koppelt voordat u begint met het uitvoeren van code.

Het notebook instellen

In deze sectie stelt u een notebookomgeving in met de benodigde modules en gegevens.

  1. Voor Spark 3.4 en hoger is Semantische koppeling beschikbaar in de standaardruntime wanneer u Fabric gebruikt en hoeft u deze niet te installeren. Als u Spark 3.3 of lager gebruikt of als u wilt bijwerken naar de meest recente versie van Semantic Link, kunt u de opdracht uitvoeren:

python %pip install -U semantic-link  

  1. Voer de benodigde importbewerkingen uit van modules die u later nodig hebt:

    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. Haal de voorbeeldgegevens op. Voor deze zelfstudie gebruikt u de Synthea-gegevensset van synthetische medische records (kleine versie voor eenvoud):

    download_synthea(which='small')
    

De gegevens verkennen

  1. Initialiseer een FabricDataFrame met de inhoud van het providers.csv-bestand :

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Controleer op problemen met gegevenskwaliteit met de functie van find_dependencies SemPy door een grafiek met automatisch gedetecteerde functionele afhankelijkheden te tekenen:

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Schermopname van de grafiek met functionele afhankelijkheden.

    De grafiek van functionele afhankelijkheden toont dat Id bepaalt NAME en ORGANIZATION (aangegeven door de ononderbroken pijlen), wat wordt verwacht, omdat Id dit uniek is:

  3. Bevestig dat dit Id uniek is:

    providers.Id.is_unique
    

    De code retourneert True om te bevestigen dat dit Id uniek is.

Functionele afhankelijkheden uitgebreid analyseren

In de grafiek met functionele afhankelijkheden ziet u ook dat ORGANIZATION bepaalt ADDRESS en ZIP, zoals verwacht. U kunt echter ook verwachten ZIP dat u dit kunt vaststellen CITY, maar de stippellijn geeft aan dat de afhankelijkheid alleen bij benadering is, wat wijst naar een probleem met de gegevenskwaliteit.

Er zijn andere bijzonderheden in de grafiek. Bepaalt bijvoorbeeld NAME niet GENDER, Idof SPECIALITYORGANIZATION. Elk van deze eigenaardigheden kan het onderzoeken waard zijn.

  1. Bekijk de geschatte relatie tussen ZIP en CITY, met behulp van de functie van list_dependency_violations SemPy om een lijst met schendingen in tabelvorm weer te geven:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Teken een grafiek met de visualisatiefunctie van plot_dependency_violations SemPy. Deze grafiek is handig als het aantal schendingen klein is:

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

    Schermopname van de plot met afhankelijkheidsschendingen.

    In de plot met afhankelijkheidsschendingen ziet u waarden voor ZIP aan de linkerkant en waarden voor CITY aan de rechterkant. Een rand verbindt een postcode aan de linkerkant van de plot met een plaats aan de rechterkant als er een rij is die deze twee waarden bevat. De randen worden geannoteerd met het aantal van dergelijke rijen. Er zijn bijvoorbeeld twee rijen met postcode 02747-1242, één rij met plaats 'NORTH DARTHMOUTH' en de andere met plaats 'DARTHMOUTH', zoals wordt weergegeven in de vorige plot en de volgende code:

  3. Bevestig de vorige waarnemingen die u hebt gemaakt met de plot met afhankelijkheidsschendingen door de volgende code uit te voeren:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. In de plot ziet u ook dat tussen de rijen met CITY "DARTHMOUTH" negen rijen een ZIP van 02747-1262 hebben; één rij een ZIP van 02747-1242; en één rij een ZIP van 02747-2537 heeft. Bevestigt deze waarnemingen met de volgende code:

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Er zijn andere postcodes gekoppeld aan DARTMOUTH, maar deze postcodes worden niet weergegeven in de grafiek met afhankelijkheidsschendingen, omdat ze geen hint geven aan problemen met de kwaliteit van gegevens. De postcode 02747-4302 is bijvoorbeeld uniek gekoppeld aan DARTMOUTH en wordt niet weergegeven in de grafiek met afhankelijkheidsschendingen. Bevestig door de volgende code uit te voeren:

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

Problemen met gegevenskwaliteit samenvatten die zijn gedetecteerd met SemPy

Als u teruggaat naar de grafiek met afhankelijkheidsschendingen, ziet u dat er verschillende interessante problemen zijn met de kwaliteit van gegevens in dit semantische model:

  • Sommige plaatsnamen zijn hoofdletters. Dit probleem kan eenvoudig worden opgelost met behulp van tekenreeksmethoden.
  • Sommige plaatsnamen hebben kwalificaties (of voorvoegsels), zoals 'Noord' en 'Oost'. De postcode '2128' wordt bijvoorbeeld één keer toegewezen aan 'EAST BOSTON' en 'BOSTON'. Er treedt een vergelijkbaar probleem op tussen 'NORTH DARTHMOUTH' en 'DARTHMOUTH'. U kunt proberen om deze kwalificaties te verwijderen of de postcodes toe te wijzen aan de stad met de meest voorkomende gebeurtenis.
  • Er zijn typfouten in sommige steden, zoals "PITTSFIELD" versus "PITTSFILED" en "NEWBURGPORT vs. "NEWBURYPORT". Voor "NEWBURGPORT" kan deze typfout worden opgelost met behulp van de meest voorkomende gebeurtenis. Voor "PITTSFIELD" is het veel moeilijker om automatisch ondubbelzinnig te zijn zonder externe kennis of het gebruik van een taalmodel.
  • Soms worden voorvoegsels zoals 'West' afgekort tot één letter 'W'. Dit probleem kan mogelijk worden opgelost met een eenvoudige vervanging, als alle exemplaren van 'W' staan voor 'West'.
  • De postcode "02130" wordt eenmaal toegewezen aan "BOSTON" en "Jamaica Plain" één keer. Dit probleem is niet eenvoudig op te lossen, maar als er meer gegevens zijn, kan het toewijzen aan de meest voorkomende gebeurtenis een mogelijke oplossing zijn.

De gegevens opschonen

  1. Los de hoofdlettergebruiksproblemen op door alle hoofdlettergebruik te wijzigen in titelcase:

    providers['CITY'] = providers.CITY.str.title()
    
  2. Voer de detectie van schendingen opnieuw uit om te zien dat sommige dubbelzinnigheden zijn verdwenen (het aantal schendingen is kleiner):

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

    Op dit moment kunt u uw gegevens handmatig verfijnen, maar een mogelijke opschoontaak voor gegevens is het verwijderen van rijen die functionele beperkingen tussen kolommen in de gegevens schenden, met behulp van de functie van drop_dependency_violations SemPy.

    Voor elke waarde van de determinante variabele drop_dependency_violations werkt u door de meest voorkomende waarde van de afhankelijke variabele te kiezen en alle rijen met andere waarden neer te halen. U moet deze bewerking alleen toepassen als u er zeker van bent dat deze statistische heuristiek tot de juiste resultaten voor uw gegevens zou leiden. Anders moet u uw eigen code schrijven om de gedetecteerde schendingen zo nodig af te handelen.

  3. Voer de drop_dependency_violations functie uit op de ZIP en CITY kolommen:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Eventuele afhankelijkheidsschendingen tussen ZIP en CITY:

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

    De code retourneert een lege lijst om aan te geven dat er geen schendingen meer zijn van de functionele beperking CITY -> ZIP.

Bekijk andere zelfstudies voor semantische koppeling /SemPy: