Del via


Selvstudium: Ryd op i data med funktionelle afhængigheder

I dette selvstudium bruger du funktionelle afhængigheder til datarensning. Der findes en funktionel afhængighed, når én kolonne i en semantisk model (et Power BI-datasæt) er en funktion i en anden kolonne. En postnummer kolonne kan f.eks. bestemme værdierne i en by kolonne. En funktionel afhængighed manifesterer sig som en en til mange-relation mellem værdierne i to eller flere kolonner i en DataFrame. I dette selvstudium bruges datasættet Synthea til at vise, hvordan funktionelle relationer kan hjælpe med at registrere problemer med datakvaliteten.

I dette selvstudium lærer du, hvordan du:

  • Anvend domænekendskab for at formulere hypoteser om funktionelle afhængigheder i en semantisk model.
  • Bliv fortrolig med komponenterne i Python-biblioteket for semantiske links (SemPy), der hjælper med at automatisere analyse af datakvalitet. Disse komponenter omfatter:
    • FabricDataFrame – en pandaslignende struktur, der er forbedret med yderligere semantiske oplysninger.
    • Nyttige funktioner, der automatiserer evalueringen af hypoteser om funktionelle afhængigheder, og som identificerer overtrædelser af relationer i dine semantiske modeller.

Forudsætninger

  • Vælg arbejdsområder i navigationsruden til venstre for at finde og vælge dit arbejdsområde. Dette arbejdsområde bliver dit aktuelle arbejdsområde.

Følg med i notesbogen

Notesbogen data_cleaning_functional_dependencies_tutorial.ipynb følger med dette selvstudium.

Konfigurer notesbogen

I dette afsnit skal du konfigurere et notesbogmiljø med de nødvendige moduler og data.

  1. For Spark 3.4 og nyere er semantisk link tilgængeligt i standardkørslen, når du bruger Fabric, og det er ikke nødvendigt at installere det. Hvis du bruger Spark 3.3 eller nedenfor, eller hvis du vil opdatere til den nyeste version af Semantic Link, kan du køre kommandoen:

python %pip install -U semantic-link  

  1. Udfør den nødvendige import af moduler, som du skal bruge senere:

    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. Træk i eksempeldataene. I dette selvstudium skal du bruge Synthea datasæt af syntetiske medicinske journaler (lille version for nemheds skyld):

    download_synthea(which='small')
    

Udforsk dataene

  1. Initialiser en FabricDataFrame med indholdet af den providers.csv fil:

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Kontrollér, om der er problemer med datakvaliteten med SemPys find_dependencies funktion ved at afbilde en graf over automatisk registrerede funktionelle afhængigheder:

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Skærmbillede, der viser grafen over funktionelle afhængigheder.

    Grafen over funktionelle afhængigheder viser, at Id bestemmer NAME og ORGANIZATION (angivet med de udfyldte pile), hvilket forventes, da Id er entydig:

  3. Bekræft, at Id er entydig:

    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. Se nærmere på den omtrentlige relation mellem ZIP og CITYved hjælp af SemPys list_dependency_violations funktion for at se en tabelliste over overtrædelser:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. 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, der viser afbildningen af afhængighedsovertrædelser.

    Afbildningen af 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:

  3. Bekræft de tidligere observationer, du har foretaget med afbildningen af afhængighedsovertrædelser, ved at køre følgende kode:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. Afbildningen viser også, at blandt de rækker, der har CITY som "DARTHMOUTH", har ni rækker en ZIP på 02747-1262; én række har en ZIP på 02747-1242; og én række har en ZIP på 02747-2537. Bekræfter disse observationer med følgende kode:

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Der er andre postnumre, der er knyttet til "DARTMOUTH", men disse postnumre vises ikke i grafen over afhængighedsovertrædelser, da de ikke antyder problemer med datakvaliteten. Postnummeret "02747-4302" er f.eks. entydigt knyttet til "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

Når du går tilbage til grafen over afhængighedsovertrædelser, kan du se, at der er flere interessante problemer med datakvaliteten i denne semantiske model:

  • Nogle bynavne er alle med store bogstaver. Dette problem er nemt at løse ved hjælp af strengmetoder.
  • Nogle bynavne har kvalifikatorer (eller præfikser), f.eks. "Nord" og "Øst". Postnummeret "2128" knyttes f.eks. til "EAST BOSTON" én gang og til "BOSTON" én gang. Et lignende problem opstår mellem "NORTH DARTHMOUTH" og "DARTHMOUTH". Du kan prøve at slippe disse kvalifikatorer eller knytte postnumre til byen med den mest almindelige forekomst.
  • Der er stavefejl i nogle byer, f.eks. "PITTSFIELD" vs. "PITTSFILED" og "NEWBURGPORT vs. "NEWBURYPORT". For "NEWBURGPORT" kan denne typo rettes ved hjælp af den mest almindelige forekomst. For "PITTSFIELD", der kun én forekomst hver gør det meget sværere for automatisk fjernelse uden ekstern viden eller brug af en sprogmodel.
  • Nogle gange forkortes præfikser som "Vest" til et enkelt bogstav "W". Dette problem kan muligvis løses med en simpel erstatning, hvis alle forekomster af "W" står for "West".
  • Postnummeret "02130" kort til "BOSTON" én gang og "Jamaica Plain" én gang. Dette problem er ikke let at løse, men hvis der var flere data, kan tilknytning til den mest almindelige forekomst være en potentiel løsning.

Ryd dataene

  1. Løs problemer med store bogstaver ved at ændre al brug af store og små bogstaver til store og små bogstaver:

    providers['CITY'] = providers.CITY.str.title()
    
  2. Kør registreringen af overtrædelse igen for at se, at nogle af tvetydighederne er væk (antallet af overtrædelser er mindre):

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

    På dette tidspunkt kan du tilpasse dine data mere manuelt, men en potentiel opgave til oprydning af data er at slippe rækker, der overtræder funktionelle begrænsninger mellem kolonner i dataene, ved hjælp af SemPys drop_dependency_violations funktion.

    For hver værdi af den determinante variabel fungerer drop_dependency_violations ved at vælge den mest almindelige værdi for den afhængige variabel og slippe alle rækker med andre værdier. Du bør kun anvende denne handling, hvis du er sikker på, at denne statistiske heuristik vil føre til de korrekte resultater for dine data. Ellers skal du skrive din egen kode for at håndtere de registrerede overtrædelser efter behov.

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

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. 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 CITY –> ZIP-.

Tjek andre selvstudier for semantisk link / SemPy: