All guides
IntermediateSelf-pacedFree GuideSection 37/95

Data Storytelling — Communiquer avec les données

Practise development foundations: programming, web, APIs, data and AI tools. Work through sections and exercises to build your first projects.

The full lessons for this course are currently available in French. Use the section menu to navigate the French course.

💡

Free content, available without an account. Tools and models change: use the current model guide to check their versions. Models and sources

Section 11.2.17 : Data Storytelling — Communiquer avec les données

🎯 Objectif pédagogique

Transformer une analyse de données en une histoire convaincante. Vous serez capable de communiquer vos découvertes de manière claire, persuasive et actionnable — la compétence qui différencie un analyste technique d'un communicant efficace.


Les données ne parlent pas — vous devez les faire parler

Marc l'a appris en finance : un rapport avec 50 tableaux n'est jamais lu. Un graphique avec un titre percutant est mémorisé. Le data storytelling est l'art de transformer les chiffres en récit.

Les 3 piliers : Data + Narrative + Visuel

Loading diagram…

Avant/Après : le même graphique, deux impacts

❌ Mauvais : technique, pas d'histoire

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(['Applied', 'Interview', 'Offer', 'Rejected'], [45, 12, 3, 25])
ax.set_title("Status Distribution")
plt.show()

✅ Bon : histoire, contexte, action

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 6))

statuses = ['Candidatures\n(45)', 'Entretiens\n(12)', 'Offres\n(3)', 'Refus\n(25)']
values = [45, 12, 3, 25]
colors = ['#94a3b8', '#f59e0b', '#22c55e', '#ef4444']

bars = ax.bar(statuses, values, color=colors, width=0.6, edgecolor='white', linewidth=2)
bars[2].set_edgecolor('#16a34a')
bars[2].set_linewidth(3)

ax.set_title("Seulement 7% des candidatures aboutissent à une offre", 
             fontsize=14, fontweight='bold', pad=15)
ax.set_ylabel("Nombre")

# Annotation sur l'insight clé
ax.annotate('Taux de conversion\n3 offres / 45 candidatures = 6.7%', 
            xy=(2, 3), xytext=(2.5, 20),
            arrowprops=dict(arrowstyle='->', color='#22c55e'),
            fontsize=10, color='#22c55e', fontweight='bold')

ax.text(0.5, -0.15, "Action : cibler moins d'offres mais mieux qualifiées (objectif : 15% de conversion)",
        transform=ax.transAxes, ha='center', fontsize=10, fontstyle='italic', color='#64748b')

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.show()

Règles de design pour les graphiques

RèglePourquoiComment
1 graphique = 1 messageTrop d'info = pas d'infoUn insight par graphique
Titre = insightLes gens ne lisent que le titre"7% de conversion" > "Status Distribution"
Couleurs intentionnellesGuident l'oeilGris = contexte, Couleur = focus
Pas de 3D ni de décorationsDistraient du messageSimple, plat, lisible
Annoter les anomaliesL'oeil ne les voit pas seulFlèches, cercles, texte
Source en basCrédibilité"Source: data.gouv.fr, 2026"

Template de rapport data

def create_data_story(df, title, insight, recommendation):
    """Template pour un rapport data storytelling."""
    fig, axes = plt.subplots(2, 2, figsize=(14, 10))
    fig.suptitle(title, fontsize=16, fontweight='bold')
    
    # Graphique 1 : Vue d'ensemble
    df['status'].value_counts().plot(kind='bar', ax=axes[0,0], color='#0891b2')
    axes[0,0].set_title("Vue d'ensemble")
    
    # Graphique 2 : Tendance temporelle
    df.groupby(df['date'].dt.to_period('W')).size().plot(ax=axes[0,1], color='#0891b2')
    axes[0,1].set_title("Évolution hebdomadaire")
    
    # Graphique 3 : Distribution
    axes[1,0].hist(df['salary'].dropna(), bins=15, color='#0891b2', edgecolor='white')
    axes[1,0].set_title("Distribution des salaires")
    
    # Graphique 4 : Comparaison
    df.groupby('status')['salary'].mean().plot(kind='barh', ax=axes[1,1], color='#0891b2')
    axes[1,1].set_title("Salaire moyen par statut")
    
    # Insight et recommandation en bas
    fig.text(0.5, 0.02, f"💡 \{insight\}", ha='center', fontsize=11, fontweight='bold')
    fig.text(0.5, -0.01, f"➡️ \{recommendation\}", ha='center', fontsize=10, fontstyle='italic')
    
    plt.tight_layout(rect=[0, 0.05, 1, 0.95])
    plt.savefig('report.png', dpi=200, bbox_inches='tight')
    plt.show()

La règle des 5 secondes

Un bon graphique communique son message en 5 secondes. Si le lecteur doit réfléchir plus longtemps, c'est trop complexe. Testez : montrez votre graphique à un collègue pendant 5 secondes. Que retient-il ? Si ce n'est pas votre insight principal, refaites le graphique.

🏋️ Exercice pratique (20 minutes)

Créez un "mini-rapport" data storytelling sur votre recherche d'emploi :

  1. →Titre : insight principal en une phrase
  2. →4 graphiques : chacun avec un titre = insight
  3. →Annotations sur les points clés
  4. →Recommandation en conclusion
Quick Check

Quel titre de graphique est le plus efficace pour le data storytelling ?

Quick Check

Dans un rapport data, quel est l'ordre optimal de présentation ?

Your progress

Progress is self-reported and stored in your browser. The final completion record is not a qualification or an independent assessment.

View progress and completion record

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

One practical AI workflow in your inbox

Methods, resources and new exercises. Free, unsubscribe at any time.