Dela via


Handledning: Rensa data med funktionella beroenden

I den här handledningen använder du funktionella beroenden för datarensning. Det finns ett funktionellt beroende när en kolumn i en semantisk modell (en Power BI-datauppsättning) är en funktion i en annan kolumn. Till exempel kan en postnummer-kolumn bestämma värdena i en stad-kolumn. Ett funktionellt beroende manifesterar sig som en en-till-många-relation mellan värdena i två eller flera kolumner i en DataFrame. I den här handledningen används datamängden Synthea för att visa hur funktionella relationer kan hjälpa till att identifiera datakvalitetsproblem.

I den här guiden lär du dig att:

  • Använd domänkunskap för att formulera hypoteser om funktionella beroenden i en semantisk modell.
  • Bekanta dig med komponenter i semantiklänkens Python-bibliotek (SemPy) som hjälper dig att automatisera datakvalitetsanalys. Dessa komponenter omfattar:
    • FabricDataFrame – en Pandas-liknande struktur som utökas med ytterligare semantisk information.
    • Användbara funktioner som automatiserar utvärderingen av hypoteser om funktionella beroenden och som identifierar överträdelser av relationer i dina semantiska modeller.

Förutsättningar

  • Välj Arbetsytor i det vänstra navigeringsfönstret för att hitta och välja din arbetsyta. Den här arbetsytan blir din aktuella arbetsyta.

Följ med i anteckningsboken

Den data_cleaning_functional_dependencies_tutorial.ipynb notebook-filen medföljer den här självstudien.

Konfigurera anteckningsboken

I det här avsnittet konfigurerar du en notebook-miljö med nödvändiga moduler och data.

  1. För Spark 3.4 och senare är Semantic link tillgänglig i standardkörmiljön när du använder Fabric, och det behövs inte installeras. Om du använder Spark 3.3 eller senare, eller om du vill uppdatera till den senaste versionen av Semantic Link, kan du köra kommandot:

python %pip install -U semantic-link  

  1. Utför nödvändiga importer av moduler som du behöver senare:

    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. Hämta exempeldata. I den här självstudien använder du Synthea datauppsättning för syntetiska medicinska journaler (liten version för enkelhetens skull):

    download_synthea(which='small')
    

Utforska data

  1. Initiera en FabricDataFrame med innehållet från providers.csv-filen.

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Identifiera datakvalitetsproblem med SemPys find_dependencies-funktion genom att rita ett diagram över automatiskt upptäckta funktionella beroenden.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Skärmbild som visar grafen över funktionella beroenden.

    Diagrammet över funktionella beroenden visar att Id bestämmer NAME och ORGANIZATION (indikeras av de fasta pilarna), vilket är förväntat eftersom Id är unikt:

  3. Bekräfta att Id är unikt:

    providers.Id.is_unique
    

    Koden returnerar True för att bekräfta att Id är unik.

Analysera funktionella beroenden på djupet

Diagrammet funktionella beroenden visar också att ORGANIZATION avgör ADDRESS och ZIP, som förväntat. Du kan dock förvänta dig att ZIP också fastställer CITY, men den streckade pilen anger att beroendet bara är ungefärligt och pekar mot ett datakvalitetsproblem.

