Informe fugas de clientes
Metodología seguida en el análisis
1) Lectura e inspección de datos.
Información sobre variables.
Fig1. Descripción de variables
Tipo de variables.
Inspección del archivo
## 'data.frame': 6353 obs. of 21 variables:
## $ ID : Factor w/ 6353 levels "0002-ORFBO","0003-MKNFE",..: 4858 3587 2338 4997 5879 5915 911 4316 5063 4102 ...
## $ Genero : Factor w/ 2 levels "Female","Male": 1 2 2 NA 1 1 2 1 NA 2 ...
## $ Mayor65 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
## $ Conyuge : Factor w/ 2 levels "No","Yes": 2 1 1 1 1 1 1 1 2 1 ...
## $ PersCargo : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 2 1 1 2 ...
## $ Antig.fc.edad : num 1 34 2 45 NA 8 22 10 28 62 ...
## $ Telf_serv : Factor w/ 2 levels "No","Yes": 1 2 2 1 2 2 2 1 2 2 ...
## $ VariasLineas : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 2 2 1 2 1 ...
## $ Int_serv : Factor w/ 3 levels "DSL","Fiber optic",..: 1 1 1 1 2 2 2 NA 2 1 ...
## $ Seguridad : Factor w/ 2 levels "No","Yes": 1 2 2 2 1 1 1 2 1 2 ...
## $ CopiaSeguridad : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 1 2 1 1 2 ...
## $ Antivirus_disp : Factor w/ 2 levels "No","Yes": 1 2 1 2 1 2 1 1 2 1 ...
## $ Soporte_tecnico: Factor w/ 2 levels "No","Yes": 1 1 1 2 1 1 1 1 2 1 ...
## $ TV_streaming : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 2 2 1 2 1 ...
## $ Peliculas : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 2 1 1 2 1 ...
## $ Contrato : Factor w/ 3 levels "Month-to-month",..: 1 2 1 2 1 1 1 1 1 NA ...
## $ Fact_sinPapel : Factor w/ 2 levels "No","Yes": 2 1 2 1 2 2 2 1 2 1 ...
## $ MetodoPago : Factor w/ 4 levels "Bank transfer (automatic)",..: NA 4 4 NA 3 NA 2 4 3 NA ...
## $ FacturaMes : num NA NA 53.9 42.3 70.7 ...
## $ FacturaTotal : num 29.9 1889.5 108.2 1840.8 151.7 ...
## $ Fuga : Factor w/ 2 levels "0","1": 1 1 2 1 2 2 1 1 2 1 ...
Lo primero que observamos en esta vista general. Es que la variable ID es del tipo factor y tiene más de 10 levels por lo que se decide transformar el tipo de dato a character. Al mismo tiempo se comprueba si hay ID duplicados, no es así en este caso. Por otro lado, aparte de no utilizar para modelar la variable ID del Cliente ya que no aporta información relevante tampoco no vamos a utilizar para modelar la variable Genero por motivos éticos y lesgilastivo.
## chr [1:6353] "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
Distribuciones de las variables
| Antig.fc.edad | FacturaMes | FacturaTotal | |
|---|---|---|---|
| Min. : 0.00 | Min. : 18.25 | Min. : 18.8 | |
| 1st Qu.: 9.00 | 1st Qu.: 35.55 | 1st Qu.: 394.5 | |
| Median :29.00 | Median : 70.30 | Median :1384.2 | |
| Mean :32.38 | Mean : 64.68 | Mean :2268.7 | |
| 3rd Qu.:55.00 | 3rd Qu.: 89.80 | 3rd Qu.:3781.5 | |
| Max. :72.00 | Max. :118.75 | Max. :8672.5 | |
| NA’s :394 | NA’s :394 | NA’s :11 |
Valores extraños.
A simple vista no observamos ningún valor estraño fuera de rango.
2) Depuración de los datos.
Separamos variable objetivo
## Factor w/ 2 levels "0","1": 1 1 2 1 2 2 1 1 2 1 ...
Valores atípicos
| % Outliers por variable | |
|---|---|
| Antig.fc.edad | 0 |
| FacturaMes | 0 |
| FacturaTotal | 0 |
Valores perdidos
Como podemos observar no tenemos un indice de NAs muy grande. De todas maneras agregamos una variable con el porcentaje de los mismos en cada registro para tenerlos indentificado a la hora de modelar. Estos son los 5 ID en lo que vamos a realizar un mayor número de imputaciones:
| ID | Genero | Mayor65 | Conyuge | PersCargo | Antig.fc.edad | Telf_serv | VariasLineas | Int_serv | Seguridad | CopiaSeguridad | Antivirus_disp | Soporte_tecnico | TV_streaming | Peliculas | Contrato | Fact_sinPapel | MetodoPago | FacturaMes | FacturaTotal | prop_missings |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2866-IKBTM | Female | NA | No | No | NA | Yes | No | No | No | No | No | No | No | No | Month-to-month | No | NA | 19.55 | 19.55 | 0.15 |
| 7501-IWUNG | NA | 0 | Yes | Yes | NA | Yes | No | DSL | No | No | Yes | Yes | Yes | Yes | Two year | NA | Bank transfer (automatic) | 73.80 | 4616.05 | 0.15 |
| 7596-ZYWBB | Female | NA | No | No | 65 | Yes | No | NA | Yes | Yes | No | Yes | No | No | Two year | Yes | NA | 59.60 | 3739.80 | 0.15 |
| 9489-UTFKA | Male | NA | Yes | No | 8 | NA | No | DSL | Yes | No | No | No | Yes | No | Month-to-month | No | NA | 60.90 | 551.95 | 0.15 |
| 3845-JHAMY | NA | 0 | Yes | Yes | 16 | No | No | DSL | No | No | No | No | No | Yes | NA | NA | Credit card (automatic) | 35.50 | 552.70 | 0.15 |
Finalmente imputamos, creamos dos variables de forma aleatoria y comprobamos que todo se haya realizado correctamente, como ha sido el caso:
3) Estudio de variables y relaciones con la variable objetivo.
Realizamos Vcramer para ver la relaciónes de las variables con la variable objetivo, en este caso sacaremos la variable ID ya que no aporta información, y la variable genero ya que no está permitida.
Oberservamos la variable con mayor relación que nos muestra Vcramer y la última que está después de la variable aleatorias creadas anteriormente:
Por lo tanto la variable parece tener mayor relación es el Contrato, sin embargo, es cierto que menos la variable Telf_serv el resto parece que pueden introducirse en un modelo, pero considero que la relación con la variable objetivo no es lo bastante fuerte como para modelar sobre ellas. En pricipio me decantarias con esta para tirar mis modelos manuales:
1- Contrato
2- Antig.fc.edad
3- Int_serv
4- MetodoPago
5- FacturaMes
6- Fact_sinPapel
7- FacturaTotal
8- Seguridad
9- Soporte_tecnico
10- PersCargo
11- Conyuge
12- Mayor65
Observamos el efecto producido de las variables cuantitativas sobre la variable objetivo:
Asimple vista parece que los clientes con la factura más alta al mes tienen mayor porcentaje de fuga siendo el mayor volumen entre los 70 y 110 aproximadamente. Podemos observar también como hay un mayor porcentaje de fuga de clientes en las edades de antiguedad más bajas. Además de ello parece que la factura total es más baja en el porcentaje de fuga.
Vamos a generar las transformaciones de las variable continuas que maximizan la relación con la variable objetivo binaria en sentido de V de Cramer.
Aparentemente no se observan grandes cambios en la toma de decisión anterior.
4) Modelado manual.
Tranformaciones de variables
Obeservamos la frecuencia a priori del evento. El modelo va tener dificultad a reconocer a los 0. Jugaremos con esto moviendo el punto de corte.
| n | % | val% | |
|---|---|---|---|
| 0 | 4667 | 73.5 | 73.5 |
| 1 | 1686 | 26.5 | 26.5 |
Partición training-test
Hacemos el training test de manera satifastoria.
Train:
## ID Genero Mayor65 Conyuge PersCargo Antig.fc.edad Telf_serv
## 1 7590-VHVEG Female 0 Yes No 1.0000 No
## 2 5575-GNVDE Male 0 No No 34.0000 Yes
## 3 3668-QPYBK Male 0 No No 2.0000 Yes
## 4 7795-CFOCW Male 0 No No 45.0000 No
## 5 9237-HQITU Female 0 No No 3.1065 Yes
## 6 9305-CDSKC Female 0 No No 8.0000 Yes
## VariasLineas Int_serv Seguridad CopiaSeguridad Antivirus_disp
## 1 No DSL No Yes No
## 2 No DSL Yes No Yes
## 3 No DSL Yes Yes No
## 4 No DSL Yes No Yes
## 5 No Fiber optic No No No
## 6 Yes Fiber optic No No Yes
## Soporte_tecnico TV_streaming Peliculas Contrato Fact_sinPapel
## 1 No No No Month-to-month Yes
## 2 No No No One year No
## 3 No No No Month-to-month Yes
## 4 Yes No No One year No
## 5 No No No Month-to-month Yes
## 6 No Yes Yes Month-to-month Yes
## MetodoPago FacturaMes FacturaTotal prop_missings aleatorio
## 1 Electronic check 19.2566 29.85 0.10 0.92163280
## 2 Mailed check 67.0001 1889.50 0.05 0.83895342
## 3 Mailed check 53.8500 108.15 0.00 0.02288899
## 4 Mailed check 42.3000 1840.75 0.10 0.92191105
## 5 Electronic check 70.7000 151.65 0.05 0.38401648
## 6 Bank transfer (automatic) 99.6500 820.50 0.05 0.70754461
## aleatorio2 sqrtxAntig.fc.edad raiz4FacturaMes raiz4FacturaTotal varObjBin
## 1 0.7283252 0.2027006 0.4288528 0.2657864 0
## 2 0.9845922 1.1800855 1.1300450 0.9539303 0
## 3 0.1655129 0.2864307 1.0446437 0.4462204 1
## 4 0.1921999 1.3576106 0.9470901 0.9476546 0
## 5 0.2725716 0.3568742 1.1508997 0.4926367 1
## 6 0.9770073 0.5725141 1.2845582 0.7718555 1
| n | % | val% | |
|---|---|---|---|
| 0 | 3734 | 73.5 | 73.5 |
| 1 | 1349 | 26.5 | 26.5 |
Test:
| n | % | val% | |
|---|---|---|---|
| 0 | 933 | 73.5 | 73.5 |
| 1 | 337 | 26.5 | 26.5 |
#pruebo un primer modelo sin las transformadas
modeloInicial<-glm(varObjBin~.,data=data_train[,-c(1:2)],family=binomial)
summary(modeloInicial)##
## Call:
## glm(formula = varObjBin ~ ., family = binomial, data = data_train[,
## -c(1:2)])
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0971 -0.6660 -0.3097 0.6784 3.1666
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.523e-01 2.230e-01 -1.131 0.258056
## Mayor651 2.655e-01 1.008e-01 2.633 0.008471 **
## ConyugeYes -5.484e-02 9.180e-02 -0.597 0.550257
## PersCargoYes -1.916e-01 1.047e-01 -1.830 0.067237 .
## Antig.fc.edad -2.247e-02 3.751e-03 -5.990 2.09e-09 ***
## Telf_servYes -6.478e-01 1.627e-01 -3.981 6.85e-05 ***
## VariasLineasYes 3.426e-01 9.480e-02 3.614 0.000302 ***
## Int_servFiber optic 8.303e-01 1.288e-01 6.448 1.13e-10 ***
## Int_servNo -5.604e-01 1.664e-01 -3.369 0.000756 ***
## SeguridadYes -4.988e-01 1.029e-01 -4.846 1.26e-06 ***
## CopiaSeguridadYes -1.883e-01 9.471e-02 -1.988 0.046765 *
## Antivirus_dispYes -6.179e-02 9.621e-02 -0.642 0.520751
## Soporte_tecnicoYes -3.534e-01 1.028e-01 -3.438 0.000587 ***
## TV_streamingYes 3.344e-01 1.017e-01 3.288 0.001010 **
## PeliculasYes 1.816e-01 1.010e-01 1.798 0.072250 .
## ContratoOne year -7.323e-01 1.196e-01 -6.122 9.27e-10 ***
## ContratoTwo year -1.376e+00 1.765e-01 -7.794 6.48e-15 ***
## Fact_sinPapelYes 3.511e-01 8.614e-02 4.076 4.58e-05 ***
## MetodoPagoCredit card (automatic) -1.393e-01 1.305e-01 -1.068 0.285716
## MetodoPagoElectronic check 2.170e-01 1.096e-01 1.981 0.047624 *
## MetodoPagoMailed check -3.725e-02 1.289e-01 -0.289 0.772505
## FacturaMes 6.316e-03 3.396e-03 1.860 0.062933 .
## FacturaTotal -1.433e-04 4.923e-05 -2.912 0.003593 **
## prop_missings 1.296e+00 1.171e+00 1.107 0.268233
## aleatorio -1.776e-01 1.336e-01 -1.329 0.183852
## aleatorio2 -2.508e-02 1.336e-01 -0.188 0.851090
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5882.3 on 5082 degrees of freedom
## Residual deviance: 4243.6 on 5057 degrees of freedom
## AIC: 4295.6
##
## Number of Fisher Scoring iterations: 6
pseudoR2(modeloInicial,data_train,"varObjBin")## [1] 0.2785862
pseudoR2(modeloInicial,data_test,"varObjBin")## [1] 0.248685
modeloInicial$rank #número de parámetros## [1] 26
impVariablesLog(modeloInicial,"varObjBin") #si los datos de entrenamiento, no se llaman "data_train", hay que indicarlomodelo 1
#pruebo uno sencillo con 3 variables
modelo2<-glm(varObjBin~Contrato+Int_serv+Antig.fc.edad+Seguridad+FacturaTotal,
data=data_train,family=binomial)
summary(modelo2)##
## Call:
## glm(formula = varObjBin ~ Contrato + Int_serv + Antig.fc.edad +
## Seguridad + FacturaTotal, family = binomial, data = data_train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5949 -0.6960 -0.3278 0.8120 2.9492
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.659e-01 7.954e-02 -2.085 0.0371 *
## ContratoOne year -8.442e-01 1.161e-01 -7.275 3.48e-13 ***
## ContratoTwo year -1.551e+00 1.720e-01 -9.022 < 2e-16 ***
## Int_servFiber optic 1.135e+00 9.274e-02 12.240 < 2e-16 ***
## Int_servNo -1.051e+00 1.326e-01 -7.928 2.24e-15 ***
## Antig.fc.edad -2.463e-02 3.630e-03 -6.784 1.17e-11 ***
## SeguridadYes -6.249e-01 9.850e-02 -6.344 2.24e-10 ***
## FacturaTotal -5.666e-05 4.166e-05 -1.360 0.1738
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5882.3 on 5082 degrees of freedom
## Residual deviance: 4396.5 on 5075 degrees of freedom
## AIC: 4412.5
##
## Number of Fisher Scoring iterations: 6
pseudoR2(modelo2,data_train,"varObjBin")## [1] 0.252589
pseudoR2(modelo2,data_test,"varObjBin")## [1] 0.2318987
modelo2$rank## [1] 8
modelo 2
#pruebo uno sencillo con 3 variables
modelo2<-glm(varObjBin~Contrato+Int_serv+Antig.fc.edad+Seguridad,
data=data_train,family=binomial)
summary(modelo2)##
## Call:
## glm(formula = varObjBin ~ Contrato + Int_serv + Antig.fc.edad +
## Seguridad, family = binomial, data = data_train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5905 -0.7029 -0.3190 0.8203 2.9859
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.142091 0.077569 -1.832 0.067 .
## ContratoOne year -0.867163 0.114954 -7.544 4.57e-14 ***
## ContratoTwo year -1.584692 0.170340 -9.303 < 2e-16 ***
## Int_servFiber optic 1.087282 0.085817 12.670 < 2e-16 ***
## Int_servNo -1.028358 0.131759 -7.805 5.96e-15 ***
## Antig.fc.edad -0.028659 0.002133 -13.437 < 2e-16 ***
## SeguridadYes -0.641980 0.097557 -6.581 4.69e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5882.3 on 5082 degrees of freedom
## Residual deviance: 4398.3 on 5076 degrees of freedom
## AIC: 4412.3
##
## Number of Fisher Scoring iterations: 6
pseudoR2(modelo2,data_train,"varObjBin")## [1] 0.2522754
pseudoR2(modelo2,data_test,"varObjBin")## [1] 0.2319642
modelo2$rank## [1] 7
modelo 3
#pruebo uno sencillo con 3 variables
modelo3<-glm(varObjBin~Contrato+Int_serv+Seguridad * MetodoPago,
data=data_train,family=binomial)
summary(modelo3)##
## Call:
## glm(formula = varObjBin ~ Contrato + Int_serv + Seguridad * MetodoPago,
## family = binomial, data = data_train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.4186 -0.6753 -0.3345 0.9540 2.8959
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) -0.77574 0.12073 -6.425
## ContratoOne year -1.38677 0.10729 -12.926
## ContratoTwo year -2.34619 0.16083 -14.588
## Int_servFiber optic 0.80023 0.08392 9.536
## Int_servNo -0.87937 0.13483 -6.522
## SeguridadYes -0.69282 0.19773 -3.504
## MetodoPagoCredit card (automatic) -0.17655 0.14580 -1.211
## MetodoPagoElectronic check 0.52666 0.11814 4.458
## MetodoPagoMailed check 0.22833 0.13920 1.640
## SeguridadYes:MetodoPagoCredit card (automatic) 0.22097 0.28092 0.787
## SeguridadYes:MetodoPagoElectronic check -0.17708 0.24513 -0.722
## SeguridadYes:MetodoPagoMailed check -0.38520 0.30031 -1.283
## Pr(>|z|)
## (Intercept) 1.32e-10 ***
## ContratoOne year < 2e-16 ***
## ContratoTwo year < 2e-16 ***
## Int_servFiber optic < 2e-16 ***
## Int_servNo 6.93e-11 ***
## SeguridadYes 0.000459 ***
## MetodoPagoCredit card (automatic) 0.225954
## MetodoPagoElectronic check 8.27e-06 ***
## MetodoPagoMailed check 0.100936
## SeguridadYes:MetodoPagoCredit card (automatic) 0.431502
## SeguridadYes:MetodoPagoElectronic check 0.470058
## SeguridadYes:MetodoPagoMailed check 0.199594
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5882.3 on 5082 degrees of freedom
## Residual deviance: 4544.0 on 5071 degrees of freedom
## AIC: 4568
##
## Number of Fisher Scoring iterations: 6
pseudoR2(modelo2,data_train,"varObjBin")## [1] 0.2522754
pseudoR2(modelo2,data_test,"varObjBin")## [1] 0.2319642
modelo2$rank## [1] 7