// Guide complet · Data Analyse

La Data Analyse
de A à Z

SQL · Excel · Visualisation · KPIs · Statistiques · Insights — tout ce qu'il faut savoir pour structurer une vraie analyse.

🧠
Le bon état d'esprit
Pourquoi vous avez la page blanche — et comment la combattre
Le vrai problème : Le bootcamp vous a appris à utiliser des outils. Mais analyser des données, c'est d'abord poser les bonnes questions — pas lancer des requêtes au hasard.

La règle fondamentale

Une analyse commence toujours par une question métier, pas par une table SQL.

🎯
Quel est l'objectif ?
Comprendre les ventes ? Réduire le churn ? L'objectif guide tout le reste.
👤
Pour qui ?
Un directeur veut 3 chiffres. Un ops manager veut du détail.
Sur quelle période ?
Hebdo, mensuel, annuel ? Comparer à la même période l'an dernier ?
📐
Quelle granularité ?
Par produit ? Par région ? Par client ?

Les 3 types d'analyses

TypeQuestion poséeExemple
DescriptiveQue s'est-il passé ?CA du mois dernier par région
DiagnosticPourquoi c'est arrivé ?Pourquoi les ventes baissent en été ?
PrédictiveQue va-t-il se passer ?Tendance des réservations pour Q4
💡 En tant que junior : concentrez-vous sur le descriptif et le diagnostic. Ce sont 90% du travail réel.

5 questions starters universelles

  1. Combien de lignes / colonnes ?
  2. Quelle période couvre le dataset ?
  3. Y a-t-il des valeurs nulles ou aberrantes ?
  4. Quelles sont les métriques clés disponibles ?
  5. Y a-t-il des tendances ou anomalies visibles ?
🗺
La méthode A → Z
Les 6 étapes d'une analyse structurée
01
Comprendre le contexte & définir les questions
Quel problème résout-on ? Rédigez 3–5 questions clés.

SQLExcel
02
Explorer les données (EDA)
Tables, colonnes, types, clés de jointure.

SQLExcel
03
Nettoyer & préparer
Nulls, doublons, formats incohérents.

SQLExcel
04
Calculer les KPIs & agrégations
Sommes, moyennes, ratios. Segmentez par dimensions clés.

SQLPower BI
05
Analyser & trouver des insights
Tendances, anomalies, corrélations. « Et alors ? »

Power BIStats
06
Visualiser & communiquer
Bons graphiques, conclusions claires en 30 secondes.

Power BIExcel
🔍
Exploration initiale (EDA)
5 requêtes pour comprendre un dataset inconnu en 5 minutes
L'EDA, c'est votre première conversation avec les données. L'objectif n'est pas encore de nettoyer ni d'analyser — c'est d'observer. Comprendre ce que vous avez avant de décider ce que vous pouvez en faire.
1 — Vue générale : volume, période, unicité
-- Nombre de lignes total
SELECT COUNT(*) AS nb_lignes FROM table_1;

-- Période couverte par les données
SELECT
MIN(col_date_1) AS date_debut,
MAX(col_date_1) AS date_fin,
DATEDIFF(day, MIN(col_date_1), MAX(col_date_1)) AS nb_jours
FROM table_1;

-- Y a-t-il des doublons sur la clé principale ?
SELECT COUNT(*) AS nb_lignes, COUNT(DISTINCT id) AS nb_ids_uniques FROM table_1;
-- Si nb_lignes > nb_ids_uniques → doublons sur id
2 — Distribution des catégories
-- Valeurs uniques et leur fréquence avec % du total
SELECT
col_cat_1,
COUNT(*) AS nb,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct
FROM table_1
GROUP BY col_cat_1
ORDER BY nb DESC;
💡 Répéter pour chaque colonne catégorielle. Cherchez : les valeurs inattendues, les typos («france» vs «France»), les catégories à 0% ou à 100%.
3 — Profil des colonnes numériques
SELECT DISTINCT
COUNT(col_num_1) OVER() AS nb_valeurs,
COUNT(*) OVER() - COUNT(col_num_1) OVER() AS nb_nulls,
MIN(col_num_1) OVER() AS minimum,
MAX(col_num_1) OVER() AS maximum,
ROUND(AVG(CAST(col_num_1 AS FLOAT)) OVER(), 2) AS moyenne,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY col_num_1) OVER() AS mediane,
ROUND(STDEV(col_num_1) OVER(), 2) AS ecart_type
FROM table_1;
💡 Si moyenne >> médiane → distribution asymétrique, probablement des outliers. Comparez toujours les deux avant de choisir votre indicateur.
4 — Tendance temporelle rapide
-- Volume et montant par mois, trié chronologiquement
SELECT
FORMAT(col_date_1, 'yyyy-MM') AS mois,
COUNT(*) AS nb_lignes,
SUM(col_num_1) AS total
FROM table_1
GROUP BY FORMAT(col_date_1, 'yyyy-MM')
ORDER BY mois;
💡 Cherchez : les mois à 0 (données manquantes ?), les pics inhabituels, les ruptures de tendance.
5 — Croisement de deux dimensions
-- Tableau croisé : catégorie 1 × catégorie 2
SELECT
col_cat_1,
col_cat_2,
COUNT(*) AS nb,
SUM(col_num_1) AS total
FROM table_1
GROUP BY col_cat_1, col_cat_2
ORDER BY col_cat_1, total DESC;

Ce que vous cherchez pendant l'EDA

QuestionRequête cléSignal d'alerte
Volume cohérent ?COUNT(*)0 lignes, ou beaucoup moins qu'attendu
Période attendue ?MIN / MAX dateDates futures ou trop anciennes
Clé unique ?COUNT(*) vs COUNT(DISTINCT id)nb_lignes > nb_ids → doublons
NULLs importants ?COUNT(*) - COUNT(col)> 10% sur une colonne clé
Valeurs aberrantes ?MIN / MAX / AVGMin négatif ou Max irréaliste
Catégories cohérentes ?GROUP BY + COUNTTypos, valeurs inattendues
Tendance normale ?GROUP BY moisMois vides ou pics isolés
🧹
Nettoyage des données
La donnée propre est la base de toute analyse fiable
Règle des 80/20 : 80% du temps d'un vrai projet est passé à nettoyer et préparer les données.
🕳
Valeurs nulles
Supprimer ? Remplacer par 0 / moyenne / «Inconnu» ? Selon le contexte métier.
👯
Doublons
Des lignes dupliquées faussent toutes vos sommes.
📅
Formats incohérents
«2024-01-05» vs «05/01/2024» — même date, 2 formats. Tout doit être harmonisé.
📊
Valeurs aberrantes
Prix à -500€ ou 999999€ ? Vérifier avant calcul.
🔤
Casse & espaces
«Paris» et « paris» sont 2 valeurs différentes. TRIM et UPPER sont vos amis.
🔢
Mauvais type
Un montant en texte = calculs impossibles. Castez vos colonnes.

