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 postcode kolom kan bijvoorbeeld de waarden in een plaats kolom 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 gegevensset Synthea 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 van semantische koppelingen (SemPy) 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.

Voorwaarden

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

Volg mee in het notitieblok

De notebook data_cleaning_functional_dependencies_tutorial.ipynb begeleidt deze zelfstudie.

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 find_dependencies-functie van 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.

    In de grafiek met functionele afhankelijkheden ziet u dat Id bepaalt NAME en ORGANIZATION (aangegeven door de effen pijlen), wat wordt verwacht, omdat Id uniek is:

  3. Controleer of Id is uniek:

    providers.Id.is_unique
    

    De code retourneert True om te bevestigen dat 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 verwachten dat ZIP ook CITYbepaalt, 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. NAME bepaalt bijvoorbeeld niet GENDER, Id, SPECIALITYof ORGANIZATION. Elk van deze eigenaardigheden kan het onderzoeken waard zijn.

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

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Teken een grafiek met de plot_dependency_violations visualisatiefunctie van 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 eerdere waarnemingen die u hebt gedaan met de plot van schendingen van afhankelijkheden door de volgende code uit te voeren.

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. In de plot ziet u ook dat, onder de rijen die een CITY van "DARTHMOUTH" hebben, negen rijen een ZIP van 02747-1262 hebben; één rij heeft een ZIP van 02747-1242; en één rij heeft een ZIP van 02747-2537. 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 volledig in hoofdletters geschreven. Dit probleem kan eenvoudig worden opgelost met behulp van tekenreeksmethoden.
  • Sommige plaatsnamen hebben kwalificaties (of voorvoegsels), zoals 'Noord' en 'Oost'. De postcode '2128' komt bijvoorbeeld één keer overeen met 'EAST BOSTON' en één keer met '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. Omdat "PITTSFIELD" elk maar één keer voorkomt, is het veel moeilijker om automatische desambiguatie te doen 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 voorkomens van 'W' staan voor 'West'.
  • De postcode "02130" komt eenmaal overeen met "BOSTON" en eenmaal met "Jamaica Plain". 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 taak voor het opschonen van gegevens is het verwijderen van rijen die functionele beperkingen tussen kolommen in de gegevens schenden, met behulp van de drop_dependency_violations functie van SemPy.

    Voor elke waarde van de determinante variabele werkt drop_dependency_violations 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 functie drop_dependency_violations uit op de kolommen ZIP en CITY:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Vermeld 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 tutorials voor semantische koppeling met SemPy: