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