Regressione logistica con R Strumenti quantitativi per la gestione

Transcript

Regressione logistica con R Strumenti quantitativi per la gestione
3/30/2015
Regressione logistica con R
Regressione logistica con R
Strumenti quantitativi per la gestione
Emanuele Taufer
Data set Discrim.dat
Cambiare i nomi delle variabili
Statistiche di sintesi
Regressione logistica
Output alternativi
Fit del modello
Previsione
Tavola di classificazione
Analisi separata per M, F
Data set Discrim.dat
Il data set contiene n
HIRING (Y ) : 0
= 28
esiti di procedure di assunzione
= No
; 1
= Si
EDUCATION (X1 ) : Anni di educazione universitaria (4, 6, 8)
EXPERIENCE (X2 ) : Anni di esperienza lavorativa
GENDER (X3 ) : 0
= F
; 1
= M
Obbiettivi dell’analisi:
Stimare la probabilità di essere assunti in base alle caratteristiche del candidato
Determinare l’impatto di ciascun predittore sulla probabilità di essere assunti
Verificare formalmente (con un test) se esista discriminazione tra sessi
Leggiamo il file in R e verifichiamone le caratteristiche.
Dis<‐read.table("http://www.cs.unitn.it/~taufer/Data/Discrim.dat",header=T)
str(Dis)
'data.frame': 28 obs. of 4 variables:
$ HIRING : int 0 0 1 1 0 1 0 0 0 1 ...
$ EDUCATION : int 6 4 6 6 4 8 4 4 6 8 ...
$ EXPERIENCE: int 2 0 6 3 1 3 2 4 1 10 ...
$ GENDER : int 0 1 1 1 0 0 1 0 0 0 ...
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
1/7
3/30/2015
Regressione logistica con R
head(Dis)
HIRING EDUCATION EXPERIENCE GENDER
1 0 6 2 0
2 0 4 0 1
3 1 6 6 1
4 1 6 3 1
5 0 4 1 0
6 1 8 3 0
Si noti che le variabili HIRING e GENDER sono classificate come numeriche. Riclassifichiamole come
factor e assegnamo dei nomi ai livelli
Dis$HIRING<‐factor(Dis$HIRING,c(0,1),c("No","Si"))
Dis$GENDER<‐factor(Dis$GENDER,c(0,1),c("F","M"))
str(Dis)
'data.frame': 28 obs. of 4 variables:
$ HIRING : Factor w/ 2 levels "No","Si": 1 1 2 2 1 2 1 1 1 2 ...
$ EDUCATION : int 6 4 6 6 4 8 4 4 6 8 ...
$ EXPERIENCE: int 2 0 6 3 1 3 2 4 1 10 ...
$ GENDER : Factor w/ 2 levels "F","M": 1 2 2 2 1 1 2 1 1 1 ...
head(Dis)
HIRING EDUCATION EXPERIENCE GENDER
1 No 6 2 F
2 No 4 0 M
3 Si 6 6 M
4 Si 6 3 M
5 No 4 1 F
6 Si 8 3 F
Cambiare i nomi delle variabili
Se, per varie ragioni, si preferisce cambiare i nomi alle variabili del data frame, questo può esser fatto
molto semplicemente con la funzione names()
names(Dis)[1]<‐"assunto"
names(Dis)[2]<‐"educ"
names(Dis)[3]<‐"exp"
names(Dis)[4]<‐"genere"
head(Dis)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
2/7
3/30/2015
Regressione logistica con R
assunto educ exp genere
1 No 6 2 F
2 No 4 0 M
3 Si 6 6 M
4 Si 6 3 M
5 No 4 1 F
6 Si 8 3 F
Statistiche di sintesi
summary(Dis)
assunto educ exp genere
No:19 Min. :4.000 Min. : 0.000 F:15 Si: 9 1st Qu.:4.000 1st Qu.: 1.000 M:13 Median :6.000 Median : 3.000 Mean :5.571 Mean : 3.893 3rd Qu.:6.000 3rd Qu.: 5.250 Max. :8.000 Max. :12.000 table(Dis$genere,Dis$assunto)
No Si
F 12 3
M 7 6
Su 15 F che hanno fatto domanda, 3 sono state assunte (0.2%)
Su 13 M che hanno fatto domanda, 6 sono stati assunti (0.46%)
Regressione logistica
Creiamo l’oggetto glm.fit che contiene i risultati della procedura glm sui dati Discrim. L’opzione
family=binomial produce un modello di regressione logistica
glm.fit<‐glm(assunto~educ+exp+genere,data=Dis, family=binomial)
summary(glm.fit)
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
3/7
3/30/2015
Regressione logistica con R
Call:
glm(formula = assunto ~ educ + exp + genere, family = binomial, data = Dis)
Deviance Residuals: Min 1Q Median 3Q Max ‐1.4380 ‐0.4573 ‐0.1009 0.1294 2.1804 Coefficients:
Estimate Std. Error z value Pr(>|z|) (Intercept) ‐14.2483 6.0805 ‐2.343 0.0191 *
educ 1.1549 0.6023 1.917 0.0552 .
exp 0.9098 0.4293 2.119 0.0341 *
genereM 5.6037 2.6028 2.153 0.0313 *
‐‐‐
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 35.165 on 27 degrees of freedom
Residual deviance: 14.735 on 24 degrees of freedom
AIC: 22.735
Number of Fisher Scoring iterations: 7
Output alternativi
E’ possibile ottenere singole parti dell’oggetto glm.fit . Si vedano alcuni esempi sotto
coef(glm.fit)
(Intercept) educ exp genereM ‐14.2482575 1.1548804 0.9098486 5.6036794 summary(glm.fit)$coef
Estimate Std. Error z value Pr(>|z|)
(Intercept) ‐14.2482575 6.0805351 ‐2.343257 0.01911620
educ 1.1548804 0.6022944 1.917468 0.05517846
exp 0.9098486 0.4292934 2.119410 0.03405584
genereM 5.6036794 2.6027819 2.152958 0.03132200
summary(glm.fit)$coef[,4]
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
4/7
3/30/2015
Regressione logistica con R
(Intercept) educ exp genereM 0.01911620 0.05517846 0.03405584 0.03132200 Fit del modello
Utilizziamo la funzione predict() per ottenere le probabilità di assunzione per le unità training.
L’opzione type="response" restituisce le probabilità stimate dal modello.
glm.probs<‐predict(glm.fit,type="response")
round(glm.probs[1:10],digits=4)
1 2 3 4 5 6 7 8 9 10 0.0041 0.0175 0.9769 0.7339 0.0002 0.0928 0.0993 0.0025 0.0016 0.9835 La variabile genere ha coefficiente 5.6037. La variazione (positiva) dell’odds, a parità di altri fattori, per i
maschi è pari a e5.6037 = 271.4232
Ad esempio, una F con educazione=4 e esperienza=6 ha probabilità di essere assunta pari a 0.01522 e
odds pari a 0.01546
Un M con gli stessi livelli di esperienza ed educazione ha probabilità di essere assunto pari a 0.80753 e
odds pari a 4.1956
Si noti che 4.1956
= 0.01546 × 271.4232
Previsione
Per capire meglio come funziona il modello, stimiamo le probabilità di assunzione per alcuni casi definiti
ad hoc nel data.frame dfp
dfp<‐data.frame("educ"=c(4,4,4,4,8,8,8,8),"exp"=c(6,6,10,10,6,6,10,10),"gener
e"=c("F","M","F","M","F","M","F","M"))
Prob<‐round(predict(glm.fit,dfp,type="response"),digits=5)
dfp2<‐cbind(dfp,"Prob"=Prob)
dfp2
educ exp genere Prob
1 4 6 F 0.01522
2 4 6 M 0.80753
3 4 10 F 0.37046
4 4 10 M 0.99378
5 8 6 F 0.61061
6 8 6 M 0.99766
7 8 10 F 0.98352
8 8 10 M 0.99994
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
5/7
3/30/2015
Regressione logistica con R
In assenza di esperienze precedenti i M hanno probabilità di assunzione molto maggiore rispetto a F .
Le differenze diminuiscono all’aumentare dell’esperienza e degli anni di educazione
Tavola di classificazione
Proviamo a confrontare la classificazione ottenuta dal modello con i risultati training.
Creiamo un vettore glm.pred contenente 28 No e successivamente trasformiamo in Si gli elementi di
glm.pred corripondenti alle unità con probabilita prevista di assunzione maggiore di 0.5
( glm.probs>0.5 ).
Successivamente creiamo una tabella che incrocia le la variabile assunto con la classificazione prevista
dal modello.
glm.pred=rep("No",nrow(Dis))
glm.pred[glm.probs>0.5]="Si"
table(glm.pred,Dis$assunto)
glm.pred No Si
No 18 2
Si 1 7
Su 28 casi, il modello ne classifica 18+7 = 25 correttamente (0.89%)
Su 19 non assunti, il modello ne classifica 18 correttamente (0.95%)
Su 9 assunti, il modello ne classifica 7 correttamente (0.78%)
Analisi separata per M, F
Crea un nuovo data.frame , Dis2 , con la nuova variabile previsto : la classificazione prevista dal
modello
Dis2<‐cbind(Dis,"previsto"=glm.pred)
Analizza solo i M
table(Dis2$assunto[Dis2$genere=="M"],Dis2$previsto[Dis2$genere=="M"])
No Si
No 6 1
Si 1 5
Analizza solo le F
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
6/7
3/30/2015
Regressione logistica con R
table(Dis2$assunto[Dis2$genere=="F"],Dis2$previsto[Dis2$genere=="F"])
No Si
No 12 0
Si 1 2
file:///C:/Users/emanuele.taufer/Dropbox/3%20SQG/Labs/L4_­_RLg.html
7/7