Del via


Selvstudium: Ryd op i data med funktionelle afhængigheder

Brug funktionelle afhængigheder til at rense data. Der findes en funktionel afhængighed, når én kolonne i en semantisk model (et Power BI-datasæt) afhænger af en anden kolonne. En ZIP code kolonne kan f.eks. bestemme værdien i en city kolonne. En funktionel afhængighed vises som en en-til-mange-relation mellem værdier i to eller flere kolonner i en DataFrame. Dette selvstudium bruger Synthea-datasættet til at vise, hvordan funktionelle afhængigheder hjælper med at registrere problemer med datakvaliteten.

I dette selvstudium lærer du, hvordan du:

  • Anvend domæneviden til at danne hypoteser om funktionelle afhængigheder i en semantisk model.
  • Bliv fortrolig med komponenter i Semantic Link Python-biblioteket (SemPy), der automatiserer datakvalitetsanalyse. Disse komponenter omfatter:
    • FabricDataFrame– en pandalignende struktur med yderligere semantisk information.
    • Funktioner, der automatiserer evaluering af hypoteser om funktionelle afhængigheder og identificerer overtrædelser i dine semantiske modeller.

Forudsætninger

  • Vælg Arbejdsområder i navigationsruden, og vælg derefter dit arbejdsområde for at angive det som det aktuelle arbejdsområde.

Følg med i notesbogen

Brug notesbogen data_cleaning_functional_dependencies_tutorial.ipynb til at følge dette selvstudium.

Konfigurer notesbogen

I dette afsnit skal du konfigurere et notesbogsmiljø.

  1. Tjek din Spark-version. Hvis du bruger Spark 3.4 eller nyere i Microsoft Fabric, er Semantic Link inkluderet som standard, så du behøver ikke at installere det. Hvis du bruger Spark 3.3 eller tidligere, eller hvis du vil opdatere til det nyeste semantiske link, skal du køre følgende kommando.

    %pip install -U semantic-link
    
  2. Importer de moduler, du bruger i denne notesbog.

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    
  3. Download eksempeldataene. I dette selvstudium skal du bruge Synthea-datasættet med syntetiske patientjournaler (lille version for nemheds skyld).

    download_synthea(which='small')
    

Udforsk dataene

  1. Initialiser a FabricDataFrame med indholdet af denproviders.csv fil.

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Tjek for datakvalitetsproblemer med SemPys find_dependencies funktion ved at plotte en graf over automatisk registrerede funktionelle afhængigheder.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Skærmbillede af en funktionel afhængighedsgraf, der viser Id bestemmer NAVN og ORGANISATION.

    Grafen viser, at Id bestemmer NAME og ORGANIZATION. Dette resultat forventes, fordi Id det er unikt.

  3. Bekræft, at det Id er unikt.

    providers.Id.is_unique
    

    Koden returnerer True for at bekræfte, at Id er entydig.

Analysér funktionelle afhængigheder i dybden

Grafen over funktionelle afhængigheder viser også, at ORGANIZATION bestemmer ADDRESS og ZIPsom forventet. Du kan dog forvente, at ZIP også bestemmer CITY, men den stiplede pil angiver, at afhængigheden kun er omtrentlig, hvilket peger på et problem med datakvaliteten.

Der er andre egenskaber i grafen. NAME bestemmer f.eks. ikke GENDER, Id, SPECIALITYeller ORGANIZATION. Hver af disse særheder kan være værd at undersøge.

  1. Tag et dybere kig på det omtrentlige forhold mellem ZIP og CITY ved at bruge SemPys list_dependency_violations funktion til at liste overtrædelserne:
providers.list_dependency_violations('ZIP', 'CITY')
  1. Tegn en graf med SemPys plot_dependency_violations visualiseringsfunktion. Denne graf er nyttig, hvis antallet af overtrædelser er lille:
providers.plot_dependency_violations('ZIP', 'CITY')

Skærmbillede af plottet af afhængighedsovertrædelser.

