Aller au contenu
APEX

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.

Chiffre d’affaires total : 24 381 090,09 €  ·  Marge totale : 5 018 562,06 €  ·  Unités vendues : 55 047  ·  Clients ayant acheté : 1 111
Les 5 tables de la version propre, leur grain, leur clé, et le poids mesuré sur le disque — total 3,4 Mo de CSV, plus 3,3 Mo de base SQLite.
tableune ligne représenteclélignespoids
ventesune ligne par ligne de vente (un produit, un client, une date)vente_id20 0001,6 Mo
12 colonne(s) de ventes
  • vente_id — identifiant de la ligne de vente — texte, unique
  • date — date de la vente — AAAA-MM-JJ, cle vers calendrier.date
  • produit_id — cle vers produits.produit_id
  • client_id — cle vers clients.client_id
  • magasin_id — cle vers magasins.magasin_id
  • canal — magasin | en ligne | telephone
  • quantite — nombre d unites vendues — entier strictement positif
  • prix_unitaire — prix catalogue applique, en euros
  • remise_taux — remise consentie, de 0 a 0,45 — proportion, pas pourcentage
  • prix_unitaire_net — prix_unitaire x (1 - remise_taux), arrondi au centime
  • chiffre_affaires — prix_unitaire_net x quantite, en euros
  • cout_total — cout_unitaire du produit x quantite, en euros
produitsune ligne par referenceproduit_id724 ko
6 colonne(s) de produits
  • produit_id — identifiant de la reference
  • libelle — nom commercial
  • famille — famille de produits — dimension d analyse principale
  • prix_catalogue — prix de vente conseille, en euros
  • cout_unitaire — cout d achat unitaire, en euros
  • date_lancement — date de mise au catalogue
clientsune ligne par clientclient_id1 11163 ko
6 colonne(s) de clients
  • client_id — identifiant du client
  • nom — nom de famille — invente
  • prenom — prenom — invente
  • segment — Particulier | Professionnel | Collectivite
  • region — region de rattachement
  • date_inscription — date de creation du compte client
magasinsune ligne par point de ventemagasin_id70 ko
5 colonne(s) de magasins
  • magasin_id — identifiant du magasin
  • libelle — nom du point de vente
  • region — region administrative
  • type — magasin | en ligne
  • surface_m2 — surface en metres carres — VIDE pour la boutique en ligne
calendrierune ligne par jour, sans troudate1 09643 ko
8 colonne(s) de calendrier
  • date — jour — AAAA-MM-JJ
  • annee — annee sur quatre chiffres
  • trimestre — T1 a T4
  • mois_numero — 1 a 12
  • mois_nom — nom du mois en francais, sans accent
  • annee_mois — AAAA-MM, pour trier les mois dans l ordre
  • jour_semaine — 1 (lundi) a 7 (dimanche)
  • est_week_end — 1 pour samedi et dimanche, 0 sinon
Les 8 anomalies de la version brute, 422 lignes au total. Chacune est posée, comptée et écrite : un exercice de nettoyage où l’élève corrigerait un défaut que l’auteur n’avait pas vu n’aurait pas de corrigé possible.
codetablelignesanomalierègle de nettoyage
A01ventes50lignes dupliquees a l identique, vente_id comprisdedoublonner sur vente_id ; un identifiant est unique par definition
A02ventes66quantite videune cellule vide n est pas un zero : decider explicitement — exclure la ligne, ou imputer, et le dire
A03ventes80dates ecrites en JJ/MM/AAAA ou MM/JJ/AAAA au lieu de AAAA-MM-JJnormaliser en ISO ; attention au 03/04 qui se lit dans les deux sens
A04ventes66montants ecrits « 1 234,56 EUR »retirer l unite, remplacer la virgule par un point, convertir en nombre
A05ventes40produit_id absent du referentiel produitsune jointure interne les perdrait en silence : les compter AVANT de joindre
A06clients92segment avec casse et espaces variablescouper les espaces et harmoniser la casse AVANT de grouper, sinon trois segments apparaissent la ou il n y en a qu un
A07ventes25prix unitaire negatif (avoir saisi comme une vente)decider : exclure, ou traiter comme un retour — et le documenter
A08produits3produit_id present deux fois avec des prix differentsune jointure dupliquerait les ventes : choisir la ligne qui fait foi avant de joindre
À télécharger

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.

