Schéma de données: un trou dans la raquette?

Bonjour à tous et à toutes,

Il y a un an, je vous avais soumis une proposition de méthodologie concernant les relations entre champs dans les jeux de données tabulaires sujet 3876.
Depuis cette date, une expérimentation a été mise en place (méthodologie, outil, indicateurs) sur le jeu de données IRVE (voir ici la réutilisation IRVE).
Je vous propose ci-dessous une synthèse rapide de ces travaux (permet de faire le lien avec le rapport de la mission data et territoire).

Bonne lecture ! :slightly_smiling_face:

Un peu de méthodologie

Un outil nécessaire

Un « schéma de données » est une description d’un jeu de données tabulaires.
Il est composé d’une partie générale concernant le jeu de données dans sa globalité et d’une partie spécifique détaillant chacun des champs du jeu de données (ex. description, exemple, type de données, contraintes).
Cette description est indispensable car elle permet de comprendre ce que contient chacun des champs du jeu de données.

mais non suffisant

Pourtant cette approche n’est pas suffisante car elle ne prend pas en compte ce qui fait la richesse d’un jeu de données tabulaires.
Pour cela, revenons sur les usages d’un jeu de données tabulaires:

On peut distinguer deux usages principaux dans les données tabulaires:

  • Un usage de « caractérisation » qui consiste à préciser des propriétés intrinsèques d’une entité. Par exemple, dans un jeu de données concernant des personnes on pourra trouver les champs ‹ nom ›, ‹ prénom ›, ‹ age ›, ‹ taille › qui précisent ce qu’est une personne suivant le point de vue de ce jeu de données
  • Un usage de « relations » qui consiste à préciser les relations d’une entité par rapport aux autres entités. Par exemple, pour ce même jeu de données concernant des personnes, on pourra trouver des champs ‹ père ›, ‹ mère ›, ‹ ville ›, ‹ pays ›, ‹ entreprise ›. Le champ ‹ ville › exprimera par exemple le fait que la personne habite la ville indiquée.

Dans les jeux de données, les deux usages sont présents et doivent être explicités pour que les données soient comprises et cohérentes.

Dans l’exemple précédent (qui n’est clairement pas satisfaisant d’un point de vue RGPD !), on pourrait préciser que la donnée du champ ‹ pays › est celle qui correspond au pays de la donnée du champ ‹ ville ›.
Ceci permet de détecter une erreur si on trouve un enregistrement (une ligne) avec ‹ ville › : « paris » et ‹ pays › : « france » et un autre avec ‹ ville › : « paris » et ‹ pays › : « suisse ».

qui doit être complété par un modèle de données

Il existe un outil qui permet de prendre en compte ces différents usages : le « modèle de données ».
Celui-ci explicite à la fois les entités présentes, leurs attributs (caractérisation) et les liens avec les autres entités (les relations).

Si l’on reprend l’exemple, on aura alors une entité ‹ personne › avec plusieurs attributs (‹ nom ›, ‹ prénom ›, ‹ age ›, ‹ taille ›), une entité ‹ ville › avec un seul attribut (son nom), une entité ‹ pays › avec un seul attribut (son nom).

On aura également une relation ‹ habite › entre l’entité ‹ personne › et l’entité ‹ ville › ainsi qu’une relation ‹ appartient › entre l’entité ‹ ville › et l’entité ‹ pays ›.

La relation ‹ appartient › est caractérisée par le fait qu’une entité ‹ ville › n’est liée qu’à une seule entité ‹ pays › et que réciproquement une entité ‹ pays › est liée à plusieurs entités ‹ ville ›.

Quelle application pour l’open-data ?

les jeux de données sont complexes

Les données partagées en open-data ont plusieurs caractéristiques:

  • les jeux de données sont majoritairement tabulaires et correspondent à un regroupement de données selon des critères spécifiques (temporel, spatial…),
  • les données peuvent être issues de sources multiples avec des producteurs différents,
  • les données ont pour vocation d’être réutilisées pour des applications et des usages non définis au préalable.

Les jeux de données sont donc souvent complexes aussi bien dans leur structure que dans leur mode de production et doivent être d’une grande cohérence pour qu’ils puissent être exploitable et utilisables par les « réutilisateurs ».

mais la méthodologie est adaptée

Pour garantir cette nécessaire cohérence une méthodologie adaptée doit être mise en oeuvre.
Le guide « data.gouv » est très clair sur ce point et rappelle dans son chapitre bien documenter un jeu de données les principes à respecter:

La bonne documentation d’un jeu de données recouvre, entre autres :

  • une description générale du jeu de données
  • une description du mode de production des données
  • une description du modèle de données
  • une description du schéma de données
  • une description des métadonnées
  • une description des changements majeurs

Le récent rapport de la mission data et territoires fournit dans son chapitre 3 « Permettre le passage à l’échelle » plusieurs recommandations allant dans le sens d’une méthodologie renforcée :

  • Recommandation n°8 : créer une Fabrique des standards, dédiée à l’industrialisation de la standardisation, de leur création à leur appropriation,
  • Recommandation n°9 : créer une obligation d’alimentation des référentiels nationaux notamment par le biais de la réglementation, de la commande publique ou par le conditionnement d’aides et de subventions publiques.
  • Recommandation n°10 : accompagner la mise en œuvre de nouvelles dispositions réglementaires par leur traduction en standards et schémas de données.

Anatomie d’un exemple

Le cas des IRVE

L’exemple des IRVE (Infrastructure de Recharge des Véhicules Electriques) est intéressant à plusieurs titres :

  • le jeux de données est complexe (50 champs, 50 000 lignes),
  • le mode de production des données est également complexe (nombreux producteurs, couplage à des dispositions règlementaires),
  • il est pris en référence dans le rapport de la mission data et territoires

Il existe déjà des exemples réussis d’alimentation de référentiels nationaux dans le domaine de la santé (base nationale des défibrillateurs automatisés externes) ou de la mobilité (infrastructures de recharge de véhicules électriques). […]dans le second cas, le levier financier (conditionnement de la subvention publique de l’ADEME à l’alimentation du référentiel IRVE) a été utilisé.

Le jeu de données

La documentation du jeu de données « IRVE statique » est structurée et accessible, elle porte aussi bien sur les données que sur le processus de production (voir page spécifique transport.data.gouv).

Le jeu de données mis à disposition est consolidé quotidiennement à partir de fichiers unitaires fournis par des « producteurs ».

La structure des données est définie par un schéma de données précisant le contenu individuel de chacun des champs (mais il est assez difficle à partir de ce schéma de comprendre la structure des données).

Le mode de production consiste à vérifier si les fichiers de données proposés sont conformes au schéma de données. En cas de conformité, les données sont intégrées au jeu de données consolidé et publié le lendemain.

Mesure de la cohérence

Le premier niveau de cohérence est de s’assurer que les données respectent le schéma de données.

Le second niveau de cohérence est de s’assurer que les données respectent le modèle de données (règles d’intégrité). Cependant, malgré sa complexité, le jeu de données ne fait l’objet d’aucun modèle de données formel partagé. Pour évaluer la cohérence des données, la première étape a donc été de reconstruire a posteriori le modèle de données à partir du schéma de données, des données présentes et des informations partagées.

Celui-ci se compose de 5 entités obligatoires (et une facultative):

  • PdC (point de recharge): Il correspond à la borne physique sur laquelle on se branche. Le PdC est identifié (clef primaire) par le champ ‹ id_pdc_itinerance › et comporte 11 champs obligatoires (puissance, prise, paiement, accessibilité) et 6 facultatifs. Un PdC correspond à une ligne du fichier IRVE
  • Station: Elle regroupe plusieurs PdC et correspond à une gestion électrique commune de ces PdC. Elle est identifiée par le champ 'id_station_itinerance’et comporte 7 champs obligatoires (typologie, horaires, véhicules) et 4 facultatifs
  • Opérateur: C’est l’exploitant de la station, il est identifié par un champ ‹ contact_operateur › qui est le seul champ obligatoire
  • Enseigne: Structure qui héberge la station, elle est identifiée par un champ unique ‹ nom_enseigne ›
  • Localisation: Elle est identifiée par un champ ‹ coordonnesXY › (longitude + latitude) et comporte un champ obligatoire (adresse) et un autre champ facultatif.

Les relations identifiées sur ce modèle de données permettent de définir les principales règles de cohérence du jeu de données:

  1. Un pdc est unique et associé à une ligne du jeu de données
  2. Un pdc est intégré dans une et une seule station
  3. Une station est opérée par un et un seul opérateur
  4. Une station est hébergée par une et une seule enseigne
  5. Une station a une et une seule localisation
  6. Une station a un et un seul « nom_station »
  7. Une station a une et une seule « implantation_station »
  8. Une station a un et un seul « nbre_pdc »
  9. Une station a un et un seule « condition_accès »
  10. Une station a un et un seul « horaires »
  11. Une station a un et un seul « station_deux_roues »
  12. Une localisation correspond à une et une seule « adresse_station »

Les données sont-elles cohérentes ?

L’examen des données montre que les règles de cohérence liées au schéma de données sont toutes respectées (de par leur prise en compte dans l’outil de validation).

Par contre, ce n’est pas le cas des règles « implicites » liées au modèle de données qui ne sont contrôlées ni à la validation initiale des données, ni au niveau des données consolidées.

La mesure de cohérence effectuée sur les données du 31-10-2023 donne les résultats suivants :

nombre d’enregistrements sans erreurs : 48819
nombre d’enregistrements avec au moins une erreur : 8820
taux d’erreur : 15 %

  1. index - id_pdc_itinerance : 3298
  2. contact_operateur - id_station_itinerance : 619
  3. nom_enseigne - id_station_itinerance : 886
  4. coordonneesXY - id_station_itinerance : 1426
  5. id_station_itinerance - id_pdc_itinerance : 2320
  6. nom_station - id_station_itinerance : 913
  7. implantation_station - id_station_itinerance : 399
  8. nbre_pdc - id_station_itinerance : 2523
  9. condition_acces - id_station_itinerance : 26
  10. horaires - id_station_itinerance : 36
  11. station_deux_roues - id_station_itinerance : 40
  12. adresse_station - coordonneesXY : 2678

Ce taux d’erreur de 15 % rend les données difficilement exploitables (cf échanges sur le fil de discussion du jeu de données).

La première cause d’incohérence est liée à la présence de « doublons » (règle n° 1) eux-même liés au processus d’actualisation et de mise à jour des données (les actions menées cet été ont permis de réduire le nombre de doublons mais pas de les éliminer).

Si l’on enlève ces doublons, les résultats sont les suivants:

nombre d’enregistrements sans erreurs : 50530
nombre d’enregistrements avec au moins une erreur : 4996
taux d’erreur : 9 %

  1. index - id_pdc_itinerance : 0
  2. contact_operateur - id_station_itinerance : 2
  3. nom_enseigne - id_station_itinerance : 261
  4. coordonneesXY - id_station_itinerance : 439
  5. id_station_itinerance - id_pdc_itinerance : 0
  6. nom_station - id_station_itinerance : 336
  7. implantation_station - id_station_itinerance : 120
  8. nbre_pdc - id_station_itinerance : 2203
  9. condition_acces - id_station_itinerance : 0
  10. horaires - id_station_itinerance : 20
  11. station_deux_roues - id_station_itinerance : 0
  12. adresse_station - coordonneesXY : 2203

Le taux d’erreur baisse significativement mais reste néanmoins à un niveau élevé (9 %). Le traitement des erreurs résiduelles n’est pas explicité ici mais les principales causes sont identifiées et des corrections pourraient être apportées (le taux d’erreur pourrait alors redescendre à moins de 3 %).

La « réutilisation en lien » accessible sur « data.gouv » fournit le modèle de données, les indicateurs de cohérence, leur évolution au fil des mises à jour et le détail des incohérences identifiées.

Cette mesure d’intégrité ainsi que les principaux problèmes constatés sont partagés avec l’équipe transport pour en déduire des actions correctives.

Conclusion

Même s’il est difficile d’extrapoler à partir d’un exemple unique, voici le retour d’expérience que je tire des travaux réalisés sur le jeu de données IRVE:

La première conclusion est d’ordre méthodologique.

  • La description d’un jeu de données sous la forme d’un modèle de données est nécessaire pour exprimer la structure de données. Elle permet aussi bien aux « producteurs » qu’aux « consommateurs » de comprendre les données et la façon de les documenter.
  • Les règles de cohérence entre champs (issues du modèle de données) peuvent être ajoutées au schéma de données (cf proposition effectuée auprès de FrictionLess - Issue TableSchema) qui intègre dans ce cas l’ensemble des contrôles à réaliser.
  • Une note méthodologique précisant le passage du modèle de données au schéma de données permettrait également de rendre le processus plus robuste.

La deuxième conclusion est d’ordre technique.

  • Après plusieurs mois de suivi des données IRVE, force est de constater qu’il est très difficile de corriger des données publiées. Pour garantir un niveau de cohérence satisfaisant des données, il est donc impératif d’intégrer l’ensemble des contrôles de cohérence et d’intégrité en amont (dès l’intégration des données) et dès l’initialisation du jeu de données.
  • Pour cela, les outils de contrôle d’intégrité (validés sur l’expérience IRVE) doivent être mis à disposition au sein des outils de validation.

Il est à noter également que la mise en oeuvre de processus « subvention contre données » tels qu’indiqués dans le rapport de la mission data et territoires renforcent ces points.

2 « J'aime »

Bonjour @thomyphi, merci de cette très intéressante analyse et proposition d’évolution de gestion des standards. Tu fais bien de noter les principes du Modèle Conceptuel de Données. Dans notre cas, nous intéressions à sa traduction physique, que tu connais aussi sous le terme de Modèle Physique des Données, qui se déduit lui-même de l’étape intermédiaire qui est le Modèle Logique des Données, tous bien connus des administrateurs de base de données : MCD > MLD > MPD
Les schémas ont été pensés au départ (il y a 6 ans) pour permettre les contrôles de fichiers et comme base essentielle à l’outil Validata. Il s’agissait donc de vérifier la cohérence d’une table, via les outils de TableSchema. C’est bien le contrôle du modèle physique de données dont il est question.
Si l’on devrait se rapprocher d’un modèle logique, quelles seraient les implications dans la formalisation des schémas et dans le traitement de tels modèles par Validata ? je ne pense pas que TableSchéma sache traiter des MCD… Je rappelle aussi que les données open data ne sont généralement pas des données brutes de production mais des exports à des fin de publication en open data (et de réutilisations externes à l’application source). Les données de production sont gérées par des process et des logiciels-métier qui doivent assurer la cohérence logique des données. C’est à ce niveau amont que la formalisation du modèle conceptuel et logique doivent être assurées. Mais pour garder l’esprit de ta proposition, il serait peut-être possible de rajouter dans les schémas (MPD) des attributs logiques entre les champs. On a essayé de le faire -il me semble- dans le couple Schéma/Validata. Dans l’exemple que tu donnes sur les IRVE, cela donnerait quoi exactement ? Le contrôle des doublons est déjà fait implicitement par Validata dans le cas des clés primaires (identifiant), les erreurs résiduelles qui font passer de 9% à 3% ne sont pas décrites dans ton post, est-ce qu’un schéma plus détaillé aurait permis une meilleure qualité ? et si oui, tu pourrais nous faire des propositions ? Cordialement.

2 « J'aime »

Bonjour,

Merci de ce retour !

Voici les réponses aux questions posées :

Passage du MCD au MPD pour les fichiers tabulaires

Effectivement, c’est un point fondamental qui doit faire l’objet d’une méthodologie claire.
J’avais abordé ce sujet il y a quelques temps pour obtenir cette formalisation. Elle est accessible sur ce lien et je suis très intéressé pour avoir des remarques et commentaires.

Intégration dans les schéma de données

L’objectif est bien de pouvoir vérifier que le jeu de données respecte le modèle de données et il est en effet justifié de n’avoir qu’une seule entrée exprimant les contraintes à prendre en compte et les règles à respecter. C’est pour cela que la sortie de la méthodologie proposée consiste en une prise en compte du MPD dans le schéma de données.

Formalisme pour les schéma de données

Pour les données data.gouv, le formalisme utilisé pour les schéma de données est celui de TableSchema et malheureusement, il ne contient pas de propriété permettant d’exprimer une contrainte entre deux champs. C’est pour cela qu’une proposition d’évolution de TableSchema a été demandée (issue 803) il y a un an (celle-ci n’a pas encore été examinée…).

Cela donnerait quoi dans l’exemple IRVE ?

L’outil que j’utilise pour sortir les indicateurs est sur ce lien. On y trouve notamment :

  • le modèle de données (le format mermaid permet une visaualisation simple)
  • la formalisation pour le schéma de données (ajout d’une propriété « relationship » dans la description du champ)
  • l’outil utilisé pour effectuer le contrôle. C’est une ligne de code :
    Cdataset(data).check_relationship(fields)
    qui prend en entrée un DataFrame (data) et la liste des relations à contrôler (fields) et retourne pour chaque relation la liste des ‹ lignes › en erreur.

Intégration dans Validata

Je ne connais pas Validata, est-ce que l’implémentation proposée ci-dessus suffirait ?

Contrôle des doublons

Cela parait simple puisqu’il y a une ligne par point de recharge (PdC) et que chaque point de recharge dispose d’une clef (champ ‹ id_pdc_itinerance ›). Par contre au niveau du processus ça semble complexe puisqu’au final on n’arrive pas à les éliminer.

Erreurs résiduelles

Effectivement, elles ne sont pas décrites dans le post et font l’objet d’un mail que je partage avec l’équipe transport (je te le fais suivre dès que j’ai une adresse mail).

Comment améliorer la qualité ?

Voici mes idées (en restant sur des choses simples à mettre en oeuvre) :

  • communiquer sur le fait qu’un jeu de données n’est pas juste un assemblage de colonnes bien documentées mais est une représentation d’un système composé d’objets en interaction (ce qu’essaie de traduire le modèle de données)
  • avoir un modèle de données partagé (les ‹ producteurs › pourraient ainsi mieux comprendre les règles à respecter et les ‹ réutilisateurs › sauraient mieux trouver l’information qu’ils cherchent)
  • intégrer les règles d’intégrité du modèle dans le schéma de données (permet de réaliser ensuite les contrôles)
  • intégrer dans Validata le contrôle des règles exprimées
  • intégrer un contrôle également en fin de chaîne (après intégration de toutes les sources de données)
  • indiquer les erreurs résiduelles (par un champ particulier ou bien dans des fichiers séparés)
  • fournir des indicateurs sur le niveau qualité des données (est-ce que les indicateurs que je diffuse sur les IRVE sont satisfaisants ?)
  • réfléchir à la prise en compte de règles inter-champs qui soient spécifiques. Par exemple on pourrait vérifier sur ces données IRVE que la coordonnée latitude/longitude est compatible avec l’adresse (basiquement on pourrait vérifier que la latitude et la longitude sont bien incluses dans la ‹ boîte englobante › du département.
1 « J'aime »