Rien ne remplace la confrontation avec le terrain. Dans cet atelier pratique, vous endossez le rôle de consultant Data Analyst fraîchement recruté par NovaTech Distribution, un grossiste d'équipements technologiques.
La direction générale souhaite piloter ses marges et ses performances commerciales, mais les données historiques extraites du système d'information sont dans un état chaotique. Votre mission : nettoyer, restructurer et enrichir ce jeu de données dans Power Query avant tout chargement dans le modèle de données.
🏢 Le Contexte Métier & Les Données Brutes#
Vous recevez deux fichiers d'extraction pour le premier trimestre :
Ventes_Brutes.csv: Un extrait transactionnel de 5 000 commandes contenant des colonnes techniques superflues, des montants en devises mal formatés et des valeurs manquantes.Objectifs_Budgets.xlsx: Un classeur Excel transmis par le contrôle de gestion, où les objectifs de chiffre d'affaires sont présentés sous forme matricielle avec les mois en colonnes (Janvier,Février,Mars).Ref_Categories.xlsx: Une table de référence contenant la correspondance entre le code catégorie et le taux de marge cible.
🎯 Vos 5 Missions#
┌────────────────────────────────────────────────────────┐
│ MISSION 1 : Audit de qualité & Élagage │
│ ──► Profilage de colonnes, suppression du bruit │
├────────────────────────────────────────────────────────┤
│ MISSION 2 : Typage rigoureux & Remplacement des nulls │
│ ──► Conversion en devise, gestion des cellules vides │
├────────────────────────────────────────────────────────┤
│ MISSION 3 : Dépivotage de la table budgétaire │
│ ──► Passage du format "Large" au format "Long" │
├────────────────────────────────────────────────────────┤
│ MISSION 4 : Fusion relationnelle (Merge) │
│ ──► Rapprochement des ventes avec les marges cibles │
├────────────────────────────────────────────────────────┤
│ MISSION 5 : Calcul conditionnel en langage M │
│ ──► Catégorisation des commandes en segments de valeur │
└────────────────────────────────────────────────────────┘
Mission 1 : Audit de Qualité et Élagage du Bruit#
1. Activer les outils de profilage de données#
Dans Power Query, la première action consiste à visualiser la santé de vos colonnes : - Rendez-vous dans l'onglet Affichage du ruban. - Cochez les options : - Qualité de la colonne (affiche le pourcentage de valeurs Valides, Erreurs et Vides). - Distribution des colonnes (affiche l'histogramme des valeurs distinctes et uniques). - Profil de la colonne.
2. Éliminer les colonnes parasites#
Le fichier CSV contient des colonnes d'audit système inutiles (sys_created_by, sys_timestamp, temp_id_buffer).
- Sélectionnez avec Ctrl les seules colonnes indispensables : OrderID, OrderDate, CustomerID, CustomerCity, PostalCode, ProductCategory, Quantity, SalesAmount.
- Faites un clic droit > Supprimer les autres colonnes.
3. Dédoublonner sur la clé métier#
Certaines commandes ont été envoyées en double par le script d'exportation :
- Sélectionnez la colonne OrderID.
- Clic droit > Supprimer les doublons.
Mission 2 : Typage Rigoureux et Traitement des Anomalies#
1. Fixer les types de données#
OrderIDetCustomerID: Nombre entier ou Texte.PostalCode: Texte (pour empêcher l'écrasement des zéros initiaux comme06000Nice).OrderDate: Date (remplacez le typeDate/HeureparDateafin de soulager le moteur VertiPaq).Quantity: Nombre entier.SalesAmount: Nombre décimal fixe ($).
2. Gérer les valeurs manquantes#
La colonne CustomerCity présente 3 % de valeurs null pour des clients en commande express :
- Sélectionnez CustomerCity.
- Clic droit > Remplacer les valeurs...
- Valeur à rechercher : null (en minuscules).
- Remplacer par : Ville non renseignée.
Mission 3 : Dépivoter la Table des Objectifs Budgétaires#
Ouvrez la requête Objectifs_Budgets. La table se présente sous cette forme :
┌──────────────────┬──────────────┬──────────────┬──────────────┐
│ Categorie │ Janvier │ Février │ Mars │
├──────────────────┼──────────────┼──────────────┼──────────────┤
│ Informatique │ 50 000 │ 55 000 │ 62 000 │
│ Téléphonie │ 35 000 │ 38 000 │ 41 000 │
│ Accessoires │ 12 000 │ 14 000 │ 15 500 │
└──────────────────┴──────────────┴──────────────┴──────────────┘
- Sélectionnez la colonne
Categorie. - Faites un clic droit et choisissez Dépivoter les autres colonnes.
- Renommez la colonne
AttributenMoisetValeurenObjectifCA. - Attribuez à
ObjectifCAle type Nombre décimal fixe.
Mission 4 : Fusionner les Ventes avec le Référentiel Catégories#
Pour évaluer la rentabilité de chaque transaction, nous devons associer à chaque vente le taux de marge de sa catégorie.
- Sélectionnez la requête principale
Fact_Ventes. - Dans l'onglet Accueil, cliquez sur Fusionner des requêtes.
- Dans la boîte de dialogue :
- Table du haut :
Fact_Ventes, sélectionnez la colonneProductCategory. - Table du bas :
Ref_Categories, sélectionnez la colonneCodeCat. - Type de jointure : Externe gauche (toutes les lignes de la première table...).
- Cliquez sur OK. Une nouvelle colonne contenant des objets
Tableapparaît à droite. - Cliquez sur l'icône de développement double flèche ⤢ située sur l'en-tête de cette colonne :
- Décochez Utiliser le nom de la colonne d'origine comme préfixe.
- Cochez uniquement la colonne
TauxMargeCible. - Validez.
Mission 5 : Créer une Colonne Conditionnelle en Langage M#
La direction souhaite segmenter les commandes selon leur taille d'un coup d'œil :
- Panier Majeur : SalesAmount >= 1000
- Panier Standard : SalesAmount >= 300
- Petit Panier : Pour toutes les autres valeurs.
Dans l'onglet Ajouter une colonne, cliquez sur Colonne conditionnelle et configurez les règles, ou ouvrez l'Éditeur avancé pour observer le code M généré :
Table.AddColumn(
EtapePrecedente,
"SegmentPanier",
each if [SalesAmount] >= 1000 then "Panier Majeur"
else if [SalesAmount] >= 300 then "Panier Standard"
else "Petit Panier",
type text
)
💻 Le Code M Complet de la Requête Finale#
Voici la transcription intégrale de votre pipeline de nettoyage pour la table Fact_Ventes dans l'Éditeur Avancé :
let
// 1. Ingestion depuis le fichier CSV source
Source = Csv.Document(File.Contents("C:\Data\Ventes_Brutes.csv"), [Delimiter=",", Columns=11, Encoding=65001, QuoteStyle=QuoteStyle.None]),
EnTetesPromus = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
// 2. Élagage des colonnes techniques
ColonnesSelectionnees = Table.SelectColumns(EnTetesPromus, {"OrderID", "OrderDate", "CustomerID", "CustomerCity", "PostalCode", "ProductCategory", "Quantity", "SalesAmount"}),
// 3. Dédoublonnage sur la clé primaire de commande
DoublonsSupprimes = Table.Distinct(ColonnesSelectionnees, {"OrderID"}),
// 4. Typage strict des colonnes
TypesModifies = Table.TransformColumnTypes(DoublonsSupprimes, {
{"OrderID", Int64.Type},
{"OrderDate", type date},
{"CustomerID", Int64.Type},
{"CustomerCity", type text},
{"PostalCode", type text},
{"ProductCategory", type text},
{"Quantity", Int64.Type},
{"SalesAmount", Currency.Type}
}),
// 5. Traitement des valeurs nulles
VillesRemplacees = Table.ReplaceValue(TypesModifies, null, "Ville non renseignée", Replacer.ReplaceValue, {"CustomerCity"}),
// 6. Fusion avec le référentiel des catégories
FusionCategories = Table.NestedJoin(VillesRemplacees, {"ProductCategory"}, Ref_Categories, {"CodeCat"}, "Ref_Categories", JoinKind.LeftOuter),
CategoriesDeveloppees = Table.ExpandTableColumn(FusionCategories, "Ref_Categories", {"TauxMargeCible"}, {"TauxMargeCible"}),
TypeMargeModifie = Table.TransformColumnTypes(CategoriesDeveloppees, {{"TauxMargeCible", Percentage.Type}}),
// 7. Ajout de la segmentation métier
SegmentAjoute = Table.AddColumn(TypeMargeModifie, "SegmentPanier", each if [SalesAmount] >= 1000 then "Panier Majeur" else if [SalesAmount] >= 300 then "Panier Standard" else "Petit Panier", type text)
in
SegmentAjoute
✅ Checklist d'Auto-Évaluation#
Avant de cliquer sur Fermer et appliquer pour envoyer vos données vers le canevas Power BI, cochez chaque élément de cette liste de contrôle :
- Aucune erreur dans la barre de qualité (100 % de lignes vertes sur toutes les colonnes clés).
- Toutes les colonnes ont un type explicite (aucun type générique
ABC/123). - Les clés et codes postaux sont en format Texte.
- Les tables de budget matricielles ont été dépivotées en colonnes
MoisetMontant. - Les colonnes d'identifiants techniques et d'audit ont été supprimées.
- Les requêtes intermédiaires qui ne doivent pas polluer le modèle final ont l'option Activer le chargement décochée (clic droit sur la requête dans le volet de gauche).
Félicitations ! Vous venez de franchir l'étape la plus déterminante d'un projet de Business Intelligence. Vos données sont saines, normalisées et allégées. Nous sommes fin prêts pour aborder la Partie 2 : Modéliser les données et dompter le langage DAX !
Commentaires