Revenu récurrent au dernier mois : 147 916,50 €  ·  Somme des 36 revenus mensuels : 2 605 625,00 €  ·  Facteur entre les deux : 17,62 ×  ·  Total facturé hors taxes — le même nombre : 2 605 625,00 €  ·  Clients actifs au dernier mois : 487  ·  Places payées pour rien : 26,90 %
Invariant garanti. un seul abonnement actif par client a tout instant — c est ce qui rend le revenu recurrent calculable, et le generateur refuse d ecrire si l invariant est rompu
Les 6 tables de la version propre, leur grain, leur clé, et le poids mesuré sur le disque — total 2,0 Mo de CSV, plus 1,7 Mo de base SQLite.
tableune ligne représenteclélignespoids
offresune ligne par offre du catalogueoffre_id40 ko
5 colonne(s) de offres
  • offre_id — identifiant de l offre — texte, unique
  • nom — nom commercial de l offre
  • prix_mensuel — forfait mensuel en euros, places incluses comprises
  • places_incluses — nombre de places comprises dans le forfait — entier
  • prix_place_supplementaire — prix mensuel de chaque place au-dela des incluses, en euros ; zero pour l offre illimitee
clientsune ligne par entreprise clienteclient_id60030 ko
6 colonne(s) de clients
  • client_id — identifiant du client — texte, unique
  • raison_sociale — nom de l entreprise — synthetique, aucune entreprise reelle
  • segment — TPE | PME | ETI | Grand compte
  • pays — pays de facturation
  • secteur — secteur d activite declare
  • date_premier_contact — date du premier contact commercial — AAAA-MM-JJ, toujours anterieure au debut du premier abonnement
abonnementsune ligne par periode d abonnement d un client ; un changement d offre ferme la periode precedente et en ouvre une nouvelleabonnement_id82938 ko
8 colonne(s) de abonnements
  • abonnement_id — identifiant de la periode — texte, unique
  • client_id — cle vers clients.client_id
  • offre_id — cle vers offres.offre_id
  • date_debut — premier jour de la periode — AAAA-MM-JJ, toujours un 1er du mois
  • date_fin — dernier jour de la periode — AAAA-MM-JJ, VIDE si l abonnement est encore actif ; une cellule vide est donc une information, pas un manque
  • places — nombre de places payees — entier strictement positif
  • montant_mensuel — prix mensuel de la periode, en euros : forfait de l offre plus les places au-dela des incluses
  • motif_fin — budget | concurrent | projet termine | insatisfaction | fusion — VIDE si la periode s est terminee par un changement d offre ou si elle est encore active
facturesune ligne par mois et par abonnement actif, emise le 1er du moisfacture_id9 234619 ko
9 colonne(s) de factures
  • facture_id — identifiant de la facture — texte, unique
  • abonnement_id — cle vers abonnements.abonnement_id
  • client_id — cle vers clients.client_id
  • date_emission — date d emission — AAAA-MM-JJ, toujours un 1er du mois
  • periode — mois facture — AAAA-MM
  • montant_ht — montant hors taxes, en euros — egal au montant mensuel de l abonnement
  • tva — 20 % du hors taxes, arrondis au centime
  • montant_ttc — hors taxes plus TVA, au centime
  • statut — payee | en retard | impayee
usage_mensuelune ligne par mois et par abonnement actifabonnement_id + annee_mois9 234300 ko
7 colonne(s) de usage_mensuel
  • client_id — cle vers clients.client_id
  • abonnement_id — cle vers abonnements.abonnement_id
  • annee_mois — mois observe — AAAA-MM
  • places_payees — places facturees ce mois-la — entier
  • places_utilisees — places effectivement utilisees — entier, toujours inferieur ou egal aux places payees
  • connexions — nombre de connexions sur le mois
  • exports — nombre d exports de donnees sur le mois
calendrierune ligne par jour de la periode, sans troudate1 09643 ko
8 colonne(s) de calendrier
  • date — jour — AAAA-MM-JJ
  • annee — annee sur quatre chiffres
  • trimestre — T1 a T4
  • mois_numero — numero du mois, 1 a 12
  • mois_nom — nom du mois en francais
  • annee_mois — AAAA-MM
  • est_fin_de_mois — 1 si c est le dernier jour du mois, 0 sinon
  • jour_semaine — 1 pour lundi a 7 pour dimanche
Les 12 anomalies de la version brute, 285 lignes au total. Chacune est posée, comptée et écrite : un exercice de nettoyage où l’élève corrigerait un défaut que l’auteur n’avait pas vu n’aurait pas de corrigé possible.
codetablelignesanomalierègle de nettoyage
A01abonnements40lignes dupliquees a l identique, abonnement_id comprisdedoublonner sur abonnement_id ; un identifiant est unique par definition
A02abonnements18date_fin anterieure a date_debutune periode negative n existe pas : ecarter la ligne ou retablir l ordre des deux dates
A03abonnements25periodes qui se chevauchent pour un meme client : son revenu est compte deux foisun seul abonnement actif par client et par jour ; recouper les periodes et trancher
A04abonnements30montant_mensuel exprime en centimes au lieu d euroscomparer a prix_mensuel de l offre : un facteur 100 se voit, un contrôle de type non
A05clients22segment videune cellule vide n est pas une categorie : decider explicitement — exclure, ou creer « non renseigne », et le dire
A06abonnements35date_debut ecrite en JJ/MM/AAAA au lieu de AAAA-MM-JJnormaliser en ISO ; attention au 03/04 qui se lit dans les deux sens
A07factures20client_id absent du referentiel des clientsjointure externe puis comptage : une facture orpheline ne se rattache a aucun revenu
A08factures28montant_ttc egal au hors taxes : la TVA manquerecalculer : ttc = ht + tva, au centime — et ne jamais faire confiance a une colonne calculee livree
A09factures12montant_ht negatifun avoir se declare comme tel : soit une colonne de type, soit une table a part
A10factures15facture_id en double avec deux montants differents : le total depend de la ligne gardeededoublonner sur facture_id, et dire laquelle est retenue — la premiere, la derniere, ou la plus elevee
A11usage_mensuel26places_utilisees superieures aux places payeesimpossible par construction : la mesure est fausse, ou la ligne appartient a un autre abonnement
A12abonnements14offre_id absente du referentiel des offresjointure externe : un abonnement sans offre n a pas de prix de liste, donc pas d ecart mesurable
À télécharger

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.

Effectif au dernier mois : 408  ·  Écart salarial global, en équivalent temps plein : 26,27 %  ·  Le même écart à poste comparable : 2,20 %  ·  Facteur entre les deux : 11,94 ×  ·  Taux d’absentéisme : 1,27 %  ·  Taux de rotation sur la dernière année : 19,74 %
Invariant garanti. aucune ligne de paie ni d absence hors de la periode de presence du salarie — c est ce qui rend l effectif, la masse salariale et le taux d absenteisme calculables, et le generateur refuse d ecrire si l invariant est rompu
Piège posé. un paradoxe de Simpson : 2 % d ecart salarial a poste comparable, et une repartition inegale des familles de metiers entre femmes et hommes. L ecart global qui en resulte est mesure dans resultats-reference.json, jamais annonce
Les 6 tables de la version propre, leur grain, leur clé, et le poids mesuré sur le disque — total 1,0 Mo de CSV, plus 1,2 Mo de base SQLite.
tableune ligne représenteclélignespoids
postesune ligne par poste : une famille de metiers et un niveauposte_id302 ko
6 colonne(s) de postes
  • poste_id — identifiant du poste — texte, unique
  • intitule — famille et niveau en clair
  • famille — Direction | Ingenierie | Commerce | Production | Support | Administration
  • niveau — niveau de 1 a 5 — entier
  • salaire_base_mensuel — salaire de base a temps plein, en euros
  • statut — cadre | non cadre
