Tutoriel : Nettoyer les données avec des dépendances fonctionnelles
Dans ce tutoriel, vous allez utiliser des dépendances fonctionnelles pour le nettoyage des données. Il existe une dépendance fonctionnelle quand une colonne d’un modèle sémantique (un jeu de données Power BI) est une fonction d’une autre colonne. Par exemple, une colonne code postal peut déterminer les valeurs d’une colonne ville. Une dépendance fonctionnelle se manifeste sous la forme d’une relation un-à-plusieurs entre les valeurs d’au moins deux colonnes dans un DataFrame. Ce tutoriel utilise le jeu de données Synthea pour montrer comment les relations fonctionnelles peuvent permettre de détecter les problèmes de qualité des données.
Dans ce tutoriel, vous allez apprendre à :
- Appliquer les connaissances du domaine pour formuler des hypothèses sur les dépendances fonctionnelles dans un modèle sémantique.
- Familiarisez-vous avec les composants de la bibliothèque Python du lien sémantique (SemPy) qui aident à automatiser l'analyse de la qualité des données. Ces composants sont les suivants :
- FabricDataFrame : structure de type pandas améliorée avec des informations sémantiques supplémentaires.
- Fonctions utiles qui automatisent l’évaluation des hypothèses sur les dépendances fonctionnelles et identifient les violations des relations dans vos modèles sémantiques.
Prérequis
Obtenir un abonnement Microsoft Fabric. Ou, inscrivez-vous pour un essai gratuit de Microsoft Fabric.
Connectez-vous à Microsoft Fabric.
Utilisez le sélecteur d’expérience sur le côté gauche de votre page d’accueil pour passer à l’expérience science des données Synapse.
- Sélectionnez Espaces de travail dans le volet de navigation gauche pour rechercher et sélectionner votre espace de travail. Cet espace de travail devient votre espace de travail actuel.
Suivre le notebook
Le notebook data_cleaning_functional_dependencies_tutorial.ipynb accompagne ce tutoriel.
Pour ouvrir le notebook accompagnant ce tutoriel, suivez les instructions fournies dans Préparer votre système pour le tutoriel sur la science des données afin d’importer les notebooks dans votre espace de travail.
Si vous préférez copier et coller le code de cette page, vous pouvez créer un nouveau notebook.
Assurez-vous d’attacher un lakehouse au notebook avant de commencer à exécuter du code.
Configurer le notebook
Dans cette section, vous configurez un environnement de notebook avec les modules et les données nécessaires.
- Pour Spark 3.4 et versions ultérieures, le lien sémantique est disponible dans le runtime par défaut lors de l’utilisation de Fabric et il n’est pas nécessaire de l’installer. Si vous utilisez Spark 3.3 ou version inférieure, ou si vous souhaitez effectuer une mise à jour vers la version la plus récente du lien sémantique, vous pouvez exécuter la commande :
python %pip install -U semantic-link
Effectuez les importations nécessaires des modules dont vous aurez besoin plus tard :
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
Extrayez les exemples de données. Pour ce tutoriel, vous allez utiliser le jeu de données Synthea de dossiers médicaux synthétiques (version réduite pour plus de simplicité) :
download_synthea(which='small')
Exploration des données
Initialisez
FabricDataFrame
avec le contenu du fichier providers.csv :providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
Recherchez les problèmes de qualité des données avec la fonction
find_dependencies
de SemPy en traçant un graphe des dépendances fonctionnelles détectées automatiquement :deps = providers.find_dependencies() plot_dependency_metadata(deps)
Le graphe des dépendances fonctionnelles montre que
Id
détermineNAME
etORGANIZATION
(indiqués par les flèches pleines), ce qui est attendu, carId
est unique :Vérifiez que
Id
est unique :providers.Id.is_unique
Le code retourne
True
pour confirmer queId
est unique.
Analyser en profondeur les dépendances fonctionnelles
Le graphe des dépendances fonctionnelles montre également que ORGANIZATION
détermine ADDRESS
et ZIP
, comme prévu. Toutefois, vous pouvez vous attendre à ce que ZIP
détermine également CITY
, mais la flèche en pointillés indique que la dépendance est seulement approximative. Elle pointe vers un problème de qualité des données.
Il existe d’autres particularités dans le graphe. Par exemple NAME
ne détermine pas GENDER
, Id
, SPECIALITY
ou ORGANIZATION
. Chacune de ces particularités peut mériter d’être investiguée.
Examinez plus en détail la relation approximative entre
ZIP
etCITY
en utilisant la fonctionlist_dependency_violations
de SemPy pour voir une liste tabulaire des violations :providers.list_dependency_violations('ZIP', 'CITY')
Dessinez un graphe avec la fonction de visualisation
plot_dependency_violations
de SemPy. Ce graphe est utile si le nombre de violations est faible :providers.plot_dependency_violations('ZIP', 'CITY')
Le tracé des violations de dépendances montre les valeurs de
ZIP
à gauche et les valeurs deCITY
à droite. Un bord connecte un code postal sur le côté gauche du tracé à une ville du côté droit, s’il existe une ligne qui contient ces deux valeurs. Les bords sont annotés avec le nombre de ces lignes. Par exemple, il existe deux lignes avec le code postal 02747-1242, une ligne avec la ville « NORTH DARTHMOUTH » et une autre avec la ville « DARTHMOUTH », comme le montre le tracé précédent et le code suivant :Vérifiez les observations que vous avez faites avec le tracé des violations de dépendances en exécutant le code suivant :
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
Le tracé montre également que parmi les lignes pour lesquelles
CITY
a la valeur « DARTHMOUTH », neuf lignes ont unZIP
ayant la valeur 02747-1262, une ligne a unZIP
ayant la valeur 02747-1242, et une ligne a unZIP
ayant la valeur 02747-2537. Vérifiez ces observations avec le code suivant :providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
Il existe d’autres codes postaux associés à « DARTMOUTH », mais ils ne s’affichent pas dans le graphe des violations de dépendances, car ils n’indiquent pas de problèmes de qualité des données. Par exemple, le code postal « 02747-4302 » est associé de manière unique à « DARTMOUTH » et n’apparaît pas dans le graphe des violations de dépendances. Vérifiez cette observation en exécutant le code suivant :
providers[providers.ZIP == '02747-4302'].CITY.value_counts()
Récapituler les problèmes de qualité des données détectés avec SemPy
Si vous revenez au graphe des violations de dépendances, vous pouvez voir qu’il existe plusieurs problèmes intéressants de qualité des données dans ce modèle sémantique :
- Certains noms de villes sont en capitales. Ce problème est facile à résoudre à l’aide de méthodes de chaîne.
- Certains noms de villes ont des qualificateurs (ou préfixes), par exemple « North » et « East ». Par exemple, le code postal « 2128 » est mappé une seule fois à « EAST BOSTON » et à « BOSTON ». Un problème similaire se produit entre « NORTH DARTHMOUTH » et « DARTHMOUTH ». Vous pouvez essayer de supprimer ces qualificateurs ou de mapper les codes postaux à la ville dont l’occurrence est la plus courante.
- Il existe des fautes de frappe dans certaines villes. C’est le cas par exemple pour « PITTSFIELD » qui ne s’écrit pas « PITTSFILED » ainsi que pour « NEWBURGPORT » qui doit s’écrire « NEWBURYPORT ». Pour « NEWBURGPORT », la faute de frappe peut être corrigée à l’aide de l’occurrence la plus courante. Pour « PITTSFIELD », il n’existe qu’une seule occurrence, ce qui rend beaucoup plus difficile la levée automatique de l’ambiguïté sans connaissance externe ou sans le recours à un modèle de langage.
- Parfois, les préfixes tels que « West » sont abrégés en une seule lettre « W ». Ce problème peut être résolu à l’aide d’un simple remplacement, si toutes les occurrences de « W » signifient « West ».
- Le code postal « 02130 » est mappé une seule fois à « BOSTON » et une seule fois à « Jamaica Plain ». Ce problème n’est pas facile à résoudre, mais s’il existait davantage de données, le mappage à l’occurrence la plus courante pourrait être une solution potentielle.
Nettoyer les données
Corrigez les problèmes de mise en majuscules en adoptant le format où la première lettre des mots est en majuscule :
providers['CITY'] = providers.CITY.str.title()
Réexécutez la détection de violations pour vérifier que certaines des ambiguïtés ont disparu (le nombre de violations est plus faible) :
providers.list_dependency_violations('ZIP', 'CITY')
À ce stade, vous pouvez affiner vos données de manière plus manuelle. Toutefois, il existe une tâche potentielle de nettoyage des données. Elle consiste à supprimer les lignes qui ne respectent pas les contraintes fonctionnelles entre les colonnes des données, à l’aide de la fonction
drop_dependency_violations
de SemPy.Pour chaque valeur de la variable déterminante,
drop_dependency_violations
fonctionne en choisissant la valeur la plus courante de la variable dépendante, et en supprimant toutes les lignes ayant d’autres valeurs. Vous devez appliquer cette opération uniquement si vous êtes sûr que cette heuristique statistique conduit aux résultats appropriés pour vos données. Sinon, vous devez écrire votre propre code pour gérer les violations détectées selon les besoins.Exécutez la fonction
drop_dependency_violations
sur les colonnesZIP
etCITY
:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
Listez les violations de dépendances entre
ZIP
etCITY
:providers_clean.list_dependency_violations('ZIP', 'CITY')
Le code retourne une liste vide pour indiquer qu’il n’existe plus de violations de la contrainte fonctionnelle CITY -> ZIP.
Contenu associé
Découvrez d’autres tutoriels pour le lien sémantique / SemPy :
- Tutoriel : Analyser les dépendances fonctionnelles dans un modèle sémantique d’échantillon
- Tutoriel : Extraire et calculer des mesures Power BI à partir d’un notebook Jupyter
- Tutoriel : Découvrir des relations dans le modèle sémantique, à l’aide du lien sémantique
- Tutoriel : Découvrir les relations dans le jeu de données Synthea, à l’aide du lien sémantique
- Tutoriel : Valider des données à l’aide de SemPy et Great Expectations (GX)