Afhandlingen med afhængighedsovertrædelser viser værdier for ZIP i venstre side og værdier for CITY i højre side. En kant forbinder et postnummer i venstre side af afbildningen med en by i højre side, hvis der er en række, der indeholder disse to værdier. Kanterne anmærkes med antallet af sådanne rækker. Der er f.eks. to rækker med postnummeret 02747-1242, én række med byen "NORTH DARTHMOUTH" og den anden med byen "DARTHMOUTH", som vist i det forrige plot og følgende kode:

  1. Bekræft observationerne fra plottet ved at køre følgende kode:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. Plottet viser også, at blandt de rækker, der har CITY som "DARTHMOUTH", har ni rækker en ZIP på 02747-1262. En række har en ZIP på 02747-1242. En række har en ZIP på 02747-2537. Bekræft disse bemærkninger med følgende kode:

    providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()
    
  2. Der er andre postnumre forbundet med "DARTMOUTH", men disse postnumre vises ikke i grafen over afhængighedsovertrædelser, fordi de ikke antyder problemer med datakvaliteten. Postnummeret "02747-4302" er f.eks. entydigt forbundet med "DARTMOUTH" og vises ikke i grafen over afhængighedsovertrædelser. Bekræft ved at køre følgende kode:

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

Opsummer problemer med datakvaliteten, der er registreret med SemPy

Grafen over afhængighedsovertrædelser viser flere problemer med datakvaliteten i denne semantiske model:

  • Nogle bynavne er med store bogstaver. Brug strengmetoder til at løse dette problem.
  • Nogle bynavne har kvalifikatorer (eller præfikser), f.eks. "Nord" og "Øst". For eksempel knyttes postnummeret "2128" til "EAST BOSTON" én gang og til "BOSTON" én gang. Et lignende problem opstår mellem "NORTH DARTMOUTH" og "DARTMOUTH". Drop disse kvalifikatorer, eller knyt postnumrene til den by, der har den mest almindelige forekomst.
  • Der er stavefejl i nogle bynavne, som "PITTSFIELD" vs. "PITTSFILED" og "NEWBURGPORT" vs. "NEWBURYPORT." For "NEWBURGPORT" skal du rette denne tastefejl ved hjælp af den mest almindelige forekomst. For "PITTSFIELD", med kun én forekomst hver, er automatisk flertydighed meget sværere uden ekstern viden eller en sprogmodel.
  • Nogle gange forkortes præfikser som "West" til det enkelte bogstav "W". Erstat "W" med "West", hvis alle forekomster af "W" står for "West".
  • Postnummeret "02130" kortlægges til "BOSTON" én gang og "Jamaica Plain" én gang. Dette problem er ikke let at løse. Med flere data kan du kortlægge den mest almindelige forekomst.

Ryd dataene

  1. Ret store bogstaver ved at ændre værdier til store og små bogstaver.

    providers['CITY'] = providers.CITY.str.title()
    
  2. Kør registrering af overtrædelser igen for at bekræfte, at der er færre tvetydigheder.

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

Afgræns dataene manuelt, eller slip rækker, der overtræder funktionelle begrænsninger mellem kolonner ved hjælp af SemPys drop_dependency_violations funktion.

For hver værdi af den determinantvariabel vælges den mest almindelige værdi af den afhængige variabel, drop_dependency_violations og alle rækker slippes med andre værdier. Anvend kun denne handling, hvis du er sikker på, at denne statistiske heuristik fører til korrekte resultater for dine data. Ellers skal du skrive din egen kode for at håndtere de registrerede overtrædelser.

  1. Kør drop_dependency_violations funktionen på kolonnerne ZIP og CITY .

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. Angiv eventuelle afhængighedsovertrædelser mellem ZIP og CITY.

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

Koden returnerer en tom liste for at angive, at der ikke er flere overtrædelser af den funktionelle begrænsning ZIP -> CITY.

Se andre tutorials for semantisk link eller SemPy: