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.
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:
| 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:
| 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:
| 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
| 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:

| 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
| 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
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.
| 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.
¿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.
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 €