Projet de modélisation stochastique
Table des matières
Contexte et objectifs du projet
Une entreprise de transport collectif cherche à améliorer l'efficacité des opérations de maintenance réalisées sur ses véhicules. Un axe d'amélioration porte sur l'élaboration de recommandations visant à assister les mainteneurs dans leurs opérations de maintenance.
L'entreprise souhaite également mutualiser l'expertise des mainteneurs. En effet, les mainteneurs, qui sont situés sur différents lieux géographiques, interviennent sur des matériels analogues sans pouvoir aisément bénéficier de l'expérience de leurs collègues travaillant sur d'autres sites.
Ce projet vise à apporter des outils d'aide à la décision pour le pilotage de la maintenance et la réalisation des actions de réparation. La section Travaux à réaliser présente différents travaux à réaliser pour contribuer à cet objectif. Pour ce faire, des données issues de la GMAO (Gestionnaire de Maintenance Assisté par Ordinateur) de l'entreprise sont mises à disposition.
*Note importante : les données mises à disposition sont anonymisées mais demeurent néanmoins confidentielles. Il est donc interdit de diffuser et partager ces données en dehors du cadre du projet.*
Problématique métier
L'entreprise de transport exploite une flotte de véhicules qui circule pendant les horaires de service. Lorsqu'un problème survient sur un véhicule, le conducteur est chargé de faire un signalement décrivant le problème perçu. Le conducteur réalise son signalement via une console électronique dans le véhicule lui permettant de saisir trois informations :
- l'organe siège de l'anomalie ;
- le symptôme observé ;
- une liste d'informations contextuelles sur le lieu ou le phénomène observé.
Il est important d'avoir à l'esprit que ce signalement est une appréciation du conducteur et que ce dernier peut bien sûr se tromper sur les informations saisies.
En fin de service, le véhicule retourne au dépôt. Les signalements effectués sont transmis dans l'outil de gestion de la maintenance (GMAO). Chaque signalement donne lieu à un ordre de travail (OT). Chaque véhicule ayant un OT reste à l'atelier de maintenance jusqu'à ce qu'un mainteneur résolve le problème et clôture l'OT. Pour ce faire, le mainteneur en charge de l'OT réalisera une ou plusieurs actions de maintenance, appelées ordres de réparation (ODR).
L'objectif de ce projet est d'aider les mainteneurs en leur recommandant la ou les actions de maintenance les plus appropriées compte tenu des informations provenant du signalement conducteur et des caractéristiques du véhicule (kilométrage, type de moteur, marque, etc.).
Travaux à réaliser
Ce travail correspond au développement d'un moteur d'aide au diagnostic et à la recommandation de maintenance. Il s'agit donc en pratique d'élaborer un modèle permettant de déduire d'un signalement de panne et des caractéristiques d'un véhicule en maintenance, la localisation de la panne (SYSTEM_N1, SYSTEM_N2, SYSTEM_N3) et l'action de maintenance à réaliser (ODR) permettant de remettre le véhicule en service.
Présentation des données
Deux sources de données sont mises à disposition dans ce projet :
- Les données
OT-ODRcontenant les OT et ODR associés de la flotte de véhicules entre 2011 et 2019. - Les données
EQUIPEMENTScontenant les caractéristiques des véhicules.
import pandas as pd import os ot_odr_filename = os.path.join(".", "OT_ODR.csv.bz2") ot_odr_df = pd.read_csv(ot_odr_filename, compression="bz2", sep=";") equipements_filename = os.path.join(".", 'EQUIPEMENTS.csv') equipements_df = pd.read_csv(equipements_filename, sep=";")
Données OT-ODR
Le Tableau 1 donne une description des variables du jeu de données OT-ODR.
| Colonne | Description |
|---|---|
| OT_ID | ID de l'ordre de travail |
| ODR_ID | ID de l'ordre de réparation |
| ODR_LIBELLE | Libellé de l'ordre de réparation (action de maintenance) |
| TYPE_TRAVAIL | Type d'action réalisée associé à l'ODR |
| DUREE_TRAVAIL | Durée de l'action de maintenance associé à l'ODR |
| SYSTEM_N1 | Identifiant de système de niveau 1 concerné par l'ODR (niveau macroscopique) |
| SYSTEM_N2 | Identifiant de système de niveau 2 concerné par l'ODR |
| SYSTEM_N3 | Identifiant de système de niveau 3 concerné par l'ODR (niveau le plus précis) |
| EQU_ID | Identifiant du véhicule concerné par l'OT |
| DATE_OT | Date de création de l'OT |
| KILOMETRAGE | Nombre de kilométres parcourus par le véhicule au moment de la création de l'OT |
| SIG_ORGANE | Signalement du conducteur sur la partie organe |
| SIG_CONTEXTE | Signalement du conducteur sur le contexte de l'anomalie |
| SIG_OBS | Signalement du conducteur sur le symptôme observé |
| LIGNE | Identifiant de la ligne du véhicule au moment du signalement conducteur |
Données EQUIPEMENTS
Le Tableau 2 donne une description des variables du jeu de données EQUIPEMENTS.
| Colonne | Description |
|---|---|
| EQU_ID | Identifiant du véhicule |
| MODELE | Modèle du véhicule |
| CONSTRUCTEUR | Constructeur du véhicule |
| MOTEUR | Type de motorisation du véhicule |
Pour se lancer en douceur
Chargement et brève analyse descriptive
Chargement des données :
import pandas as pd import os ot_odr_filename = os.path.join(".", "OT_ODR.csv.bz2") ot_odr_df = pd.read_csv(ot_odr_filename, compression="bz2", sep=";") equipements_filename = os.path.join(".", 'EQUIPEMENTS.csv') equipements_df = pd.read_csv(equipements_filename, sep=";")
Analyse des modalités des variables de signalement :
var_sig = ["SIG_ORGANE", "SIG_CONTEXTE", "SIG_OBS"] ot_odr_df[var_sig].describe()
SIG_ORGANE SIG_CONTEXTE SIG_OBS
count 506558 506558 506558
unique 116 5509 59
top ECLAIRAGE FEUX EXTERIEURS ARRIERE NE FONCTIONNE PAS
freq 189559 32095 150740
Analyse des modalités des variables systèmes :
var_sys = ["SYSTEM_N1", "SYSTEM_N2", "SYSTEM_N3"] ot_odr_df[var_sys].describe()
SYSTEM_N1 SYSTEM_N2 SYSTEM_N3
count 506558 506558 506558
unique 10 45 150
top EQUIPEMENT ELECTRIQUE ECLAIRAGE-SIGNALISATION ECLAIRAGE-SIGNALISATION EXT
freq 285348 261949 245663
Analyse des modalités des variables type travail et OdR :
var_odr = ["TYPE_TRAVAIL", "ODR_LIBELLE"] ot_odr_df[var_odr].describe()
TYPE_TRAVAIL ODR_LIBELLE
count 506558 506558
unique 12 1410
top ELECTRICITE REMPLACEMENT D'UNE LAMPE DE CODE / PHARE
freq 258129 40302
Préparation des données
On change le type des variables catégorielles avec la méthode .astype('category') :
var_cat = ['ODR_LIBELLE', 'TYPE_TRAVAIL', 'SYSTEM_N1', 'SYSTEM_N2', 'SYSTEM_N3', 'SIG_ORGANE', 'SIG_CONTEXTE', 'SIG_OBS', 'LIGNE'] for var in var_cat: ot_odr_df[var] = ot_odr_df[var].astype('category') ot_odr_df.info()
Note: Ceci est nécessaire pour utiliser la fonction .fit de la librairie pyagrum_extra.
Création d'un premier modèle
Nous proposons de créer un modèle permettant d'expliquer la variable SYSTEM_N1 à partir de
SIG_OBS.
On commence par créer les variables du réseau.
import pyAgrum as gum var_to_model = ["SYSTEM_N1", "SIG_OBS"] var_bn = {} for var in var_to_model: nb_values = len(ot_odr_df[var].cat.categories) var_bn[var] = gum.LabelizedVariable(var, var, nb_values)
On renseigne les modalités des variables pour être fidèle à celles des données.
for var in var_bn: for i, modalite in enumerate(ot_odr_df[var].cat.categories): var_bn[var].changeLabel(i, modalite)
Ensuite, on crée le réseau bayésien et on ajoute les variables sélectionnées.
bn = gum.BayesNet("modèle simple") for var in var_bn.values(): bn.add(var)
Pour finir, on fixe la structure.
bn.addArc("SIG_OBS", "SYSTEM_N1")
Nous pouvons utiliser temporairement un notebook Jupyter afin de vérifier graphiquement la structure et les LPC de notre modèle.
import pyAgrum.lib.notebook as gnb bn
Loi de probabilité de SIG_OBS :
bn.cpt("SIG_OBS")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
# #+BEGIN_SRC python :session :results silent :exports code
# #+END_SRC
Loi de probabilité de SYSTEM_N1 | SIG_OBS :
bn.cpt("SYSTEM_N1")
|
|
|
|
|
|
|
|
|
|
| |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
On remarque naturellement que les LPC ne contiennent pour l'instant que des zéros…
Apprentissage des LPC
Pour apprendre les paramètres des LPC à partir des données, vous pouvez utiliser la classe
gum.BNLearner et en particulier la méthode fitParameters:
learner = gum.BNLearner(ot_odr_df[var_to_model])
learner.fitParameters(bn)
Filename : /tmp/tmpi4x0mm49.csv Size : (506558,2) Variables : SYSTEM_N1[10], SIG_OBS[59] Induced types : True Missing values : False Algorithm : MIIC Score : BDeu (Not used for constraint-based algorithms) Correction : MDL (Not used for score-based algorithms) Prior : -
Après apprentissage, nous obtenons les LPC suivantes.
Loi de probabilité de SIG_OBS :
bn.cpt("SIG_OBS")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0032 | 0.0978 | 0.0000 | 0.0084 | 0.0001 | 0.0016 | 0.0004 | 0.0278 | 0.0000 | 0.0001 | 0.0152 | 0.0005 | 0.1964 | 0.0053 | 0.0047 | 0.0005 | 0.0263 | 0.0000 | 0.0063 | 0.0005 | 0.0003 | 0.0077 | 0.0034 | 0.0155 | 0.0004 | 0.0002 | 0.0010 | 0.0745 | 0.0436 | 0.0036 | 0.0011 | 0.0145 | 0.0050 | 0.0090 | 0.0000 | 0.0077 | 0.0220 | 0.0000 | 0.0000 | 0.0001 | 0.2976 | 0.0022 | 0.0016 | 0.0001 | 0.0002 | 0.0245 | 0.0008 | 0.0003 | 0.0000 | 0.0003 | 0.0000 | 0.0010 | 0.0004 | 0.0003 | 0.0003 | 0.0013 | 0.0015 | 0.0494 | 0.0135 |
Loi de probabilité de SYSTEM_N1 | SIG_OBS :
bn.cpt("SYSTEM_N1")
|
|
|
|
|
|
|
|
|
|
| |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.0006 | 0.3728 | 0.0075 | 0.0752 | 0.0827 | 0.1548 | 0.1529 | 0.1222 | 0.0013 | 0.0301 | |
| 0.0000 | 0.0009 | 0.0362 | 0.0704 | 0.0012 | 0.0070 | 0.0004 | 0.8435 | 0.0399 | 0.0006 | |
| 0.0000 | 0.1111 | 0.0000 | 0.4444 | 0.0000 | 0.0000 | 0.0000 | 0.4444 | 0.0000 | 0.0000 | |
| 0.0002 | 0.0253 | 0.0005 | 0.7252 | 0.0002 | 0.0103 | 0.0002 | 0.2348 | 0.0007 | 0.0026 | |
| 0.0000 | 0.0000 | 0.0000 | 0.9744 | 0.0000 | 0.0000 | 0.0000 | 0.0256 | 0.0000 | 0.0000 | |
| 0.0000 | 0.6828 | 0.0050 | 0.2020 | 0.0211 | 0.0136 | 0.0012 | 0.0310 | 0.0000 | 0.0434 | |
| 0.0000 | 0.8507 | 0.0000 | 0.0498 | 0.0100 | 0.0000 | 0.0000 | 0.0896 | 0.0000 | 0.0000 | |
| 0.0001 | 0.0852 | 0.0370 | 0.5294 | 0.0302 | 0.0138 | 0.0072 | 0.1701 | 0.1112 | 0.0159 | |
| 0.0000 | 0.0000 | 0.0000 | 0.1250 | 0.0000 | 0.6250 | 0.2500 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.9091 | 0.0303 | 0.0303 | 0.0303 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0018 | 0.2973 | 0.0788 | 0.1895 | 0.1209 | 0.1692 | 0.0102 | 0.0666 | 0.0181 | 0.0477 | |
| 0.0000 | 0.0335 | 0.0037 | 0.0372 | 0.0297 | 0.6580 | 0.0335 | 0.1859 | 0.0000 | 0.0186 | |
| 0.0000 | 0.0078 | 0.0093 | 0.4506 | 0.0008 | 0.0028 | 0.0008 | 0.5212 | 0.0060 | 0.0006 | |
| 0.0004 | 0.3625 | 0.0030 | 0.4850 | 0.0491 | 0.0206 | 0.0052 | 0.0566 | 0.0007 | 0.0169 | |
| 0.0000 | 0.0529 | 0.0063 | 0.0944 | 0.0364 | 0.1562 | 0.0169 | 0.5887 | 0.0326 | 0.0157 | |
| 0.0000 | 0.8165 | 0.0036 | 0.0396 | 0.0468 | 0.0216 | 0.0000 | 0.0683 | 0.0000 | 0.0036 | |
| 0.0000 | 0.0139 | 0.0047 | 0.6333 | 0.0076 | 0.0073 | 0.0010 | 0.3261 | 0.0051 | 0.0007 | |
| 0.0000 | 0.0526 | 0.0000 | 0.0000 | 0.6842 | 0.1579 | 0.0000 | 0.0000 | 0.0526 | 0.0526 | |
| 0.0003 | 0.6489 | 0.0019 | 0.0709 | 0.0803 | 0.0244 | 0.0034 | 0.0269 | 0.0006 | 0.1425 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0038 | 0.0000 | 0.0000 | 0.0000 | 0.0460 | 0.9502 | 0.0000 | |
| 0.0000 | 0.1849 | 0.0000 | 0.6096 | 0.0000 | 0.0137 | 0.0068 | 0.1438 | 0.0342 | 0.0068 | |
| 0.0000 | 0.0240 | 0.0018 | 0.7327 | 0.0036 | 0.0059 | 0.0008 | 0.2170 | 0.0138 | 0.0005 | |
| 0.0075 | 0.5982 | 0.0034 | 0.1682 | 0.1056 | 0.0201 | 0.0029 | 0.0511 | 0.0000 | 0.0431 | |
| 0.0000 | 0.0243 | 0.0018 | 0.8038 | 0.0029 | 0.0098 | 0.0005 | 0.1551 | 0.0014 | 0.0004 | |
| 0.0000 | 0.0050 | 0.0000 | 0.0550 | 0.0050 | 0.0200 | 0.0000 | 0.8600 | 0.0550 | 0.0000 | |
| 0.0000 | 0.0097 | 0.0000 | 0.8932 | 0.0000 | 0.0000 | 0.0000 | 0.0971 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0121 | 0.0020 | 0.8508 | 0.0020 | 0.0040 | 0.0000 | 0.0907 | 0.0040 | 0.0343 | |
| 0.0002 | 0.0349 | 0.0440 | 0.3531 | 0.0317 | 0.0170 | 0.0045 | 0.4103 | 0.0952 | 0.0092 | |
| 0.0000 | 0.0483 | 0.0598 | 0.1745 | 0.1246 | 0.2497 | 0.0042 | 0.0343 | 0.0011 | 0.3035 | |
| 0.0006 | 0.0477 | 0.1176 | 0.0544 | 0.2958 | 0.3929 | 0.0072 | 0.0466 | 0.0033 | 0.0339 | |
| 0.0000 | 0.0087 | 0.0017 | 0.2686 | 0.0711 | 0.0121 | 0.0000 | 0.6239 | 0.0139 | 0.0000 | |
| 0.0000 | 0.0024 | 0.2501 | 0.1608 | 0.0161 | 0.0424 | 0.0011 | 0.5083 | 0.0151 | 0.0037 | |
| 0.0000 | 0.0520 | 0.0268 | 0.1304 | 0.0575 | 0.2316 | 0.0161 | 0.3588 | 0.0835 | 0.0433 | |
| 0.0000 | 0.0051 | 0.0590 | 0.3833 | 0.0053 | 0.0121 | 0.0051 | 0.4279 | 0.1014 | 0.0009 | |
| 0.0000 | 0.3333 | 0.0000 | 0.5556 | 0.1111 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0157 | 0.0010 | 0.8354 | 0.0008 | 0.0028 | 0.0000 | 0.1432 | 0.0005 | 0.0005 | |
| 0.0000 | 0.0061 | 0.0128 | 0.2809 | 0.0078 | 0.0552 | 0.0009 | 0.6167 | 0.0169 | 0.0027 | |
| 0.0000 | 0.0000 | 0.0000 | 0.6667 | 0.0000 | 0.0000 | 0.0000 | 0.2222 | 0.1111 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 1.0000 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0172 | 0.0000 | 0.0000 | 0.0000 | 0.0345 | 0.9483 | 0.0000 | |
| 0.0000 | 0.0078 | 0.0218 | 0.0351 | 0.0009 | 0.0024 | 0.0004 | 0.8636 | 0.0672 | 0.0007 | |
| 0.0000 | 0.0098 | 0.0036 | 0.0134 | 0.0134 | 0.8481 | 0.0241 | 0.0536 | 0.0018 | 0.0322 | |
| 0.0000 | 0.0417 | 0.3068 | 0.0644 | 0.1705 | 0.2740 | 0.0101 | 0.0745 | 0.0215 | 0.0366 | |
| 0.0000 | 0.0238 | 0.0000 | 0.8095 | 0.0000 | 0.0000 | 0.0000 | 0.1667 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0673 | 0.0000 | 0.0481 | 0.0096 | 0.3558 | 0.3942 | 0.1250 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0114 | 0.0010 | 0.7627 | 0.0004 | 0.0056 | 0.0002 | 0.2173 | 0.0008 | 0.0006 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0025 | 0.0000 | 0.0051 | 0.0000 | 0.0000 | 0.9924 | 0.0000 | |
| 0.0000 | 0.0000 | 0.0755 | 0.7547 | 0.0000 | 0.0377 | 0.0000 | 0.0943 | 0.0314 | 0.0063 | |
| 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.5000 | 0.0000 | 0.5000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.2418 | 0.0000 | 0.7059 | 0.0065 | 0.0000 | 0.0000 | 0.0261 | 0.0131 | 0.0065 | |
| 0.0000 | 1.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | |
| 0.0000 | 0.0181 | 0.0040 | 0.2254 | 0.0040 | 0.0101 | 0.0000 | 0.7324 | 0.0060 | 0.0000 | |
| 0.0168 | 0.2849 | 0.0056 | 0.0447 | 0.4413 | 0.0615 | 0.0056 | 0.1229 | 0.0000 | 0.0168 | |
| 0.0000 | 0.1707 | 0.0061 | 0.0061 | 0.7378 | 0.0183 | 0.0000 | 0.0549 | 0.0000 | 0.0061 | |
| 0.0000 | 0.0233 | 0.0000 | 0.9535 | 0.0000 | 0.0000 | 0.0000 | 0.0233 | 0.0000 | 0.0000 | |
| 0.0000 | 0.2006 | 0.0000 | 0.7021 | 0.0029 | 0.0708 | 0.0000 | 0.0192 | 0.0000 | 0.0044 | |
| 0.0014 | 0.2299 | 0.0068 | 0.1646 | 0.0503 | 0.3687 | 0.0544 | 0.0844 | 0.0122 | 0.0272 | |
| 0.0001 | 0.0289 | 0.0224 | 0.0353 | 0.1466 | 0.3563 | 0.0071 | 0.3584 | 0.0068 | 0.0381 | |
| 0.0000 | 0.0041 | 0.0032 | 0.0456 | 0.0209 | 0.0088 | 0.0054 | 0.8619 | 0.0486 | 0.0015 | |
Prédictions
À ce stade, vous pouvez reprendre la fonction predict que nous avons utilisée dans ce TD pour réaliser des prédictions d'une variable cible à
partir de données. Chaque ligne des données fournies est utilisée comme évidence (conditionnement)
pour calculer la loi de la variable cible sachant les données observées.
pred_prob = predict(bn, data=ot_odr_df[["SIG_OBS"]].iloc[-1000:], var_target="SYSTEM_N1", show_progress=True) pred_var = pred_prob.idxmax(axis=1).rename("pred")
On finit par évaluer le taux de prédictions du modèle par rapport aux données observées.
(ot_odr_df["SYSTEM_N1"].iloc[-1000:] == pred_var).mean()
0.65
Et la matrice de confusion associée :
pd.crosstab(ot_odr_df["SYSTEM_N1"].iloc[-1000:], pred_var)
| SYSTEM_N1 | EQUIPEMENT CHASSIS | EQUIPEMENT DE CARROSSERIE | EQUIPEMENT DE FREINAGE | EQUIPEMENT DE MOTORISATION | EQUIPEMENT ELECTRIQUE | EQUIPEMENT EMBARQUE | EQUIPEMENT PNEUMATIQUE |
|---|---|---|---|---|---|---|---|
| EQUIPEMENT CHASSIS | 9 | 7 | 0 | 0 | 10 | 0 | 5 |
| EQUIPEMENT CLIMATIQUE | 0 | 3 | 0 | 3 | 8 | 0 | 2 |
| EQUIPEMENT DE CARROSSERIE | 2 | 56 | 0 | 1 | 138 | 0 | 10 |
| EQUIPEMENT DE FREINAGE | 4 | 3 | 4 | 0 | 16 | 0 | 8 |
| EQUIPEMENT DE MOTORISATION | 3 | 2 | 0 | 6 | 25 | 0 | 16 |
| EQUIPEMENT DE TRANSMISSION | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| EQUIPEMENT ELECTRIQUE | 2 | 20 | 0 | 0 | 555 | 0 | 1 |
| EQUIPEMENT EMBARQUE | 0 | 5 | 0 | 0 | 49 | 6 | 0 |
| EQUIPEMENT PNEUMATIQUE | 4 | 0 | 0 | 0 | 2 | 0 | 14 |
Attention : On notera que dans cet exemple, nous n'avons pas mis en place un schéma d'évaluation faisant intervenir des données d'apprentissage et des données de test.
À vous de jouer à présent !