etablissementsune ligne par etablissementetablissement_id50 ko
4 colonne(s) de etablissements
  • etablissement_id — identifiant — texte, unique
  • libelle — nom de l etablissement
  • region — region administrative
  • effectif_cible — effectif vise par la direction — entier, sert aux ecarts
salariesune ligne par salariesalarie_id52037 ko
12 colonne(s) de salaries
  • salarie_id — identifiant — texte, unique
  • matricule — numero de serie interne — texte, unique
  • nom — nom — synthetique, aucune personne reelle
  • prenom — prenom — synthetique
  • sexe — F | H
  • date_naissance — AAAA-MM-JJ — age a l entree toujours entre 16 et 70 ans
  • date_entree — premier jour de presence — AAAA-MM-JJ, parfois anterieur au debut de la periode observee
  • date_sortie — dernier jour de presence — AAAA-MM-JJ, VIDE si le salarie est toujours present ; une cellule vide est donc une information
  • motif_sortie — demission | fin de contrat | rupture conventionnelle | retraite | licenciement — VIDE si le salarie est present
  • poste_id — cle vers postes.poste_id
  • etablissement_id — cle vers etablissements.etablissement_id
  • temps_travail — PROPORTION et non pourcentage : 0,50 · 0,80 · 1,00
remunerationsune ligne par mois de presence et par salariesalarie_id + annee_mois11 720404 ko
5 colonne(s) de remunerations
  • salarie_id — cle vers salaries.salarie_id
  • annee_mois — mois de paie — AAAA-MM, toujours dans la periode de presence
  • salaire_brut_mensuel — brut du mois en euros, deja proportionne au temps de travail — pour comparer deux salaries, diviser par temps_travail
  • prime — prime du mois en euros, souvent nulle
  • heures_payees — heures payees — 151,67 a temps plein
absencesune ligne par absenceabsence_id97948 ko
6 colonne(s) de absences
  • absence_id — identifiant — texte, unique
  • salarie_id — cle vers salaries.salarie_id
  • date_debut — premier jour d absence — AAAA-MM-JJ
  • date_fin — dernier jour d absence — AAAA-MM-JJ
  • motif — maladie | conge paye | formation | sans solde | maternite ou paternite
  • jours_ouvres — jours ouvres couverts par l absence — entier strictement positif
calendrierune ligne par jour de la periode, sans troudate1 09643 ko
8 colonne(s) de calendrier
  • date — jour — AAAA-MM-JJ
  • annee — annee sur quatre chiffres
  • trimestre — T1 a T4
  • mois_numero — numero du mois, 1 a 12
  • mois_nom — nom du mois en francais
  • annee_mois — AAAA-MM
  • est_ouvre — 1 du lundi au vendredi, 0 le week-end
  • jour_semaine — 1 pour lundi a 7 pour dimanche
Les 12 anomalies de la version brute, 247 lignes au total. Chacune est posée, comptée et écrite : un exercice de nettoyage où l’élève corrigerait un défaut que l’auteur n’avait pas vu n’aurait pas de corrigé possible.
codetablelignesanomalierègle de nettoyage
A01salaries26lignes dupliquees a l identique, salarie_id comprisdedoublonner sur salarie_id ; un identifiant est unique par definition
A02salaries16date_sortie anterieure a date_entreeune periode negative n existe pas : ecarter la ligne ou retablir l ordre des deux dates
A03salaries34sexe code de plusieurs facons : f, Femme, FEMME, h, Homme, Mnormaliser sur un vocabulaire ferme AVANT tout regroupement ; sinon un meme groupe se compte en six categories
A04salaries22temps_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
A05remunerations30salaire_brut_mensuel exprime en centimes au lieu d euroscomparer au salaire de base du poste : un facteur 100 se voit, un contrôle de type non
A06remunerations21lignes de paie posterieures a la date de sortie du salarierapprocher 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
A07salaries18poste_id absent du referentiel des postesjointure externe : un salarie sans poste n a pas de salaire de base, donc aucun ecart mesurable
A08absences14absence_id en double avec deux durees differentes : le total depend de la ligne gardeededoublonner sur absence_id, et dire laquelle est retenue
A09absences20jours_ouvres a zero sur une absence dateezero 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
A10absences18absence situee hors de la periode de presence du salarieencadrer par les deux dates du salarie : un taux d absenteisme calcule sans cet encadrement depasse 100 % pour certains
A11salaries12date_naissance donnant un age a l entree inferieur a 16 ans ou superieur a 70borner avant de publier une pyramide des ages : une seule valeur a 101 ans deplace la moyenne et ecrase l echelle du graphique
A12salaries16etablissement_id videune cellule vide n est pas un etablissement : decider explicitement — exclure, ou creer « non affecte », et le dire
À télécharger

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.

