Sdílet prostřednictvím


Kurz: Vyčištění dat pomocí funkčních závislostí

K vyčištění dat použijte funkční závislosti. Funkční závislost existuje, když jeden sloupec v sémantickém modelu (datová sada Power BI) závisí na jiném sloupci. Například sloupec ZIP code může určit hodnotu ve sloupci city. Funkční závislost se zobrazuje jako relace 1:N mezi hodnotami ve dvou nebo více sloupcích v objektu DataFrame. Tento kurz používá datovou sadu Synthea k zobrazení toho, jak funkční závislosti pomáhají zjišťovat problémy s kvalitou dat.

V tomto kurzu se naučíte:

  • Využijte znalosti domény k vytvoření hypotéz o funkčních závislostech v sémantickém modelu.
  • Seznamte se s komponentami knihovny Semantic Link Python (SemPy), které automatizují analýzu kvality dat. Mezi tyto komponenty patří:
    • FabricDataFrame– struktura podobná pandas s dalšími sémantickými informacemi.
    • Funkce, které automatizují vyhodnocování hypotéz o funkčních závislostech a identifikují porušení v sémantických modelech.

Požadavky

  • V navigačním podokně vyberte Pracovní prostory a pak vyberte svůj pracovní prostor, aby byl nastaven jako aktuální.

Postupujte podle pokynů v poznámkovém bloku

Pomocí poznámkového bloku data_cleaning_functional_dependencies_tutorial.ipynb postupujte podle tohoto kurzu.

Nastavení poznámkového bloku

V této části nastavíte prostředí poznámkového bloku.

  1. Zkontrolujte verzi Sparku. Pokud používáte Spark 3.4 nebo novější v Microsoft Fabric, je sémantický odkaz ve výchozím nastavení zahrnutý, takže ho nemusíte instalovat. Pokud používáte Spark 3.3 nebo starší nebo chcete aktualizovat na nejnovější sémantický odkaz, spusťte následující příkaz.

    %pip install -U semantic-link
    
  2. Importujte moduly, které používáte v tomto poznámkovém bloku.

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    
  3. Stáhněte si ukázková data. V tomto kurzu použijte datovou sadu Synthea syntetických lékařských záznamů (malá verze pro jednoduchost).

    download_synthea(which='small')
    

Prozkoumání dat

  1. Inicializujte FabricDataFrame obsahem souboru providers.csv.

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Zkontrolujte problémy s kvalitou dat u funkce SemPy find_dependencies vykreslením grafu automaticky rozdetekovaných funkčních závislostí.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Snímek obrazovky s grafem funkční závislosti zobrazující ID určuje NÁZEV a ORGANIZACI

    Graf ukazuje, že Id určuje NAME a ORGANIZATION. Tento výsledek je očekávaný, protože Id je jedinečný.

  3. Ověřte, že Id je jedinečný.

    providers.Id.is_unique
    

    Kód vrátí True, aby potvrdil, že Id je jedinečný.

Hloubková analýza funkčních závislostí

Graf funkčních závislostí také ukazuje, že ORGANIZATION určuje ADDRESS a ZIPpodle očekávání. Můžete ale očekávat, že ZIP také určí CITY, ale přerušovaná šipka indikuje, že závislost je pouze přibližná a ukazuje na problém s kvalitou dat.

V grafu jsou další zvláštní vlastnosti. Například NAME neurčí GENDER, Id, SPECIALITYnebo ORGANIZATION. Každá z těchto zvláštních vlastností by mohla být za to prozkoumat.

  1. Podívejte se blíže na přibližný vztah mezi ZIP a CITY tím, že použijete funkci list_dependency_violations z knihovny SemPy k vypsání porušení:
providers.list_dependency_violations('ZIP', 'CITY')
  1. Nakreslete graf pomocí plot_dependency_violations vizualizační funkce SemPy. Tento graf je užitečný, pokud je počet porušení malý:
providers.plot_dependency_violations('ZIP', 'CITY')

Snímek obrazovky s grafem porušení závislostí

