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 indicarlo

modelo 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