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.
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 colonnerubriqueàentries, puis construisezpnl: 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 = ...Soldes intermédiaires
Écrivez
sig(m)oùmest un dictionnaire rubrique → montant d’un mois. Elle renvoiemarge_brute,valeur_ajoutee,ebeetresultat_exploitation. Calculez ensuiteebe_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 = ...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
Le compte 641000 appartient à quelle catégorie ?
- Produits
- Charges de personnel
- Trésorerie
CA 100, achats 40, charges externes 15, impôts 2, personnel 25. Que vaut l’EBE ?
- 45
- 18
- 60
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
- Budget et analyse des écarts18 min
- Prévisions de trésorerie18 min
- Rentabilité par produit : marge sur coûts variables et seuil de rentabilité18 min
- Tableau de bord financier et prévision de fin d'année15 min