Projet de modélisation stochastique

Table des matières

bus maintenance city 2d isometric cartoon white background

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 :

  1. l'organe siège de l'anomalie ;
  2. le symptôme observé ;
  3. 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 :

  1. Les données OT-ODR contenant les OT et ODR associés de la flotte de véhicules entre 2011 et 2019.
  2. Les données EQUIPEMENTS contenant 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.

Tableau 1 : Définition 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.

Tableau 2 : Définition 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
G SYSTEM_N1 SYSTEM_N1 SIG_OBS SIG_OBS SIG_OBS->SYSTEM_N1

Loi de probabilité de SIG_OBS :

bn.cpt("SIG_OBS")
SIG_OBS
A-COUPS
ABSENT
ALLUME
ARRACHE
ASPIRER
BALANCE
BLESSE
BLOQUE
BROUTE
BRUTAL
BRUYANT
CALE
CASSE
CLAQUE
CLIGNOTE
CREVE
DEBOITE
DECLENCHEMENT
DEGONFLE
DELOCALISE
DEREGLE
DESSERRE
DUR
ENFONCE
FAUX CONTACT
FENDU
FERME MAL
FONCTIONNE MAL
FUITE
FUME/CHAUFFE
INCOMPLET
INSUFFISANT
INTERMITTENT
INTERRUPTEUR H.S
JEU
LACERE
MANQUE
MAUVAIS
N'EMET PAS
N'ENCRE PAS
NE FONCTIONNE PAS
NE TIRE PAS
ODEUR
OUVRE MAL
PATINE
RAYE
REFUSE TITRE
SALE
SECOUSSE
TAGUE
TANGUE
TEMOIN OUVERTURE H.S
TIRE A DROITE
TIRE A GAUCHE
TORDU
USE/VIDE
VIBRE
VOYANT ALLUME
VOYANT HS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000

# #+BEGIN_SRC python :session :results silent :exports code

# #+END_SRC

Loi de probabilité de SYSTEM_N1 | SIG_OBS :

bn.cpt("SYSTEM_N1")
SYSTEM_N1
SIG_OBS
DIVERS
EQUIPEMENT CHASSIS
EQUIPEMENT CLIMATIQUE
EQUIPEMENT DE CARROSSERIE
EQUIPEMENT DE FREINAGE
EQUIPEMENT DE MOTORISATION
EQUIPEMENT DE TRANSMISSION
EQUIPEMENT ELECTRIQUE
EQUIPEMENT EMBARQUE
EQUIPEMENT PNEUMATIQUE
A-COUPS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ABSENT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ALLUME
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ARRACHE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ASPIRER
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BALANCE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BLESSE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BLOQUE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BROUTE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BRUTAL
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
BRUYANT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
CALE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
CASSE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
CLAQUE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
CLIGNOTE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
CREVE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DEBOITE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DECLENCHEMENT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DEGONFLE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DELOCALISE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DEREGLE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DESSERRE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
DUR
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ENFONCE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FAUX CONTACT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FENDU
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FERME MAL
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FONCTIONNE MAL
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FUITE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
FUME/CHAUFFE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
INCOMPLET
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
INSUFFISANT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
INTERMITTENT
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
INTERRUPTEUR H.S
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
JEU
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
LACERE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
MANQUE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
MAUVAIS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
N'EMET PAS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
N'ENCRE PAS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
NE FONCTIONNE PAS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
NE TIRE PAS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
ODEUR
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
OUVRE MAL
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
PATINE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
RAYE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
REFUSE TITRE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
SALE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
SECOUSSE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TAGUE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TANGUE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TEMOIN OUVERTURE H.S
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TIRE A DROITE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TIRE A GAUCHE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
TORDU
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
USE/VIDE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
VIBRE
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
VOYANT ALLUME
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
VOYANT HS
0.00000.00000.00000.00000.00000.00000.00000.00000.00000.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")
SIG_OBS
A-COUPS
ABSENT
ALLUME
ARRACHE
ASPIRER
BALANCE
BLESSE
BLOQUE
BROUTE
BRUTAL
BRUYANT
CALE
CASSE
CLAQUE
CLIGNOTE
CREVE
DEBOITE
DECLENCHEMENT
DEGONFLE
DELOCALISE
DEREGLE
DESSERRE
DUR
ENFONCE
FAUX CONTACT
FENDU
FERME MAL
FONCTIONNE MAL
FUITE
FUME/CHAUFFE
INCOMPLET
INSUFFISANT
INTERMITTENT
INTERRUPTEUR H.S
JEU
LACERE
MANQUE
MAUVAIS
N'EMET PAS
N'ENCRE PAS
NE FONCTIONNE PAS
NE TIRE PAS
ODEUR
OUVRE MAL
PATINE
RAYE
REFUSE TITRE
SALE
SECOUSSE
TAGUE
TANGUE
TEMOIN OUVERTURE H.S
TIRE A DROITE
TIRE A GAUCHE
TORDU
USE/VIDE
VIBRE
VOYANT ALLUME
VOYANT HS
0.00320.09780.00000.00840.00010.00160.00040.02780.00000.00010.01520.00050.19640.00530.00470.00050.02630.00000.00630.00050.00030.00770.00340.01550.00040.00020.00100.07450.04360.00360.00110.01450.00500.00900.00000.00770.02200.00000.00000.00010.29760.00220.00160.00010.00020.02450.00080.00030.00000.00030.00000.00100.00040.00030.00030.00130.00150.04940.0135

