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.
- 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.
- 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
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
Ś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
Zainicjuj element
FabricDataFrame
z zawartością pliku providers.csv :providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
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)
Wykres zależności funkcjonalnych pokazuje, że
Id
określaNAME
iORGANIZATION
(wskazywane przez stałe strzałki), które są oczekiwane, ponieważId
jest unikatowe:Upewnij się, że
Id
jest to unikatowe:providers.Id.is_unique
Kod powraca
True
, aby potwierdzić, żeId
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 GENDER
wartości NAME
, Id
, SPECIALITY
lub ORGANIZATION
. Każda z tych osobliwości może być warta zbadania.
Przyjrzyj się bliżej przybliżonej relacji między elementami
ZIP
iCITY
, korzystając z funkcji SemPylist_dependency_violations
, aby wyświetlić tabelaryczny wykaz naruszeń:providers.list_dependency_violations('ZIP', 'CITY')
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')
Wykres naruszeń zależności pokazuje wartości po
ZIP
lewej stronie i wartości dlaCITY
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: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()
Wykres pokazuje również, że wśród wierszy, które mają
CITY
wartość "DARTHMOUTH", dziewięć wierszy maZIP
wartość 02747-1262; jeden wiersz ma wartość 02747-1242, a jeden wiersz maZIP
ZIP
wartość 02747-2537. Potwierdza te obserwacje przy użyciu następującego kodu:providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
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
Rozwiąż problemy z wielkością liter, zmieniając wielkość liter na wielkość liter:
providers['CITY'] = providers.CITY.str.title()
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.drop_dependency_violations
Uruchom funkcję w kolumnachZIP
i :CITY
providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
Wyświetlanie listy wszelkich naruszeń zależności między elementami
ZIP
iCITY
:providers_clean.list_dependency_violations('ZIP', 'CITY')
Kod zwraca pustą listę, aby wskazać, że nie ma więcej naruszeń ograniczenia funkcjonalnego CITY -> ZIP.
Powiązana zawartość
Zapoznaj się z innymi samouczkami dotyczącymi linku semantycznego /SemPy:
- Samouczek: analizowanie zależności funkcjonalnych w przykładowym modelu semantycznym
- Samouczek: wyodrębnianie i obliczanie miar usługi Power BI z notesu Jupyter
- Samouczek: odnajdywanie relacji w modelu semantycznym przy użyciu linku semantycznego
- Samouczek: odnajdywanie relacji w zestawie danych Synthea przy użyciu linku semantycznego
- Samouczek: weryfikowanie danych przy użyciu bibliotekI SemPy i wielkich oczekiwań (GX)