Partager via


Tutoriel : Nettoyer les données avec des dépendances fonctionnelles

Dans ce tutoriel, vous utilisez des dépendances fonctionnelles pour le nettoyage des données. Une dépendance fonctionnelle existe lorsqu’une colonne d’un modèle sémantique (un jeu de données Power BI) est une fonction d’une autre colonne. Par exemple, un code postal colonne peut déterminer les valeurs d’une colonne ville. Une dépendance fonctionnelle se manifeste en tant que relation un-à-plusieurs entre les valeurs de deux colonnes ou plus dans un DataFrame. Ce tutoriel utilise le jeu de données Synthea pour montrer comment les relations fonctionnelles peuvent aider à détecter les problèmes de qualité des données.

Dans ce tutoriel, vous allez apprendre à :

  • Appliquez des connaissances de 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 permettent d’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 qui identifient les violations des relations dans vos modèles sémantiques.

Conditions préalables

  • Obtenir un abonnement Microsoft Fabric. Vous pouvez également vous inscrire à une version d’évaluation gratuite de Microsoft Fabric .

  • Connectez-vous à Microsoft Fabric.

  • Utilisez le sélecteur d’expérience en bas à gauche de votre page d’accueil pour basculer vers Fabric.

    Capture d’écran du menu sélecteur d’expérience, montrant où sélectionner Data Science.

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

Configurer le notebook

Dans cette section, vous configurez un environnement de notebook avec les modules et données nécessaires.

  1. 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 ci-dessous, 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  

  1. Effectuez les importations nécessaires de modules dont vous aurez besoin ultérieurement :

    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. Extrayez les exemples de données. Pour ce tutoriel, vous utilisez le jeu de données Synthea de dossiers médicaux synthétiques (petite version pour plus de simplicité) :

    download_synthea(which='small')
    

Exploration des données

  1. Initialisez un FabricDataFrame avec le contenu du fichier providers.csv :

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Recherchez les problèmes de qualité des données avec la fonction find_dependencies semPy en tracéant un graphique des dépendances fonctionnelles détectées automatiquement :

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    capture d’écran montrant le graphique des dépendances fonctionnelles.

    Le graphique des dépendances fonctionnelles montre que Id détermine NAME et ORGANIZATION (indiqués par les flèches solides), ce qui est attendu, étant donné que Id est unique :

  3. Vérifiez que Id est unique :

    providers.Id.is_unique
    

    Le code retourne True pour confirmer que Id est unique.

Analyser les dépendances fonctionnelles en profondeur

Le graphique 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 n’est que approximative, pointant vers un problème de qualité des données.

Il existe d’autres particularités dans le graphique. Par exemple, NAME ne détermine pas GENDER, Id, SPECIALITYou ORGANIZATION. Chacune de ces particularités pourrait mériter une enquête.

  1. Examinez plus en détail la relation approximative entre ZIP et CITY, à l’aide de la fonction list_dependency_violations semPy pour afficher une liste tabulaire de violations :

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. Dessinez un graphique avec la fonction de visualisation plot_dependency_violations de SemPy. Ce graphique est utile si le nombre de violations est petit :

    providers.plot_dependency_violations('ZIP', 'CITY')
    

    Capture d’écran montrant le tracé des violations de dépendances.

    Le tracé des violations de dépendances affiche les valeurs de ZIP sur le côté gauche et les valeurs de CITY sur le côté droit. Un bord connecte un code postal sur le côté gauche du tracé avec une ville sur le côté droit s’il existe une ligne qui contient ces deux valeurs. Les arêtes sont annotées avec le nombre de lignes de ce type. Par exemple, il existe deux lignes avec le code postal 02747-1242, une ligne avec la ville « NORTH DARTHMOUTH » et l’autre avec la ville « DARTHMOUTH », comme illustré dans le tracé précédent et le code suivant :

  3. Vérifiez les observations précédentes que vous avez faites avec le tracé des violations de dépendance en exécutant le code suivant :

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. Le tracé montre également que parmi les lignes qui ont CITY comme « DARTHMOUTH », neuf lignes ont une ZIP de 02747-1262 ; une ligne a une ZIP de 02747-1242 ; et une ligne a une ZIP de 02747-2537. Confirme ces observations avec le code suivant :

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. Il existe d’autres codes postaux associés à « DARTMOUTH », mais ces codes postal ne sont pas affichés dans le graphique des violations de dépendances, car ils n’indiquent pas les problèmes de qualité des données. Par exemple, le code postal « 02747-4302 » est associé de manière unique à « DARTMOUTH » et ne s’affiche pas dans le graphique des violations de dépendances. Confirmez en exécutant le code suivant :

    providers[providers.ZIP == '02747-4302'].CITY.value_counts()
    

Résumer les problèmes de qualité des données détectés avec SemPy

Revenez au graphique des violations de dépendances, vous pouvez voir qu’il existe plusieurs problèmes de qualité des données intéressants présents dans ce modèle sémantique :

  • Certains noms de ville sont tous en majuscules. Ce problème est facile à résoudre à l’aide de méthodes de chaîne.
  • Certains noms de ville ont des qualificateurs (ou préfixes), tels que « Nord » et « Est ». Par exemple, le code postal « 2128 » correspond une fois à « EAST BOSTON » et une fois à « BOSTON ». Un problème similaire se produit entre « NORTH DARTHMOUTH » et « DARTHMOUTH ». Vous pouvez essayer de supprimer ces qualificateurs ou de relier les codes postaux à la ville la plus courante.
  • Il existe des fautes de frappe dans certaines villes, telles que « PITTSFIELD » et « PITTSFILED » et « NEWBURGPORT vs. NEWBURYPORT ». Pour « NEWBURGPORT », cette 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 comme « Ouest » sont abrégés en une seule lettre « W ». Ce problème peut éventuellement être résolu avec un remplacement simple, si toutes les occurrences de « W » sont associées à « West ».
  • Le code postal « 02130 » est mappé à « BOSTON » une fois et « Jamaïque Plain » une fois. Ce problème n’est pas facile à résoudre, mais s’il y avait plus de données, le mappage à l’occurrence la plus courante pourrait être une solution potentielle.

Nettoyer les données

  1. 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()
    
  2. Réexécutez la détection des violations pour voir que certaines ambiguïtés sont passées (le nombre de violations est plus petit) :

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

    À ce stade, vous pouvez affiner vos données plus manuellement, mais une tâche potentielle de nettoyage des données consiste à supprimer des lignes qui violent 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 sélectionnant la valeur la plus courante de la variable dépendante et en supprimant toutes les lignes avec d’autres valeurs. Vous devez appliquer cette opération uniquement si vous êtes certain que cette heuristique statistique entraînerait les résultats corrects pour vos données. Sinon, vous devez écrire votre propre code pour gérer les violations détectées si nécessaire.

  3. Exécutez la fonction drop_dependency_violations sur les colonnes ZIP et CITY :

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. Répertoriez les violations de dépendance entre ZIP et CITY:

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

    Le code retourne une liste vide pour indiquer qu’il n’y a plus de violations de la contrainte fonctionnelle CITY -> ZIP.

Consultez d’autres didacticiels pour le lien sémantique / SemPy :