Udostępnij za pośrednictwem


Samouczek: czyszczenie danych przy użyciu zależności funkcjonalnych

W tym samouczku użyjesz zależności funkcjonalnych do czyszczenia danych. Zależność funkcjonalna istnieje, gdy jedna kolumna w modelu semantycznym (zestaw danych usługi Power BI) jest funkcją innej kolumny. Na przykład kolumna kodu pocztowego może określić wartości w kolumnie miasta. Zależność funkcjonalna manifestuje się jako relacja jeden do wielu między wartościami w co najmniej dwóch kolumnach w ramce danych. W tym samouczku użyto zestawu danych Synthea, aby pokazać, jak funkcjonalne relacje mogą pomóc wykrywać problemy z jakością danych.

Z tego samouczka dowiesz się, jak wykonywać następujące działania:

  • Zastosuj wiedzę na temat domeny, aby sformułować hipotezy dotyczące zależności funkcjonalnych w modelu semantycznym.
  • Zapoznaj się ze składnikami biblioteki języka Python linku semantycznego (SemPy), które pomagają zautomatyzować analizę jakości danych. Te składniki obejmują:
    • FabricDataFrame — struktura podobna do pandas rozszerzona o dodatkowe informacje semantyczne.
    • Przydatne funkcje automatyzujące ocenę hipotez dotyczących zależności funkcjonalnych i identyfikujące naruszenia relacji w modelach semantycznych.

Warunki wstępne

  • Pobierz subskrypcję usługi Microsoft Fabric . Możesz też utworzyć bezpłatne konto wersji próbnej usługi Microsoft Fabric.

  • Zaloguj się do usługi Microsoft Fabric.

  • Użyj przełącznika środowiska w lewej dolnej części strony głównej, aby przełączyć się na Fabric.

    Zrzut ekranu przedstawiający menu przełącznika doświadczeń, pokazujące, gdzie wybrać opcję Nauka o danych.

  • Wybierz pozycję Obszary robocze w okienku nawigacji po lewej stronie, aby znaleźć i wybrać obszar roboczy. Ten obszar roboczy staje się aktualnym obszarem roboczym.

Podążaj za treścią w notesie

W ramach tego samouczka towarzyszy notes data_cleaning_functional_dependencies_tutorial.ipynb.

Konfigurowanie notesu

W tej sekcji skonfigurujesz środowisko notesu z niezbędnymi modułami i danymi.

  1. W przypadku platformy Spark w wersji 3.4 lub nowszej link semantyczny jest dostępny w domyślnym środowisku uruchomieniowym podczas korzystania z Fabric i nie ma potrzeby jego instalowania. Jeśli używasz platformy Spark 3.3 lub nowszej lub chcesz zaktualizować do najnowszej wersji narzędzia Semantic Link, możesz uruchomić polecenie:

python %pip install -U semantic-link  

  1. Wykonaj niezbędne importy modułów, które będą potrzebne później:

    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. Ściąganie przykładowych danych. Na potrzeby tego samouczka użyjesz syntetycznego zestawu danych medycznych Synthea (, mała wersja dla uproszczenia):

    download_synthea(which='small')
    

Eksplorowanie danych

  1. Zainicjuj FabricDataFrame za pomocą zawartości pliku providers.csv.

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Sprawdź, czy występują problemy z jakością danych z funkcją find_dependencies SemPy, wykreślijąc wykres automatycznie wykrywanych zależności funkcjonalnych:

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Zrzut ekranu przedstawiający wykres zależności funkcjonalnych.

    Wykres zależności funkcjonalnych pokazuje, że Id określa NAME i ORGANIZATION (wskazywane przez stałe strzałki), które są oczekiwane, ponieważ Id jest unikatowa:

  3. Upewnij się, że Id jest unikatowa:

    providers.Id.is_unique
    

    Kod zwraca True, aby potwierdzić, że Id jest unikatowa.

Analizowanie zależności funkcjonalnych wnikliwie

Wykres zależności funkcjonalnych pokazuje również, że ORGANIZATION określa ADDRESS i ZIP, zgodnie z oczekiwaniami. Można jednak oczekiwać, że ZIP może również określić CITY, ale strzałka kreskowana wskazuje, że zależność jest jedynie przybliżona, co wskazuje na problem z jakością danych.

