#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
#partition train-test -- utilisation de la colonne SAMPLE_STATUS
#effectifs
df.SAMPLE_STATUS.value_counts()
train 232 test 200 Name: SAMPLE_STATUS, dtype: int64
#éch. d'apprentissage + evacuer la variable SAMPLE_STATUS
dfTrain = df.loc[df.SAMPLE_STATUS=="train"][df.columns[:-1]]
dfTrain.shape
(232, 7)
#éch. test
dfTest = df.loc[df.SAMPLE_STATUS=="test"][df.columns[:-1]]
dfTest.shape
(200, 7)
#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.
#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']
#coefficients des fonctions discriminantes
pandas.DataFrame(adl.coef_,index=dfTrain.columns[1:],columns=['good','poor'])
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 |
#constantes
adl.intercept_
array([[-51.64617221, -47.38139047]])
#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
0.666617467385988
#reporting - rapport de traitements
from reporting import HTML
HTML().discrim_html_output(adl, "./output.html")
#prédiction en test
pred = adl.predict(dfTest[dfTest.columns[1:]])
numpy.unique(pred,return_counts=True)
(array(['good', 'poor'], dtype=object), array([133, 67], dtype=int64))
#matrice de confusion
adl.confusion_matrix(dfTest.CLASSE,pred)
array([[109., 24.], [ 22., 45.]])
#sélection backward
adl.stepdisc(0.01, "backward")
#retracer les calculs - variables retirées à chaque étape
adl.stepdiscSummary
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 |
#variables sélectionnées (restantes), dernière étape des calculs
adl.infoStepResults
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 |
#sélection forward
adl.stepdisc(0.01, "forward")
#retracer les calculs - variables sélectionnées à chaque étape
adl.stepdiscSummary
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 |
#variables non-sélectionnées, dernière étape des calculs
adl.infoStepResults
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 |