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.
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
- Coeficiente (estimate)
- P-valor (Pr(>|z|)).
Day Mins
, Eve Mins
, Intl Mins
, CustServ Calls
, Day Calls
y Age ya que todas ellas tienen un p-valor inferior a 0,1. Night Mins
, Eve Calls
y Night Calls
ya que poseen un p-valor superior a 0,1.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
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.
- [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)
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.
0 comentarios:
Publicar un comentario