1. Introducción

La pérdida de clientes,traducida al inglés como “Churn”, es una métrica comercial importante para los servicios basados en suscripción, como las compañías de telecomunicaciones,entretenimiento, servicios informáticos y otras. Este proyecto desarrolla un análisis de abandono utilizando datos descargados de conjuntos de datos de muestra de IBM (Telco). Utilizaremos el lenguaje de programación estadística R para identificar variables asociadas con la pérdida de clientes.

2 - Analisis exploratorio

2.1 - Analisis exploratorio general y tipo de datos

Después de desarrollar un análisis preliminar exploratorio del conjunto de datos objeto de análisis arribamos a las siguientes conclusiones.

Conclusiones:

- Tenemos un dataframe con 7043 observaciones, a las que les corresponden 21 variables. Por el diseño del proyecto Churn va a ser la target.

- La variables “customerID” no estará incluída para construir la variable target, como tampoco estará incluída posiblemente la variable “TotalCharges” por su alta correlación con la variable “MonthlyCharges”.

- Hay algunas variables que deberian ser factores: “gender”,“SeniorCitizen”,“Partner”,“Dependents”,“PhoneService”,“MultipleLines”,“InternetService”,“OnlineSecurity”,“OnlineBackup”,“DeviceProtection”,“TechSupport”,“StreamingTV”,“StreamingMovies”,“Contract”,“PaperlessBilling”,“PaymentMethod”, estas las guardaremos para recodificarlas. De momento las guardamos en la variable ‘a_factores’

Reservamos la variable ‘TotalCharges’ a eliminar, en caso de que fuera necesario.

2.2 - Calidad de datos: Estadísticos básicos

Hacemos un summary, con la función “lapply” que nos arroja los resultados en formato de lista y se puede leer mejor.

Conclusiones:

- La variable Senior Citizen (Persona de la 3ra Edad), está dada en valores 0 y 1, por lo que debemos ajustarla antes de convertirla en factor.

- La variable Tenure (antiguedad), tiene un valor máximo de 72, debemos revisar si no es un caso atípico.

- La variable Total Charges (Cargos Totales) tiene 11 valores nulos, los apuntamos para analizar posteriormente por la alta correlación que creemos puede tener esta variable con la variable MonthlyCharges (Cargos Mensuales).

- Vemos en general muchos valores con formato caracter que convertiremos más adelante en factores.

2.3 - Calidad de datos: Análisis de nulos

Conclusion:

-Tenemos 11 valores nulos, que trataremos posteriormente junto con la variable “Total Charges”,para definir si debemos eliminar estos clientes.

2.4 - Calidad de datos: Análisis de ceros

-Al desarrollar el análisis de ceros observamos que todas las variables tienen valores acordes según la información que arroja cada una.

Conclusiones:

- La variable “SeniorCitizen” nos informa un total de 5901 ceros, lo que nos indica que el 16.2 % del total de clientes son persons de la tercera edad, lo que es consistente.

- La variable “tenure”, nos muestra que solo 11 clientes tienen menos de 1 mes de antigüedad, lo que puede ser consistente.

2.5 - Calidad de datos: Análisis de atípicos

2.5.1 - Analizamos las que son de tipo numerico

2.5.2 - Analizamos las que son de tipo “integer”.

Conclusiones:

-No hay valores atípicos en las variables “MonthlyCharges” y “TotalCharges” que son las de tipo numérico.

No hay cambios significativos, como ya sabíamos anteriormente,obtenemos un total de 5901 ceros,en la variable “Senior Citizen” lo que nos indica que el 16.2 % del total de clientes son persons de la tercera edad.

-Existen 362 clientes con una antigüedad de 72 meses, por lo que podemos ver que no es un valor atípico.

-Existen 613 clientes con un período de antigüedad de 1 mes, lo que puede deberse a alto crecimiento de la compañía en la actualidad.

-Con valor 0 tenemos en la variable “tenure” 11 clientes, los que pueden corresponderse con los 11 valores nulos de “Total Charges”, por el poco tiempo de estos clientes en la empresa, sus datos no son representativos.

2.6 - Analisis longitudinal

Conclusión:

-Al analizar nuestro data frame de forma longitudinal, vemos que los cargos totales siempre son mayores los cargos mensuales (excepto los NA), lo que es coincidente con lo que esperamos. No hay diferencias significativas, debemos tener en cuenta también que no tenemos series de tiempo en este dataframe.

