Modelo glm en r

Hola a todos, uno de los grandes dilemas en todo análisis de datos es conocer cuales son las variables que más nos influyen en una determinada condición.

Para conocer esto una herramienta que podemos utilizar es un modelo de regresión logística : glm.

La regresión logística nos permite conocer cuales son las variables que más influyen en el resultado de la variable analizada; por lo tanto, en este post vamos a realizar un modelo completo de regresión logística paso a paso.

El primer paso es leer el fichero que queremos analizar, en nuestro caso este fichero se encuentra en un formato Excel por lo que tenemos que instalar la librería readxl en R para poder leerlo.


library(readxl)
setwd("C:/Users/Sergi/Desktop/Blog de R")
datos <- read_excel("datos_churn.xlsx")

La formula usada en R para realizar una regresión logística es glm, antes de utilizar esta función tenemos que dividir el data set en dos; train formado por el 80% de los datos totales y en test formado por el 20% restante. Esta división se realiza mediante un método de muestreo aleatorio simple (mas, no_mas).

En la función glm tenemos que introducir la variable que queremos analizar (en nuestro caso Churn) y el resto de variables que influyen sobre dicha variable.


set.seed(515616)
mas <- sample(seq(1:nrow(datos)), ceiling(nrow(datos)*0.8))
no_mas <- which(!1:nrow(datos) %in% mas)
train <- datos[mas,]
test <- datos[no_mas,]
modelo <- glm(Churn ~ ., family = binomial(link = 'logit'), data = train)
summary(modelo)

Call:
glm(formula = Churn ~ ., family = binomial(link = "logit"), data = train)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-2.119  -0.520  -0.336  -0.188   3.061  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -5.262230   0.823289  -6.392 1.64e-10 ***
`Day Mins`        0.012578   0.001208  10.413  < 2e-16 ***
`Eve Mins`        0.006385   0.001285   4.970 6.69e-07 ***
`Night Mins`      0.002036   0.001250   1.629   0.1034    
`Intl Mins`       0.098624   0.023041   4.280 1.87e-05 ***
`CustServ Calls`  0.435844   0.044124   9.878  < 2e-16 ***
Age              -0.067486   0.005186 -13.013  < 2e-16 ***
`Day Calls`       0.006751   0.003126   2.159   0.0308 *  
`Eve Calls`       0.001641   0.003128   0.525   0.5998    
`Night Calls`     0.002334   0.003184   0.733   0.4635    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2180.4  on 2666  degrees of freedom
Residual deviance: 1692.2  on 2657  degrees of freedom
AIC: 1712.2

Number of Fisher Scoring iterations: 6
En los resultados obtenidos en la regresión tenemos que fijarnos principalmente en dos aspectos:
  • Coeficiente (estimate) 
  • P-valor (Pr(>|z|)).
Para conocer si una variable es significativa o no únicamente tenemos que fijarnos en el p-valor ya que mientras enor sea el p-valor mas significativa será esa variable. Ante esto nos encontramos que las variables más significativas son Day MinsEve MinsIntl MinsCustServ CallsDay Calls y Age ya que todas ellas tienen un p-valor inferior a 0,1. 
Las variables que no podemos considerar como no significativas son Night MinsEve Calls y Night Calls ya que poseen un p-valor superior a 0,1.
En cuanto a los coeficientes, la interpretación cambia, si nos fijamos en el coeficiente de la variable Age (-0.0674486), nos esta indicando que la probabilidad de abondonar la compañía (Churn) disminuye 0.067486 unidades por cada unidad que aumente la variable Age. 
Una forma más simple de interpretar los coeficientes es realizando su exponencial.
exp(coefficients(modelo))
     (Intercept)       `Day Mins`       `Eve Mins`     `Night Mins`      `Intl Mins` `CustServ Calls` 
     0.005183732      1.012657675      1.006405441      1.002037919      1.103651137      1.546267924 
             Age      `Day Calls`      `Eve Calls`    `Night Calls` 
     0.934741078      1.006774202      1.001642462      1.002336852 

Tras realizar la exponencial de los coeficientes del modelo, obtenemos que las variables influyen en el Churn de la siguiente manera:
  • Day Mins: Aumentar en una unidad la variable provoca un aumento del 0.012% las posibilidades de abandonar la compañía. 
  • Eve Mins: Aumentar en una unidad la variable provoca un aumento del 0.006% las posibilidades de abandonar la compañía. 
  • Night Mins: Aumentar en una unidad la variable provoca un aumento del 0.002% las posibilidades de abandonar la compañía.
  • Intl Mins: Aumentar en una unidad la variable provoca un aumento del 0.103% las posibilidades de abandonar la compañía. 
  • CustServ Calls: Aumentar en una unidad la variable provoca un aumento del 0.546% las posibilidades de abandonar la compañía. 
  • Age: Aumentar en una unidad la variable provoca un descenso del 0.07% las posibilidades de abandonar la compañía. 
  • Day Calls: Aumentar en una unidad la variable provoca un aumento del 0.006% las posibilidades de abandonar la compañía. 
  • Eve Calls: Aumentar en una unidad la variable provoca un aumento del 0.0016% las posibilidades de abandonar la compañía. 
  • Night Calls: Aumentar en una unidad la variable provoca un aumento del 0.0023% las posibilidades de abandonar la compañía.
Para conocer la calidad del modelo utilizamos el indicador AUC; el cual se puede definir como la probabilidad de que un clasificador ordenará una instancia positiva elegida aleatoriamente más alta que una negativa. Los niveles de este indicador son:
  • [0.5, 0.6): Test malo. 
  • [0.6, 0.75): Test regular. 
  • [0.75, 0.9): Test bueno. 
  • [0.9, 0.97): Test muy bueno.
  • [0.97, 1): Test excelente.

library(ROCR)
p <- predict(modelo, test, type = "response") 
pr <- prediction(p, test$Churn) 
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
plot(prf)
Modelo glm en r
auc <- performance(pr,measure = "auc")
auc <- auc@y.values[[1]]
auc

En nuestro caso nos encontramos con un auc = 0.797253: por lo que podemos decir que nuestro test es bueno. 

También nos encontramos con la curva ROC la cual es la representación de verdaderos positivos frente a falsos positivos, es decir, cogiendo un 20% de la muestra alcanzaríamos un 60% de la población.


Un saludo. 

Share on Google Plus

About Unknown

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.

0 comentarios:

Publicar un comentario