CK Labs — Head of Data & Analytics, Sephora
Formation Power BI
Module 7 sur 8 · Modélisation complexe
Fil rouge : TheLook e-commerce
Modélisation complexe : multi-sources, calendrier, KPI combinés
Croiser des sources de granularités différentes, poser une table calendrier commune, et construire les KPI qui pilotent : CAC, ROAS, écart au budget. Aboutissement : le tableau « Performance par canal ».
Module 7 / 8 Modélisation avancée CAC · ROAS · Budget
Support 0
Intro
Pour qui, pourquoi Power BI, comment suivre.
Module 1
Le piège Excel
Pourquoi le reporting manuel vous enferme.
Module 2
Pourquoi Power BI
Le dernier kilomètre : de la donnée à la décision.
Module 3
Charger un fichier
Power Query : importer, nettoyer, fiabiliser.
Module 4
Découvrir & explorer
Métriques, dimensions, slicers, sanity check.
Module 5
DAX
Colonne vs mesure, DIVIDE, CALCULATE.
Module 6
Modélisation simple
Clés, cardinalité, schéma en étoile.
Module 7
Modélisation complexe
Multi-sources, calendrier, CAC / ROAS / budget.
Module 8
Récap & aide-mémoire
Fiches DAX, étoile, bonnes pratiques.
Bonus
Power BI & IA
L'ère agentique : piloter, mesurer, arbitrer.
À quoi sert ce module
Le réel est multi-sources : les ventes tombent au jour, le marketing au mois, le budget à l'année. Ce module apprend à tout aligner grâce à une table calendrier, à relier les quatre tables de TheLook, et à construire des KPI qui parlent au business — pour finir par reproduire, chiffres réels à l'appui, le tableau « Performance par canal ».
7
Croiser plusieurs sources et piloter par les KPI

Le problème : des granularités qui ne s'alignent pas

Jusqu'ici, notre étoile reliait les ventes, les clients et les canaux. Il manque deux sources — et elles ne sont pas à la même maille :

SourceGranularité temporelleClé de rattachement
SRC_ORDER_ITEMS (ventes)À la date (created_at)Date + canal + client
SRC_MARKETING (média)Au mois (month, 1 à 12)Mois + canal
SRC_BUDGET (budget)À l'année, par canalCanal

On ne peut pas relier directement des ventes datées au jour à un budget marketing mensuel. Il faut une colonne vertébrale temporelle commune : la table calendrier.

Créer la table calendrier DIM_DATE

Dans Power Query, une requête vide avec ce code M génère un calendrier complet sur 2024, avec l'année, le numéro de mois et le nom du mois en français :

let
    StartDate = #date(2024, 1, 1),
    EndDate = #date(2024, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    Dates = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    TableFromList = Table.FromList(Dates, Splitter.SplitByNothing()),
    ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type date}}),
    RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Date"}}),
    InsertYear = Table.AddColumn(RenamedColumns, "Année", each Date.Year([Date])),
    InsertMonth = Table.AddColumn(InsertYear, "Mois (numéro)", each Date.Month([Date])),
    InsertMonthName = Table.AddColumn(InsertMonth, "Mois", each Date.MonthName([Date], "fr-FR"))
in InsertMonthName
Marquer comme table de dates
Une fois DIM_DATE chargée, faites clic droit → « Marquer comme table de dates ». Power BI l'utilisera alors comme référentiel temporel officiel, condition nécessaire aux analyses de temps (cumuls, comparaisons N vs N-1…).

Relier les quatre tables : l'étoile complète

On complète maintenant toutes les relations, toutes en 1:N, dimensions vers faits :

Depuis (dimension)VersClé
DIM_DATESRC_ORDER_ITEMSDate → created_at
DIM_DATESRC_USERSDate → created_at
DIM_DATESRC_MARKETINGMois (numéro) → month
SRC_USERSSRC_ORDER_ITEMSuser_id → user_id
DIM_CANALSRC_ORDER_ITEMSCanal → traffic_source
DIM_CANALSRC_MARKETINGCanal → channel
DIM_CANALSRC_BUDGETCanal → channel
Le point technique à ne pas rater
La relation DIM_DATE → SRC_MARKETING se fait via le numéro de mois (1 à 12), pas via une date complète — parce que le marketing est mensuel. Vérifiez que « Mois (numéro) » de DIM_DATE et « month » de SRC_MARKETING contiennent bien des valeurs de 1 à 12. Toutes les relations doivent être actives et en 1:N. DIM_DATE et DIM_CANAL sont au centre de l'étoile, partagées par plusieurs tables de faits.

Les KPI qui pilotent

Grâce à ce modèle, les mesures du module 5 fonctionnent maintenant par canal, par mois, par pays. On les complète avec les indicateurs qui intéressent vraiment le pilotage marketing.