2.7 - Analisis de coherencia

En este caso solo tenemos 2 variables en las que podemos evaluar coherencia (“MonthlyCharges” y “TotalCharges”) y en un análisis anterior vimos que eran correctas.

2.8 Otros

2.8.1 Analisis de “tenure” y “TotalCharges”.

Habiamos visto 11 valores NA en la variable “TotalCharges”, y podemos ver que coinciden con los valores de “tenure” igual a cero.

Conclusion: son 11 clientes con valores de “tenure” igual a cero y “TotalCharges” igual a NA, asi que podemos tomar la decision de imputarlos, por su baja representatibilidad en el análisis.

2.8.2 Análisis de la correlación entre las variables “MonthlyCharges” y “TotalCharges”

Creamos una nueva columna sin los valores nulos de la variable “TotalCharges”, sustituyendo los mismos por la media de la variable “TotalCharges” y vemos que tiene una correlación de 0.650468 con respecto a “MonthlyCharges”, por lo que procederemos a eliminar la primera variable para nuestro análisis.

2.9 - Acciones resultado del analisis de calidad de datos y exploratorio

Vamos a tomar las siguientes acciones:

- eliminar las variables sin informacion, en este caso los clientes con valores NA en “TotalCharges” y cero en “tenure”.

- transformar a factor las variables de ‘a_factores’

- eliminar la columna “TotalCharges” por su alta correlación con “MonthlyCharges”.

- transformar la variable “SeniorCitizen” a factor transformándola primero a caracter.

- Las variables “OnlineSecurity”, “OnlineBackup”, “DeviceProtection”, “TechSupport”, “StreamingTV” y “StreamingMovies” requieren una conexión a Internet y la variable “MultipleLines” necesita un servicio telefónico, por lo que reemplazaré “Sin servicio de Internet” y “Sin servicio telefónico” con “No”, porque nos aporta el mismo significado.

3 - Trasformación de datos

3.1 - Creacion de la variable target

En este paso creamos la variable Target_Churn (para el entrenamiento).

3.2 - Preparacion de las variables independientes

3.2.1 - Preseleccion de variables independientes

En este paso creamos una lista larga con todas las variables independientes (ind_larga).

Creamos una muestra m menor para que los calculos sean mas rapidos.

3.2.1.1 - Preseleccion con RandomForest.

Después de realizar el análisis de importancia de todas las variables con “Random Forest” los resultados obtenidos son los siguientes:

VARIABLE IMP_RF RANKING_RF
tenure 289.88817 1
MonthlyCharges 215.22776 2
Contract 191.27745 3
PaymentMethod 113.81651 4
InternetService 108.44064 5
OnlineSecurity 48.58971 6
PaperlessBilling 46.99679 7
TechSupport 42.53966 8
OnlineBackup 30.17010 9
SeniorCitizen 30.10820 10
Partner 30.04346 11
Dependents 29.61428 12
DeviceProtection 26.79892 13
StreamingTV 26.45997 14
StreamingMovies 26.02052 15
gender 25.14282 16
MultipleLines 24.86699 17
PhoneService 13.11210 18

3.2.1.2 - Preseleccion con Information Value.

Procedemos de la misma forma para determinar la importancia de todas las variables pero en este caso por el criterio “Information Value”.

VARIABLE IMP_IV RANKING_IV
Contract 1.2332 1
tenure 0.8773 2
InternetService 0.6152 3
MonthlyCharges 0.4824 4
PaymentMethod 0.4557 5
PaperlessBilling 0.2020 6
OnlineSecurity 0.1719 7
TechSupport 0.1574 8
Dependents 0.1532 9
Partner 0.1179 10
SeniorCitizen 0.1051 11
OnlineBackup 0.0360 12
DeviceProtection 0.0230 13
StreamingTV 0.0202 14
StreamingMovies 0.0188 15
MultipleLines 0.0081 16
PhoneService 0.0007 17
gender 0.0004 18

3.2.1.3 - Preseleccion final

En este punto combinamos los resultados obtenidos anteriormente por los dos métodos y determinamos cuáles son las más importantes teniendo en cuenta los resultados de ambos criterios.

