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 postcode kolom kan bijvoorbeeld de waarden in een plaats kolom 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 gegevensset Synthea 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 van semantische koppelingen (SemPy) 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.
Voorwaarden
Een Microsoft Fabric-abonnementophalen. Of meld u aan voor een gratis microsoft Fabric-proefversie.
Meld u aan bij Microsoft Fabric-.
Gebruik de ervaringswisselaar aan de linkerkant van de startpagina om over te schakelen naar Fabric.
- Selecteer Werkruimten in het linkernavigatiedeelvenster om uw werkruimte te zoeken en te selecteren. Deze werkruimte wordt uw huidige werkruimte.
Volg mee 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 op zelfstudies voor gegevenswetenschap om het notebook in uw werkruimte te importeren.
Als u liever de code van deze pagina kopieert en plakt, kunt u een nieuw notitieblok maken.
Zorg ervoor dat een lakehouse aan het notebook koppelen 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
find_dependencies
-functie van SemPy door een grafiek met automatisch gedetecteerde functionele afhankelijkheden te tekenen:deps = providers.find_dependencies() plot_dependency_metadata(deps)
In de grafiek met functionele afhankelijkheden ziet u dat
Id
bepaaltNAME
enORGANIZATION
(aangegeven door de effen pijlen), wat wordt verwacht, omdatId
uniek is:Controleer of
Id
is uniek:providers.Id.is_unique
De code retourneert
True
om te bevestigen datId
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 verwachten dat ZIP
ook CITY
bepaalt, 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.
NAME
bepaalt bijvoorbeeld niet GENDER
, Id
, SPECIALITY
of ORGANIZATION
. Elk van deze eigenaardigheden kan het onderzoeken waard zijn.
Bekijk de benaderingsrelatie tussen
ZIP
enCITY
, met behulp van de functielist_dependency_violations
van SemPy om een lijst met schendingen in tabelvorm weer te geven:providers.list_dependency_violations('ZIP', 'CITY')
Teken een grafiek met de
plot_dependency_violations
visualisatiefunctie van 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 eerdere waarnemingen die u hebt gedaan met de plot van schendingen van afhankelijkheden door de volgende code uit te voeren.
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
In de plot ziet u ook dat, onder de rijen die een
CITY
van "DARTHMOUTH" hebben, negen rijen eenZIP
van 02747-1262 hebben; één rij heeft eenZIP
van 02747-1242; en één rij heeft eenZIP
van 02747-2537. 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 volledig in hoofdletters geschreven. Dit probleem kan eenvoudig worden opgelost met behulp van tekenreeksmethoden.
- Sommige plaatsnamen hebben kwalificaties (of voorvoegsels), zoals 'Noord' en 'Oost'. De postcode '2128' komt bijvoorbeeld één keer overeen met 'EAST BOSTON' en één keer met '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. Omdat "PITTSFIELD" elk maar één keer voorkomt, is het veel moeilijker om automatische desambiguatie te doen 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 voorkomens van 'W' staan voor 'West'.
- De postcode "02130" komt eenmaal overeen met "BOSTON" en eenmaal met "Jamaica Plain". 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 taak voor het opschonen van gegevens is het verwijderen van rijen die functionele beperkingen tussen kolommen in de gegevens schenden, met behulp van de
drop_dependency_violations
functie van SemPy.Voor elke waarde van de determinante variabele werkt
drop_dependency_violations
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 functie
drop_dependency_violations
uit op de kolommenZIP
enCITY
:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
Vermeld 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-.
Verwante inhoud
Bekijk andere tutorials voor semantische koppeling met 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 semantische koppeling
- Zelfstudie: Relaties ontdekken in de Synthea--gegevensset met behulp van semantische koppeling
- Zelfstudie: Gegevens valideren met behulp van SemPy en Great Expectations (GX)