En SQL

-- Détecter les NULLs
SELECT COUNT(*) FROM table_1 WHERE col_cat_1 IS NULL;

-- Détecter les doublons
SELECT col_cat_1, COUNT(*) FROM table_1 GROUP BY col_cat_1 HAVING COUNT(*) > 1;

-- Remplacer NULL par 0
SELECT ISNULL(col_num_1, 0) FROM table_1;

-- Nettoyer casse + espaces
SELECT UPPER(TRIM(col_cat_1)) FROM table_1;

Aller plus loin

Audit NULLs — toutes les colonnes en une requête
-- Vue d'ensemble des valeurs manquantes, colonne par colonne
SELECT
COUNT(*) AS total_lignes,
SUM(CASE WHEN col_cat_1 IS NULL THEN 1 ELSE 0 END) AS nulls_col_cat_1,
SUM(CASE WHEN col_num_1 IS NULL THEN 1 ELSE 0 END) AS nulls_col_num_1,
SUM(CASE WHEN col_date_1 IS NULL THEN 1 ELSE 0 END) AS nulls_col_date_1
FROM table_1;
Remplacer les NULLs — COALESCE (fonctionne sur tous les SGBD)
-- Remplacer NULL par 0 — universel (MySQL, PostgreSQL, SQL Server...)
SELECT COALESCE(col_num_1, 0) AS montant FROM table_1;

-- Fallback sur une 2e colonne, puis 'Inconnu' si les deux sont NULL
SELECT COALESCE(col_cat_1, col_cat_2, 'Inconnu') AS categorie FROM table_1;

-- Remplacer NULL par la moyenne de la colonne (window function)
SELECT COALESCE(col_num_1, AVG(col_num_1) OVER()) AS montant_corrige FROM table_1;
ISNULL vs COALESCE : ISNULL(col, val) est spécifique à SQL Server. COALESCE(col, val) fonctionne partout — préférez-le.
Doublons — sur plusieurs colonnes et déduplication
-- Identifier les doublons sur une combinaison de colonnes clés
SELECT col_cat_1, col_cat_2, col_date_1, COUNT(*) AS nb
FROM table_1
GROUP BY col_cat_1, col_cat_2, col_date_1
HAVING COUNT(*) > 1;

-- Garder 1 ligne par doublon (conserver la plus récente)
WITH dedup AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY col_cat_1, col_cat_2
ORDER BY col_date_1 DESC
) AS rn
FROM table_1
)
SELECT * FROM dedup WHERE rn = 1;
Profil rapide — vue d'ensemble d'une colonne numérique
SELECT
COUNT(*) AS total_lignes,
COUNT(col_num_1) AS valeurs_renseignees,
COUNT(*) - COUNT(col_num_1) AS nb_nulls,
MIN(col_num_1) AS minimum,
MAX(col_num_1) AS maximum,
ROUND(AVG(col_num_1), 2) AS moyenne,
ROUND(STDEV(col_num_1), 2) AS ecart_type
FROM table_1;
Valeurs aberrantes (outliers) — par percentiles
-- Méthode 1 : seuil fixe (rapide si on connaît le domaine métier)
SELECT * FROM table_1
WHERE col_num_1 < 0 OR col_num_1 > 10000;

-- Méthode 2 : valeurs hors du 1er et 99e percentile
WITH bornes AS (
SELECT
PERCENTILE_CONT(0.01) WITHIN GROUP (ORDER BY col_num_1) AS p01,
PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY col_num_1) AS p99
FROM table_1
)
SELECT t.*
FROM table_1 t, bornes b
WHERE t.col_num_1 < b.p01 OR t.col_num_1 > b.p99;
Intégrité référentielle — détecter les lignes orphelines
-- Lignes de table_2 sans correspondance dans table_1 (clé étrangère invalide)
SELECT t2.*
FROM table_2 t2
LEFT JOIN table_1 t1 ON t2.id_fk = t1.id
WHERE t1.id IS NULL;

-- Version synthétique : juste le nombre d'orphelins
SELECT COUNT(*) AS nb_orphelins
FROM table_2 t2
LEFT JOIN table_1 t1 ON t2.id_fk = t1.id
WHERE t1.id IS NULL;
🗇
SQL essentiel
Les patterns indispensables pour l'analyse

Structure d'une requête analytique

SELECT col_cat_1, SUM(col_num_1) AS total
FROM table_1
JOIN table_2 ON table_1.id = table_2.id_fk
WHERE col_cat_2 = 'valeur'
GROUP BY col_cat_1
HAVING SUM(col_num_1) > 100
ORDER BY total DESC;

Agrégations essentielles

FonctionUsage
COUNT(*)Compter les lignes
SUM(col_num)Somme d'une valeur numérique
AVG(col_num)Moyenne d'une valeur numérique
MIN/MAX(col_num)Valeur extrême
COUNT(DISTINCT col_cat)Valeurs uniques d'une catégorie
💡 Ordre d'exécution SQL : FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
📊
KPIs & métriques
Comprendre, calculer et choisir les bons indicateurs
🎯
Actionnable
Si le KPI change, on doit pouvoir agir dessus.
📏
Mesurable précisément
La définition du calcul doit être claire et reproductible.
Comparé à une baseline
Un chiffre seul ne dit rien. Toujours une référence.
CHIFFRE D'AFFAIRES
CA = Quantité vendue × Prix unitaire
TAUX DE CONVERSION
Taux = (Ventes / Prospects) × 100
TAUX D'ANNULATION
Ann. = (Annulées / Total réservations) × 100
CROISSANCE MoM / YoY
= ((Valeur N − Valeur N-1) / Valeur N-1) × 100
💡 La règle d'or : «CA = 120K€ (+8% vs mois précédent)» est utile. «CA = 120K€» l'est beaucoup moins.

Calculer ces KPIs en SQL

CA — chiffre d'affaires et panier moyen
-- CA total
SELECT SUM(col_num_1) AS ca_total FROM table_1;

-- Panier moyen = CA total / nombre de commandes distinctes
SELECT
SUM(col_num_1) AS ca_total,
COUNT(DISTINCT id) AS nb_commandes,
ROUND(SUM(col_num_1) / COUNT(DISTINCT id), 2) AS panier_moyen
FROM table_1;
CA par catégorie — avec part du total
SELECT
col_cat_1,
SUM(col_num_1) AS ca,
ROUND(SUM(col_num_1) * 100.0 / SUM(SUM(col_num_1)) OVER(), 1) AS pct_total
FROM table_1
GROUP BY col_cat_1
ORDER BY ca DESC;
Croissance MoM — variation mois par mois
WITH mensuel AS (
SELECT
FORMAT(col_date_1, 'yyyy-MM') AS mois,
SUM(col_num_1) AS total
FROM table_1
GROUP BY FORMAT(col_date_1, 'yyyy-MM')
)
SELECT
mois,
total,
LAG(total) OVER (ORDER BY mois) AS total_precedent,
ROUND(
(total - LAG(total) OVER (ORDER BY mois)) * 100.0
/ NULLIF(LAG(total) OVER (ORDER BY mois), 0), 1
) AS var_mom_pct
FROM mensuel
ORDER BY mois;
Taux — annulation, conversion, retour (pattern universel)
-- Adapter les valeurs ('annule', 'converti'...) à votre dataset
SELECT
COUNT(*) AS total,
SUM(CASE WHEN col_cat_1 = 'annule' THEN 1 ELSE 0 END) AS nb_annules,
SUM(CASE WHEN col_cat_1 = 'converti' THEN 1 ELSE 0 END) AS nb_convertis,
ROUND(SUM(CASE WHEN col_cat_1 = 'annule' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS taux_annulation_pct,
ROUND(SUM(CASE WHEN col_cat_1 = 'converti' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS taux_conversion_pct
FROM table_1;

KPIs par domaine métier

Ventes — E-commerce
KPIFormuleNote
CA totalSUM(quantité × prix)Toujours comparer à N−1
Panier moyen (AOV)CA / COUNT(DISTINCT id_commande)Segmenter par canal
Taux d'annulationAnnulées / Total × 100Surveiller les pics saisonniers
Taux de retourRetournées / Livrées × 100Impact direct sur CA net
Top clients (Pareto)RANK() sur CA par client20% des clients = 80% du CA
Abonnements — SaaS
KPIFormuleSeuil à surveiller
Abonnés actifsCOUNT(statut = 'actif')Snapshot à une date donnée
Churn mensuelDésabonnés / Actifs début mois × 100< 5% = acceptable
Taux de rétention100 − Churn> 90% = sain
MRRSUM(abonnements actifs du mois)Revenus récurrents mensuels
ARPUMRR / nb abonnésRevenu moyen par utilisateur
Ressources humaines
KPIFormuleSeuil à surveiller
Taux de turnoverDéparts / Effectif moyen × 100< 10% = sain
Taux d'absentéismeJours abs. / Jours théoriques × 100Cible < 3%
Ancienneté moyenneAVG(DATEDIFF(day, date_entrée, date_sortie))Indicateur de stabilité
Coût moyen recrutementBudget recrut. / nb embauchesROI RH
Hôtellerie & Hébergement
KPIFormuleSeuil à surveiller
Taux d'occupationNuits vendues / Nuits disponibles × 100< 60 % hors saison basse
RevPARCA hébergement / Chambres disponiblesBaisse MoM > 10 %
ADR (prix moy. journalier)CA hébergement / Nuits venduesInférieur au tarif affiché
ALOS (durée moy. séjour)Total nuits / Nb séjoursALOS < 1,5 → fort turnover
Taux d'annulationAnnulations / Réservations × 100> 20 % → revoir politique
Supply Chain & Logistique
KPIFormuleSeuil à surveiller
Taux de service (fill rate)Commandes livrées à temps / Total × 100< 95 %
Rotation des stocksCA / Valeur stock moyen< 4 → surstockage probable
Lead Time moyenAVG(date_livraison − date_commande)Hausse > 20 % vs période préc.
Taux de ruptureJours en rupture / Jours période × 100> 5 %
Coût de stockage unitaireCoût entrepôt / Unités stockéesHausse sans augmentation volume
Transport & Mobilité
KPIFormuleSeuil à surveiller
Taux de remplissagePassagers réels / Capacité × 100< 40 % → sous-utilisation
PonctualitéArrivées à l'heure / Total × 100< 90 %
Coût par kmCoûts opérationnels / km parcourusHausse > 10 % MoM
Fréquence incidentsNb incidents / Nb trajets × 1 000Hausse concentrée sur une ligne
Durée moy. de trajetAVG(heure_arrivée − heure_départ)Dépasse l'horaire théorique
📐
Statistiques clés
Les concepts fondamentaux pour comprendre vos données

1. Tendance centrale

MesureDéfinitionQuand l'utiliserSQL
MoyenneSomme ÷ nombreDonnées sans outliersAVG(col_num)
MédianeValeur du milieuPrésence d'outliersPERCENTILE_CONT(0.5)
ModeValeur la plus fréquenteDonnées catégoriellesGROUP BY + TOP 1
Exemple : Revenus 100€, 100€, 110€, 120€, 5 000€ → Moyenne = 1 086€ (faussée par l’outlier) · Médiane = 110€ (représentative). Pour les revenus, préférez toujours la médiane.
-- Mode : valeur la plus fréquente d'une colonne catégorielle
SELECT TOP 1 col_cat_1, COUNT(*) AS nb
FROM table_1
GROUP BY col_cat_1
ORDER BY nb DESC;

2. Dispersion — mesurer la variabilité

MesureDéfinitionSQLRobuste aux outliers ?
Écart-typeDispersion autour de la moyenneSTDEV(col_num)Non
VarianceÉcart-type au carréVAR(col_num)Non
Plage (Range)MAX − MINMAX(col) - MIN(col)Non
IQRQ3 − Q1 (50% central)PERC_CONT(0.75) - PERC_CONT(0.25)Oui
SELECT
ROUND(STDEV(col_num_1), 2) AS ecart_type,
ROUND(VAR(col_num_1), 2) AS variance,
MAX(col_num_1) - MIN(col_num_1) AS plage,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY col_num_1)
- PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY col_num_1) AS iqr
FROM table_1;
Préférer l'IQR à l'écart-type quand le dataset contient des outliers — l'écart-type en est très sensible, l'IQR ne l'est pas.

3. Percentiles & quartiles

Les quartiles divisent le dataset en 4 parties égales. Ils permettent de comprendre la répartition des valeurs et de segmenter sans fixer de seuils arbitraires.

QuartilePercentileSignification
Q125e25% des valeurs sont en dessous
Q2 (médiane)50e50% des valeurs sont en dessous
Q375e75% des valeurs sont en dessous
IQRQ3 − Q1La plage des 50% centraux
-- Q1, médiane, Q3 et IQR en une requête
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY col_num_1) AS q1,
PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY col_num_1) AS q2_mediane,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY col_num_1) AS q3,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY col_num_1)
- PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY col_num_1) AS iqr
FROM table_1;

-- Classer chaque ligne dans son quartile (1 = bas, 4 = haut)
SELECT
col_cat_1, col_num_1,
NTILE(4) OVER (ORDER BY col_num_1) AS quartile
FROM table_1;

-- Résumé statistique par quartile
WITH segmente AS (
SELECT col_num_1, NTILE(4) OVER (ORDER BY col_num_1) AS quartile
FROM table_1
)
SELECT quartile, COUNT(*) AS nb, ROUND(AVG(col_num_1), 2) AS moyenne
FROM segmente
GROUP BY quartile
ORDER BY quartile;
Usage concret : NTILE(4) classe vos clients en 4 groupes selon leur CA — sans avoir à définir des seuils arbitraires.

4. Forme de la distribution

Symétrique
Moyenne ≈ Médiane

Données bien réparties. La moyenne est un bon indicateur.
Asymétrie droite
Moyenne > Médiane

Queue vers les valeurs élevées. Ex : salaires, prix. Préférer la médiane.
Asymétrie gauche
Moyenne < Médiane

Queue vers les valeurs basses. Ex : notes, satisfaction.
-- Détecter la forme de distribution automatiquement
SELECT
ROUND(AVG(col_num_1), 2) AS moyenne,
ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY col_num_1), 2) AS mediane,
CASE
WHEN AVG(col_num_1) > PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY col_num_1) * 1.05
THEN 'Asymétrie droite (outliers hauts)'
WHEN AVG(col_num_1) < PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY col_num_1) * 0.95
THEN 'Asymétrie gauche (outliers bas)'
ELSE 'Distribution symétrique'
END AS forme
FROM table_1;

5. Corrélation

Le coefficient r mesure la force et la direction d'une relation linéaire entre deux variables numériques. Il varie de −1 à +1.

Valeur de rInterprétation
0,7 à 1Forte positive — quand X monte, Y monte fortement
0,3 à 0,7Modérée positive
−0,3 à 0,3Pas de corrélation notable
−0,7 à −0,3Modérée négative
−1 à −0,7Forte négative — quand X monte, Y descend fortement
-- Corrélation de Pearson entre deux colonnes numériques
SELECT ROUND(
(AVG(col_num_1 * col_num_2) - AVG(col_num_1) * AVG(col_num_2))
/ (STDEV(col_num_1) * STDEV(col_num_2))
, 3) AS correlation_pearson
FROM table_1;

-- Dans Excel : =CORREL(plage1 ; plage2)
⚠️ Corrélation ≠ Causalité. Les ventes de glaces et les noyades sont corrélées (les deux augmentent en été) — ce n'est pas la glace qui cause les noyades, c'est la chaleur. La corrélation dit « ces variables bougent ensemble », pas pourquoi.

6. Loi de Pareto (80/20)

Principe : Dans la plupart des datasets métier, 20% des entités (clients, produits, régions...) génèrent 80% de la valeur. Les identifier est souvent l'insight le plus actionnable d'une analyse.
-- Identifier les entités qui représentent les 80 premiers % du CA
WITH par_entite AS (
SELECT id, SUM(col_num_1) AS ca
FROM table_1
GROUP BY id
),
avec_cumul AS (
SELECT
id, ca,
SUM(ca) OVER (ORDER BY ca DESC) AS cumul,
SUM(ca) OVER () AS total
FROM par_entite
)
SELECT
id,
ca,
ROUND(cumul * 100.0 / total, 1) AS cumul_pct
FROM avec_cumul
WHERE cumul * 100.0 / total <= 80 -- ← les 80% premiers
ORDER BY ca DESC;
Variante : Remplacer id par col_cat_1 (produit, région, canal...) pour identifier les 20% de catégories qui font 80% du résultat.
💡
Trouver des insights
Comment passer d'un chiffre à une conclusion utile
Définition : Un insight implique une action. «Le CA baisse» n'est pas un insight. «Le CA baisse uniquement sur les réservations de dernière minute, suggérant un problème tarifaire» — ça, c'est un insight.

Les 7 réflexes pour trouver un insight

1
Comparer dans le temps
Un chiffre isolé ne dit rien. Comparez toujours à N−1 ou à la période précédente pour détecter les ruptures.
→ Stable toute l'année, puis −30% en mars ? Creusez mars.
2
Segmenter & décomposer
Une moyenne cache toujours des extrêmes. Décomposez par région, canal, produit, profil client jusqu'à trouver où la différence est réelle.
→ Panier moyen 85€ — mais 120€ en ligne vs 40€ en magasin.
3
Chercher les anomalies
Ce qui sort de l'ordinaire est souvent le plus intéressant. Les anomalies sont des hypothèses déguisées — ne les ignorez jamais.
→ Un produit qui chute un jour précis, un pic isolé sur une seule région.
4
Appliquer la règle du « Et alors ? »
Répétez la question 3 fois minimum après chaque observation. Chaque réponse vous rapproche de la cause réelle — et d'une action concrète.
5
Ancrer à une baseline
30% est-il bon ou mauvais ? Sans référence (objectif, même période N−1, benchmark secteur), impossible de conclure.
→ Toujours : valeur + comparaison + écart.
6
Croiser deux variables
Les croisements révèlent des patterns invisibles séparément. Un signal fort peut disparaître dans une moyenne globale.
→ Taux d'annulation normal en global… mais 3× plus élevé sur réservations > 30 j.
7
Formuler et tester une hypothèse
Proposez une explication, puis cherchez à la confirmer ou à l'infirmer dans les données. Un insight non vérifié est une opinion.
→ «Je pense que la baisse vient des clients < 6 mois» → testez-le.

Templates par type d'insight

📈
Tendance
«Le [KPI] a [augmenté / chuté] de [X%] entre [période A] et [période B]. Contrairement à [tendance habituelle], cela coïncide avec [événement]. Recommandation : [action].»
⚠️
Anomalie
«[KPI] sur [segment] est [X fois] [supérieur / inférieur] à la moyenne ([valeur] vs [moy.]). Ce comportement est isolé à [conditions]. Cause probable : [hypothèse]. À investiguer : [piste].»
Comparaison
«[Segment A] performe [X%] [mieux / moins bien] que [Segment B] sur [KPI]. La différence principale réside dans [variable clé]. Recommandation : [reproduire A / corriger B].»
🔗
Corrélation
«[Variable X] et [Variable Y] évoluent ensemble (r ≈ [valeur]). Quand [X augmente], [Y suit]. Cela suggère [relation]. À valider : [test / expérience à mener].»

Avant → Après — exemples concrets

❌  Observation brute✓  Insight actionnable
«Les ventes ont augmenté en décembre.» «Le CA de décembre (+28% vs N−1) est tiré par 3 produits Cadeaux représentant 71% du CA mensuel — hors de ces références, les ventes stagnent. Recommandation : anticiper les stocks de ces 3 SKU dès octobre.»
«Le turnover est élevé ce trimestre.» «Le turnover Q3 (18%) est concentré à 80% sur les collaborateurs de moins de 6 mois (42% sur ce segment), période où 3 managers ont été remplacés. Recommandation : audit du parcours d'onboarding.»
«Le taux d'occupation baisse.» «Le taux d'occupation de juillet (−12 pts vs N−1) chute uniquement sur les réservations de dernière minute (J−3), qui représentaient 35% du volume. Les réservations anticipées restent stables. Recommandation : revoir la tarification J−3.»

Le test des 3 « Et alors ?»

Méthode : Partez de votre observation brute. Posez « Et alors ?» trois fois de suite. Chaque réponse creuse un niveau de plus vers la cause réelle — et vers une action concrète.
OBS
Observation initiale
«Le CA de mars est de 120 000€.»
? 1
Et alors ?
«C'est −18% vs mars N−1 — soit 26 000€ de manque à gagner.»
? 2
Et alors ?
«La baisse est concentrée sur les clients existants (−31%). Les nouveaux clients progressent (+12%).»
? 3
Et alors ?
«Les clients existants commandent moins souvent : fréquence passée de 2,1 à 1,4 commandes/mois depuis février.»
Insight actionnable
«Le programme de fidélité ne stimule plus la fréquence d'achat des clients existants depuis février. Recommandation : revoir les incentives ou lancer une campagne de réactivation ciblée.»

Ce qui n'est pas un insight

❌  Pas un insightPourquoi ça ne suffit pasCe qu'il manque
«Le CA a augmenté.»Pas comparé, pas segmenté, pas actionnableDe combien ? vs quoi ? sur quel segment ?
«Il y a 15% de NULLs sur col_region.»Observation technique sans impact métierQuel effet sur l'analyse ? Que faire ?
«La catégorie A représente 40% du CA.»Snapshot sans tendance ni contexteEst-ce en hausse ? Normal ? Vs objectif ?
«Les ventes varient selon les mois.»Trop vague, aucune direction actionnableQuels mois ? Pourquoi ? Que changer ?
«Les clients satisfaits achètent plus.»Corrélation évidente, zéro différentielQuel segment ? Quel levier ? Combien ?

Checklist avant de présenter

  • Le chiffre est comparé à une baseline (N−1, objectif, benchmark secteur)
  • L'observation est segmentée — pas une moyenne globale
  • La cause probable est identifiée, pas juste le symptôme
  • Une action concrète est proposée — pas juste une conclusion
  • L'hypothèse inverse a été testée — y a-t-il une autre explication plausible ?
  • L'audience cible est claire — qui doit agir ? (direction, ops, marketing…)
🎤
Communiquer ses résultats
Passer de l'analyse au message — storytelling, structure et clarté
La règle d'or : Vos données sont aussi bonnes que votre capacité à les expliquer. Un insight que personne ne comprend ne génère aucune action. La communication fait partie de l'analyse.

1. Le principe BLUF — Bottom Line Up Front

Approche classique (mauvaise)
Contexte → Données → Analyse → Conclusion

L'audience attend 10 minutes avant de savoir pourquoi elle est là. Elle décroche avant la fin.
Approche BLUF (efficace)
Conclusion → Preuves → Contexte → Recommandation

L'audience sait dès la première phrase où vous voulez en venir. Le reste vient valider.
💡 En pratique : La première phrase de votre présentation doit contenir la conclusion. «Notre taux de churn a doublé en 3 mois sur les clients < 6 mois, ce qui coûte 40K€/mois. Voici pourquoi et comment y remédier.»

2. Le framework SCR — Situation → Complication → Résolution

Structure narrative issue du conseil (McKinsey). Universelle, applicable à tout rapport ou présentation.

S
Situation — le contexte partagé
Ce que tout le monde sait et accepte comme vrai. Établissez le terrain commun. Court, factuel, non-contestable.
→ «Notre CA mensuel est stable depuis 6 mois autour de 500K€.»
C
Complication — ce qui change ou pose problème
L'événement ou le problème qui rompt l'équilibre et crée le besoin d'agir. C'est la tension de votre histoire.
→ «Mais depuis mars, les clients existants commandent 30% moins souvent — soit 26K€ de manque à gagner/mois.»
R
Résolution — ce que vous recommandez
La réponse concrète à la complication. Action spécifique, responsable identifié, impact estimé.
→ «Lancer une campagne de réactivation sur les 1 200 clients inactifs depuis 45 jours : ROI estimé à 3,2× sur 60 jours.»

3. La règle : 1 slide = 1 message

Principe : Chaque slide doit répondre à une seule question. Si vous avez besoin de deux titres, vous avez besoin de deux slides. Le titre doit être l'insight — pas la description du graphique.
❌  Titre passif (description)✓  Titre insight (message)
Ventes par région — 2024La région Sud sous-performe de 20% malgré un budget marketing supérieur
Taux de churn mensuelLe churn a doublé en 3 mois — concentré sur les clients < 6 mois
Évolution du CALa croissance ralentit depuis février : +2% MoM vs +12% en moyenne 2023
Répartition des catégories3 catégories génèrent 78% du CA — les 12 autres sont marginales
Taux d'occupation — juilletLe taux d'occupation chute uniquement sur les réservations de dernière minute

4. Structure type d'un rapport / deck

01
Executive Summary — 1 page max
Le BLUF complet : contexte en 1 phrase, 2–3 findings clés chiffrés, 1–2 recommandations. Un dirigeant qui lit seulement cette page doit pouvoir prendre une décision.
02
Contexte & périmètre
Objectif de l'analyse, période couverte, dataset utilisé, limites éventuelles. Donne la confiance dans la méthodologie.
03
Résultats clés
2–4 insights majeurs, un par slide / section. Chaque finding : observation + quantification + comparaison + cause probable.
04
Recommandations
Actions concrètes, priorisées, avec responsable et impact estimé. Format : «Faire [quoi] pour [qui] afin de [impact] d'ici [quand].»
05
Annexes (optionnel)
Détail méthodologique, tables de données, graphiques supplémentaires. Présent si demandé, jamais imposé.

5. Adapter le message à l'audience

AudienceCe qu'elle veutFormat idéalCe qu'elle ne veut pas
Direction / C-levelDécision à prendre, impact financier, risque3–5 slides, chiffres grands, 1 recommandation claireMéthodologie, détail technique, trop de graphiques
Manager opérationnelCauses, segments, actions concrètes10–15 slides, décompositions, priorisationJargon statistique, graphiques sans contexte
Équipe techniqueMéthodologie, qualité des données, reproductibilitéRapport écrit, requêtes sources, notes de bas de pageSimplifications excessives, conclusions sans preuves
Client / ExterneValeur créée, storytelling, visuel soignéDeck visuel 5–10 slides, peu de chiffres, impact métierDonnées internes sensibles, jargon interne

6. Les erreurs classiques à éviter