Marge après marketing et CAC (rappel)

Marge après Mkt = [Marge] - [Spend Mkt]
CAC             = DIVIDE([Spend Mkt], [Clients], 0)

ROAS — retour sur dépense publicitaire

Le ROAS (Return On Ad Spend) mesure combien d'euros de CA génère un euro dépensé en média. Il se construit directement à partir de deux mesures qu'on a déjà :

ROAS = DIVIDE([CA Réel], [Spend Mkt], 0)

Un ROAS de 3 signifie 3 € de CA pour 1 € investi. Croisé au CAC, il dit non seulement combien coûte un client, mais combien il rapporte.

Écart au budget

La table SRC_BUDGET porte un objectif de CA par canal (budget_ca). On mesure l'écart entre réalisé et budget :

Budget CA   = SUM(SRC_BUDGET[budget_ca])
Écart CA    = [CA Réel] - [Budget CA]
Écart CA %  = DIVIDE([CA Réel] - [Budget CA], [Budget CA], 0)
Ce que ces trois KPI racontent ensemble
CAC (ce que coûte un client), ROAS (ce qu'il rapporte), écart au budget (est-on dans la cible). Trois angles, une seule question : où remettre de l'euro, où lever le pied ? C'est du pilotage, pas de la description.

Le piège des valeurs manquantes

Sanity check du module 4 confirmé : certaines lignes de SRC_ORDER_ITEMS n'ont pas de traffic_source. Elles sont donc exclues des analyses par canal. Résultat concret sur TheLook : le total « par canal » (102 794 €) est inférieur au CA de toutes les commandes (262 355 €). Ce n'est pas un bug — c'est la part non attribuée à un canal.

// Rendre visible le CA sans canal
CA Sans Canal = CALCULATE([CA Réel], ISBLANK(SRC_ORDER_ITEMS[traffic_source]))

Autre option : ajouter une ligne « Non attribué » dans DIM_CANAL. L'important est de ne jamais faire disparaître silencieusement un écart : on l'explique, on le montre.

L'aboutissement : le tableau « Performance par canal »

On pose un visuel Tableau, Canal (DIM_CANAL) en lignes, et les mesures en valeurs, dans cet ordre : CA Réel, Coût, Marge, Taux de Marge, Clients, Spend Mkt, CAC. Formats : € à 2 décimales pour les montants, % pour le taux, entier pour les clients, totaux activés. Voici le résultat attendu du modèle :

CanalCA RéelMargeTaux margeClientsCAC
Search71 876 €35 092 €48,82 %3 505152,92 €
Organic16 408 €8 067 €49,16 %718131,59 €
Email5 460 €2 615 €47,89 %252565,80 €
Display3 399 €1 655 €48,68 %2071 590,73 €
Facebook5 650 €2 768 €48,99 %3181 320,23 €
TOTAL102 794 €50 196 €48,83 %5 000304,43 €
Ce que ce tableau fait décider
Search domine le volume (71 876 € de CA) avec un CAC maîtrisé (152,92 €). Organic est le canal le plus efficient (CAC 131,59 €, marge 49,16 %). À l'opposé, Display coûte 1 590,73 € par client pour un CA modeste : le premier réflexe de pilotage est d'aller regarder ce que Display rapporte vraiment. Le tableau ne décrit pas : il ouvre une décision.

Aller plus loin, maintenant que le modèle tient

Une fois cette base en place, la table calendrier et les dimensions partagées ouvrent tout un champ d'analyses, sans reconstruire quoi que ce soit :

Chaque ajout se branche sur l'étoile existante. C'est tout l'intérêt d'un modèle propre : il grandit avec les questions, au lieu de casser à chaque nouvelle demande.

Fiche mémo — modélisation complexe
Table calendrier
DIM_DATE, colonne vertébrale temporelle. À marquer « comme table de dates ».
Aligner les granularités
Marketing au mois → relier via le numéro de mois (1-12), pas la date complète.
Dimensions partagées
DIM_DATE et DIM_CANAL relient plusieurs tables de faits. Toutes relations 1:N actives.
ROAS
DIVIDE([CA Réel], [Spend Mkt], 0)
Écart au budget
[CA Réel] - SUM(SRC_BUDGET[budget_ca])
Ne pas cacher les trous
CA par canal (102 794 €) < CA total (262 355 €) : le non-attribué, à montrer.
Suite du parcours
Vous venez de livrer un projet Power BI complet, du fichier brut au tableau qui décide. Le module 8 consolide tout : fiches DAX, schéma en étoile, bonnes pratiques — de quoi rejouer un cas seul.

Ouvrir le module 8 — Récap & aide-mémoire