Loi de probabilité de SYSTEM_N1 | SIG_OBS :

bn.cpt("SYSTEM_N1")
SYSTEM_N1
SIG_OBS
DIVERS
EQUIPEMENT CHASSIS
EQUIPEMENT CLIMATIQUE
EQUIPEMENT DE CARROSSERIE
EQUIPEMENT DE FREINAGE
EQUIPEMENT DE MOTORISATION
EQUIPEMENT DE TRANSMISSION
EQUIPEMENT ELECTRIQUE
EQUIPEMENT EMBARQUE
EQUIPEMENT PNEUMATIQUE
A-COUPS
0.00060.37280.00750.07520.08270.15480.15290.12220.00130.0301
ABSENT
0.00000.00090.03620.07040.00120.00700.00040.84350.03990.0006
ALLUME
0.00000.11110.00000.44440.00000.00000.00000.44440.00000.0000
ARRACHE
0.00020.02530.00050.72520.00020.01030.00020.23480.00070.0026
ASPIRER
0.00000.00000.00000.97440.00000.00000.00000.02560.00000.0000
BALANCE
0.00000.68280.00500.20200.02110.01360.00120.03100.00000.0434
BLESSE
0.00000.85070.00000.04980.01000.00000.00000.08960.00000.0000
BLOQUE
0.00010.08520.03700.52940.03020.01380.00720.17010.11120.0159
BROUTE
0.00000.00000.00000.12500.00000.62500.25000.00000.00000.0000
BRUTAL
0.00000.00000.00000.90910.03030.03030.03030.00000.00000.0000
BRUYANT
0.00180.29730.07880.18950.12090.16920.01020.06660.01810.0477
CALE
0.00000.03350.00370.03720.02970.65800.03350.18590.00000.0186
CASSE
0.00000.00780.00930.45060.00080.00280.00080.52120.00600.0006
CLAQUE
0.00040.36250.00300.48500.04910.02060.00520.05660.00070.0169
CLIGNOTE
0.00000.05290.00630.09440.03640.15620.01690.58870.03260.0157
CREVE
0.00000.81650.00360.03960.04680.02160.00000.06830.00000.0036
DEBOITE
0.00000.01390.00470.63330.00760.00730.00100.32610.00510.0007
DECLENCHEMENT
0.00000.05260.00000.00000.68420.15790.00000.00000.05260.0526
DEGONFLE
0.00030.64890.00190.07090.08030.02440.00340.02690.00060.1425
DELOCALISE
0.00000.00000.00000.00380.00000.00000.00000.04600.95020.0000
DEREGLE
0.00000.18490.00000.60960.00000.01370.00680.14380.03420.0068
DESSERRE
0.00000.02400.00180.73270.00360.00590.00080.21700.01380.0005
DUR
0.00750.59820.00340.16820.10560.02010.00290.05110.00000.0431
ENFONCE
0.00000.02430.00180.80380.00290.00980.00050.15510.00140.0004
FAUX CONTACT
0.00000.00500.00000.05500.00500.02000.00000.86000.05500.0000
FENDU
0.00000.00970.00000.89320.00000.00000.00000.09710.00000.0000
FERME MAL
0.00000.01210.00200.85080.00200.00400.00000.09070.00400.0343
FONCTIONNE MAL
0.00020.03490.04400.35310.03170.01700.00450.41030.09520.0092
FUITE
0.00000.04830.05980.17450.12460.24970.00420.03430.00110.3035
FUME/CHAUFFE
0.00060.04770.11760.05440.29580.39290.00720.04660.00330.0339
INCOMPLET
0.00000.00870.00170.26860.07110.01210.00000.62390.01390.0000
INSUFFISANT
0.00000.00240.25010.16080.01610.04240.00110.50830.01510.0037
INTERMITTENT
0.00000.05200.02680.13040.05750.23160.01610.35880.08350.0433
INTERRUPTEUR H.S
0.00000.00510.05900.38330.00530.01210.00510.42790.10140.0009
JEU
0.00000.33330.00000.55560.11110.00000.00000.00000.00000.0000
LACERE
0.00000.01570.00100.83540.00080.00280.00000.14320.00050.0005
MANQUE
0.00000.00610.01280.28090.00780.05520.00090.61670.01690.0027
MAUVAIS
0.00000.00000.00000.66670.00000.00000.00000.22220.11110.0000
N'EMET PAS
0.00000.00000.00000.00000.00000.00000.00000.00001.00000.0000
N'ENCRE PAS
0.00000.00000.00000.01720.00000.00000.00000.03450.94830.0000
NE FONCTIONNE PAS
0.00000.00780.02180.03510.00090.00240.00040.86360.06720.0007
NE TIRE PAS
0.00000.00980.00360.01340.01340.84810.02410.05360.00180.0322
ODEUR
0.00000.04170.30680.06440.17050.27400.01010.07450.02150.0366
OUVRE MAL
0.00000.02380.00000.80950.00000.00000.00000.16670.00000.0000
PATINE
0.00000.06730.00000.04810.00960.35580.39420.12500.00000.0000
RAYE
0.00000.01140.00100.76270.00040.00560.00020.21730.00080.0006
REFUSE TITRE
0.00000.00000.00000.00250.00000.00510.00000.00000.99240.0000
SALE
0.00000.00000.07550.75470.00000.03770.00000.09430.03140.0063
SECOUSSE
0.00000.00000.00000.00000.00000.50000.00000.50000.00000.0000
TAGUE
0.00000.24180.00000.70590.00650.00000.00000.02610.01310.0065
TANGUE
0.00001.00000.00000.00000.00000.00000.00000.00000.00000.0000
TEMOIN OUVERTURE H.S
0.00000.01810.00400.22540.00400.01010.00000.73240.00600.0000
TIRE A DROITE
0.01680.28490.00560.04470.44130.06150.00560.12290.00000.0168
TIRE A GAUCHE
0.00000.17070.00610.00610.73780.01830.00000.05490.00000.0061
TORDU
0.00000.02330.00000.95350.00000.00000.00000.02330.00000.0000
USE/VIDE
0.00000.20060.00000.70210.00290.07080.00000.01920.00000.0044
VIBRE
0.00140.22990.00680.16460.05030.36870.05440.08440.01220.0272
VOYANT ALLUME
0.00010.02890.02240.03530.14660.35630.00710.35840.00680.0381
VOYANT HS
0.00000.00410.00320.04560.02090.00880.00540.86190.04860.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 !