Zelfstudie: Gegevens opschonen met functionele afhankelijkheden
In deze zelfstudie gebruikt u functionele afhankelijkheden voor het opschonen van gegevens. Er bestaat een functionele afhankelijkheid wanneer één kolom in een semantisch model (een Power BI-gegevensset) een functie van een andere kolom is. Een postcodekolom kan bijvoorbeeld de waarden in een plaatskolom bepalen. Een functionele afhankelijkheid manifesteert zich als een een-op-veel-relatie tussen de waarden in twee of meer kolommen binnen een DataFrame. In deze zelfstudie wordt de Synthea-gegevensset gebruikt om te laten zien hoe functionele relaties kunnen helpen bij het detecteren van problemen met de gegevenskwaliteit.
In deze zelfstudie leert u het volgende:
- Pas domeinkennis toe om hypothesen te formuleren over functionele afhankelijkheden in een semantisch model.
- Maak kennis met onderdelen van de Python-bibliotheek (SemPy) van semantische koppelingen die u helpen bij het automatiseren van gegevenskwaliteitsanalyse. Deze onderdelen zijn onder andere:
- FabricDataFrame- een pandas-achtige structuur die is uitgebreid met aanvullende semantische informatie.
- Nuttige functies die de evaluatie van hypothesen over functionele afhankelijkheden automatiseren en waarmee schendingen van relaties in uw semantische modellen worden geïdentificeerd.
Vereisten
Haal een Microsoft Fabric-abonnement op. Of meld u aan voor een gratis proefversie van Microsoft Fabric.
Meld u aan bij Microsoft Fabric.
Gebruik de ervaringswisselaar aan de linkerkant van de startpagina om over te schakelen naar de Synapse-Datawetenschap-ervaring.
- Selecteer Werkruimten in het linkernavigatiedeelvenster om uw werkruimte te zoeken en te selecteren. Deze werkruimte wordt uw huidige werkruimte.
Volgen in het notitieblok
De notebook data_cleaning_functional_dependencies_tutorial.ipynb begeleidt deze zelfstudie.
Als u het bijbehorende notitieblok voor deze zelfstudie wilt openen, volgt u de instructies in Uw systeem voorbereiden voor zelfstudies voor gegevenswetenschap om het notebook te importeren in uw werkruimte.
Als u liever de code van deze pagina kopieert en plakt, kunt u een nieuw notitieblok maken.
Zorg ervoor dat u een lakehouse aan het notebook koppelt voordat u begint met het uitvoeren van code.
Het notebook instellen
In deze sectie stelt u een notebookomgeving in met de benodigde modules en gegevens.
- Voor Spark 3.4 en hoger is Semantische koppeling beschikbaar in de standaardruntime wanneer u Fabric gebruikt en hoeft u deze niet te installeren. Als u Spark 3.3 of lager gebruikt of als u wilt bijwerken naar de meest recente versie van Semantic Link, kunt u de opdracht uitvoeren:
python %pip install -U semantic-link
Voer de benodigde importbewerkingen uit van modules die u later nodig hebt:
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
Haal de voorbeeldgegevens op. Voor deze zelfstudie gebruikt u de Synthea-gegevensset van synthetische medische records (kleine versie voor eenvoud):
download_synthea(which='small')
De gegevens verkennen
Initialiseer een
FabricDataFrame
met de inhoud van het providers.csv-bestand :providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
Controleer op problemen met gegevenskwaliteit met de functie van
find_dependencies
SemPy door een grafiek met automatisch gedetecteerde functionele afhankelijkheden te tekenen:deps = providers.find_dependencies() plot_dependency_metadata(deps)
De grafiek van functionele afhankelijkheden toont dat
Id
bepaaltNAME
enORGANIZATION
(aangegeven door de ononderbroken pijlen), wat wordt verwacht, omdatId
dit uniek is:Bevestig dat dit
Id
uniek is:providers.Id.is_unique
De code retourneert
True
om te bevestigen dat ditId
uniek is.
Functionele afhankelijkheden uitgebreid analyseren
In de grafiek met functionele afhankelijkheden ziet u ook dat ORGANIZATION
bepaalt ADDRESS
en ZIP
, zoals verwacht. U kunt echter ook verwachten ZIP
dat u dit kunt vaststellen CITY
, maar de stippellijn geeft aan dat de afhankelijkheid alleen bij benadering is, wat wijst naar een probleem met de gegevenskwaliteit.
Er zijn andere bijzonderheden in de grafiek. Bepaalt bijvoorbeeld NAME
niet GENDER
, Id
of SPECIALITY
ORGANIZATION
. Elk van deze eigenaardigheden kan het onderzoeken waard zijn.
Bekijk de geschatte relatie tussen
ZIP
enCITY
, met behulp van de functie vanlist_dependency_violations
SemPy om een lijst met schendingen in tabelvorm weer te geven:providers.list_dependency_violations('ZIP', 'CITY')
Teken een grafiek met de visualisatiefunctie van
plot_dependency_violations
SemPy. Deze grafiek is handig als het aantal schendingen klein is:providers.plot_dependency_violations('ZIP', 'CITY')
In de plot met afhankelijkheidsschendingen ziet u waarden voor
ZIP
aan de linkerkant en waarden voorCITY
aan de rechterkant. Een rand verbindt een postcode aan de linkerkant van de plot met een plaats aan de rechterkant als er een rij is die deze twee waarden bevat. De randen worden geannoteerd met het aantal van dergelijke rijen. Er zijn bijvoorbeeld twee rijen met postcode 02747-1242, één rij met plaats 'NORTH DARTHMOUTH' en de andere met plaats 'DARTHMOUTH', zoals wordt weergegeven in de vorige plot en de volgende code:Bevestig de vorige waarnemingen die u hebt gemaakt met de plot met afhankelijkheidsschendingen door de volgende code uit te voeren:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
In de plot ziet u ook dat tussen de rijen met
CITY
"DARTHMOUTH" negen rijen eenZIP
van 02747-1262 hebben; één rij eenZIP
van 02747-1242; en één rij eenZIP
van 02747-2537 heeft. Bevestigt deze waarnemingen met de volgende code:providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
Er zijn andere postcodes gekoppeld aan DARTMOUTH, maar deze postcodes worden niet weergegeven in de grafiek met afhankelijkheidsschendingen, omdat ze geen hint geven aan problemen met de kwaliteit van gegevens. De postcode 02747-4302 is bijvoorbeeld uniek gekoppeld aan DARTMOUTH en wordt niet weergegeven in de grafiek met afhankelijkheidsschendingen. Bevestig door de volgende code uit te voeren:
providers[providers.ZIP == '02747-4302'].CITY.value_counts()
Problemen met gegevenskwaliteit samenvatten die zijn gedetecteerd met SemPy
Als u teruggaat naar de grafiek met afhankelijkheidsschendingen, ziet u dat er verschillende interessante problemen zijn met de kwaliteit van gegevens in dit semantische model:
- Sommige plaatsnamen zijn hoofdletters. Dit probleem kan eenvoudig worden opgelost met behulp van tekenreeksmethoden.
- Sommige plaatsnamen hebben kwalificaties (of voorvoegsels), zoals 'Noord' en 'Oost'. De postcode '2128' wordt bijvoorbeeld één keer toegewezen aan 'EAST BOSTON' en 'BOSTON'. Er treedt een vergelijkbaar probleem op tussen 'NORTH DARTHMOUTH' en 'DARTHMOUTH'. U kunt proberen om deze kwalificaties te verwijderen of de postcodes toe te wijzen aan de stad met de meest voorkomende gebeurtenis.
- Er zijn typfouten in sommige steden, zoals "PITTSFIELD" versus "PITTSFILED" en "NEWBURGPORT vs. "NEWBURYPORT". Voor "NEWBURGPORT" kan deze typfout worden opgelost met behulp van de meest voorkomende gebeurtenis. Voor "PITTSFIELD" is het veel moeilijker om automatisch ondubbelzinnig te zijn zonder externe kennis of het gebruik van een taalmodel.
- Soms worden voorvoegsels zoals 'West' afgekort tot één letter 'W'. Dit probleem kan mogelijk worden opgelost met een eenvoudige vervanging, als alle exemplaren van 'W' staan voor 'West'.
- De postcode "02130" wordt eenmaal toegewezen aan "BOSTON" en "Jamaica Plain" één keer. Dit probleem is niet eenvoudig op te lossen, maar als er meer gegevens zijn, kan het toewijzen aan de meest voorkomende gebeurtenis een mogelijke oplossing zijn.
De gegevens opschonen
Los de hoofdlettergebruiksproblemen op door alle hoofdlettergebruik te wijzigen in titelcase:
providers['CITY'] = providers.CITY.str.title()
Voer de detectie van schendingen opnieuw uit om te zien dat sommige dubbelzinnigheden zijn verdwenen (het aantal schendingen is kleiner):
providers.list_dependency_violations('ZIP', 'CITY')
Op dit moment kunt u uw gegevens handmatig verfijnen, maar een mogelijke opschoontaak voor gegevens is het verwijderen van rijen die functionele beperkingen tussen kolommen in de gegevens schenden, met behulp van de functie van
drop_dependency_violations
SemPy.Voor elke waarde van de determinante variabele
drop_dependency_violations
werkt u door de meest voorkomende waarde van de afhankelijke variabele te kiezen en alle rijen met andere waarden neer te halen. U moet deze bewerking alleen toepassen als u er zeker van bent dat deze statistische heuristiek tot de juiste resultaten voor uw gegevens zou leiden. Anders moet u uw eigen code schrijven om de gedetecteerde schendingen zo nodig af te handelen.Voer de
drop_dependency_violations
functie uit op deZIP
enCITY
kolommen:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
Eventuele afhankelijkheidsschendingen tussen
ZIP
enCITY
:providers_clean.list_dependency_violations('ZIP', 'CITY')
De code retourneert een lege lijst om aan te geven dat er geen schendingen meer zijn van de functionele beperking CITY -> ZIP.
Gerelateerde inhoud
Bekijk andere zelfstudies voor semantische koppeling /SemPy:
- Zelfstudie: Functionele afhankelijkheden analyseren in een semantisch voorbeeldmodel
- Zelfstudie: Power BI-metingen extraheren en berekenen uit een Jupyter-notebook
- Zelfstudie: Relaties ontdekken in een semantisch model met behulp van een semantische koppeling
- Zelfstudie: Relaties ontdekken in de Synthea-gegevensset met behulp van een semantische koppeling
- Zelfstudie: Gegevens valideren met Behulp van SemPy en Grote Verwachtingen (GX)