Informe fugas de clientes
El documento ha sido convertido a PDF con la librería pdfkit de Python de la web pública responsive que se puede visitar en la siguiente URL: https://rpubs.com/rtovcan/877300
Metodología seguida en el análisis
1) Lectura e inspección de datos.
Información sobre variables.
| Variables | Descripción |
|---|---|
| ID | Identificador único de Cliente |
| Genero | Género binario (Male/Female) |
| Mayor65 | Cliente mayor de 65 años |
| Conyuge | Cliente con conyuge/compañero/compañera |
| PersCargo | Cliente con personas a su cargo |
| Antig.fc.edad | Antigúedad en meses del contrato |
| Telf_serv | Cliente tiene servicios de teléfono contratados |
| VariasLineas | Cliente tiene varias líneas de teléfono |
| Int_serv | Cliente tiene servicios de internet contratados |
| Seguridad | Cliente tiene servicio de seguridad contratado |
| CopiaSeguridad | Cliente tiene servicio de copia de seguridad contratado |
| Antivirus_disp | Cliente tiene antivirus en dispositivo |
| Soporte_tecnico | Cliente tiene soporte técnico contratado |
| TV_streaming | Cliente tiene TV en streaming contratado |
| Peliculas | Cliente tiene servicio de películas contratado |
| Contrato | Tipo de contrato de cliente |
| Fact_sinPapel | Factura sin papel |
| MetodoPago | Método de pago |
| FacturaMes | Importe facturado mensual |
| FacturaTotal | Importe facturado total |
| Fuga | Cliente abandona la compañía |
Tipo de variables.
## '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.
## chr [1:6353] "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
Al mismo tiempo se comprueba si hay algún ID duplicado, 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 vamos a utilizar para modelar la variable Genero.
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 |
A simple vista podemos observar en los datos porcentajes de NAs tanto en las variables categóricas como cuantitativas.
Su distribuciones son las siguientes:
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 V de Cramer para ver la relaciónes de las variables con la variable objetivo:
Oberservamos la primera y última variable antes de las creadas aletoriamente que nos muestra Vcramer:
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 y ha sido el punto de partida inicial por el que he empezado. El ranking que nos muestra Vcramer es el siguiente:
1- Contrato
2- Antig.fc.edad
3- Int_serv
4- MetodoPago
5- FacturaMes
7- FacturaTotal
6- Fact_sinPapel
8- Seguridad
9- Soporte_tecnico
10- PersCargo
11- Conyuge
12- Mayor65
13- Copia de Seguridad
14_ Antivirus_disp
15- TV_Streaming
16- Peliculas
17- VariasLineas
Observamos el efecto producido de las variables cuantitativas sobre la variable objetivo:
A simple vista parece que los clientes con la factura más alta al mes tienen mayor porcentaje de fuga. 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 cuando existe un mayor porcentaje de fuga. Depues de generar las transformaciones de la variables continuas comprobamos V de Cramer:
Aparentemente no se observan grandes cambios en la toma de decisión anterior, solo una leve mejoría.
4) Modelado manual.
Obeservamos la frecuencia a priori del evento. El modelo va tener dificultad a reconocer a los 1.
| 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:
| 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 |
| Modelo | seudoR2 | Param | AIC | Null.dev | dev.resid |
|---|---|---|---|---|---|
| Inicial | 0.2830424 | 27 | 4271.354 | 5882.292 | 4217.354 |
| Modelo 1 | 0.2481018 | 6 | 4434.885 | 5882.292 | 4422.885 |
| Modelo 2 | 0.2613963 | 8 | 4360.683 | 5882.292 | 4344.683 |
| Modelo 3 | 0.2481018 | 6 | 4434.885 | 5882.292 | 4422.885 |
| Modelo 4 | 0.2790598 | 20 | 4280.781 | 5882.292 | 4240.781 |
| Modelo 5 | 0.2873889 | 31 | 4253.787 | 5882.292 | 4191.787 |
| Modelo 6 | 0.2936497 | 44 | 4242.959 | 5882.292 | 4154.959 |
| Modelo 7 | 0.2732350 | 20 | 4315.044 | 5882.292 | 4275.044 |
| Modelo 8 | 0.2988146 | 61 | 4246.577 | 5882.292 | 4124.577 |
| Modelo 9 | 0.2989116 | 63 | 4250.007 | 5882.292 | 4124.007 |
5) Modelado por selección de variables.
Clásica.
Selección de variables clásica con variables originales y sus interacciones
Se generan los modelos modeloStepAIC, modeloBackAIC,modeloStepAIC_int y modeloStepBIC_int.
Selección de variables clásica con variables originales y transformaciones
Se genera los modelos modeloStepAIC_trans y modeloStepBIC_trans.
Selección de variables clásica con variables originales y transformaciones y sus interacciones
Se generan los modelos modeloStepAIC_transInt y modeloStepBIC_transInt.
Aleatoria.
Seleccionaremos 3 modelos aleatorios.
Lasso.
Generamos el modelo Lasso con las variables transformadas.
6) Comparación de modelos por validación cruzada repetida.
Mejor modelo manual
| Modelo | seudoR2 | Param | AIC | Null.dev | dev.resid |
|---|---|---|---|---|---|
| Inicial | 0.2830424 | 27 | 4271.354 | 5882.292 | 4217.354 |
| Modelo 1 | 0.2481018 | 6 | 4434.885 | 5882.292 | 4422.885 |
| Modelo 2 | 0.2613963 | 8 | 4360.683 | 5882.292 | 4344.683 |
| Modelo 3 | 0.2481018 | 6 | 4434.885 | 5882.292 | 4422.885 |
| Modelo 4 | 0.2790598 | 20 | 4280.781 | 5882.292 | 4240.781 |
| Modelo 5 | 0.2873889 | 31 | 4253.787 | 5882.292 | 4191.787 |
| Modelo 6 | 0.2936497 | 44 | 4242.959 | 5882.292 | 4154.959 |
| Modelo 7 | 0.2732350 | 20 | 4315.044 | 5882.292 | 4275.044 |
| Modelo 8 | 0.2988146 | 61 | 4246.577 | 5882.292 | 4124.577 |
| Modelo 9 | 0.2989116 | 63 | 4250.007 | 5882.292 | 4124.007 |
He decidido seleccionar el Modelo manual 2 ya que tiene un menor número de parametros y se nota solo una leve perdida en su capacidad predictiva.
Mejor de selección clásica
| Modelo | seudoR2 | Param | AIC | dev.resid | roc_mean | roc_sd |
|---|---|---|---|---|---|---|
| modeloStepAIC | 0.2812849 | 22 | 5366.437 | 5322.437 | 0.8399946 | 0.0114345 |
| modeloStepBIC | 0.2725863 | 14 | 5399.577 | 5371.577 | 0.8379235 | 0.0115781 |
| modeloStepAIC_int | 0.3039398 | 55 | 5255.506 | 5145.506 | 0.8466676 | 0.0114117 |
| modeloStepBIC_int | 0.2778310 | 17 | 5371.033 | 5337.033 | 0.8398724 | 0.0116995 |
| modeloStepAIC_trans | 0.2926913 | 23 | 5246.059 | 5200.059 | 0.8479122 | 0.0105255 |
| modeloStepBIC_trans | 0.2877306 | 15 | 5266.528 | 5236.528 | 0.8471121 | 0.0106437 |
| modeloStepAIC_transInt | 0.3071746 | 42 | 5177.579 | 5093.579 | 0.8521659 | 0.0105911 |
| modeloStepBIC_transInt | 0.3071746 | 17 | 5224.662 | 5190.662 | 0.8496906 | 0.0109403 |
Mejor de selección aleatoria
| Modelo | seudoR2 | Param | AIC | dev.resid | roc_mean | roc_sd |
|---|---|---|---|---|---|---|
| modelo_ale_1 | 0.2923026 | 23 | 5248.916 | 5202.916 | 0.8478317 | 0.0104643 |
| modelo_ale_2 | 0.2915492 | 23 | 5254.455 | 5208.455 | 0.8473195 | 0.0106529 |
| modelo_ale_3 | 0.2915492 | 23 | 5254.455 | 5208.455 | 0.8478727 | 0.0103429 |
7) Elección justificada del modelo final.
Decido quedarme con el modelo modeloStepBIC_transInt en base al seudo R y ROC. Además me parece coherente con la realidad.
8) Evaluación e interpretación de parámetros.
¿Cuáles son las variables que más influyen?
## varObjBin ~ Contrato + Int_serv + raiz4FacturaTotal + TV_streaming +
## Fact_sinPapel + VariasLineas + Peliculas + Seguridad + MetodoPago +
## Soporte_tecnico + Int_serv:Peliculas
¿En qué sentido lo hacen?
## (Intercept) ContratoOne year
## 1.0399354 -0.6935653
## ContratoTwo year Int_servFiber optic
## -1.4436797 1.0032401
## Int_servNo raiz4FacturaTotal
## -1.4040519 -3.3518306
## TV_streamingYes Fact_sinPapelYes
## 0.4641880 0.4475235
## VariasLineasYes PeliculasYes
## 0.4299594 0.1730015
## SeguridadYes MetodoPagoCredit card (automatic)
## -0.3224069 -0.1277074
## MetodoPagoElectronic check MetodoPagoMailed check
## 0.2513995 -0.2108761
## Soporte_tecnicoYes Int_servFiber optic:PeliculasYes
## -0.2790801 0.3351592
## Int_servNo:PeliculasYes
## 3.7132982
9) Búsqueda del punto de corte óptimo para la probabilidad estimada.
Posibles puntos de cortes:
## [1] 0.23
## [1] 0.44
## Predicción para los datos de test.
Se realiza la predicción con la variable continua transformada (FacturaTotal) y sin transformar.
Construcción del dataset de entrega con el ID y Fuga_pred.
Se construye el dataset de entrega con la variable continua transformada y sin transformar.