Importation et préparation des données¶

In [ ]:
#changement de dossier
import os
os.chdir("C:/Users/ricco/Desktop/demo")

#importation des données
import pandas
df = pandas.read_excel("working_condition.xls")
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 432 entries, 0 to 431
Data columns (total 8 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   CLASSE         432 non-null    object 
 1   profdev        432 non-null    float64
 2   conflict       432 non-null    float64
 3   regulat        432 non-null    float64
 4   jobvar         432 non-null    float64
 5   workgrp        432 non-null    float64
 6   standrds       432 non-null    float64
 7   SAMPLE_STATUS  432 non-null    object 
dtypes: float64(6), object(2)
memory usage: 27.1+ KB
In [ ]:
#partition train-test -- utilisation de la colonne SAMPLE_STATUS
#effectifs
df.SAMPLE_STATUS.value_counts()
Out[ ]:
train    232
test     200
Name: SAMPLE_STATUS, dtype: int64
In [ ]:
#éch. d'apprentissage + evacuer la variable SAMPLE_STATUS
dfTrain = df.loc[df.SAMPLE_STATUS=="train"][df.columns[:-1]]
dfTrain.shape
Out[ ]:
(232, 7)
In [ ]:
#éch. test
dfTest = df.loc[df.SAMPLE_STATUS=="test"][df.columns[:-1]]
dfTest.shape
Out[ ]:
(200, 7)

Analyse discriminante prédictive¶

Modélisation - Inspection des résultats¶

In [ ]:
#lda - instanciation
from discriminant_analysis import LinearDiscriminantAnalysis as LDA
adl = LDA(dfTrain,"CLASSE")

#entraînement sur les données d'apprentissage
adl.fit()
Attention :  0  observations ont été supprimées.
In [ ]:
#informations générales
print(f"Variable cible : {adl.classEtiquette}")
print(f"Classes : {adl.classNames}")
print(f"Nombre d'explicatives : {adl.p}")      
print(f"Noms des variables {adl.varNames}")
Variable cible : CLASSE
Classes : ['good' 'poor']
Nombre d'explicatives : 6
Noms des variables ['profdev', 'conflict', 'regulat', 'jobvar', 'workgrp', 'standrds']
In [ ]:
#coefficients des fonctions discriminantes
pandas.DataFrame(adl.coef_,index=dfTrain.columns[1:],columns=['good','poor'])
Out[ ]:
good poor
profdev 0.854752 -0.097835
conflict 2.848816 3.029632
regulat 4.947790 5.437828
jobvar 0.533710 0.641023
workgrp 5.865712 4.935636
standrds 5.587691 5.801884
In [ ]:
#constantes
adl.intercept_
Out[ ]:
array([[-51.64617221, -47.38139047]])
In [ ]:
#Wb - livre, page 60
#obtenu directement ici
adl.Wb

#Vb
adl.Vb

#lambda de Wilks
import numpy
wilks = numpy.linalg.det(adl.Wb)/numpy.linalg.det(adl.Vb)
wilks
Out[ ]:
0.666617467385988
In [ ]:
#reporting - rapport de traitements
from reporting import HTML
HTML().discrim_html_output(adl, "./output.html")

Prédiction et évaluation en test¶

In [ ]:
#prédiction en test
pred = adl.predict(dfTest[dfTest.columns[1:]])
numpy.unique(pred,return_counts=True)
Out[ ]:
(array(['good', 'poor'], dtype=object), array([133,  67], dtype=int64))
In [ ]:
#matrice de confusion
adl.confusion_matrix(dfTest.CLASSE,pred)
Out[ ]:
array([[109.,  24.],
       [ 22.,  45.]])

Sélection de variables¶

Backward¶

In [ ]:
#sélection backward
adl.stepdisc(0.01, "backward")

#retracer les calculs - variables retirées à chaque étape
adl.stepdiscSummary
Out[ ]:
R-carre F-statistique p-value Lambda de Wilks
jobvar 0.001168 0.263134 0.608479 0.667397
conflict 0.002418 0.547783 0.459993 0.669015
standrds 0.005783 1.320430 0.251724 0.672906
In [ ]:
#variables sélectionnées (restantes), dernière étape des calculs
adl.infoStepResults
Out[ ]:
R-carre F-statistique p-value Lambda de Wilks
regulat 0.038182 9.051172 0.002920 0.699619
profdev 0.078768 19.494742 0.000016 0.730442
workgrp 0.086738 21.654410 0.000006 0.736816

Forward¶

In [ ]:
#sélection forward
adl.stepdisc(0.01, "forward")

#retracer les calculs - variables sélectionnées à chaque étape
adl.stepdiscSummary
Out[ ]:
R-carre F-statistique p-value Lambda de Wilks
workgrp 0.238274 71.945713 2.664535e-15 0.761726
profdev 0.081534 20.328890 1.041109e-05 0.699619
regulat 0.038182 9.051172 2.920067e-03 0.672906
In [ ]:
#variables non-sélectionnées, dernière étape des calculs
adl.infoStepResults
Out[ ]:
R-carre F-statistique p-value Lambda de Wilks
standrds 0.005783 1.320430 0.251724 0.669015
jobvar 0.003071 0.699176 0.403940 0.670840
conflict 0.001667 0.379099 0.538703 0.671784