❌  ErreurPourquoi c'est problématiqueCe qu'il faut faire à la place
Le data dumpMontrer toutes les données disponibles sans fil directeurSélectionner 2–4 findings qui répondent à la question initiale
Trop de slidesL'audience se noie, le message se perdSi > 15 slides : réduire ou déplacer en annexe
Titres descriptifs«CA par mois» ne dit rien — l'audience doit interpréter seuleTitres = messages : «Le CA stagne depuis février malgré la hausse des leads»
Pas de recommandationL'analyse reste théorique, personne ne sait quoi faireToujours terminer par : «Je recommande de…» avec une action concrète
Graphiques illisiblesAxes sans unité, 8 couleurs, légende incompréhensible1 graphique = 1 comparaison. Annoter directement la courbe.
Commencer par la méthodologieL'audience décroche avant les résultatsMéthodologie en annexe, résultats d'abord
📖
SQL — Référentiel complet
De SELECT * aux CTEs et Window Functions, du débutant à l'expert
Convention de nommage : Toutes les requêtes utilisent des noms génériques colorés selon leur type. Remplacez-les par vos vraies colonnes.
id / id_fk — clé primaire / étrangère
col_num_1 — valeur numérique (montant, quantité, prix…)
col_cat_1 — catégorie / texte (pays, type, statut…)
col_date_1 — date ou datetime
NIVEAU
DÉBUTANT
1 — Lire toute une table
SELECT *
FROM table_1;
2 — Sélectionner des colonnes précises
SELECT id, col_cat_1, col_num_1, col_date_1
FROM table_1;
3 — Alias (renommer)
SELECT
col_cat_1 AS categorie,
col_num_1 AS montant
FROM table_1;
4 — Filtrer les lignes (WHERE)
-- Egalite sur une categorie
SELECT * FROM table_1 WHERE col_cat_1 = 'valeur';

-- Comparaison numerique
SELECT * FROM table_1 WHERE col_num_1 > 100;

-- ET / OU
SELECT * FROM table_1
WHERE col_cat_1 = 'A' AND col_num_1 > 50;

-- Liste de valeurs
SELECT * FROM table_1
WHERE col_cat_1 IN ('val1', 'val2', 'val3');

-- Plage numerique
SELECT * FROM table_1
WHERE col_num_1 BETWEEN 10 AND 100;

-- Recherche texte partiel (% = n'importe quels caracteres)
SELECT * FROM table_1
WHERE col_cat_1 LIKE '%mot%';
5 — Trier (ORDER BY)
-- Croissant (defaut)
SELECT * FROM table_1 ORDER BY col_num_1 ASC;

-- Decroissant
SELECT * FROM table_1 ORDER BY col_num_1 DESC;

-- Plusieurs colonnes
SELECT * FROM table_1 ORDER BY col_cat_1 ASC, col_num_1 DESC;
6 — Limiter les resultats
-- SQL Server / T-SQL
SELECT TOP 10 * FROM table_1 ORDER BY col_num_1 DESC;

-- MySQL / PostgreSQL
SELECT * FROM table_1 ORDER BY col_num_1 DESC LIMIT 10;
7 — Valeurs distinctes (DISTINCT)
-- Lister toutes les categories uniques
SELECT DISTINCT col_cat_1 FROM table_1;

-- Compter les valeurs distinctes
SELECT COUNT(DISTINCT col_cat_1) AS nb_unique FROM table_1;
NIVEAU
INTERMÉDIAIRE
8 — Agregations (GROUP BY)
SELECT
col_cat_1,
COUNT(*) AS nb,
SUM(col_num_1) AS total,
AVG(col_num_1) AS moyenne,
MIN(col_num_1) AS minimum,
MAX(col_num_1) AS maximum
FROM table_1
GROUP BY col_cat_1
ORDER BY total DESC;
9 — Filtrer apres agregation (HAVING)
-- WHERE filtre les lignes AVANT agregation
-- HAVING filtre les groupes APRES agregation
SELECT col_cat_1, COUNT(*) AS nb
FROM table_1
WHERE col_num_1 > 0 -- filtre lignes d'abord
GROUP BY col_cat_1
HAVING COUNT(*) >= 5; -- filtre groupes ensuite
10 — Jointures (JOIN)
-- INNER JOIN : seulement les correspondances dans les 2 tables
SELECT t1.col_cat_1, t2.col_num_1
FROM table_1 t1
INNER JOIN table_2 t2 ON t1.id = t2.id_fk;

-- LEFT JOIN : toutes les lignes de table_1, meme sans correspondance
SELECT t1.col_cat_1, t2.col_num_1
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.id = t2.id_fk;

-- Jointure sur 3 tables
SELECT t1.col_cat_1, t2.col_num_1, t3.col_cat_2
FROM table_1 t1
JOIN table_2 t2 ON t1.id = t2.fk_1
JOIN table_3 t3 ON t2.id = t3.fk_2;
11 — Logique conditionnelle (CASE WHEN)
-- Segmenter une valeur numerique en categories
SELECT
col_cat_1, col_num_1,
CASE
WHEN col_num_1 >= 100 THEN 'Eleve'
WHEN col_num_1 >= 50 THEN 'Moyen'
ELSE 'Faible'
END AS segment
FROM table_1;

-- Compter conditionnellement (pattern courant)
SELECT
SUM(CASE WHEN col_cat_1 = 'A' THEN 1 ELSE 0 END) AS nb_A,
SUM(CASE WHEN col_cat_1 = 'B' THEN 1 ELSE 0 END) AS nb_B
FROM table_1;
12 — Sous-requetes (Subqueries)
-- Dans le WHERE : garder les lignes au-dessus de la moyenne
SELECT * FROM table_1
WHERE col_num_1 > (
SELECT AVG(col_num_1) FROM table_1
);

-- Dans le FROM : resultat intermediaire comme table
SELECT sub.col_cat_1, sub.total
FROM (
SELECT col_cat_1, SUM(col_num_1) AS total
FROM table_1 GROUP BY col_cat_1
) AS sub
WHERE sub.total > 500;
13 — Manipuler les dates
-- Extraire annee, mois, jour (SQL Server)
SELECT
YEAR(col_date_1) AS annee,
MONTH(col_date_1) AS mois,
DAY(col_date_1) AS jour
FROM table_1;

-- Grouper par mois
SELECT
FORMAT(col_date_1, 'yyyy-MM') AS annee_mois,
SUM(col_num_1) AS total
FROM table_1
GROUP BY FORMAT(col_date_1, 'yyyy-MM')
ORDER BY annee_mois;

-- Difference en jours
SELECT DATEDIFF(day, col_date_1, col_date_2) AS nb_jours FROM table_1;

-- Filtrer sur une periode
SELECT * FROM table_1
WHERE col_date_1 BETWEEN '2023-01-01' AND '2023-12-31';
14 — Combiner des requetes (UNION)
-- UNION ALL : empile (garde les doublons)
SELECT col_cat_1, col_num_1 FROM table_1
UNION ALL
SELECT col_cat_1, col_num_1 FROM table_2;

-- UNION : empile et supprime les doublons
SELECT col_cat_1 FROM table_1
UNION
SELECT col_cat_1 FROM table_2;
NIVEAU
AVANCÉ
15 — CTE (Common Table Expressions)
-- Un CTE = table temporaire nommee, valable le temps de la requete
-- Bien plus lisible qu'une sous-requete imbriquee

WITH cte_totaux AS (
SELECT
col_cat_1,
SUM(col_num_1) AS total
FROM table_1
GROUP BY col_cat_1
)
SELECT * FROM cte_totaux
WHERE total > 1000
ORDER BY total DESC;

-- Chainer plusieurs CTEs
WITH
cte_1 AS (
SELECT col_cat_1, SUM(col_num_1) AS total
FROM table_1 GROUP BY col_cat_1
),
cte_2 AS (
SELECT col_cat_1, AVG(col_num_2) AS moyenne
FROM table_2 GROUP BY col_cat_1
)
SELECT c1.col_cat_1, c1.total, c2.moyenne
FROM cte_1 c1
JOIN cte_2 c2 ON c1.col_cat_1 = c2.col_cat_1;
16 — Window Functions — Rang et numerotation
-- ROW_NUMBER : numero unique par ligne
SELECT col_cat_1, col_num_1,
ROW_NUMBER() OVER (ORDER BY col_num_1 DESC) AS num_ligne
FROM table_1;

-- RANK : ex-aequo saute des numeros (1, 2, 2, 4)
-- DENSE_RANK : ex-aequo ne saute pas (1, 2, 2, 3)
SELECT col_cat_1, col_num_1,
RANK() OVER (ORDER BY col_num_1 DESC) AS rang,
DENSE_RANK() OVER (ORDER BY col_num_1 DESC) AS dense_rang
FROM table_1;

-- PARTITION BY : top 3 par categorie
SELECT * FROM (
SELECT col_cat_1, col_cat_2, col_num_1,
RANK() OVER (PARTITION BY col_cat_1 ORDER BY col_num_1 DESC) AS rang
FROM table_1
) ranked
WHERE rang <= 3;
17 — Window Functions — Calculs glissants
-- Cumul progressif (running total)
SELECT col_date_1, col_num_1,
SUM(col_num_1) OVER (ORDER BY col_date_1) AS cumul
FROM table_1;

-- Moyenne glissante sur 3 periodes
SELECT col_date_1, col_num_1,
AVG(col_num_1) OVER (
ORDER BY col_date_1
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moy_glissante_3
FROM table_1;

-- % du total general par ligne
SELECT col_cat_1, col_num_1,
ROUND(col_num_1 * 100.0 / SUM(col_num_1) OVER(), 2) AS pct_total
FROM table_1;
18 — Window Functions — LAG / LEAD
-- LAG : valeur de la ligne PRECEDENTE (N vs N-1)
SELECT
col_date_1,
col_num_1 AS valeur_actuelle,
LAG(col_num_1) OVER (ORDER BY col_date_1) AS valeur_precedente,
col_num_1 - LAG(col_num_1) OVER (ORDER BY col_date_1) AS variation
FROM table_1;

-- LEAD : valeur de la ligne SUIVANTE
SELECT col_date_1, col_num_1,
LEAD(col_num_1) OVER (ORDER BY col_date_1) AS valeur_suivante
FROM table_1;
NIVEAU
EXPERT
19 — CTE recursifs (hierarchies)
-- Utile pour structures parent/enfant : org chart, categories...
-- ⚠ Syntaxe PostgreSQL / MySQL — sur SQL Server (T-SQL) : remplacer WITH RECURSIVE par WITH
WITH RECURSIVE hierarchie AS (
-- Ancre : racines sans parent
SELECT id, col_cat_1, parent_id, 0 AS niveau
FROM table_1 WHERE parent_id IS NULL

UNION ALL

-- Recursion : enfants de chaque noeud
SELECT t.id, t.col_cat_1, t.parent_id, h.niveau + 1
FROM table_1 t
JOIN hierarchie h ON t.parent_id = h.id
)
SELECT * FROM hierarchie ORDER BY niveau;
20 — PIVOT : lignes en colonnes (SQL Server)
-- Transformer : (col_cat_1, annee, col_num_1) => une colonne par annee
SELECT col_cat_1, [2022], [2023], [2024]
FROM (
SELECT col_cat_1, YEAR(col_date_1) AS annee, col_num_1
FROM table_1
) src
PIVOT (
SUM(col_num_1) FOR annee IN ([2022], [2023], [2024])
) piv;
21 — Requete analytique complete (CTE + Window + agregation)
-- Classement mensuel avec variation N vs N-1 et part du total
WITH
agregats AS (
SELECT
col_cat_1,
FORMAT(col_date_1, 'yyyy-MM') AS mois,
SUM(col_num_1) AS total
FROM table_1
WHERE col_cat_2 IS NOT NULL
GROUP BY col_cat_1, FORMAT(col_date_1, 'yyyy-MM')
),
avec_calculs AS (
SELECT
col_cat_1, mois, total,
LAG(total) OVER (PARTITION BY col_cat_1 ORDER BY mois) AS total_precedent,
SUM(total) OVER (PARTITION BY mois) AS total_global
FROM agregats
)
SELECT
col_cat_1, mois, total,
ROUND((total - total_precedent) * 100.0 / NULLIF(total_precedent,0), 1) AS var_pct,
ROUND(total * 100.0 / total_global, 1) AS part_pct,
RANK() OVER (PARTITION BY mois ORDER BY total DESC) AS rang_mois
FROM avec_calculs
ORDER BY mois, rang_mois;
💡 Conseils : Niveaux 1-2 = 80% des besoins quotidiens en junior. Les CTEs (niveau 3) sont votre prochain objectif. Les window functions vous feront sortir du lot en entretien.
📙
Excel — Formules essentielles
Les fonctions indispensables pour l'analyse

Agrégation conditionnelle

FormuleUsageExemple
SOMME.SIAdditionner selon 1 critère=SOMME.SI(A:A,"France",B:B)
SOMME.SI.ENSAdditionner selon N critères=SOMME.SI.ENS(montant,pays,"FR",statut,"actif")
NB.SICompter selon 1 critère=NB.SI(A:A,"annulé")
MOYENNE.SIMoyenne conditionnelle=MOYENNE.SI(type,"deluxe",prix)

Recherche

FormuleUsage
RECHERCHEXJointure entre tableaux — remplace VLOOKUP
INDEX + EQUIVRecherche bidirectionnelle

Tableaux croisés dynamiques (TCD)

  1. Sélectionnez votre tableau → Insertion > Tableau croisé dynamique
  2. Glissez une dimension dans «Lignes»
  3. Glissez une métrique dans «Valeurs» → Somme
  4. Ajoutez un filtre ou colonne pour affiner
  5. Triez par valeur décroissante
💡 Raccourci : Alt + N + V pour insérer un TCD immédiatement.

Statistiques

MOYENNE(plage) · MEDIANE(plage) · ECARTYPE(plage)
CENTILE(plage, 0.75) -> 75e percentile
GRANDE.VALEUR(plage,1) -> maximum
CORREL(plage1, plage2) -> correlation
📊
Visualisation & Dashboards
Choisir le bon graphique et construire des visuels clairs — Power BI, Tableau, Looker ou autre
Principe fondamental : Un graphique ne montre pas des données — il répond à une question. Avant de créer un visuel, demandez-vous : quelle comparaison est-ce que je veux que l'audience voie ?
💡 Le workflow professionnel — SQL → VIEW → Viz : Plutôt que de connecter votre outil de visualisation directement à une table brute, préparez et nettoyez vos données en SQL, puis sauvegardez le résultat en VIEW. Votre outil n'a plus qu'à lire cette view propre et prête. C'est plus simple, reproductible, et nettement plus répandu en entreprise.

CREATE VIEW vue_ventes_propres AS
SELECT id, col_cat_1, SUM(col_num_1) AS ca, FORMAT(col_date_1, 'yyyy-MM') AS mois
FROM table_1 WHERE col_num_1 > 0
GROUP BY id, col_cat_1, FORMAT(col_date_1, 'yyyy-MM');


Ensuite dans Power BI / Tableau / Looker : connectez-vous à vue_ventes_propres — c'est tout.

1. Choisir le bon graphique

ObjectifGraphique recommandéÀ éviter
Évolution dans le tempsCourbe (Line chart)Barres si > 12 périodes
Comparer des catégoriesBarres horizontales (Bar chart)Camembert, 3D
Évolution + comparaisonBarres groupées ou empiéléesTrop de séries (> 4)
Répartition proportionnelleDonut / Anneau (≤ 5 segments)Camembert > 5 segments
Distribution d'une variableHistogrammeCourbe (données discrètes)
Corrélation 2 variablesNuage de points (Scatter plot)Barres (masque la relation)
Composition & hiérarchieTreemapTableau (difficile visuellement)
KPI uniqueCarte / KPI tile + variation %Graphique (trop complexe)
Données géographiquesCarte choroplèthe (Map)Barres si > 10 zones

2. Les règles d'un graphique efficace

📄
Titre = le message
Le titre doit être l'insight, pas la description. «CA par région» → «La région Sud sous-performe de 20%».
1 graphique = 1 question
Si vous avez besoin de deux titres pour décrire un graphique, vous avez besoin de deux graphiques.
🎨
Couleur = sens
Réservez les couleurs pour mettre en valeur. Pas de dégradé, pas de 8 couleurs. Une seule couleur d'accent sur ce qui compte.
📌
Annoter directement
Écrivez les valeurs clés directement sur la courbe ou la barre. Une légende séparée oblige le lecteur à faire le lien seul.
💡 Axe Y : Pour les graphiques à barres, l'axe commence toujours à zéro — sinon vous exagérez visuellement les écarts. Pour les courbes, adapter l'échelle est acceptable si clairement indiqué.

3. Anatomie d'un bon dashboard

1
En-tête — KPIs clés
3 à 5 métriques en grand, avec variation vs période précédente. Compréhension en 5 secondes. C'est la zone que tout le monde voit en premier.
2
Évolution temporelle
Courbe ou barres pour voir les tendances et saisonnalités sur la période. Ajouter une ligne de référence (objectif ou N−1).
3
Décomposition par dimension
Barres horizontales pour la répartition par catégorie (région, produit, canal...). Toujours trié par valeur décroissante.
4
Filtres interactifs (Slicers)
Période, segment, région, type. Les filtres permettent à l'utilisateur d'explorer sans changer le dashboard. Regroupez-les en haut ou à gauche.
5
Tableau de détail (optionnel)
En bas, pour ceux qui veulent le granulaire. Un tableau avec les lignes clés et la possibilité d'exporter. Jamais en premier plan.

4. Erreurs visuelles à éviter

❌  ErreurPourquoi c'est trompeurCorrection
Axe Y ne commence pas à 0Exagère visuellement les écarts sur les barres — une hausse de 2% semble énormeToujours partir de 0 sur les barres. Indiquer clairement si l'échelle est tronquée
Graphique en 3DDistord les proportions — le segment à l'avant paraît plus grand qu'il n'estToujours en 2D. Le 3D n'apporte aucune information supplémentaire
Trop de couleursCharge cognitive élevée, l'audience ne sait pas où regarderGris pour le fond, 1 couleur d'accent pour ce qui compte
Double axe YComparaison visuellement trompeuse selon l'échelle choisieDeux graphiques séparés, ou normaliser les deux séries en indice 100
Camembert > 5 segmentsImpossible de comparer des angles similaires — illisibleBarres horizontales triées, ou regrouper les petits segments en «Autres»
Légende séparéeOblige à faire des allers-retours entre la légende et le graphiqueAnnoter directement les courbes ou barres avec leur label

5. Équivalences inter-outils

ConceptPower BITableauLooker
Métrique calculéeMesure DAXCalculated FieldMeasure (LookML)
Filtre interactifSlicerFilter / ParameterFilter
Drill-downDrill throughDrill downDrill
Source de donnéesPower QueryData SourceLookML Model
Partage / publicationPower BI ServiceTableau Cloud / ServerLooker Explore
💡 Pour les formules DAX (Power BI) : La section SQL du guide couvre les mêmes logiques d'agrégation — CALCULATE est l'équivalent de WHERE, DIVIDE gère la division par zéro comme NULLIF.
Checklist interactive
Cliquez pour cocher chaque étape de votre analyse

Phase 1 — Contexte

  • Définir l'objectifQuel problème résout-on ? Pour qui ?
  • Formuler 3–5 questions métier précises
  • Identifier la période et granularité

Phase 2 — Exploration

  • Inventorier les tables et colonnes
  • Vérifier le volume (COUNT *)
  • Vérifier les types de données
  • Identifier la période couverte (MIN/MAX date)

Phase 3 — Nettoyage

  • Détecter et traiter les NULLs
  • Détecter et traiter les doublons
  • Vérifier les valeurs aberrantes
  • Harmoniser les formats

Phase 4 — Analyse

  • Calculer les KPIs globaux
  • Segmenter par dimension clé
  • Analyser l'évolution temporelle
  • Identifier 3 insights actionnables

Phase 5 — Communication

  • Choisir les bons visuels
  • Rédiger un résumé exécutif (3-5 phrases)
  • Formuler des recommandations concrètes
Progression globale
0 / 18 étapes complétées