Du grand livre au compte de résultat de gestion

Première leçon du cours Analyse financière et contrôle de gestion, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Regrouper des écritures comptables en rubriques de gestion à partir du numéro de compte
  • Construire un compte de résultat mensuel avec pandas
  • Calculer marge brute, valeur ajoutée, EBE et résultat d'exploitation dans une version simplifiée

Plan comptable et rubriquesCompte de résultatSoldes intermédiaires de gestion

Le point de départ : les écritures

La comptabilité enregistre chaque opération dans des comptes. En France, le plan comptable général organise ces comptes en classes : la classe 6 regroupe les charges, la classe 7 les produits. Les deux premiers chiffres précisent la nature :

Préfixe Nature
70 Ventes (chiffre d’affaires)
60 Achats
61, 62 Services extérieurs (loyers, honoraires, télécoms…)
63 Impôts et taxes
64 Charges de personnel
68 Dotations aux amortissements et provisions

Un contrôleur de gestion ne présente pas des centaines de comptes à la direction : il les regroupe en rubriques lisibles. Pour cela, il s’appuie sur une table de correspondance écrite et partagée, qu’on peut relire et auditer.

Les écritures de ce cours sont simplifiées : un montant positif par compte et par mois, sans variation de stock ni écritures de clôture.

Construire la table de correspondance

MAPPING = {
    "70": "Chiffre d'affaires",
    "60": "Achats consommés",
    "61": "Charges externes",
    "62": "Charges externes",
    "63": "Impôts et taxes",
    "64": "Charges de personnel",
    "68": "Dotations aux amortissements",
}

def rubrique(account):
    return MAPPING.get(str(account)[:2], "Hors compte de résultat")

entries["rubrique"] = entries["account"].map(rubrique)

La valeur par défaut "Hors compte de résultat" attrape les comptes de bilan (classe 5 pour la trésorerie, classe 4 pour les tiers…) qui n’ont rien à faire dans un compte de résultat. Si elle apparaît dans vos résultats, c’est un signal à investiguer, pas une ligne à ignorer.

Le compte de résultat mensuel

pnl = entries.pivot_table(index="rubrique", columns="month", values="amount", aggfunc="sum", fill_value=0)

Une ligne par rubrique, une colonne par mois : c’est la forme attendue d’un reporting mensuel. Contrôle indispensable : la somme de pnl doit être égale à la somme des écritures du périmètre. Un écart signifie qu’une écriture a été perdue ou comptée deux fois.

Les soldes intermédiaires, en version simplifiée

Le compte de résultat se lit en cascade. Chaque solde retire une catégorie de charges et répond à une question :

def sig(m):          # m : dictionnaire rubrique -> montant pour un mois
    marge_brute = m["Chiffre d'affaires"] - m["Achats consommés"]
    valeur_ajoutee = marge_brute - m["Charges externes"]
    ebe = valeur_ajoutee - m["Impôts et taxes"] - m["Charges de personnel"]
    resultat_exploitation = ebe - m["Dotations aux amortissements"]
    return {"marge_brute": marge_brute, "valeur_ajoutee": valeur_ajoutee,
            "ebe": ebe, "resultat_exploitation": resultat_exploitation}

print(sig(pnl["2026-01"].to_dict()))
# marge 30 000, VA 26 000, EBE 10 500, résultat d'exploitation 8 500
  • La marge brute (ici une marge commerciale, puisque l’entreprise revend des marchandises) dit ce qu’il reste après avoir payé les produits vendus.
  • La valeur ajoutée mesure la richesse créée par l’entreprise après ses consommations externes.
  • L’EBE (excédent brut d’exploitation) mesure ce que l’exploitation dégage avant les amortissements, les frais financiers et l’impôt. C’est un indicateur très suivi, car il dépend peu des choix d’investissement et de financement.
  • Le résultat d’exploitation déduit l’usure des investissements (dotations aux amortissements).

La définition officielle des soldes intermédiaires de gestion comporte d’autres éléments (production, variation de stocks, subventions d’exploitation, reprises, autres produits et charges) ; ce cours en garde la structure pour l’analyse.

Rapporter au chiffre d’affaires

Un solde se compare d’un mois à l’autre en pourcentage du chiffre d’affaires : un taux d’EBE de 21 % en janvier et de 26,7 % en février montre que les charges fixes (personnel, loyer) ont été mieux absorbées par un CA plus élevé. C’est ce que l’on appelle l’effet de levier opérationnel.

À retenir

  • Les comptes 6 sont des charges, les comptes 7 des produits ; les préfixes donnent la nature.
  • Une table de correspondance documentée transforme les écritures en rubriques.
  • Les soldes se calculent en cascade et se lisent en pourcentage du CA.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. CodeDifficulté 1Python dans le navigateur2 indices

    Du grand livre aux rubriques

    Écrivez rubrique(account) qui renvoie la rubrique d’un numéro de compte à partir de ses deux premiers chiffres (table de la leçon ; "Hors compte de résultat" par défaut). Ajoutez la colonne rubrique à entries, puis construisez pnl : un tableau croisé rubrique × mois des montants.

    import pandas as pd
    
    entries = pd.DataFrame({
        "month":   ["2026-01"] * 7 + ["2026-02"] * 7,
        "account": ["707000", "607000", "613200", "626000", "635100", "641000", "681100"] * 2,
        "amount":  [50000, 20000, 3000, 1000, 500, 15000, 2000,
                    60000, 24000, 3000, 1500, 500, 15000, 2000],
    })
    
    
    def rubrique(account):
        ...
    
    
    # pnl = ...
  2. CodeDifficulté 2Python dans le navigateur2 indices

    Soldes intermédiaires

    Écrivez sig(m) où m est un dictionnaire rubrique → montant d’un mois. Elle renvoie marge_brute, valeur_ajoutee, ebe et resultat_exploitation. Calculez ensuite ebe_rate, une Series (index = mois) du taux d’EBE (EBE / chiffre d’affaires).

    import pandas as pd
    
    entries = pd.DataFrame({
        "month":   ["2026-01"] * 7 + ["2026-02"] * 7,
        "account": ["707000", "607000", "613200", "626000", "635100", "641000", "681100"] * 2,
        "amount":  [50000, 20000, 3000, 1000, 500, 15000, 2000,
                    60000, 24000, 3000, 1500, 500, 15000, 2000],
    })
    
    MAPPING = {
        "70": "Chiffre d'affaires",
        "60": "Achats consommés",
        "61": "Charges externes",
        "62": "Charges externes",
        "63": "Impôts et taxes",
        "64": "Charges de personnel",
        "68": "Dotations aux amortissements",
    }
    
    
    def rubrique(account):
        return MAPPING.get(str(account)[:2], "Hors compte de résultat")
    
    
    entries["rubrique"] = entries["account"].map(rubrique)
    pnl = entries.pivot_table(index="rubrique", columns="month", values="amount", aggfunc="sum", fill_value=0)
    
    
    def sig(m):
        ...
    
    
    # ebe_rate = ...
  3. QCMDifficulté 11 indice

    Lire l'EBE

    Une entreprise achète une machine coûteuse amortie sur 5 ans. Quel solde n’est PAS affecté par la dotation aux amortissements de cette machine ?

    • Le résultat d'exploitation
    • L'EBE
    • Le résultat net
    • Aucun, tous sont affectés

Quiz de fin de leçon

  1. Le compte 641000 appartient à quelle catégorie ?

    • Produits
    • Charges de personnel
    • Trésorerie
  2. CA 100, achats 40, charges externes 15, impôts 2, personnel 25. Que vaut l’EBE ?

    • 45
    • 18
    • 60
  3. Pourquoi prévoir une rubrique par défaut « Hors compte de résultat » ?

    • Pour cacher les écritures gênantes
    • Pour repérer les comptes de bilan ou les comptes non prévus dans la correspondance
    • Parce que pandas l'exige

La suite du cours

  1. Budget et analyse des écarts18 min
  2. Prévisions de trésorerie18 min
  3. Rentabilité par produit : marge sur coûts variables et seuil de rentabilité18 min
  4. Tableau de bord financier et prévision de fin d'année15 min

Analyse financière et contrôle de gestion · Intermédiaire · 1 h 24