Taux de service sur les expéditions livrées : 66,39 %  ·  Le même numérateur, sur les commandes passées : 55,63 %  ·  Écart entre les deux : 10,76 points  ·  Délai de livraison médian : 2,00 j  ·  Délai moyen : 3,62 j  ·  Délai au 95ᵉ centile : 11 j  ·  Facteur de la jointure commandes → expéditions : 1,15 ×
Invariant garanti. le stock ne devient jamais negatif : le cumul chronologique des mouvements, par entrepot et par article, reste positif ou nul a chaque ligne. Toute commande a au moins une ligne ; toute commande livree a au moins une expedition livree ; une commande annulee n a aucune expedition
Pièges posés. un taux dont le denominateur se discute (trois taux de service differents et tous defendables), et une distribution de delais a queue longue, ou la moyenne est tres au-dessus de la mediane
Les 8 tables de la version propre, leur grain, leur clé, et le poids mesuré sur le disque — total 7,5 Mo de CSV, plus 7,4 Mo de base SQLite.
tableune ligne représenteclélignespoids
entrepotsune ligne par entrepotentrepot_id40 ko
5 colonne(s) de entrepots
  • entrepot_id — identifiant — texte, unique
  • libelle — nom de l entrepot
  • region — region administrative
  • surface_m2 — surface en metres carres — entier
  • quais — nombre de quais de chargement — entier
transporteursune ligne par transporteurtransporteur_id40 ko
4 colonne(s) de transporteurs
  • transporteur_id — identifiant — texte, unique
  • nom — nom commercial — invente
  • delai_contractuel_jours — delai promis au contrat, en jours — entier
  • taux_service_contractuel — taux de service promis au contrat — proportion de 0 a 1, PAS un pourcentage
articlesune ligne par referencearticle_id844 ko
7 colonne(s) de articles
  • article_id — identifiant — texte, unique
  • libelle — designation
  • famille — Mobilier | Electromenager | Jardin | Bricolage | Decoration | Luminaire
  • poids_kg — poids unitaire en kilogrammes
  • volume_dm3 — volume unitaire en decimetres cubes
  • prix_unitaire — prix de vente unitaire en euros
  • stock_securite — seuil de reapprovisionnement — entier
commandesune ligne par commandecommande_id12 000693 ko
8 colonne(s) de commandes
  • commande_id — identifiant — texte, unique
  • client_ref — reference client — numero de serie, aucune personne reelle
  • date_commande — date de passation — AAAA-MM-JJ
  • date_promesse — date de livraison promise — AAAA-MM-JJ, jamais anterieure a la commande
  • entrepot_id — cle vers entrepots.entrepot_id
  • canal — web | magasin | marketplace | telephone
  • statut — livree | en cours | annulee
  • motif_annulation — rupture de stock | demande du client | adresse invalide | paiement refuse — VIDE si la commande n est pas annulee
lignes_commandeune ligne par article commande ; une commande en a de une a sixligne_id25 5881 004 ko
6 colonne(s) de lignes_commande
  • ligne_id — identifiant — texte, unique
  • commande_id — cle vers commandes.commande_id
  • article_id — cle vers articles.article_id
  • quantite — nombre d unites — entier strictement positif
  • prix_unitaire — prix applique, en euros
  • montant_ligne — prix_unitaire x quantite, au centime