Det finns andra egenheter i diagrammet. NAME avgör till exempel inte GENDER, Id, SPECIALITYeller ORGANIZATION. Var och en av dessa egenheter kan vara värt att undersöka.

  1. Ta en djupare titt på den ungefärliga relationen mellan ZIP och CITYgenom att använda SemPys list_dependency_violations-funktion för att se en tabelllista över överträdelser:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Rita ett diagram med SemPys plot_dependency_violations visualiseringsfunktion. Det här diagrammet är användbart om antalet överträdelser är litet:

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

    Skärmbild som visar diagrammet över beroendeöverträdelser.

    Diagrammet över beroendeöverträdelser visar värden för ZIP till vänster och värden för CITY till höger. En kant ansluter ett postnummer till vänster i diagrammet med en stad till höger om det finns en rad som innehåller dessa två värden. Kanterna kommenteras med antalet sådana rader. Det finns till exempel två rader med postnummer 02747-1242, en rad med staden "NORTH DARTHMOUTH" och den andra med staden "DARTHMOUTH", som du ser i föregående diagram och följande kod:

  3. Bekräfta de tidigare observationer du gjorde med diagrammet över beroendeöverträdelser genom att köra följande kod:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. Diagrammet visar också att bland de rader som har CITY som "DARTHMOUTH" har nio rader en ZIP 02747-1262; en rad har en ZIP 02747-1242; och en rad har en ZIP 02747-2537. Bekräftar dessa observationer med följande kod:

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Det finns andra postnummer som är associerade med "DARTMOUTH", men dessa postnummer visas inte i diagrammet över beroendeöverträdelser, eftersom de inte antyder datakvalitetsproblem. Postnumret "02747-4302" är till exempel unikt associerat med "DARTMOUTH" och visas inte i diagrammet över beroendeöverträdelser. Bekräfta genom att köra följande kod:

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

Sammanfatta datakvalitetsproblem som identifierats med SemPy

Om du går tillbaka till diagrammet över beroendeöverträdelser kan du se att det finns flera intressanta problem med datakvaliteten i den här semantiska modellen:

  • Vissa stadsnamn är skrivna med stora bokstäver. Det här problemet är enkelt att åtgärda med hjälp av strängmetoder.
  • Vissa stadsnamn har kvalificerare (eller prefix), till exempel "North" och "East". Postnumret "2128" mappar till exempel till "EAST BOSTON" en gång och till "BOSTON" en gång. Ett liknande problem uppstår mellan "NORTH DARTHMOUTH" och "DARTHMOUTH". Du kan försöka ta bort dessa kvalificerare eller mappa postnummer till staden med flest förekomster.
  • Det finns stavfel i vissa städer, till exempel "PITTSFIELD" jämfört med "PITTSFILED" och "NEWBURGPORT vs. "NEWBURYPORT". För "NEWBURGPORT" kan det här stavfelet åtgärdas med hjälp av den vanligaste förekomsten. För "PITTSFIELD" gör det faktum att det bara finns en förekomst var det mycket svårare för automatisk avklaring utan extern kunskap eller användning av en språkmodell.
  • Ibland förkortas prefix som "West" till en enda bokstav "W". Det här problemet kan eventuellt åtgärdas med en enkel ersättning om alla förekomster av "W" står för "West".
  • Postnumret "02130" mappar till "BOSTON" en gång och "Jamaica Plain" en gång. Det här problemet är inte lätt att åtgärda, men om det fanns mer data kan mappning till den vanligaste förekomsten vara en potentiell lösning.

Rensa data

  1. Åtgärda problem med versaler genom att ändra alla versaler till rubrikfall:

    providers['CITY'] = providers.CITY.str.title()
    
  2. Kör överträdelseidentifieringen igen för att se att vissa tvetydigheter är borta (antalet överträdelser är mindre):

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

    I det här läget kan du förfina dina data mer manuellt, men en potentiell datarensningsaktivitet är att släppa rader som bryter mot funktionella begränsningar mellan kolumner i data med hjälp av SemPys drop_dependency_violations funktion.

    För varje värde för den determinanta variabeln fungerar drop_dependency_violations genom att välja det vanligaste värdet för den beroende variabeln och släppa alla rader med andra värden. Du bör endast tillämpa den här åtgärden om du är säker på att den här statistiska heuristiken skulle leda till rätt resultat för dina data. Annars bör du skriva din egen kod för att hantera de identifierade överträdelserna efter behov.

  3. Kör funktionen drop_dependency_violations på kolumnerna ZIP och CITY:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Lista eventuella beroendeöverträdelser mellan ZIP och CITY:

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

    Koden returnerar en tom lista som anger att det inte finns fler överträdelser av funktionsbegränsningen CITY –> ZIP-.

Kolla in andra handledningar för Semantisk länk / SemPy: