Master · Data & Business Intelligence · 4 jeux de données
Les jeux de données du parcours,
fournis, documentés et téléchargeables.
Quatre jeux synthétiques, 132 010 lignes et 27,5 Mo au total. Chacun existe en deux versions : une version propre, sur laquelle les résultats de référence sont calculés, et une version brute portant 1 624 lignes d’anomalies posées exprès, chacune comptée et accompagnée de sa règle de nettoyage.
Aucune donnée personnelle réelle : les noms viennent de listes de syllabes, les adresses n’existent pas, les montants ne concernent personne. Chaque générateur est reproductible à la graine — relancé avec la même graine, il réécrit les fichiers à l’identique ; relancé avec une autre, il produit un jeu d’entraînement de même forme et de chiffres différents. Et chaque jeu refuse de s’écrire si son invariant est rompu : c’est ce qui rend les corrigés possibles.
Les résultats de référence sont lus dans les fichiers livrés à chaque génération, jamais recopiés à la main — et ils sont recalculés une seconde fois en SQL sur la base SQLite, par un chemin de calcul indépendant. Les deux doivent tomber d’accord, sinon rien n’est publié.
ventes — Ventes et rentabilite d une entreprise de commerce
Le jeu commun des six cursus : les memes chiffres servent a construire un modele en etoile dans Power BI, a ecrire les memes mesures en DAX, en LookML, en champs calcules Tableau et en pandas — et a verifier qu on obtient le meme resultat. Les montants s additionnent, les totaux se reconcilient : c est le jeu ou tout se comporte bien.
| table | une ligne représente | clé | lignes | poids |
|---|---|---|---|---|
ventes | une ligne par ligne de vente (un produit, un client, une date) | vente_id | 20 000 | 1,6 Mo |
12 colonne(s) de | ||||
produits | une ligne par reference | produit_id | 72 | 4 ko |
6 colonne(s) de | ||||
clients | une ligne par client | client_id | 1 111 | 63 ko |
6 colonne(s) de | ||||
magasins | une ligne par point de vente | magasin_id | 7 | 0 ko |
5 colonne(s) de | ||||
calendrier | une ligne par jour, sans trou | date | 1 096 | 43 ko |
8 colonne(s) de | ||||
| code | table | lignes | anomalie | règle de nettoyage |
|---|---|---|---|---|
A01 | ventes | 50 | lignes dupliquees a l identique, vente_id compris | dedoublonner sur vente_id ; un identifiant est unique par definition |
A02 | ventes | 66 | quantite vide | une cellule vide n est pas un zero : decider explicitement — exclure la ligne, ou imputer, et le dire |
A03 | ventes | 80 | dates ecrites en JJ/MM/AAAA ou MM/JJ/AAAA au lieu de AAAA-MM-JJ | normaliser en ISO ; attention au 03/04 qui se lit dans les deux sens |
A04 | ventes | 66 | montants ecrits « 1 234,56 EUR » | retirer l unite, remplacer la virgule par un point, convertir en nombre |
A05 | ventes | 40 | produit_id absent du referentiel produits | une jointure interne les perdrait en silence : les compter AVANT de joindre |
A06 | clients | 92 | segment avec casse et espaces variables | couper les espaces et harmoniser la casse AVANT de grouper, sinon trois segments apparaissent la ou il n y en a qu un |
A07 | ventes | 25 | prix unitaire negatif (avoir saisi comme une vente) | decider : exclure, ou traiter comme un retour — et le documenter |
A08 | produits | 3 | produit_id present deux fois avec des prix differents | une jointure dupliquerait les ventes : choisir la ligne qui fait foi avant de joindre |
CSV — version propre (séparateur ;, UTF-8) : calendrier clients magasins produits ventes
CSV — version brut (séparateur ;, UTF-8) : calendrier clients magasins produits ventes
Fiches : dictionnaire.json anomalies.json resultats-reference.json ventes.sqlite
Reproductible : python outils/donnees/ventes.py --graine 20261007 réécrit ces fichiers à l’identique. Une autre graine donne un jeu d’entraînement de même forme et de chiffres différents.
saas — Abonnements SaaS : revenu recurrent, expansion, contraction, resiliation
Le jeu ou la grandeur centrale NE S ADDITIONNE PAS. Le revenu recurrent mensuel existe a un instant ; sommer ses trente-six valeurs donne un nombre qui ne veut rien dire — et qui vaut, au centime, le total facture sur trois ans. Deux grandeurs legitimes, deux questions differentes, le meme nombre.
| table | une ligne représente | clé | lignes | poids |
|---|---|---|---|---|
offres | une ligne par offre du catalogue | offre_id | 4 | 0 ko |
5 colonne(s) de | ||||
clients | une ligne par entreprise cliente | client_id | 600 | 30 ko |
6 colonne(s) de | ||||
abonnements | une ligne par periode d abonnement d un client ; un changement d offre ferme la periode precedente et en ouvre une nouvelle | abonnement_id | 829 | 38 ko |
8 colonne(s) de | ||||
factures | une ligne par mois et par abonnement actif, emise le 1er du mois | facture_id | 9 234 | 619 ko |
9 colonne(s) de | ||||
usage_mensuel | une ligne par mois et par abonnement actif | abonnement_id + annee_mois | 9 234 | 300 ko |
7 colonne(s) de | ||||
calendrier | une ligne par jour de la periode, sans trou | date | 1 096 | 43 ko |
8 colonne(s) de | ||||
| code | table | lignes | anomalie | règle de nettoyage |
|---|---|---|---|---|
A01 | abonnements | 40 | lignes dupliquees a l identique, abonnement_id compris | dedoublonner sur abonnement_id ; un identifiant est unique par definition |
A02 | abonnements | 18 | date_fin anterieure a date_debut | une periode negative n existe pas : ecarter la ligne ou retablir l ordre des deux dates |
A03 | abonnements | 25 | periodes qui se chevauchent pour un meme client : son revenu est compte deux fois | un seul abonnement actif par client et par jour ; recouper les periodes et trancher |
A04 | abonnements | 30 | montant_mensuel exprime en centimes au lieu d euros | comparer a prix_mensuel de l offre : un facteur 100 se voit, un contrôle de type non |
A05 | clients | 22 | segment vide | une cellule vide n est pas une categorie : decider explicitement — exclure, ou creer « non renseigne », et le dire |
A06 | abonnements | 35 | date_debut ecrite en JJ/MM/AAAA au lieu de AAAA-MM-JJ | normaliser en ISO ; attention au 03/04 qui se lit dans les deux sens |
A07 | factures | 20 | client_id absent du referentiel des clients | jointure externe puis comptage : une facture orpheline ne se rattache a aucun revenu |
A08 | factures | 28 | montant_ttc egal au hors taxes : la TVA manque | recalculer : ttc = ht + tva, au centime — et ne jamais faire confiance a une colonne calculee livree |
A09 | factures | 12 | montant_ht negatif | un avoir se declare comme tel : soit une colonne de type, soit une table a part |
A10 | factures | 15 | facture_id en double avec deux montants differents : le total depend de la ligne gardee | dedoublonner sur facture_id, et dire laquelle est retenue — la premiere, la derniere, ou la plus elevee |
A11 | usage_mensuel | 26 | places_utilisees superieures aux places payees | impossible par construction : la mesure est fausse, ou la ligne appartient a un autre abonnement |
A12 | abonnements | 14 | offre_id absente du referentiel des offres | jointure externe : un abonnement sans offre n a pas de prix de liste, donc pas d ecart mesurable |
CSV — version propre (séparateur ;, UTF-8) : abonnements calendrier clients factures offres usage_mensuel
CSV — version brut (séparateur ;, UTF-8) : abonnements calendrier clients factures offres usage_mensuel
Fiches : dictionnaire.json anomalies.json resultats-reference.json saas.sqlite
Reproductible : python outils/donnees/saas.py --graine 20261010 réécrit ces fichiers à l’identique. Une autre graine donne un jeu d’entraînement de même forme et de chiffres différents.
rh — Ressources humaines : effectif, remuneration, absences, departs
Le jeu qui porte un PARADOXE DE SIMPSON. L ecart de salaire entre femmes et hommes est large sur l ensemble de l entreprise, et presque nul a poste comparable, parce que la repartition par famille de metiers n est pas la meme. Les deux chiffres sont justes, et celui qu on publie change la conclusion.
| table | une ligne représente | clé | lignes | poids |
|---|---|---|---|---|
postes | une ligne par poste : une famille de metiers et un niveau | poste_id | 30 | 2 ko |
6 colonne(s) de | ||||
etablissements | une ligne par etablissement | etablissement_id | 5 | 0 ko |
4 colonne(s) de | ||||
salaries | une ligne par salarie | salarie_id | 520 | 37 ko |
12 colonne(s) de | ||||
remunerations | une ligne par mois de presence et par salarie | salarie_id + annee_mois | 11 720 | 404 ko |
5 colonne(s) de | ||||
absences | une ligne par absence | absence_id | 979 | 48 ko |
6 colonne(s) de | ||||
calendrier | une ligne par jour de la periode, sans trou | date | 1 096 | 43 ko |
8 colonne(s) de | ||||
| code | table | lignes | anomalie | règle de nettoyage |
|---|---|---|---|---|
A01 | salaries | 26 | lignes dupliquees a l identique, salarie_id compris | dedoublonner sur salarie_id ; un identifiant est unique par definition |
A02 | salaries | 16 | date_sortie anterieure a date_entree | une periode negative n existe pas : ecarter la ligne ou retablir l ordre des deux dates |
A03 | salaries | 34 | sexe code de plusieurs facons : f, Femme, FEMME, h, Homme, M | normaliser sur un vocabulaire ferme AVANT tout regroupement ; sinon un meme groupe se compte en six categories |
A04 | salaries | 22 | temps_travail ecrit en pourcentage (80,00) au lieu d une proportion (0,80) | un taux depasse rarement 1 : tout ce qui est au-dessus est un pourcentage deguise |
A05 | remunerations | 30 | salaire_brut_mensuel exprime en centimes au lieu d euros | comparer au salaire de base du poste : un facteur 100 se voit, un contrôle de type non |
A06 | remunerations | 21 | lignes de paie posterieures a la date de sortie du salarie | rapprocher chaque paie de la periode de presence : la masse salariale et l effectif sont tous deux faux, sans qu aucune ligne soit invalide prise seule |
A07 | salaries | 18 | poste_id absent du referentiel des postes | jointure externe : un salarie sans poste n a pas de salaire de base, donc aucun ecart mesurable |
A08 | absences | 14 | absence_id en double avec deux durees differentes : le total depend de la ligne gardee | dedoublonner sur absence_id, et dire laquelle est retenue |
A09 | absences | 20 | jours_ouvres a zero sur une absence datee | zero jour ouvre est possible pour un week-end seul : verifier les dates avant de conclure a une erreur — et ne jamais diviser par la somme sans l avoir regardee |
A10 | absences | 18 | absence situee hors de la periode de presence du salarie | encadrer par les deux dates du salarie : un taux d absenteisme calcule sans cet encadrement depasse 100 % pour certains |
A11 | salaries | 12 | date_naissance donnant un age a l entree inferieur a 16 ans ou superieur a 70 | borner avant de publier une pyramide des ages : une seule valeur a 101 ans deplace la moyenne et ecrase l echelle du graphique |
A12 | salaries | 16 | etablissement_id vide | une cellule vide n est pas un etablissement : decider explicitement — exclure, ou creer « non affecte », et le dire |
CSV — version propre (séparateur ;, UTF-8) : absences calendrier etablissements postes remunerations salaries
CSV — version brut (séparateur ;, UTF-8) : absences calendrier etablissements postes remunerations salaries
Fiches : dictionnaire.json anomalies.json resultats-reference.json rh.sqlite
Reproductible : python outils/donnees/rh.py --graine 20261010 réécrit ces fichiers à l’identique. Une autre graine donne un jeu d’entraînement de même forme et de chiffres différents.
logistique — Logistique : commandes, expeditions, delais, stock
Le jeu ou le DENOMINATEUR se discute. Le taux de service se calcule sur les expeditions livrees, sur les commandes livrees ou sur les commandes passees : trois taux defendables, et plus de dix points d ecart. Et les delais ont une QUEUE LONGUE, ou la moyenne est tres au-dessus de la mediane.
| table | une ligne représente | clé | lignes | poids |
|---|---|---|---|---|
entrepots | une ligne par entrepot | entrepot_id | 4 | 0 ko |
5 colonne(s) de | ||||
transporteurs | une ligne par transporteur | transporteur_id | 4 | 0 ko |
4 colonne(s) de | ||||
articles | une ligne par reference | article_id | 84 | 4 ko |
7 colonne(s) de | ||||
commandes | une ligne par commande | commande_id | 12 000 | 693 ko |
8 colonne(s) de | ||||
lignes_commande | une ligne par article commande ; une commande en a de une a six | ligne_id | 25 588 | 1 004 ko |
6 colonne(s) de | ||||
expeditions | une ligne par expedition ; une commande peut partir en PLUSIEURS expeditions, ce qui fait que joindre les deux tables multiplie les montants de commande | expedition_id | 11 997 | 585 ko |
7 colonne(s) de | ||||
mouvements_stock | une ligne par mouvement de stock | mouvement_id | 23 970 | 1,5 Mo |
7 colonne(s) de | ||||
calendrier | une ligne par jour de la periode, sans trou | date | 730 | 34 ko |
8 colonne(s) de | ||||
| code | table | lignes | anomalie | règle de nettoyage |
|---|---|---|---|---|
A01 | lignes_commande | 90 | lignes dupliquees a l identique, ligne_id compris | dedoublonner sur ligne_id ; un identifiant est unique par definition |
A02 | expeditions | 60 | date_livraison anterieure a date_expedition | un delai negatif n existe pas : ecarter la ligne, et ne JAMAIS la laisser entrer dans une moyenne de delai |
A03 | expeditions | 70 | poids exprime en grammes au lieu de kilogrammes | recouper avec la somme des poids des articles commandes : un facteur 1 000 se voit, un contrôle de type non |
A04 | commandes | 80 | statut ecrit de plusieurs facons : Livree, LIVREE, delivered, livrée | normaliser sur un vocabulaire ferme AVANT tout regroupement ; sinon un meme statut se compte en cinq categories et le taux de service est faux |
A05 | lignes_commande | 81 | commandes sans aucune ligne : 40 commandes orphelines | jointure externe puis comptage : une commande sans ligne a un montant de zero, et elle ecrase le panier moyen |
A06 | lignes_commande | 55 | quantite a zero | une ligne de commande a zero n existe pas : decider explicitement — ecarter, ou la traiter comme une annulation de ligne, et le dire |
A07 | expeditions | 45 | transporteur_id absent du referentiel | jointure externe : sans transporteur, pas de delai contractuel, donc aucun taux de service calculable sur ces lignes |
A08 | commandes | 50 | date_promesse anterieure a date_commande | une promesse dans le passe rend la commande en retard des sa creation : le taux de service tombe sans qu aucune livraison ait change |
A09 | expeditions | 35 | expedition_id en double avec deux dates differentes : le delai depend de la ligne gardee | dedoublonner sur expedition_id, et dire laquelle est retenue |
A10 | mouvements_stock | 30 | ajustement d inventaire negatif rendant le solde cumule negatif | cumuler dans l ordre chronologique et s arreter au premier solde negatif : un stock negatif n est pas une rupture, c est une erreur de saisie |
A11 | lignes_commande | 48 | prix_unitaire vide | une cellule vide n est pas un zero : recuperer le prix de l article, ou ecarter la ligne et le dire |
A12 | expeditions | 26 | date_livraison posterieure a la fin de la periode annoncee par le jeu | borner par la periode : une date hors bornes passe tous les contrôles de type et casse l echelle de tout graphique temporel |
CSV — version propre (séparateur ;, UTF-8) : articles calendrier commandes entrepots expeditions lignes_commande mouvements_stock transporteurs
CSV — version brut (séparateur ;, UTF-8) : articles calendrier commandes entrepots expeditions lignes_commande mouvements_stock transporteurs
Fiches : dictionnaire.json anomalies.json resultats-reference.json logistique.sqlite
Reproductible : python outils/donnees/logistique.py --graine 20261010 réécrit ces fichiers à l’identique. Une autre graine donne un jeu d’entraînement de même forme et de chiffres différents.