expeditionsune ligne par expedition ; une commande peut partir en PLUSIEURS expeditions, ce qui fait que joindre les deux tables multiplie les montants de commandeexpedition_id11 997585 ko
7 colonne(s) de expeditions
  • expedition_id — identifiant — texte, unique
  • commande_id — cle vers commandes.commande_id
  • transporteur_id — cle vers transporteurs.transporteur_id
  • date_expedition — date de depart — AAAA-MM-JJ, jamais anterieure a la commande
  • date_livraison — date d arrivee — AAAA-MM-JJ, VIDE si la livraison est encore en cours ; une cellule vide est donc une information
  • poids_kg — poids expedie, en kilogrammes
  • nb_colis — nombre de colis — entier
mouvements_stockune ligne par mouvement de stockmouvement_id23 9701,5 Mo
7 colonne(s) de mouvements_stock
  • mouvement_id — identifiant — texte, unique
  • date — date du mouvement — AAAA-MM-JJ
  • entrepot_id — cle vers entrepots.entrepot_id
  • article_id — cle vers articles.article_id
  • type — entree | sortie | ajustement
  • quantite — quantite du mouvement — entier positif ; le SIGNE vient du type
  • motif — stock initial | reapprovisionnement | preparation de commande | inventaire
calendrierune ligne par jour de la periode, sans troudate73034 ko
8 colonne(s) de calendrier
  • date — jour — AAAA-MM-JJ
  • annee — annee sur quatre chiffres
  • trimestre — T1 a T4
  • mois_numero — numero du mois, 1 a 12
  • mois_nom — nom du mois en francais
  • annee_mois — AAAA-MM
  • semaine_iso — AAAA-Sxx
  • est_ouvre — 1 du lundi au vendredi, 0 le week-end
Les 12 anomalies de la version brute, 670 lignes au total. Chacune est posée, comptée et écrite : un exercice de nettoyage où l’élève corrigerait un défaut que l’auteur n’avait pas vu n’aurait pas de corrigé possible.
codetablelignesanomalierègle de nettoyage
A01lignes_commande90lignes dupliquees a l identique, ligne_id comprisdedoublonner sur ligne_id ; un identifiant est unique par definition
A02expeditions60date_livraison anterieure a date_expeditionun delai negatif n existe pas : ecarter la ligne, et ne JAMAIS la laisser entrer dans une moyenne de delai
A03expeditions70poids exprime en grammes au lieu de kilogrammesrecouper avec la somme des poids des articles commandes : un facteur 1 000 se voit, un contrôle de type non
A04commandes80statut ecrit de plusieurs facons : Livree, LIVREE, delivered, livréenormaliser sur un vocabulaire ferme AVANT tout regroupement ; sinon un meme statut se compte en cinq categories et le taux de service est faux
A05lignes_commande81commandes sans aucune ligne : 40 commandes orphelinesjointure externe puis comptage : une commande sans ligne a un montant de zero, et elle ecrase le panier moyen
A06lignes_commande55quantite a zeroune ligne de commande a zero n existe pas : decider explicitement — ecarter, ou la traiter comme une annulation de ligne, et le dire
A07expeditions45transporteur_id absent du referentieljointure externe : sans transporteur, pas de delai contractuel, donc aucun taux de service calculable sur ces lignes
A08commandes50date_promesse anterieure a date_commandeune promesse dans le passe rend la commande en retard des sa creation : le taux de service tombe sans qu aucune livraison ait change
A09expeditions35expedition_id en double avec deux dates differentes : le delai depend de la ligne gardeededoublonner sur expedition_id, et dire laquelle est retenue
A10mouvements_stock30ajustement d inventaire negatif rendant le solde cumule negatifcumuler 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
A11lignes_commande48prix_unitaire videune cellule vide n est pas un zero : recuperer le prix de l article, ou ecarter la ligne et le dire
A12expeditions26date_livraison posterieure a la fin de la periode annoncee par le jeuborner par la periode : une date hors bornes passe tous les contrôles de type et casse l echelle de tout graphique temporel
À télécharger

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.