Graf porušení závislostí zobrazuje hodnoty pro ZIP levou stranu a hodnoty pro CITY pravou stranu. Hrana spojuje PSČ na levé straně grafu s městem na pravé straně, pokud je řádek obsahující tyto dvě hodnoty. Hrany jsou opatřeny poznámkami s počtem takových řádků. Například existují dva řádky se PSČ 02747-1242, jeden řádek s městem "NORTH DARTHMOUTH" a druhý s městem "DARTHMOUTH", jak je znázorněno v předchozím grafu a následujícím kódem:

  1. Potvrďte pozorování z grafu spuštěním následujícího kódu:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. Graf také ukazuje, že mezi řádky, které mají CITY hodnotu "DARTHMOUTH", má ZIP devět řádků 02747-1262. Jeden řádek má ZIP 02747-1242. Jeden řádek má ZIP číslo 02747-2537. Pomocí následujícího kódu ověřte následující pozorování:

    providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()
    
  2. Existují další PSČ přidružené k "DARTMOUTH", ale tyto PSČ se nezobrazují v grafu porušení závislostí, protože neukazují na problémy s kvalitou dat. Například PSČ "02747-4302" je jedinečně spojené s "DARTMOUTH" a nezobrazuje se v grafu porušení závislostí. Potvrďte spuštěním následujícího kódu:

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

Shrnutí problémů s kvalitou dat zjištěných v SemPy

Graf porušení závislostí ukazuje několik problémů s kvalitou dat v tomto sémantickém modelu:

  • Některé názvy měst jsou velká písmena. Tento problém můžete vyřešit pomocí řetězcových metod.
  • Některé názvy měst mají kvalifikátory (nebo předpony), například "Sever" a "Východ". Například se PSČ "2128" mapuje jednou na "EAST BOSTON" a jednou na "BOSTON". K podobnému problému dochází mezi "NORTH DARTMOUTH" a "DARTMOUTH". Odstraňte tyto kvalifikátory nebo namapujte PSČ na město s nejběžnějším výskytem.
  • V některých názvech měst existují překlepy, například PITTSFIELD vs. PITTSFILED a NEWBURGPORT vs. NEWBURYPORT. V případě newBURGPORT opravte tento překlep pomocí nejběžnějšího výskytu. Pro "PITTSFIELD", který se vyskytuje pouze jednou, je automatické rozlišování nejednoznačnosti mnohem obtížnější bez externích znalostí nebo jazykového modelu.
  • Někdy jsou předpony jako "West" zkráceny na jedno písmeno "W". Nahraďte "W" za "West", pokud všechny výskyty "W" stojí pro "West".
  • PSČ "02130" se jednou mapuje na "BOSTON" a jednou na "Jamaica Plain". Tento problém se nedá snadno opravit. S větším množstvím dat mapujte na nejběžnější výskyt.

Vyčištění dat

  1. Opravte velká písmena změnou hodnot na velká písmena nadpisu.

    providers['CITY'] = providers.CITY.str.title()
    
  2. Znovu spusťte detekci porušení, abyste potvrdili, že existuje méně nejednoznačností.

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

Data upřesněte ručně nebo odstraňte řádky, které porušují funkční omezení mezi sloupci pomocí funkce SemPy drop_dependency_violations .

Pro každou hodnotu determinantní proměnné drop_dependency_violations vyberete nejběžnější hodnotu závislé proměnné a zahodí všechny řádky s jinými hodnotami. Tuto operaci použijte jenom v případě, že máte jistotu, že tato statistická heuristika vede ke správnému výsledku vašich dat. V opačném případě napište vlastní kód, který bude zpracovávat zjištěná porušení.

  1. drop_dependency_violations Spusťte funkci na ZIP sloupcích a CITY sloupcích.

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. Uveďte všechna porušení závislostí mezi ZIP a CITY.

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

Kód vrátí prázdný seznam, který označuje, že neexistují žádná další porušení funkčního omezení ZIP -> CITY.

Další kurzy pro sémantický odkaz nebo SemPy: