Un graphe où chaque flèche relie une cause à un effet, et où chaque nœud porte une table de probabilités. Le modèle répond à des questions dans les deux sens : prédire l'effet à partir des causes, ou remonter aux causes probables d'un effet observé. Il combine volontiers expertise métier et données.
Un expert sinistres sait que l'âge, la zone et la puissance du véhicule influencent le risque d'accident, et que l'accident influence le coût. Il dessine ces flèches au tableau et met un chiffre sur chacune.
Chaque variable est un nœud, chaque flèche une influence directe. Le graphe ne doit contenir aucune boucle. Il vient des experts, des données, ou des deux.
Chaque nœud reçoit la probabilité de ses valeurs pour chaque combinaison de ses parents, par exemple P(sinistre | âge, zone, puissance, bonus). Les tables s'estiment en comptant dans les données.
On fixe ce que l'on sait (l'évidence) et le réseau calcule la probabilité de tout le reste, dans le sens des flèches comme à rebours.
Âge du conducteur, zone, puissance du véhicule, bonus-malus, survenue d'un sinistre et niveau de coût. Les variables sont découpées en classes : moins de 25 ans, 25 à 59 ans, 60 ans et plus, par exemple.
Prédiction : un conducteur de moins de 25 ans en zone urbaine a environ 19 % de risque de sinistre sur la période, contre 7 % en moyenne. Diagnostic : selon le réseau, environ un quart des sinistres coûteux concernent des moins de 25 ans, qui ne représentent que 10 % des contrats.
On confronte le graphe expert à la structure trouvée par les données seules (algorithme hill climbing) et on vérifie que les probabilités estimées collent aux taux observés. Pour tarifer, on garde un modèle de fréquence qui tient compte de l'exposition.
Noms donnés pour bnlearn en R et pgmpy en Python.
Un graphe dessiné avec les experts est plus robuste. hc() propose une structure à partir des seules données : utile pour repérer des liens oubliés, pas pour trancher le sens des flèches.
Chaque classe ajoutée multiplie la taille des tables. Des classes trop fines laissent des cases vides ; trop larges, elles effacent l'effet recherché.
method = "mle" compte simplement les fréquences. method = "bayes" ajoute un a priori (paramètre iss) qui lisse les petites cases et évite les probabilités nulles.
Sur un petit réseau, le calcul exact est instantané (élimination de variables dans pgmpy). cpquery() dans bnlearn procède par simulation : augmenter n stabilise le résultat.
# Assurance auto : réseau bayésien en R
library(bnlearn)
sin <- read.csv("sinistres.csv")
donnees <- data.frame(
age = cut(sin$age_conducteur, c(0, 24, 59, Inf), labels = c("moins_25", "25_59", "60_plus")),
zone = factor(sin$zone),
puissance = factor(ifelse(sin$puissance_cv >= 8, "8cv_plus", "moins_8cv")),
bonus = factor(ifelse(sin$bonus_malus < 1, "bonus", "malus")),
sinistre = factor(ifelse(sin$nb_sinistres > 0, "oui", "non")),
cout = cut(sin$cout_total, c(-1, 0, 2000, Inf), labels = c("aucun", "modere", "eleve")))
# Le graphe, fixé avec les experts métier : 4 facteurs -> sinistre -> coût
graphe <- model2network("[age][zone][puissance][bonus][sinistre|age:zone:puissance:bonus][cout|sinistre]")
reseau <- bn.fit(graphe, donnees) # tables de probabilités estimées sur les données
print(reseau$cout)
set.seed(42)
# Prédiction : risque de sinistre d'un conducteur de moins de 25 ans en zone urbaine
cat("P(sinistre | moins de 25 ans, urbain) :",
cpquery(reseau, event = (sinistre == "oui"), evidence = (age == "moins_25" & zone == "urbain"), n = 1e6), "\n")
# Diagnostic : part des moins de 25 ans derrière les sinistres coûteux
cat("P(moins de 25 ans | coût élevé) :",
cpquery(reseau, event = (age == "moins_25"), evidence = (cout == "eleve"), n = 1e6), "\n")
# Structure proposée par les données seules (hill climbing), à confronter au graphe expert
print(arcs(hc(donnees)))
# Assurance auto : réseau bayésien en Python
import numpy as np
import pandas as pd
from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.inference import VariableElimination
sin = pd.read_csv("sinistres.csv")
donnees = pd.DataFrame({
"age": pd.cut(sin.age_conducteur, [0, 24, 59, 200], labels=["moins_25", "25_59", "60_plus"]).astype(str),
"zone": sin.zone,
"puissance": np.where(sin.puissance_cv >= 8, "8cv_plus", "moins_8cv"),
"bonus": np.where(sin.bonus_malus < 1, "bonus", "malus"),
"sinistre": np.where(sin.nb_sinistres > 0, "oui", "non"),
"cout": pd.cut(sin.cout_total, [-1, 0, 2000, np.inf], labels=["aucun", "modere", "eleve"]).astype(str)})
# Le graphe, fixé avec les experts métier : 4 facteurs -> sinistre -> coût
reseau = DiscreteBayesianNetwork([("age", "sinistre"), ("zone", "sinistre"), ("puissance", "sinistre"),
("bonus", "sinistre"), ("sinistre", "cout")])
reseau.fit(donnees) # tables de probabilités estimées par maximum de vraisemblance
inference = VariableElimination(reseau)
# Prédiction : risque de sinistre d'un conducteur de moins de 25 ans en zone urbaine
print(inference.query(["sinistre"], evidence={"age": "moins_25", "zone": "urbain"}))
# Diagnostic : répartition par âge derrière les sinistres coûteux
print(inference.query(["age"], evidence={"cout": "eleve"}))
Un modèle qui représente les dépendances entre variables par un graphe orienté sans boucle, avec une table de probabilités conditionnelles par nœud. Il calcule la probabilité de n'importe quelle variable à partir de celles qu'on observe.
Pas automatiquement. Les flèches codent des dépendances ; les lire comme des causes suppose un graphe validé par l'expertise et l'absence de facteur caché. Les travaux de Judea Pearl précisent quand ce passage est légitime.
Naive Bayes est un réseau bayésien très particulier : une variable cible reliée à toutes les autres, supposées indépendantes entre elles une fois la cible connue. Un réseau bayésien général autorise n'importe quelle structure de dépendances.
Un réseau bayésien applique Bayes à de nombreuses variables à la fois, en suivant le graphe.
Voir la fiche → le réseau le plus simpleUn graphe en étoile : la classe influence toutes les variables, supposées indépendantes entre elles.
Voir la fiche → le standard de la tarificationPrédit un nombre de sinistres en tenant compte de l'exposition : l'outil de référence des actuaires.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus