Aller au contenu principal

Analyser des Graphiques avec la Vision API

Lire les graphiques comme un analyste

Les graphiques — barres, lignes, camemberts, aires — sont omniprésents dans les rapports d’entreprise, les dashboards et les publications scientifiques. La Vision API de Mistral peut les lire, interpréter les tendances et extraire des données chiffrées.

Dans cette leçon, vous apprendrez à formuler des prompts efficaces pour l’analyse de graphiques et à structurer les résultats obtenus.

Principes de l’analyse de graphiques

Un bon prompt pour l’analyse de graphiques doit :

  1. Identifier le type de graphique : barres, lignes, camembert, scatter, etc.
  2. Lire les axes et légendes : unités, échelles, catégories
  3. Extraire les valeurs : approximations numériques lues sur le graphique
  4. Interpréter les tendances : hausse, baisse, saisonnalité, anomalies

Analyser un graphique en barres

from mistralai import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Vous êtes un analyste de données expert. Quand vous analysez un graphique :
1. Identifiez le type de graphique et son titre
2. Décrivez les axes (labels, unités, échelle)
3. Listez les valeurs principales que vous pouvez lire
4. Identifiez les tendances, points hauts/bas, anomalies
5. Rédigez une conclusion en 2-3 phrases"""
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Analysez ce graphique en barres du chiffre d'affaires trimestriel."},
                {"type": "image_url", "image_url": "https://exemple.com/ca-trimestriel.png"}
            ]
        }
    ]
)

print(response.choices[0].message.content)

Le prompt système structure la réponse du modèle en étapes logiques, ce qui améliore la précision et la lisibilité.

Extraire des données numériques

Pour obtenir des données exploitables (pas juste une description), demandez explicitement un format structuré :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Vous êtes un extracteur de données. Analysez le graphique et retournez les données sous forme de tableau markdown. Ne commentez pas, ne décrivez pas -- extrayez uniquement les données."
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Extrayez les données de ce graphique en barres dans un tableau."},
                {"type": "image_url", "image_url": "https://exemple.com/ventes-mensuelles.png"}
            ]
        }
    ]
)

Le modèle retournera quelque chose comme :

| Mois     | Ventes (k€) |
|----------|-------------|
| Janvier  | 120         |
| Février  | 135         |
| Mars     | 148         |

Analyser un graphique en lignes (tendances)

Les graphiques en lignes se prêtent particulièrement à l’analyse de tendances :

prompt_tendance = """Analysez ce graphique en lignes et répondez :
1. Quelle est la tendance générale (hausse, baisse, stable) ?
2. Y a-t-il des points d'inflexion ? Si oui, à quelles dates ?
3. Observez-vous une saisonnalité ?
4. Quelle est la valeur approximative au début et à la fin de la période ?
5. Quelle projection faites-vous pour le prochain trimestre ?"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt_tendance},
                {"type": "image_url", "image_url": "https://exemple.com/evolution-prix.png"}
            ]
        }
    ]
)

Analyser un camembert (répartition)

Pour les graphiques en camembert ou anneaux :

prompt_camembert = """Analysez ce diagramme circulaire :
- Listez chaque segment avec son pourcentage approximatif
- Identifiez le segment dominant
- Indiquez si la répartition est concentrée ou dispersée
Retournez les données dans un tableau markdown."""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt_camembert},
                {"type": "image_url", "image_url": "https://exemple.com/repartition-marche.png"}
            ]
        }
    ]
)

Pipeline d’analyse de rapport

Voici un exemple complet pour analyser automatiquement les graphiques d’un rapport :

import base64
from pathlib import Path
from mistralai import Mistral
import json

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

def encoder_image(chemin):
    with open(chemin, "rb") as f:
        b64 = base64.standard_b64encode(f.read()).decode("utf-8")
    return f"data:image/png;base64,{b64}"

def analyser_graphique(chemin_image, question=None):
    """Analyse un graphique et retourne les données structurées."""
    if question is None:
        question = "Analysez ce graphique. Retournez un JSON avec : type (bar/line/pie/other), titre, donnees (tableau de {label, valeur}), tendance, et resume."

    response = client.chat.complete(
        model="mistral-large-latest",
        messages=[
            {
                "role": "system",
                "content": "Retournez uniquement du JSON valide, sans blocs de code markdown."
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": question},
                    {"type": "image_url", "image_url": encoder_image(chemin_image)}
                ]
            }
        ]
    )

    return response.choices[0].message.content

# Analyser tous les graphiques d'un dossier
dossier = Path("rapport/graphiques/")
resultats = {}

for fichier in sorted(dossier.glob("*.png")):
    print(f"Analyse de {fichier.name}...")
    resultats[fichier.name] = analyser_graphique(fichier)

# Sauvegarder les résultats
with open("rapport/analyse_graphiques.json", "w", encoding="utf-8") as f:
    json.dump(resultats, f, ensure_ascii=False, indent=2)

Limites de l’analyse de graphiques

Le modèle peut rencontrer des difficultés avec :

  • Les valeurs précises : il estime les valeurs à partir de la position visuelle, avec une marge d’erreur de 5-10 %
  • Les graphiques surchargés : trop de séries, de légendes ou de petits textes
  • La basse résolution : les labels flous ou pixelisés sont mal lus
  • Les graphiques 3D : la perspective fausse la lecture des valeurs

Recommandation : pour une extraction précise, préférez l’export CSV des données source. La Vision API est idéale pour l’analyse rapide et la synthèse, pas pour remplacer un tableur.

Points clés à retenir

  • Utilisez Mistral Large 3 pour l’analyse de graphiques — la précision est critique
  • Structurez votre prompt en étapes : type, axes, valeurs, tendances, conclusion
  • Demandez explicitement un format de sortie (tableau markdown, JSON) pour des données exploitables
  • Le modèle estime les valeurs avec une marge de 5-10 % — ne l’utilisez pas pour des chiffres exacts
  • Combinez la Vision API avec un export CSV pour le meilleur des deux mondes