VARIABLE IMP_RF IMP_IV RANKING_RF RANKING_IV RANKING_TOT
tenure 289.88817 0.8773 1 2 3
Contract 191.27745 1.2332 3 1 4
MonthlyCharges 215.22776 0.4824 2 4 6
InternetService 108.44064 0.6152 5 3 8
PaymentMethod 113.81651 0.4557 4 5 9
OnlineSecurity 48.58971 0.1719 6 7 13
PaperlessBilling 46.99679 0.2020 7 6 13
TechSupport 42.53966 0.1574 8 8 16
OnlineBackup 30.17010 0.0360 9 12 21
SeniorCitizen 30.10820 0.1051 10 11 21
Partner 30.04346 0.1179 11 10 21
Dependents 29.61428 0.1532 12 9 21
DeviceProtection 26.79892 0.0230 13 13 26
StreamingTV 26.45997 0.0202 14 14 28
StreamingMovies 26.02052 0.0188 15 15 30
MultipleLines 24.86699 0.0081 17 16 33
gender 25.14282 0.0004 16 18 34
PhoneService 13.11210 0.0007 18 17 35

En este paso nos preguntamos ¿Son los métodos fiables?. Vamos a hacer una correlacion entre ellos a ver si dan resultados similares

Conclusiones

-Si nos dan fiabilidad los resultados ya que la correlacion es muy alta (0.8684).

Decision: vamos a descartar aquellas variables que no hayan salido entre las 10 mas importantes en ninguno de los dos sistemas de seleccion de variables.

Estas son las variables predictoras con las que vamos a trabajar finalmente.

x
tenure
Contract
MonthlyCharges
InternetService
PaymentMethod
OnlineSecurity
PaperlessBilling
TechSupport
OnlineBackup
SeniorCitizen
Partner
Dependents

3.2.2 - Seleccionamos la lista de variables finales del proyecto.

Ahora vamos a buscar en las variables iniciales las variable de esta lista (variables finales) y creamos un nuevo dataframe

3.3 - Fichero final y limpieza del entorno

3.3.1 - Fichero final

Creamos un fichero final con las variables seleccionadas para pasar a la siguiente fase.

3.3.2 - Limpieza del entorno

Durante todo el proceso anterior hemos creado muchas variables y ficheros temporales, en este punto vamos aprovechamos para limpiarlo todo y dejarlo organizado antes de pasar a la siguiente fase.

4 - Creacion de variables sinteticas.

4.1 - Como en nuestro caso no necesitamos crear variables sintéticas (medias,tendencias etc.) pasamos directamente a la etapa de discretización.

4.2 - Discretizacion

Primero creamos la funcion que va a discretizar de forma automatica maximizando la capacidad predictiva de la nueva variable.

Ademas, como vamos a usar en la modelizacion un algoritmo lineal, que es la regresion logistica, vamos a intentar que la discretizacion sea monotonica.

Discretizamos todas las variables enteras y numéricas, en este caso “tenure” y “MonthlyCharges” respectivamente.

Aquí vemos como nos quedó la variable “tenure” una vez discretizada:

Var1 Freq
01 <= 1 613
02 <= 5 747
03 <= 16 1179
04 <= 22 481
05 <= 49 1839
06 <= 59 690
07 <= 70 951
08 > 70 532

Y en esta tabla la variable “Monthly Charges” discretizada:

Var1 Freq
01 <= 26.9 1600
02 <= 55.95 1119
03 <= 68.8 563
04 <= 106.75 3380
05 > 106.75 370

Hacemos una inspeccion visual de todas las variables a ver si han salido bien.

Al analizar la penetración de la target en cada categoría, vemos que las variables han salido monotónicas en su mayoría. Nos salen perfectamnete monotonicas las variables “tenure”y “Contract”, que eran las mas predictivas, como vimos anteriormente.

4.3 - Limpieza

Volvemos a limpiar el entorno de cualquier cosa que no sea el dataframe final.

5. Modelizacion

5.1 - Preparar las funciones que vamos a necesitar

5.1.1 Funcion para crear una matriz de confusion

5.1.2 Funcion para calcular las metricas de los modelos: acierto, precision, cobertura y F1

5.1.3 Funcion para probar distintos umbrales y ver el efecto sobre precision y cobertura

5.1.4 Funciones que calculan la curva ROC y el AUC

5.2 - Creamos las particiones de training (70%) y test (30%) y establecemos una semilla.

A continuación generamos una variable aleatoria con una distribucion 70-30 y creamos los dos dataframes.

5.3 - Creación del modelo de propensión

Probamos tres algoritmos diferentes para ver cual funciona mejor y comparamos al final del proceso.

5.3.1 - Identificamos las variables

Las independientes seran todas menos el codigo cliente (customerID) y la variable target (Target_Churn).

5.3.2 - Creamos la formula para usar en el modelo.

En este punto definimos cuáles son las variables independientes con respecto a la variable target.


5.3.3 - Modelizamos con regresion logistica

Primero hacemos un modelo con todas las variables.

Revisamos la significatividad y mantenemos todas las variables que tengan tres estrellas en alguna categoría. Que en este caso fueron:

‘InternetService’,

‘Contract’

‘PaperlessBilling’

‘tenure_disc’

‘OnlineSecurity’

Volvemos a modelizar, pero en este caso con las variables que tienen 3 estrellas.

Ya todas las variables tienen al menos una categoria con 3 estrellas de significacion.

Al mirar el signo de los coeficientes, todas las variables tienen logica, asi que comprobamos este modelo sobre el conjunto de test

Y calculamos el pseudo R cuadrado:

El R2 nos arroja un valor de 0.29, lo que no es un valor explicativo alto en nuestro experimento.

Calculamos los scorings y evaluamos el modelo.

Ahora tenemos que transformar la probabilidad en una decision de si el cliente va a comprar o no. Con la funcion umbrales probamos diferentes cortes.

Posteriormente seleccionamos el umbral que maximiza la F1.

Evaluamos las métricas con el umbral optimizado:

umbral acierto precision cobertura F1
0.35 77.40705 52.79255 76.93798 62.6183

Evaluamos la curva ROC.

Sacamos las métricas definitivas incluyendo el AUC.

umbral 0.35000
acierto 77.40705
precision 52.79255
cobertura 76.93798
F1 62.61830
AUC 85.00000

5.3.4 - Modelizamos con Arboles de decision

Creamos el primer modelo.

Revisamos donde el error de validacion cruzada empieza a crecer

Parece que minimiza aproximadamente en 0.00221729 de complejidad. Generamos un nuevo arbol con ese parametro. Ademas vamos a incluir un nuevo paramtero para que el arbol no tenga mas de 7 niveles.

Revisamos de nuevo la complejidad.

-Ahora parece bastante estable.

-Vamos a crear el grafico del arbol para analizarlo.

Vamos a calcular los scorings y evaluar el modelo:

Con la funcion umbrales probamos diferentes cortes.

Seleccionamos automaticamente el mejor umbral.

Evaluamos la matriz de confusion y las metricas con el umbral optimizado

umbral acierto precision cobertura F1
0.2 72.49762 46.73797 84.68992 60.23432

Evaluamos la ROC:

Sacamos las metricas definitivas incluyendo el AUC

umbral 0.20000
acierto 72.49762
precision 46.73797
cobertura 84.68992
F1 60.23432
AUC 83.00000

5.3.5 - Modelizamos con Random Forest

Creamos el modelo

Visualizamos las variables mas importantes:

MeanDecreaseAccuracy MeanDecreaseGini
SeniorCitizen 15.800088 36.51862
Partner 7.756248 38.28626
Dependents 7.981120 33.65905
InternetService 39.626347 106.57540
OnlineSecurity 29.151952 49.46192
OnlineBackup 12.873195 38.98828
TechSupport 17.797783 41.38591
Contract 36.740385 176.78915
PaperlessBilling 16.371712 46.55191
PaymentMethod 25.661981 126.59556
tenure_disc 42.550722 237.14655
MonthlyCharges_disc 29.554645 100.60261

Como hay dos criterios vamos a crear una unica variable agregada y visualizarla para tener una mejor idea de la importancia de cada variable

Creamos de nuevo el modelo con las nuevas variables

Aplicamos el modelo al conjunto de test, generando un vector con las probabilidades:

Con la funcion umbrales probamos diferentes cortes

umbral acierto precision cobertura F1
0.05 66.25357 41.44385 90.11628 56.77656
0.10 73.16492 47.43730 84.30233 60.71179
0.15 75.26215 49.81366 77.71318 60.71158
0.20 77.45472 53.12955 70.73643 60.68163
0.25 78.88465 55.74803 68.60465 61.51173
0.30 79.74261 57.72496 65.89147 61.53846
0.35 80.17159 58.92857 63.95349 61.33829
0.40 80.79123 60.68053 62.20930 61.43541
0.45 80.55291 60.50584 60.27132 60.38835
0.50 80.17159 60.68376 55.03876 57.72358
0.55 80.45758 62.04545 52.90698 57.11297
0.60 80.21926 62.16867 50.00000 55.42428
0.65 80.45758 63.25000 49.03101 55.24017
0.70 80.60057 64.08269 48.06202 54.92802
0.75 80.55291 65.88235 43.41085 52.33645
0.80 79.88561 65.16129 39.14729 48.91041
0.85 79.40896 69.26605 29.26357 41.14441
0.90 79.02765 69.38776 26.35659 38.20225
0.95 79.31363 75.30864 23.64341 35.98820

Seleccionamos automaticamente el mejor umbral

x
0.3

Evaluamos las metricas con el umbral optimizado

umbral 0.30000
acierto 79.74261
precision 57.72496
cobertura 65.89147
F1 61.53846

Evaluamos la ROC:

Sacamos las metricas definitivas incluyendo el AUC

umbral 0.30000
acierto 79.74261
precision 57.72496
cobertura 65.89147
F1 61.53846
AUC 83.00000

5.3.5 - Comparamos los 3 metodos.

Regresion Logistica Arbol de Decisión Random Forest
umbral 0.35000 0.20000 0.30000
acierto 77.40705 72.49762 79.74261
precision 52.79255 46.73797 57.72496
cobertura 76.93798 84.68992 65.89147
F1 62.61830 60.23432 61.53846
AUC 85.00000 83.00000 83.00000

Conclusion:

La regresión logística es el modelo más predictivo, entonces por este criterio vamos a quedarnos con la regresion logistica.

5.3.6 - Escribimos el scoring final en el dataset y guardamos el modelo.

6. Evaluacion y analisis de negocio.

Vamos a visualizar la contratacion real por tramos de scoring. Este grafico es muy potente para ver que el modelo es consistente, ya que debe presentar una linea descente en la tasa de contratacion conforme se desciende en el scoring.

## `summarise()` ungrouping output (override with `.groups` argument)

¿Como decidimos los clientes a los que lanzaremos la campaña de venta cruzada de depositos?

Opcion 1: El tamaño de campaña viene definido por un criterio de negocio como por ejemplo el presupuesto total asignado a la campaña:

Supongamos que tenemos un presupuesto de 20.000€. Y que la campaña se realizara por call center, con un coste unitario de 20€ por cliente contactado.

Entonces el numero de clientes a contactar sera de 20.000 / 20 = 1.000. Para extraerlos simplemente filtramos del total de la base de clientes a aquellos que ya tienen un deposito (porque es venta cruzada) y despues cogemos los 1.000 primeros ordenados por scoring.

Opcion 2: Establecemos un criterio de negocio. Suele ser normal coger aquellos clientes cuyo scoring este x2 o x3 por encima de la penetracion de la target:

Opcion 3: Calculamos el tamaño maximo de campaña que resultaria rentable, teniendo en cuenta el ingreso medio previsto y el coste medio por accion comercial:

Supuesto de margen medio por deposito = 100€

Supuesto de coste medio por accion comercial (call center cliente contactado) = 20€

Definicion de margen esperado = probabilidad de evento * margen evento

Definicion de margen neto = margen esperado - coste medio

Visualizamos las curvas

Opcion 4: Calculamos el punto optimo de retorno de la inversion:

Vamos a calcular 2 nuevas variables que sean un agregado de los ingresos agregados y de los gastos agregados en cada potencial tamaño de campaña, y el ROI como diferencia de las anteriores, y vamos a localizar el tamaño de la campaña que va a maximizar ese ROI y tambien cuanto vamos a ganar previblemente.

Visualizamos las curvas

Vamos a visualizar un zoom sobre el ROI solo en los tamaños de campaña que son positivos para localizar el punto ,ptimo.

Resultados generales:

## El tamaño óptimo de campaña para el ROI es de: 1932 clientes 
## Con unos ingresos esperados de margen neto acumulado de: 78856 € 
## Y unos costes agregados de: 38640 € 
## Que van a generar un Retorno Neto de la Inversión de: 40216 €