Na wykresie istnieją inne osobliwości. Na przykład NAME nie określa GENDER, Id, SPECIALITYlub ORGANIZATION. Każda z tych osobliwości może być warta zbadania.

  1. Przyjrzyj się bliżej przybliżonej relacji między ZIP i CITYprzy użyciu funkcji list_dependency_violations SemPy, aby wyświetlić tabelaryczny wykaz naruszeń:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Rysuj graf za pomocą funkcji wizualizacji plot_dependency_violations SemPy. Ten wykres jest przydatny, jeśli liczba naruszeń jest mała:

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

    Zrzut ekranu przedstawiający wykres naruszeń zależności.

    Wykres naruszeń zależności przedstawia wartości dla ZIP po lewej stronie i wartości dla CITY po prawej stronie. Krawędź łączy kod pocztowy po lewej stronie wykresu z miastem po prawej stronie, jeśli istnieje wiersz zawierający te dwie wartości. Krawędzie są oznaczone adnotacjami z liczbą takich wierszy. Na przykład istnieją dwa wiersze z kodem pocztowym 02747-1242, jeden wiersz z miastem "NORTH DARTHMOUTH", a drugi z miastem "DARTHMOUTH", jak pokazano na poprzednim wykresie i następującym kodzie:

  3. Potwierdź poprzednie obserwacje dokonane przy użyciu wykresu naruszeń zależności, uruchamiając następujący kod:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. Wykres pokazuje również, że wśród wierszy, które mają CITY jako "DARTHMOUTH", dziewięć wierszy ma ZIP 02747-1262; jeden wiersz ma ZIP 02747-1242; a jeden wiersz ma ZIP 02747-2537. Potwierdza te obserwacje przy użyciu następującego kodu:

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Istnieją inne kody pocztowe skojarzone z "DARTMOUTH", ale te kody pocztowe nie są wyświetlane na wykresie naruszeń zależności, ponieważ nie wskazują na problemy z jakością danych. Na przykład kod pocztowy "02747-4302" jest jednoznacznie skojarzony z "DARTMOUTH" i nie jest wyświetlany na wykresie naruszeń zależności. Potwierdź, uruchamiając następujący kod:

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

Podsumowywanie problemów z jakością danych wykrytych za pomocą rozwiązania SemPy

Wracając do wykresu naruszeń zależności, widać, że w tym modelu semantycznym występuje kilka interesujących problemów z jakością danych:

  • Niektóre nazwy miast są pisane wielkimi literami. Ten problem jest łatwy do rozwiązania przy użyciu metod ciągów.
  • Niektóre nazwy miast mają kwalifikatory (lub prefiksy), takie jak "Północ" i "Wschód". Na przykład kod pocztowy "2128" jest odwzorowany raz jako "EAST BOSTON" i raz jako "BOSTON". Podobny problem występuje między "NORTH DARTHMOUTH" i "DARTHMOUTH". Możesz spróbować usunąć te kwalifikatory lub przyporządkować kody pocztowe miastu, w którym występują najczęściej.
  • W niektórych miastach istnieją literówki, takie jak „PITTSFIELD” a „PITTSFILED” oraz „NEWBURGPORT” a „NEWBURYPORT”. W przypadku "NEWBURGPORT" tę literówkę można poprawić, używając najczęściej używanej wersji. W przypadku "PITTSFIELD" posiadanie tylko jednego wystąpienia sprawia, że znacznie trudniej jest dokonać automatycznego rozróżniania bez wiedzy zewnętrznej lub użycia modelu językowego.
  • Czasami prefiksy takie jak "Zachód" są skracane do pojedynczej litery "W". Ten problem może być potencjalnie rozwiązany za pomocą prostego zastąpienia, jeśli wszystkie wystąpienia litery "W" oznaczają "Zachód".
  • Kod pocztowy "02130" odnosi się raz do "BOSTON" i raz do "Jamaica Plain." Ten problem nie jest łatwy do rozwiązania, ale gdyby było więcej danych, mapowanie na najbardziej typowe wystąpienie mogłoby być potencjalnym rozwiązaniem.

Czyszczenie danych

  1. Rozwiąż problemy z wielkością liter, zmieniając wszystkie litery na format tytułowy.

    providers['CITY'] = providers.CITY.str.title()
    
  2. Uruchom ponownie wykrywanie naruszeń, aby zobaczyć, że niektóre niejednoznaczności znikną (liczba naruszeń jest mniejsza):

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

    W tym momencie można bardziej ręcznie udoskonalić dane, ale jednym z potencjalnych zadań oczyszczania danych jest usunięcie wierszy naruszających ograniczenia funkcjonalne między kolumnami w danych przy użyciu funkcji drop_dependency_violations SemPy.

    Dla każdej wartości zmiennej decydującej drop_dependency_violations działa, wybierając najbardziej typową wartość zmiennej zależnej i usuwając wszystkie wiersze z innymi wartościami. Należy zastosować tę operację tylko wtedy, gdy masz pewność, że ta statystyczna heurystyka doprowadzi do poprawnych wyników dla danych. W przeciwnym razie należy napisać własny kod, aby obsłużyć wykryte naruszenia zgodnie z potrzebami.

  3. Uruchom funkcję drop_dependency_violations w kolumnach ZIP i CITY:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Wyświetl wszystkie naruszenia zależności między ZIP a CITY:

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

    Kod zwraca pustą listę wskazującą, że nie ma więcej naruszeń ograniczenia funkcjonalnego CITY —> ZIP.

Zapoznaj się z innymi samouczkami dotyczącymi linku semantycznego /SemPy: