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ślać 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 relacje funkcjonalne mogą pomóc wykrywać problemy z jakością danych.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • 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 biblioteki 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.

Wymagania wstępne

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

  • Zaloguj się do usługi Microsoft Fabric.

  • Użyj przełącznika środowiska po lewej stronie głównej, aby przełączyć się na środowisko usługi Synapse Nauka o danych.

    Zrzut ekranu przedstawiający menu przełącznika środowiska pokazujące, gdzie wybrać Nauka o danych.

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

Postępuj zgodnie z instrukcjami w notesie

Notes data_cleaning_functional_dependencies_tutorial.ipynb towarzyszy temu samouczkowi.

Aby otworzyć towarzyszący notes na potrzeby tego samouczka, postępuj zgodnie z instrukcjami w temacie Przygotowywanie systemu do celów nauki o danych, aby zaimportować notes do obszaru roboczego.

Jeśli wolisz skopiować i wkleić kod z tej strony, możesz utworzyć nowy notes.

Przed rozpoczęciem uruchamiania kodu pamiętaj, aby dołączyć usługę Lakehouse do notesu .

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 sieci szkieletowej i nie ma potrzeby jej 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 zestawu danych Synthea syntetycznych dokumentacji medycznej (mała wersja dla uproszczenia):

    download_synthea(which='small')
    

Eksplorowanie danych

  1. Zainicjuj element FabricDataFrame z 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ą SemPy find_dependencies , 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 unikatowe:

  3. Upewnij się, że Id jest to unikatowe:

    providers.Id.is_unique
    

    Kod powraca True , aby potwierdzić, że Id jest unikatowy.

Analizowanie zależności funkcjonalnych w głębi systemu

Wykres zależności funkcjonalnych pokazuje również, że ORGANIZATION określa ADDRESS wartości i ZIP, zgodnie z oczekiwaniami. Można jednak spodziewać się ZIP również określenia CITY, ale strzałka przerywana wskazuje, że zależność jest przybliżona, wskazując na problem z jakością danych.

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

  1. Przyjrzyj się bliżej przybliżonej relacji między elementami ZIP i CITY, korzystając z funkcji SemPy list_dependency_violations , aby wyświetlić tabelaryczny wykaz naruszeń:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Rysuj graf za pomocą funkcji wizualizacji SemPy plot_dependency_violations . 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 pokazuje wartości po ZIP 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 wartość "DARTHMOUTH", dziewięć wierszy ma ZIP wartość 02747-1262; jeden wiersz ma wartość 02747-1242, a jeden wiersz ma ZIP ZIP wartość 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 to wielkie litery. 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 mapowy na "EAST BOSTON" raz i na "BOSTON". Podobny problem występuje między "NORTH DARTHMOUTH" i "DARTHMOUTH". Możesz spróbować usunąć te kwalifikatory lub mapować kody pocztowe do miasta z najczęstszym wystąpieniem.
  • W niektórych miastach istnieją literówki, takie jak "PITTSFIELD" a "PITTSFILED" i "NEWBURGPORT vs. "NEWBURYPORT". W przypadku "NEWBURGPORT" ten typ można naprawić przy użyciu najbardziej typowego wystąpienia. W przypadku "PITTSFIELD" posiadanie tylko jednego wystąpienia sprawia, że znacznie trudniej jest automatyczne uściślanie 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 "W" stoją na "Zachód".
  • Kod pocztowy "02130" mapuje na "BOSTON" raz i "Jamajka Plain" raz. Ten problem nie jest łatwy do rozwiązania, ale jeśli było więcej danych, mapowanie na najbardziej typowe wystąpienie może być potencjalnym rozwiązaniem.

Czyszczenie danych

  1. Rozwiąż problemy z wielkością liter, zmieniając wielkość liter na wielkość liter:

    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 SemPy drop_dependency_violations .

    Dla każdej wartości zmiennej drop_dependency_violations determinatora działa, wybierając najbardziej typową wartość zmiennej zależnej i upuszczają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. drop_dependency_violations Uruchom funkcję w kolumnach ZIP i :CITY

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Wyświetlanie listy wszelkich naruszeń zależności między elementami ZIP i CITY:

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

    Kod zwraca pustą listę, aby wskazać, że nie ma więcej naruszeń ograniczenia funkcjonalnego CITY -> ZIP.

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