Documentos de Académico
Documentos de Profesional
Documentos de Cultura
knitr::opts_chunk$set(echo = TRUE)
options(scipen=999)
##
## Attaching package: 'dplyr'
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 1/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## randomForest 4.6-14
##
## Attaching package: 'randomForest'
##
## Attaching package: 'gplots'
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 2/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Attaching package: 'purrr'
##
## Attaching package: 'caret'
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 3/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## ----------------------------------------------------------------------
##
## Your next step is to start H2O:
## > h2o.init()
##
## For H2O package documentation, ask for help:
## > ??h2o
##
## After starting H2O, you can use the Web UI at http://localhost:54321
## For more information visit http://docs.h2o.ai
##
## ----------------------------------------------------------------------
##
## Attaching package: 'h2o'
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 4/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [[1]]
## [1] TRUE
##
## [[2]]
## [1] TRUE
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] TRUE
##
## [[5]]
## [1] TRUE
##
## [[6]]
## [1] TRUE
##
## [[7]]
## [1] TRUE
##
## [[8]]
## [1] TRUE
##
## [[9]]
## [1] TRUE
##
## [[10]]
## [1] TRUE
##
## [[11]]
## [1] TRUE
##
## [[12]]
## [1] TRUE
##
## [[13]]
## [1] TRUE
Cargamos el fichero de datos y vemos qué pinta tienen con un análisis exploratorio
df <- fread('Telco-Customer-Churn.csv')
glimpse(df)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 5/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Observations: 7,043
## Variables: 21
## $ customerID <chr> "7590-VHVEG", "5575-GNVDE", "3668-QPYBK", "7795-CFOC…
## $ gender <chr> "Female", "Male", "Male", "Male", "Female", "Female"…
## $ SeniorCitizen <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Partner <chr> "Yes", "No", "No", "No", "No", "No", "No", "No", "Ye…
## $ Dependents <chr> "No", "No", "No", "No", "No", "No", "Yes", "No", "No…
## $ tenure <int> 1, 34, 2, 45, 2, 8, 22, 10, 28, 62, 13, 16, 58, 49, …
## $ PhoneService <chr> "No", "Yes", "Yes", "No", "Yes", "Yes", "Yes", "No",…
## $ MultipleLines <chr> "No phone service", "No", "No", "No phone service", …
## $ InternetService <chr> "DSL", "DSL", "DSL", "DSL", "Fiber optic", "Fiber op…
## $ OnlineSecurity <chr> "No", "Yes", "Yes", "Yes", "No", "No", "No", "Yes", …
## $ OnlineBackup <chr> "Yes", "No", "Yes", "No", "No", "No", "Yes", "No", "…
## $ DeviceProtection <chr> "No", "Yes", "No", "Yes", "No", "Yes", "No", "No", "…
## $ TechSupport <chr> "No", "No", "No", "Yes", "No", "No", "No", "No", "Ye…
## $ StreamingTV <chr> "No", "No", "No", "No", "No", "Yes", "Yes", "No", "Y…
## $ StreamingMovies <chr> "No", "No", "No", "No", "No", "Yes", "No", "No", "Ye…
## $ Contract <chr> "Month-to-month", "One year", "Month-to-month", "One…
## $ PaperlessBilling <chr> "Yes", "No", "Yes", "No", "Yes", "Yes", "Yes", "No",…
## $ PaymentMethod <chr> "Electronic check", "Mailed check", "Mailed check", …
## $ MonthlyCharges <dbl> 29.85, 56.95, 53.85, 42.30, 70.70, 99.65, 89.10, 29.…
## $ TotalCharges <dbl> 29.85, 1889.50, 108.15, 1840.75, 151.65, 820.50, 194…
## $ Churn <chr> "No", "No", "Yes", "No", "Yes", "Yes", "No", "No", "…
str(df)
as.data.frame(sort(names(df)))
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 6/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## sort(names(df))
## 1 Churn
## 2 Contract
## 3 customerID
## 4 Dependents
## 5 DeviceProtection
## 6 gender
## 7 InternetService
## 8 MonthlyCharges
## 9 MultipleLines
## 10 OnlineBackup
## 11 OnlineSecurity
## 12 PaperlessBilling
## 13 Partner
## 14 PaymentMethod
## 15 PhoneService
## 16 SeniorCitizen
## 17 StreamingMovies
## 18 StreamingTV
## 19 TechSupport
## 20 tenure
## 21 TotalCharges
Vemos que es un base de datos de 7043 registros con 21 variables incluyendo la variable que tenemos que
predecir ‘Churn’. Se trata sobre todo de variables de texto (character) salvo las variables de cargos mensuales
y totales (MonthlyCharges y TotalCharges) que son numéricas y la antigüeda (tenure) que está formada por
números enteros. Las siguientes variables de carácter o de texto habrá que transformarlas en factores:
1. Gender
2. SeniorCitizen
3. Partner
4. Dependents
5. PhoneService
6. MultipleLines
7. InternetService
8. OnlineSecurity
9. OnlineBackup
10. DeviceProtection
11. TechSupport
12. StreamingTV
13. StreamingMovies
14. Contract
15. PaperlessBilling
16. PaymentMethod
17. Churn
Lo convertiremos en factores más adelante pero las agrupamos en un vector con su nombre
2. Calidad de datos
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 7/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
lapply(df,summary)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 8/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## $customerID
## Length Class Mode
## 7043 character character
##
## $gender
## Length Class Mode
## 7043 character character
##
## $SeniorCitizen
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 0.0000 0.1621 0.0000 1.0000
##
## $Partner
## Length Class Mode
## 7043 character character
##
## $Dependents
## Length Class Mode
## 7043 character character
##
## $tenure
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 9.00 29.00 32.37 55.00 72.00
##
## $PhoneService
## Length Class Mode
## 7043 character character
##
## $MultipleLines
## Length Class Mode
## 7043 character character
##
## $InternetService
## Length Class Mode
## 7043 character character
##
## $OnlineSecurity
## Length Class Mode
## 7043 character character
##
## $OnlineBackup
## Length Class Mode
## 7043 character character
##
## $DeviceProtection
## Length Class Mode
## 7043 character character
##
## $TechSupport
## Length Class Mode
## 7043 character character
##
## $StreamingTV
## Length Class Mode
## 7043 character character
##
## $StreamingMovies
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 9/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Parece que hay muchos ceros en senior citizen (la mediana es 0 y la media es muy baja) por lo que podría ser
una variable a eliminar pero también puede ser debido a que hay pocos seniors en la base de datos en una
variable dicotómica (1=Seniors / 0=No Seniors). Tenure parece ser una variable que mida la antigüedad o el
tiempo que lleva un usuario siendo cliente de la compañía, probablemente medido en meses.
data.frame(colSums(is.na(df)))
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 10/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## colSums.is.na.df..
## customerID 0
## gender 0
## SeniorCitizen 0
## Partner 0
## Dependents 0
## tenure 0
## PhoneService 0
## MultipleLines 0
## InternetService 0
## OnlineSecurity 0
## OnlineBackup 0
## DeviceProtection 0
## TechSupport 0
## StreamingTV 0
## StreamingMovies 0
## Contract 0
## PaperlessBilling 0
## PaymentMethod 0
## MonthlyCharges 0
## TotalCharges 11
## Churn 0
Vamos a ver si además hay algunos que se han convertido en ceros y contamos los ceros para cada una de
las variables.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 11/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Hay 5901 ceros (el 84% del total) en Senior Citizen pero como ya dijimos parece un factor en el que el 0
representa a los clientes “no senior” por lo que podría tener sentido.
Además hay 11 casos con ceros en tenure que podríamos analizar si coinciden con los 11 casos con NA en
Total Charges y si merece la pena eliminarnos en el caso de que estén incompletos aunque podrían ser
clientes nuevos con una antigüedad inferior al mes.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 12/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 13/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Convertimos la variable tenure de entero a numérica para poder ver sus valores más altos
df$tenure <-as.numeric(df$tenure)
Para todas las variables continuas de la base de datos (antigüedad, pagos totales, pagos mensuales y tenure)
vamos a ver cuales son sus valores más altos
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 14/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## $customerID
## NULL
##
## $gender
## NULL
##
## $SeniorCitizen
## NULL
##
## $Partner
## NULL
##
## $Dependents
## NULL
##
## $tenure
## [,1]
## [1,] 72
## [2,] 72
## [3,] 72
## [4,] 72
## [5,] 72
## [6,] 72
## [7,] 72
## [8,] 72
## [9,] 72
## [10,] 72
## [11,] 72
## [12,] 72
## [13,] 72
## [14,] 72
## [15,] 72
## [16,] 72
## [17,] 72
## [18,] 72
## [19,] 72
## [20,] 72
##
## $PhoneService
## NULL
##
## $MultipleLines
## NULL
##
## $InternetService
## NULL
##
## $OnlineSecurity
## NULL
##
## $OnlineBackup
## NULL
##
## $DeviceProtection
## NULL
##
## $TechSupport
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 15/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## NULL
##
## $StreamingTV
## NULL
##
## $StreamingMovies
## NULL
##
## $Contract
## NULL
##
## $PaperlessBilling
## NULL
##
## $PaymentMethod
## NULL
##
## $MonthlyCharges
## [,1]
## [1,] 118.75
## [2,] 118.65
## [3,] 118.60
## [4,] 118.60
## [5,] 118.35
## [6,] 118.20
## [7,] 117.80
## [8,] 117.60
## [9,] 117.50
## [10,] 117.45
## [11,] 117.35
## [12,] 117.20
## [13,] 117.15
## [14,] 116.95
## [15,] 116.85
## [16,] 116.80
## [17,] 116.75
## [18,] 116.60
## [19,] 116.60
## [20,] 116.55
##
## $TotalCharges
## [,1]
## [1,] 8684.80
## [2,] 8672.45
## [3,] 8670.10
## [4,] 8594.40
## [5,] 8564.75
## [6,] 8547.15
## [7,] 8543.25
## [8,] 8529.50
## [9,] 8496.70
## [10,] 8477.70
## [11,] 8477.60
## [12,] 8476.50
## [13,] 8468.20
## [14,] 8456.75
## [15,] 8443.70
## [16,] 8436.25
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 16/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [17,] 8425.30
## [18,] 8425.15
## [19,] 8424.90
## [20,] 8405.00
##
## $Churn
## NULL
Los mayores valores se corresponden con una antigüedad de 72 meses (6 años), 118€ de cargos mensuales
y 8.684€ de cargos totales.
Mi hipótesis es que los cargos totales es el resultado de multiplicar los cargos mensuales por la antigüedad ya
que si dividimos los cargos totales máximos entre la antigüedad máxima obtenemos 120€ mensuales, un valor
muy próximo al valor más alto de facturación mensual (119€).
summary(df$MonthlyCharges)
summary(df$TotalCharges)
summary(df$tenure)
Analizando los estadísticos básicos vemos que la media se sitúa en 65€ de cargos mensuales, 2283€ de
cargos totales y una antigüedad de 32 meses.
Parece que puede haber algún problema con la variable antigüedad (tenure) que tiene algunos ceros. Vamos
a ver cuanto facturan estos clientes para entender si son clientes sin antigüedad pero con tarifa mensual y
comprobar sus datos en otras variables clave como servicios de TV en streaming o películas.
df %>%
filter(tenure == 0) %>%
select(tenure, TotalCharges, MonthlyCharges, StreamingTV, StreamingMovies)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 17/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Son 11 casos con una antigüedad de 0. Deben ser clientes nuevos ya que tienen valores de NA en
TotalCharges (todavía no han facturado) pero sí una tarifa mensual por lo que podríamos eliminarlos o
asignarles un valor 0 en TotalCharges
En general salvo al principio y al final del gráfico los clientes se reparten de manera bastante equilibrada en
todos los niveles. Que haya bastantes clientes nuevos parece correcto pero probablemente los de más de 72
meses (6 años) son clientes más antiguos pero 72 meses es el nivel máximo disponible en el sistema. Habrá
por tanto que discretizar la variable para evitar esos problemas
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 18/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
head(df) %>%
select(MonthlyCharges,TotalCharges,tenure) %>%
mutate(TotalChargesv2=MonthlyCharges*tenure)
Vemos que efectivamente parece que TotalCharges es el resultado de multiplicar las otras 2 variables
(tenencia y cargos mensuales) por lo que la podríamos eliminar y quedarnos con las otras dos que aportan la
misma información. De hecho vamos a ver la correlación de TotalCharges con el resultado de multiplicar las
otras dos variables tanto numérica como gráficamente
## [1] 0.9995599
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 19/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
La correlación entre ambas variables es el 99.95599% y visualmente vemos que coinciden por lo que vamos
a eliminar la variable Total Charges y quedarnos con las otras dos variables que nos pueden ayudar a
predecir mejor el Churn
Además voy a comprobar que aquellos que no tienen servicio de Internet “No Internet service” obtienen los
mismos resultados en las otras seis variables relacionadas con Internet. Para ello tenemos que transformar
todas estas variables en factores y ver con summary los valores de sin servicio de internet (No internet
service)
summary(df$StreamingTV)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 20/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
summary(df$StreamingMovies)
summary(df$OnlineSecurity)
summary(df$OnlineBackup)
summary(df$DeviceProtection)
summary(df$TechSupport)
Hay 1526 clientes sin servicio de Internet y este valor es el mismo en las seis variables relacionadas con los
servicios de Internet.
Vamos también a comprobar que el resultado “No internet service” en StreamingTV, StreamingMovies,
OnlineSecurity, OnlineBackup, DeviceProtection y TechSupport se corresponde con un No en la variable
InternetService en esos mismos registros
df %>%
filter(row_number() <= 30) %>%
filter(InternetService == 'No') %>%
select(InternetService,StreamingTV,StreamingMovies,OnlineSecurity,OnlineBackup,DeviceProtec
tion, TechSupport)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 21/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Vemos que en principio es correcto y que cuando no hay servicio en internet en la variable InternetService se
refleja correctamente en las otras seis variables y por tanto no hay televisión, películas por internet, seguridad
online, backup, protección del dispositivo y servicio técnico para lo que es necesario tener internet.
Tenemos que hacer la misma comprobación con otras dos variables correlacionadas: la presencia del servicio
de Teléfono (PhoneService) y la existencia de varias líneas de teléfono (MultipleLines)
## No Yes
## 682 6361
summary(df$MultipleLines)
Vemos que 682 clientes no tienen servicio de teléfono y el número coincide en ambas variables
Voy también a comprobar que el resultado “No phone service” en MultipleLines se corresponde con un No en
la variable PhoneService en algunos de los registros
df %>%
filter(row_number() <= 30) %>%
filter(PhoneService == 'No') %>%
select(PhoneService,MultipleLines)
## PhoneService MultipleLines
## 1 No No phone service
## 2 No No phone service
## 3 No No phone service
## 4 No No phone service
## 5 No No phone service
En cualquier caso y para evitar correlaciones entre las variables relacionadas con Internet y con el servicio de
teléfono tendremos que transformar el “no internet” o “no phone service” en simplemente un “no”
3. Transformación de datos
Acciones resultado del analisis de calidad de datos y exploratorio:
Transformar los resultados de la variable target (Churn) de si/no a 1 y 0 para poder funcionar como
variable target
Transformar los valores “No Internet Service” de las variables relacionadas con internet
(OnlineSecurity, OnlineBackup, DeviceProtection, StreamingMovies y StreamingTV) y “No Phone
Line” de la variable relacionada con la línea de teléfono (MultiplesLines) en un simple “No” para
evitar correlaciones entre las mismas y dejarlas en variables dicotómicas
Transformar a factor las variables de ‘a_factores’ que no habíamos transformado previamente. Ya
hemos transformado tenure en una variable numérica (era una variable entera)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 22/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Discretizar la variable tenencia (tenure) para corregir los valores elevados en a partir de los 6 años
Eliminar la variable TotalCharges que es resultado de multiplicar las otras dos y así evitamos las NA
que se producen cuando la tenencia es cero (clientes nuevos)
df <- df %>%
mutate(Churn = ifelse(Churn == 'Yes', 1, 0))
df$Churn <- as.factor(df$Churn)
Y transformamos las variables independientes que habíamos incluido en la lista a_factores en factores
df <- df %>%
mutate_at(a_factores,list(factor))
Creamos una lista larga con todas las variables independientes. Eliminamos de esa lista el CustomerID y Total
Charges además de la variable Churn que es la variable target
ind_larga<-names(df)
no_usar <- c('customerID','Churn', 'TotalCharges')
ind_larga<-setdiff(ind_larga,no_usar)
No hace falta crear una muestra para trabajar porque sólo tenemos 7000 observaciones y por tanto no
manejamos muchos datos.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 23/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
La antigüedad (tenure)
El cargo mensual (MonthlyCharges)
La duración del contrato (Contract)
Si tiene o no contratado internet (InternetService)
El método de pago (PaymentMethod)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 24/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
##
|
| | 0%
|
|--- | 5%
|
|----- | 11%
|
|-------- | 16%
|
|----------- | 21%
|
|------------- | 26%
|
|---------------- | 32%
|
|------------------ | 37%
|
|--------------------- | 42%
|
|------------------------ | 47%
|
|-------------------------- | 53%
|
|----------------------------- | 58%
|
|-------------------------------- | 63%
|
|---------------------------------- | 68%
|
|------------------------------------- | 74%
|
|--------------------------------------- | 79%
|
|------------------------------------------ | 84%
|
|--------------------------------------------- | 89%
|
|----------------------------------------------- | 95%
|
|--------------------------------------------------| 100%
##
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 25/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
imp_final
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 26/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Las cinco variables mas importantes en base tanto al Random Forest y el IV son
La antigüedad (tenure)
La duración del contrato (Contract)
Los cargos mensuales (MonthlyCharges)
El servicio de Internet (InternetService)
El método de pago (PaymentMethod)
Vamos a comprobar si los dos métodos nos han dado resultados similares por lo que calculamos su
correlación
cor(imp_final$IMP_RF,imp_final$IMP_IV,use = 'complete.obs')
## [1] 0.9035112
Una correlación de 90.35112% es un dato elevado por lo que podemos dar como válidos los datos
Limitamos las variables explicativas a aquellas que hayan salido en el Top 10 en alguna de las dos cálculos y
vemos cuáles son
Una vez que ya hemos identificado las variables independientes más relevantes tenemos que volver añadir la
variable target y el código de cliente que eliminamos previamente para generar un nuevo dataframe.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 27/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
ls()
rm(list=setdiff(ls(),'df'))
saveRDS(df,'cacheDan1.rds')
Primero cargamos el cache temporal y definimos de nuevo las variables target e independientes
Discretizamos las dos variables numéricas: antigüedad (tenure) y cargos mensuales (MonthlyCharges)
#tenure
disc_temp_tenure <- discretizar(df$tenure,df$Churn)
df_temp <- select(df,tenure,Churn)
df_temp <- smbinning.gen(df_temp,disc_temp_tenure,chrname = 'Tenure_DISC')
df <- cbind(df,df_temp[3])
#MonthlyCharges
disc_temp_MonthlyCharges <- discretizar(df$MonthlyCharges,df$Churn)
df_temp <- select(df,MonthlyCharges,Churn)
df_temp <- smbinning.gen(df_temp,disc_temp_MonthlyCharges,chrname = 'MonthlyCharges_DISC')
df <- cbind(df,df_temp[3])
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 28/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Parece que los niveles quedan algo descompensados ya que el mayor número de clientes se sitúan entre 22
y 49 meses de antigüedad y en este corte se incluyen 27 meses mientras que, por ejemplo, en el nivel anterior
se incluyen sólo 4 meses.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 29/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Del mismo modo que en la variable antigüedad en MonthlyCharges hay un grupo muy descompensado que es
el 4 ya que incluye más de 3000 clientes al incluir casi 40 € en el rango vs los 13 € del grupo anterior.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 30/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Podemos ver que para Tenure la penetración del target es completamente monótona por lo que la dejamos tal
cual y eliminamos la variable sin discretizar
df <- df %>%
select(-tenure)
Del mismo modo incluimos la penetración del target para la variable MonthlyCharges
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 31/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
En este caso la variable no es monótona por lo que vamos a probar con la discretización manual con rangos
de 20€ hasta los 100€
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 32/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Ahora sí parece que la variable sigue una tendencia ascendente aunque en el último grupo cae ligeramente
por lo que vamos a dejar esta variable con la discretización manual
Eliminamos la variable discretizada de manera automática que ya no nos sirve y cambiamos el nombre de
MonthlyCharges que habíamos discretizado por el de MonthlyCharges_DISC
df <- df %>%
select(-MonthlyCharges_DISC)
df <- df %>%
rename(MonthlyCharges_DISC = MonthlyCharges)
Vamos a ver visualmente todas las variables incluida la variable target Churn
df %>%
select_if(is.factor) %>%
gather() %>%
ggplot(aes(value)) +
geom_bar(color = "white", fill = "darkgreen") +
facet_wrap(~ key, scales = "free") +
theme(axis.text=element_text(size=5))
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 33/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Vamos a ver como ha quedado nuestro fichero antes de pasar a la fase de modelizacion
glimpse(df)
## Observations: 7,043
## Variables: 14
## $ Contract <fct> Month-to-month, One year, Month-to-month, One yea…
## $ MonthlyCharges_DISC <fct> 02_DE_20_A_40, 03_DE_40_A_60, 03_DE_40_A_60, 03_D…
## $ InternetService <fct> DSL, DSL, DSL, DSL, Fiber optic, Fiber optic, Fib…
## $ PaymentMethod <fct> Electronic check, Mailed check, Mailed check, Ban…
## $ PaperlessBilling <fct> Yes, No, Yes, No, Yes, Yes, Yes, No, Yes, No, Yes…
## $ OnlineSecurity <fct> No, Yes, Yes, Yes, No, No, No, Yes, No, Yes, Yes,…
## $ TechSupport <fct> No, No, No, Yes, No, No, No, No, Yes, No, No, No,…
## $ SeniorCitizen <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Partner <fct> Yes, No, No, No, No, No, No, No, Yes, No, Yes, No…
## $ OnlineBackup <fct> Yes, No, Yes, No, No, No, Yes, No, No, Yes, No, N…
## $ Dependents <fct> No, No, No, No, No, No, Yes, No, No, Yes, Yes, No…
## $ customerID <chr> "7590-VHVEG", "5575-GNVDE", "3668-QPYBK", "7795-C…
## $ Churn <fct> 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0…
## $ Tenure_DISC <fct> 01 <= 1, 05 <= 49, 02 <= 5, 05 <= 49, 02 <= 5, 03…
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 34/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Ahora todas las variables salvo el CustomerID son factoriales incluidas las que eran continuas y que hemos
discretizado
saveRDS(df,'cacheDan2.rds')
4. Modelización manual
Vamos a probar manualmente cuatro algoritmos diferentes para ver cual funciona mejor y elegir aquel que
tiene mayor capacidad predictora de la variable target, el Churn. En concreto vamos a modelizar con:
Regresión Logística
Árboles de decisión
Random Forest
Bayes naive
Para ello primero cargamos el cache temporal con los datos a emplear
df <- readRDS('cacheDan2.rds')
confusion<-function(real,scoring,umbral){
conf<-table(real,scoring>=umbral)
if(ncol(conf)==2) return(conf) else return(NULL)
}
Función para calcular las métricas de los modelos: acierto, precisión, cobertura y F1
metricas<-function(matriz_conf){
acierto <- (matriz_conf[1,1] + matriz_conf[2,2]) / sum(matriz_conf) *100
precision <- matriz_conf[2,2] / (matriz_conf[2,2] + matriz_conf[1,2]) *100
cobertura <- matriz_conf[2,2] / (matriz_conf[2,2] + matriz_conf[2,1]) *100
F1 <- 2*precision*cobertura/(precision+cobertura)
salida<-c(acierto,precision,cobertura,F1)
return(salida)
}
Función para probar distintos umbrales y ver el efecto sobre precisión y cobertura
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 35/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
umbrales<-function(real,scoring){
umbrales<-data.frame(umbral=rep(0,times=19),acierto=rep(0,times=19),precision=rep(0,times=1
9),cobertura=rep(0,times=19),F1=rep(0,times=19))
cont <- 1
for (cada in seq(0.05,0.95,by = 0.05)){
datos<-metricas(confusion(real,scoring,cada))
registro<-c(cada,datos)
umbrales[cont,]<-registro
cont <- cont + 1
}
return(umbrales)
}
roc<-function(prediction){
r<-performance(prediction,'tpr','fpr')
plot(r)
}
auc<-function(prediction){
a<-performance(prediction,'auc')
return(a@y.values[[1]])
}
set.seed(12345)
df$random<-sample(0:1,size = nrow(df),replace = T,prob = c(0.3,0.7))
train<-filter(df,random==1)
test<-filter(df,random==0)
df$random <- NULL
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 36/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 37/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Call:
## glm(formula = formula_rl, family = binomial(link = "logit"),
## data = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0713 -0.6856 -0.2592 0.5854 3.2868
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 0.78785 0.33544 2.349
## ContractOne year -0.77413 0.12989 -5.960
## ContractTwo year -1.71221 0.23222 -7.373
## MonthlyCharges_DISC02_DE_20_A_40 -0.20159 0.24525 -0.822
## MonthlyCharges_DISC03_DE_40_A_60 -0.40752 0.31047 -1.313
## MonthlyCharges_DISC04_DE_60_A_80 -0.41190 0.33757 -1.220
## MonthlyCharges_DISC05_DE_80_A_100 -0.06846 0.36053 -0.190
## MonthlyCharges_DISC07_MAYOR_100 0.40096 0.38782 1.034
## InternetServiceFiber optic 0.69193 0.18995 3.643
## InternetServiceNo -1.40874 0.24841 -5.671
## PaymentMethodCredit card (automatic) -0.06755 0.13599 -0.497
## PaymentMethodElectronic check 0.24167 0.11389 2.122
## PaymentMethodMailed check -0.15405 0.13856 -1.112
## PaperlessBillingYes 0.36767 0.08996 4.087
## OnlineSecurityYes -0.35766 0.10282 -3.479
## TechSupportYes -0.23628 0.10626 -2.224
## SeniorCitizen1 0.19190 0.10049 1.910
## PartnerYes 0.18824 0.09325 2.019
## OnlineBackupYes -0.12575 0.09389 -1.339
## DependentsYes -0.19271 0.10828 -1.780
## Tenure_DISC02 <= 5 -0.94728 0.14977 -6.325
## Tenure_DISC03 <= 16 -1.36954 0.14592 -9.386
## Tenure_DISC04 <= 22 -1.85791 0.18507 -10.039
## Tenure_DISC05 <= 49 -2.20999 0.15849 -13.944
## Tenure_DISC06 <= 59 -2.20157 0.20889 -10.539
## Tenure_DISC07 <= 70 -2.56079 0.23163 -11.056
## Tenure_DISC08 > 70 -3.80441 0.47957 -7.933
## Pr(>|z|)
## (Intercept) 0.018837 *
## ContractOne year 0.00000000252176384 ***
## ContractTwo year 0.00000000000016671 ***
## MonthlyCharges_DISC02_DE_20_A_40 0.411097
## MonthlyCharges_DISC03_DE_40_A_60 0.189316
## MonthlyCharges_DISC04_DE_60_A_80 0.222382
## MonthlyCharges_DISC05_DE_80_A_100 0.849403
## MonthlyCharges_DISC07_MAYOR_100 0.301190
## InternetServiceFiber optic 0.000270 ***
## InternetServiceNo 0.00000001419561110 ***
## PaymentMethodCredit card (automatic) 0.619404
## PaymentMethodElectronic check 0.033835 *
## PaymentMethodMailed check 0.266224
## PaperlessBillingYes 0.00004368168984892 ***
## OnlineSecurityYes 0.000504 ***
## TechSupportYes 0.026177 *
## SeniorCitizen1 0.056180 .
## PartnerYes 0.043526 *
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 38/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## OnlineBackupYes 0.180485
## DependentsYes 0.075131 .
## Tenure_DISC02 <= 5 0.00000000025346651 ***
## Tenure_DISC03 <= 16 < 0.0000000000000002 ***
## Tenure_DISC04 <= 22 < 0.0000000000000002 ***
## Tenure_DISC05 <= 49 < 0.0000000000000002 ***
## Tenure_DISC06 <= 59 < 0.0000000000000002 ***
## Tenure_DISC07 <= 70 < 0.0000000000000002 ***
## Tenure_DISC08 > 70 0.00000000000000214 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5711.2 on 4940 degrees of freedom
## Residual deviance: 4033.4 on 4914 degrees of freedom
## AIC: 4087.4
##
## Number of Fisher Scoring iterations: 6
Revisamos la significatividad y mantenemos las cinco variables que tienen tres estrellas en alguno de sus
valores:
Contrato
Servicio de Internet
Seguridad online
Factura sin papel
Antigüedad
a_mantener <- c(
'Contract',
'InternetService',
'OnlineSecurity',
'PaperlessBilling',
'Tenure_DISC'
)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 39/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Call:
## glm(formula = formula_rl, family = binomial(link = "logit"),
## data = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.9958 -0.6801 -0.2767 0.5417 3.2894
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.31357 0.13506 2.322 0.020246 *
## ContractOne year -0.83068 0.12553 -6.617 0.0000000000366039 ***
## ContractTwo year -1.88549 0.22619 -8.336 < 0.0000000000000002 ***
## InternetServiceFiber optic 1.11043 0.09176 12.102 < 0.0000000000000002 ***
## InternetServiceNo -1.13010 0.14872 -7.599 0.0000000000000299 ***
## OnlineSecurityYes -0.36569 0.10010 -3.653 0.000259 ***
## PaperlessBillingYes 0.42099 0.08858 4.752 0.0000020105130901 ***
## Tenure_DISC02 <= 5 -0.95112 0.14868 -6.397 0.0000000001584892 ***
## Tenure_DISC03 <= 16 -1.34002 0.14214 -9.427 < 0.0000000000000002 ***
## Tenure_DISC04 <= 22 -1.81540 0.17975 -10.099 < 0.0000000000000002 ***
## Tenure_DISC05 <= 49 -2.09241 0.14712 -14.223 < 0.0000000000000002 ***
## Tenure_DISC06 <= 59 -1.99484 0.19422 -10.271 < 0.0000000000000002 ***
## Tenure_DISC07 <= 70 -2.29195 0.20982 -10.923 < 0.0000000000000002 ***
## Tenure_DISC08 > 70 -3.46783 0.46581 -7.445 0.0000000000000972 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5711.2 on 4940 degrees of freedom
## Residual deviance: 4096.1 on 4927 degrees of freedom
## AIC: 4124.1
##
## Number of Fisher Scoring iterations: 6
Vemos que ahora todas las variables seleccionadas (Contract, InternetService, OnlineSecurity,
PaperlessBilling y Tenure_DISC) tienen 3 estrellas de significacion en alguno de sus niveles
En relación con el signo de los coeficientes y su valor vemos que la relación tiene sentido de negocio:
1. La mayor antigüedad genera mayores coeficientes y de signo negativo, es decir que el Churn o el
abandono baja a mayor antigüedad
2. El tener fibra óptica genera mayor probabilidad de Churn mientras que no tener Servicio de
Internet tiene signo negativo, es decir, reduce el Churn. Quizás esto puede estar debido a la mayor
actividad promocional en este servicio o al perfil del usuario de Internet que es más proclive a cambiar
de compañía de telecomunicaciones vs aquel que tiene sólo línea de teléfono
3. Disponer del servicio de seguridad online también disminuye la probabilidad de Churn
4. No tener factura en papel incrementa la probabilidad de Churn. Probablemente porque estos
clientes son los más digitales y los que más buscan opciones de cambio
5. Como era previsible el tener algún tipo de contrato anual (uno o dos años) vs el mensual reduce la
probabilidad de Churn y cuanto más largo es el contrato más se reduce
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 40/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [1] 0.2827973
El R cuadrado es bajo ya que sólo explica de manera correcta el 28.27973% de la variabilidad de la variable
target y se sitúa por debajo del 50%. En cualquier caso vamos a analizar el modelo con el resto de variables
para entender si es válido.
rl_predict<-predict(rl,test,type = 'response')
Lo vemos visualmente
Aunque en general parece que como cabría esperar los valores medios de scoring en aquellos que tienen un
Churn positivo son más altos (alrededor de un 0.4) que cuando el Churn es 0 (0.1) vemos que algunos valores
de Churn real tienen niveles elevados de probabilidad en el scoring
Y podemos ver esos valores que tienen un Churn de 0 pero que en su predicción dan un scoring elevado (por
encima del 60%)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 41/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
test_rlpredict <-
cbind(rl_predict,test)
test_rlpredict %>%
filter(rl_predict >= '0.6', Churn=='0') %>%
select(Churn,rl_predict)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 42/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Churn rl_predict
## 1 0 0.6758052
## 2 0 0.8059653
## 3 0 0.6236269
## 4 0 0.7096887
## 5 0 0.6236269
## 6 0 0.6236269
## 7 0 0.7096887
## 8 0 0.6236269
## 9 0 0.6236269
## 10 0 0.6236269
## 11 0 0.6236269
## 12 0 0.8059653
## 13 0 0.6236269
## 14 0 0.6236269
## 15 0 0.6290584
## 16 0 0.6758052
## 17 0 0.6160669
## 18 0 0.6236269
## 19 0 0.7096887
## 20 0 0.6290584
## 21 0 0.6758052
## 22 0 0.6758052
## 23 0 0.8635377
## 24 0 0.6758052
## 25 0 0.8059653
## 26 0 0.6236269
## 27 0 0.6758052
## 28 0 0.6160669
## 29 0 0.7096887
## 30 0 0.7096887
## 31 0 0.7096887
## 32 0 0.6236269
## 33 0 0.6236269
## 34 0 0.7096887
## 35 0 0.6236269
## 36 0 0.8144662
## 37 0 0.6236269
## 38 0 0.8635377
## 39 0 0.7096887
## 40 0 0.6236269
## 41 0 0.6236269
## 42 0 0.6160669
## 43 0 0.6758052
## 44 0 0.6758052
## 45 0 0.7096887
## 46 0 0.6236269
## 47 0 0.6758052
## 48 0 0.7096887
## 49 0 0.6236269
## 50 0 0.6236269
## 51 0 0.7096887
## 52 0 0.7096887
## 53 0 0.6160669
## 54 0 0.8635377
## 55 0 0.6236269
## 56 0 0.6236269
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 43/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## 57 0 0.8059653
## 58 0 0.6236269
## 59 0 0.7096887
## 60 0 0.6236269
## 61 0 0.7096887
## 62 0 0.6160669
## 63 0 0.8635377
## 64 0 0.6758052
## 65 0 0.6236269
## 66 0 0.6236269
## 67 0 0.6236269
## 68 0 0.6236269
## 69 0 0.6236269
## 70 0 0.6236269
## 71 0 0.6160669
## 72 0 0.8635377
## 73 0 0.6236269
## 74 0 0.6160669
## 75 0 0.6290584
## 76 0 0.6290584
## 77 0 0.6236269
## 78 0 0.6236269
Son 78 casos con una probabilidad o scoring superior al 60% pese a que su Churn real es 0. En una muestra
de alrededor 2000 casos no son tampoco muchos así que vamos a transformar la probabilidad en un scoring
de si el cliente va a cancelar o no el servicio
umb_rl<-umbrales(test$Churn,rl_predict)
umb_rl
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 44/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
umbral_final_rl<-umb_rl[which.max(umb_rl$F1),1]
umbral_final_rl
## [1] 0.3
confusion(test$Churn,rl_predict,umbral_final_rl)
##
## real FALSE TRUE
## 0 1140 401
## 1 116 445
rl_metricas<-filter(umb_rl,umbral==umbral_final_rl)
rl_metricas
La precisión tiene niveles algo bajos ya que predice como positivos valores que son negativos. La
cobertura es más alta ya que funciona a la inversa que la precisión y nos indica que % de positivos
reales identifica.
En este caso parece que tiene más sentido dar prioridad a la cobertura para asegurar que somos
capaces de reducir el Churn aunque en ocasiones generemos falsos negativos y eso suponga un
coste añadido (si llevamos a cabo una campaña para reducir el Churn ofreciendo mejores condiciones a
algunos clientes que en realidad no tienen pretensión de cambiar de compañía) El acierto también es elevado
Evaluamos la ROC
rl_prediction<-prediction(rl_predict,test$Churn)
roc(rl_prediction)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 45/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
rl_metricas<-cbind(rl_metricas,AUC=round(auc(rl_prediction),2)*100)
print(t(rl_metricas))
## [,1]
## umbral 0.30000
## acierto 75.40438
## precision 52.60047
## cobertura 79.32264
## F1 63.25515
## AUC 84.00000
En cualquier caso la métrica más relevante, el AUC, alcanza un nivel elevado (84.04825)
printcp(ar)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 46/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Classification tree:
## rpart(formula = formula_ar, data = train, method = "class", parms = list(split = "informat
ion"),
## control = rpart.control(cp = 0.00001))
##
## Variables actually used in tree construction:
## [1] Contract Dependents InternetService
## [4] MonthlyCharges_DISC OnlineBackup OnlineSecurity
## [7] PaperlessBilling Partner PaymentMethod
## [10] SeniorCitizen TechSupport Tenure_DISC
##
## Root node error: 1308/4941 = 0.26472
##
## n= 4941
##
## CP nsplit rel error xerror xstd
## 1 0.06982671 0 1.00000 1.00000 0.023709
## 2 0.00535168 3 0.79052 0.79052 0.021861
## 3 0.00382263 7 0.76529 0.78058 0.021759
## 4 0.00305810 13 0.74159 0.79052 0.021861
## 5 0.00267584 15 0.73547 0.78899 0.021845
## 6 0.00254842 17 0.73012 0.78670 0.021822
## 7 0.00229358 21 0.71942 0.78440 0.021798
## 8 0.00191131 25 0.71024 0.78746 0.021830
## 9 0.00152905 29 0.70260 0.78976 0.021853
## 10 0.00127421 41 0.68196 0.79587 0.021915
## 11 0.00101937 44 0.67813 0.79969 0.021954
## 12 0.00076453 50 0.67202 0.81498 0.022105
## 13 0.00057339 73 0.65443 0.80199 0.021977
## 14 0.00050968 77 0.65214 0.81040 0.022060
## 15 0.00038226 83 0.64908 0.80963 0.022053
## 16 0.00025484 89 0.64679 0.81651 0.022120
## 17 0.00015291 98 0.64450 0.82492 0.022202
## 18 0.00012742 103 0.64373 0.82569 0.022210
## 19 0.00001000 109 0.64297 0.82492 0.022202
plotcp(ar)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 47/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Parece que minimiza aprox en 0.0022 de complejidad y generamos un nuevo arbol con ese parametro
Además vamos a incluir un nuevo parámetro para que el árbol no tenga más de 7 niveles
printcp(ar)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 48/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Classification tree:
## rpart(formula = formula, data = train, method = "class", parms = list(split = "informatio
n"),
## control = rpart.control(cp = 0.0022, maxdepth = 7))
##
## Variables actually used in tree construction:
## [1] Contract InternetService MonthlyCharges_DISC
## [4] OnlineBackup OnlineSecurity PaperlessBilling
## [7] PaymentMethod SeniorCitizen Tenure_DISC
##
## Root node error: 1308/4941 = 0.26472
##
## n= 4941
##
## CP nsplit rel error xerror xstd
## 1 0.0698267 0 1.00000 1.00000 0.023709
## 2 0.0053517 3 0.79052 0.79052 0.021861
## 3 0.0030581 7 0.76529 0.78593 0.021814
## 4 0.0022936 8 0.76223 0.78823 0.021837
## 5 0.0022000 18 0.73471 0.79434 0.021900
plotcp(ar)
Parece bastante estable así que vamos a crear el gráfico del árbol para analizarlo
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 49/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Y vamos a sacar las reglas que podrian ser utilizadas por ejemplo para hacer una implantacion del arbol
rpart.rules(ar,style = 'tall',cover = T)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 50/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 51/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Contract is Month-to-month
## Tenure_DISC is 01 <= 1 or 02 <= 5
## InternetService is DSL
## SeniorCitizen is 1
##
## Churn is 0.87 with cover 3% when
## Contract is Month-to-month
## Tenure_DISC is 01 <= 1
## InternetService is Fiber optic
Por ejemplo el primer criterio sería tener un contrato de uno o dos años que bajaría notablemente el Churn, el
segundo criterio se base en un contrato mensual, con una antigüedad superior a los 5 meses pero sin servicio
de internet, etc…
Podemos llevarnos el nodo final de cada cliente a un data.frame para poder hacer una explotación posterior
ar_numnodos<-rpart.predict(ar,test,nn = T)
head(ar_numnodos)
## 0 1 nn
## 1 0.3888889 0.61111111 219
## 2 0.9347531 0.06524694 2
## 3 0.6025641 0.39743590 108
## 4 0.9347531 0.06524694 2
## 5 0.4653061 0.53469388 239
## 6 0.9347531 0.06524694 2
ar_predict<-predict(ar,test,type = 'prob')[,2]
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 53/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Aquí vemos que predice en línea a como lo hacía el modelo anterior de la regresión logística pero como en
este caso seguimos teniendo valores con un elevado scoring pero un Churn real de 0
umb_ar<-umbrales(test$Churn,ar_predict)
umb_ar
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 54/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
umbral_final_ar<-umb_ar[which.max(umb_ar$F1),1]
umbral_final_ar
## [1] 0.35
confusion(test$Churn,ar_predict,umbral_final_ar)
##
## real FALSE TRUE
## 0 1302 239
## 1 189 372
ar_metricas<-filter(umb_ar,umbral==umbral_final_ar)
ar_metricas
Evaluamos la ROC
ar_prediction<-prediction(ar_predict,test$Churn)
roc(ar_prediction)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 55/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
ar_metricas<-cbind(ar_metricas,AUC=round(auc(ar_prediction),2)*100)
print(t(ar_metricas))
## [,1]
## umbral 0.35000
## acierto 79.63844
## precision 60.88380
## cobertura 66.31016
## F1 63.48123
## AUC 82.00000
Este modelo tiene mayor precisión que la regresión logística pero como es lógico la cobertura es más baja ya
que ambas variables funcionan a la inversa. El acierto también es más elevado que la regresión logística.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 56/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Call:
## randomForest(formula = formula_rf, data = train, importance = T)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 20.38%
## Confusion matrix:
## 0 1 class.error
## 0 3216 417 0.1147812
## 1 590 718 0.4510703
Vemos que la antigüedad es la variable más importante en Random Forest en los dos criterios pero el resto de
posiciones el orden difiere bastante.
Como hay dos criterios vamos a crear una unica variable agregada y visualizarla para tener una mejor idea de
la importancia de cada variable
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 57/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
importancia_norm
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 58/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
La antigüedad
La presencia de contrato
El servicio de Internet
Los cargos mensuales
El sistema de pago
La caída es bastante gradual, asi que no hay corte claro. Podemos seleccionar aquellas variables que están
por encima de 1.0
##
## Call:
## randomForest(formula = formula_rf, data = train, importance = T)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 20.52%
## Confusion matrix:
## 0 1 class.error
## 0 3260 373 0.1026700
## 1 641 667 0.4900612
rf_predict<-predict(rf,test,type = 'prob')[,2]
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 59/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Parece que se generan bastantes valores con un Churn negativo pero scoring elevados en el modelo.
Además los valores con un Churn positivo tiene una dispersión muy amplia.
umb_rf<-umbrales(test$Churn,rf_predict)
umb_rf
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 60/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
De nuevo parece que el umbral que maximiza el F1 es el mismo queen la regresión logística pero lo
seleccionamos automáticamente
umbral_final_rf<-umb_rf[which.max(umb_rf$F1),1]
umbral_final_rf
## [1] 0.25
confusion(test$Churn,rf_predict,umbral_final_rf)
##
## real FALSE TRUE
## 0 1290 251
## 1 190 371
rf_metricas<-filter(umb_rf,umbral==umbral_final_rf)
rf_metricas
Evaluamos la ROC
rf_prediction<-prediction(rf_predict,test$Churn)
roc(rf_prediction)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 61/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
rf_metricas<-cbind(rf_metricas,AUC=round(auc(rf_prediction),2)*100)
print(t(rf_metricas))
## [,1]
## umbral 0.25000
## acierto 79.01998
## precision 59.64630
## cobertura 66.13191
## F1 62.72189
## AUC 83.00000
La precisión es más elevada que en la regresión logística y los árboles de decisión pero la cobertura al
contrario es baja.
El acierto es el más elevado de los tres. La AUC es superior a los Árboles de decisión pero por debajo
del que alcanza la regresión logística (83.36879)
Primero tenemos que eliminar de las dos muestras de entrenamiento y de test el código de cliente y dejar sólo
la variable target y las independientes
Creamos el modelo y vemos como clasifica en las dos niveles de la variable independiente Churn
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 62/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Bayes=naiveBayes(Churn~., data=train_Bayes)
print(Bayes)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 63/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## Naive Bayes Classifier for Discrete Predictors
##
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
##
## A-priori probabilities:
## Y
## 0 1
## 0.7352763 0.2647237
##
## Conditional probabilities:
## Contract
## Y Month-to-month One year Two year
## 0 0.43214974 0.24552711 0.32232315
## 1 0.88990826 0.08868502 0.02140673
##
## MonthlyCharges_DISC
## Y 01_MENOR_20 02_DE_20_A_40 03_DE_40_A_60 04_DE_60_A_80 05_DE_80_A_100
## 0 0.11312964 0.19763281 0.16240022 0.19157721 0.21277181
## 1 0.03440367 0.08486239 0.14908257 0.25382263 0.34556575
## MonthlyCharges_DISC
## Y 07_MAYOR_100
## 0 0.12248830
## 1 0.13226300
##
## InternetService
## Y DSL Fiber optic No
## 0 0.38370493 0.34434352 0.27195156
## 1 0.24617737 0.68807339 0.06574924
##
## PaymentMethod
## Y Bank transfer (automatic) Credit card (automatic) Electronic check
## 0 0.2477291 0.2491054 0.2496559
## 1 0.1360856 0.1269113 0.5619266
## PaymentMethod
## Y Mailed check
## 0 0.2535095
## 1 0.1750765
##
## PaperlessBilling
## Y No Yes
## 0 0.4668318 0.5331682
## 1 0.2515291 0.7484709
##
## OnlineSecurity
## Y No Yes
## 0 0.6672172 0.3327828
## 1 0.8425076 0.1574924
##
## TechSupport
## Y No Yes
## 0 0.6625378 0.3374622
## 1 0.8279817 0.1720183
##
## SeniorCitizen
## Y 0 1
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 64/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## 0 0.8720066 0.1279934
## 1 0.7423547 0.2576453
##
## Partner
## Y No Yes
## 0 0.4750895 0.5249105
## 1 0.6269113 0.3730887
##
## OnlineBackup
## Y No Yes
## 0 0.6344619 0.3655381
## 1 0.7232416 0.2767584
##
## Dependents
## Y No Yes
## 0 0.6559317 0.3440683
## 1 0.8233945 0.1766055
##
## Tenure_DISC
## Y 01 <= 1 02 <= 5 03 <= 16 04 <= 22 05 <= 49 06 <= 59
## 0 0.048444811 0.077071291 0.141756124 0.069914671 0.283787503 0.113404900
## 1 0.213302752 0.190366972 0.226299694 0.069571865 0.187308869 0.060397554
## Tenure_DISC
## Y 07 <= 70 08 > 70
## 0 0.162124966 0.103495734
## 1 0.048165138 0.004587156
##
## random
## Y [,1] [,2]
## 0 1 0
## 1 1 0
Vemos por ejemplo como el contrato de 2 años genera bajas probabilidades de Churn o disponer el servicio
de seguridad online baja el Churn.
Aplicamos el modelo al conjunto de test, generando un vector con los resultados. En este caso no nos
devuelve probabilidades sino directamente 0 y 1 por lo que no necesitamos trabajar con umbrales
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 65/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
En este caso no obtenemos probabilidades sino que clasifica los resultados en 1 y 0 (Churn sí o no). En
general parece que clasifica bien aunque a algunos valores con Churn negativo en realidad los clasifica como
con Churn y a la inversa.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 66/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Evaluamos la ROC pero tenemos que transformar los resultados de factor a numérico
Bayes_predict<-as.numeric(Bayes_predict)
Bayes_prediction<-prediction(Bayes_predict,test$Churn)
roc(Bayes_prediction)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 67/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Sacamos las metricas definitivas incluyendo el AUC e incluimos el dato de umbral 0 para que se pueda
comparar con el resto de modelos ya Bayes no necesita umbrales. El AUC es el más bajo de los cuatro
modelos evaluados (76.98701)
Bayes_metricas<-append(c(NA),Bayes_metricas)
Bayes_metricas <- t(Bayes_metricas)
Bayes_metricas<-cbind(Bayes_metricas,round(auc(Bayes_prediction),2)*100)
print(t(Bayes_metricas))
## [,1]
## [1,] NA
## [2,] 79.30542
## [3,] 59.23754
## [4,] 72.01426
## [5,] 65.00402
## [6,] 77.00000
Lo convertimos en un data frame para poder comparar con los otros 3 modelos
Vemos que con Bayes obtenemos una menor cobertura pero un nivel de acierto elevado. Sin embargo el AUC
es el más bajo de los modelos empleados
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 68/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Conclusión: teniendo en cuenta el AUC los dos modelos que obtienen niveles más elevados son los de
regresion logistica y Random Forest. Si además damos prioridad a la cobertura aunque tengamos una
menor precisión optaríamos por el modelo de Regresión Logística
Escribimos el scoring final del modelo de Regresión Logística en el dataset y guardamos el modelo
aunque vamos a hacer también modelos automáticos
Podemos ver la media del Scoring vs el Churn real y comprobar que la media es significativamente más baja
en el caso del 0 (0.18) vs el 1 (0.48) aunque la Desviación es elevada en ambos casos
## # A tibble: 2 x 3
## Churn mean_Scoring Desv_Scoring
## <fct> <dbl> <dbl>
## 1 0 0.184 0.194
## 2 1 0.485 0.222
Y lo vemos en un gráfico
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 69/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
En general parece que identifica bien el Churn aunque como vimos previamente algunos valores que tienen
un elevado scoring pese a tener un Churn negativo
saveRDS(df,'cacheDan3.rds')
df <- readRDS('cacheDan3.rds')
h2o.init()
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 70/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Connection successful!
##
## R is connected to the H2O cluster:
## H2O cluster uptime: 16 minutes 35 seconds
## H2O cluster timezone: Europe/Madrid
## H2O data parsing timezone: UTC
## H2O cluster version: 3.30.0.1
## H2O cluster version age: 1 month and 18 days
## H2O cluster name: H2O_started_from_R_DanielB_qzt318
## H2O cluster total nodes: 1
## H2O cluster total memory: 0.47 GB
## H2O cluster total cores: 4
## H2O cluster allowed cores: 4
## H2O cluster healthy: TRUE
## H2O Connection ip: localhost
## H2O Connection port: 54321
## H2O Connection proxy: NA
## H2O Internal Security: FALSE
## H2O API Extensions: Amazon S3, XGBoost, Algos, AutoML, Core V3, TargetEncoder,
Core V4
## R Version: R version 3.6.3 (2020-02-29)
##
|
| | 0%
|
|======================================================================| 100%
Definimos los roles de las variables, tanto de la variable target (Churn) como de las dependientes dejando
fuera el scoring obtenido anteriormente y el CustomerID
y <- 'Churn'
x <- setdiff(names(df_h2o),c('customerID','SCORING_CHURN','Churn',y))
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 71/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
rl <- h2o.glm(
y = y,
x = x,
training_frame = train_h2o,
validation_frame = valid_h2o,
nfolds = 5,
family = 'binomial',
lambda = 0,
compute_p_values = TRUE
)
##
|
| | 0%
|
|======= | 11%
|
|======================================================================| 100%
rl@model$coefficients_table %>%
as.data.frame() %>%
mutate(coefficients = round(coefficients,2),
p_value = round(p_value,2)) %>%
select(names,coefficients,p_value)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 72/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
De nuevo la antigüedad es la variable con los coeficientes más elevados y signo negativo (a mayor
antigüedad menor es el abandono). También los cargos mensuales, el servicio de internet y el tipo de contrato
tienen de nuevo elevados coeficientes.
Aunque algunas variables tienen bajos coeficientes alcanzan un elevado p_value así que optamos por no
eliminar ninguna variable
rl@model$validation_metrics
## H2OBinomialMetrics: glm
## ** Reported on validation data. **
##
## MSE: 0.134352
## RMSE: 0.3665406
## LogLoss: 0.4136125
## Mean Per-Class Error: 0.2374537
## AUC: 0.8398253
## AUCPR: 0.6443712
## Gini: 0.6796507
## R^2: 0.2899401
## Residual Deviance: 1439.371
## AIC: 1493.371
##
## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
## 0 1 Error Rate
## 0 1012 287 0.220939 =287/1299
## 1 112 329 0.253968 =112/441
## Totals 1124 616 0.229310 =399/1740
##
## Maximum Metrics: Maximum metrics at their respective thresholds
## metric threshold value idx
## 1 max f1 0.321889 0.622517 198
## 2 max f2 0.085079 0.728617 324
## 3 max f0point5 0.466177 0.614895 131
## 4 max accuracy 0.466177 0.805172 131
## 5 max precision 0.922682 1.000000 0
## 6 max recall 0.011503 1.000000 389
## 7 max specificity 0.922682 1.000000 0
## 8 max absolute_mcc 0.419579 0.485793 152
## 9 max min_per_class_accuracy 0.300670 0.755966 209
## 10 max mean_per_class_accuracy 0.321889 0.762546 198
## 11 max tns 0.922682 1299.000000 0
## 12 max fns 0.922682 439.000000 0
## 13 max fps 0.002539 1299.000000 399
## 14 max tps 0.011503 441.000000 389
## 15 max tnr 0.922682 1.000000 0
## 16 max fnr 0.922682 0.995465 0
## 17 max fpr 0.002539 1.000000 399
## 18 max tpr 0.011503 1.000000 389
##
## Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>,
valid=<T/F>, xval=<T/F>)`
h2o.auc(rl@model$validation_metrics)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 73/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [1] 0.8398253
## Confusion Matrix (vertical: actual; across: predicted) for max f1 @ threshold = 0.3493648
54584978:
## 0 1 Error Rate
## 0 3122 753 0.194323 =753/3875
## 1 380 1048 0.266106 =380/1428
## Totals 3502 1801 0.213653 =1133/5303
Extraemos las principales variables de la matriz de confusión para poder comparar con los modelos anteriores
aunque no tengamos el dato del umbral
Obtenemos un buen nivel de acierto y de precisión pero con una cobertura baja, sobre todo en
comparación a la obtenida en los modelos manuales
rf <- h2o.randomForest(
y = y,
x = x,
training_frame = train_h2o,
validation_frame = valid_h2o,
nfolds = 5,
ntrees = 50,
mtries = 5
)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 74/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
|
| | 0%
|
|===== | 7%
|
|========== | 14%
|
|============== | 20%
|
|===================== | 30%
|
|============================== | 43%
|
|========================================= | 58%
|
|================================================ | 68%
|
|==================================================== | 74%
|
|======================================================= | 78%
|
|======================================================== | 80%
|
|========================================================== | 83%
|
|============================================================== | 88%
|
|================================================================ | 92%
|
|================================================================== | 95%
|
|===================================================================== | 98%
|
|======================================================================| 100%
Evaluamos
rf@model$validation_metrics
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 75/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## H2OBinomialMetrics: drf
## ** Reported on validation data. **
##
## MSE: 0.1453532
## RMSE: 0.3812521
## LogLoss: 0.5207393
## Mean Per-Class Error: 0.2596817
## AUC: 0.8159547
## AUCPR: 0.6046925
## Gini: 0.6319094
## R^2: 0.2317983
##
## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
## 0 1 Error Rate
## 0 1022 277 0.213241 =277/1299
## 1 135 306 0.306122 =135/441
## Totals 1157 583 0.236782 =412/1740
##
## Maximum Metrics: Maximum metrics at their respective thresholds
## metric threshold value idx
## 1 max f1 0.353526 0.597656 202
## 2 max f2 0.135037 0.718796 305
## 3 max f0point5 0.585723 0.583384 104
## 4 max accuracy 0.589244 0.794253 103
## 5 max precision 0.970243 1.000000 0
## 6 max recall 0.000004 1.000000 399
## 7 max specificity 0.970243 1.000000 0
## 8 max absolute_mcc 0.430041 0.443000 166
## 9 max min_per_class_accuracy 0.296984 0.738260 228
## 10 max mean_per_class_accuracy 0.351021 0.740661 204
## 11 max tns 0.970243 1299.000000 0
## 12 max fns 0.970243 440.000000 0
## 13 max fps 0.000004 1299.000000 399
## 14 max tps 0.000004 441.000000 399
## 15 max tnr 0.970243 1.000000 0
## 16 max fnr 0.970243 0.997732 0
## 17 max fpr 0.000004 1.000000 399
## 18 max tpr 0.000004 1.000000 399
##
## Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>,
valid=<T/F>, xval=<T/F>)`
h2o.auc(rf@model$validation_metrics)
## [1] 0.8159547
Vemos que obtenemos un AUC más bajo que el obtenido con la regresión logística (81.59547)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 76/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Confusion Matrix (vertical: actual; across: predicted) for max f1 @ threshold = 0.2246567
14293592:
## 0 1 Error Rate
## 0 2618 1257 0.324387 =1257/3875
## 1 275 1153 0.192577 =275/1428
## Totals 2893 2410 0.288893 =1532/5303
Extraemos las principales variables para poder comparar con los modelos anteriores
Vamos a probar el modelo de Random Forest pero con otros parámetros diferentes a través del Grid Search y
el Random Search
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 77/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
|
| | 0%
|
|======================================================================| 100%
rf_gridwinner@model$validation_metrics
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 78/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## H2OBinomialMetrics: drf
## ** Reported on validation data. **
##
## MSE: 0.1396304
## RMSE: 0.3736715
## LogLoss: 0.4298243
## Mean Per-Class Error: 0.250436
## AUC: 0.8260986
## AUCPR: 0.6034246
## Gini: 0.6521971
## R^2: 0.2620436
##
## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
## 0 1 Error Rate
## 0 993 306 0.235566 =306/1299
## 1 117 324 0.265306 =117/441
## Totals 1110 630 0.243103 =423/1740
##
## Maximum Metrics: Maximum metrics at their respective thresholds
## metric threshold value idx
## 1 max f1 0.327651 0.605042 192
## 2 max f2 0.155712 0.737523 285
## 3 max f0point5 0.504837 0.594679 108
## 4 max accuracy 0.560279 0.797701 84
## 5 max precision 0.896253 1.000000 0
## 6 max recall 0.003087 1.000000 394
## 7 max specificity 0.896253 1.000000 0
## 8 max absolute_mcc 0.428719 0.452990 143
## 9 max min_per_class_accuracy 0.320273 0.746032 197
## 10 max mean_per_class_accuracy 0.252080 0.752701 232
## 11 max tns 0.896253 1299.000000 0
## 12 max fns 0.896253 440.000000 0
## 13 max fps 0.000434 1299.000000 399
## 14 max tps 0.003087 441.000000 394
## 15 max tnr 0.896253 1.000000 0
## 16 max fnr 0.896253 0.997732 0
## 17 max fpr 0.000434 1.000000 399
## 18 max tpr 0.003087 1.000000 394
##
## Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>,
valid=<T/F>, xval=<T/F>)`
h2o.auc(rf_gridwinner@model$validation_metrics)
## [1] 0.8260986
Obtiene un AUC del 82.60986, superior al modelo anterior pero inferior al de regresión logística
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 79/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Confusion Matrix (vertical: actual; across: predicted) for max f1 @ threshold = 0.2848687
01225369:
## 0 1 Error Rate
## 0 2809 1066 0.275097 =1066/3875
## 1 294 1134 0.205882 =294/1428
## Totals 3103 2200 0.256459 =1360/5303
Extraemos las principales variables para poder comparar con los modelos anteriores
En la matriz de confusión obtenemos valores similares a los de la regresión logísitica aunque algo por
debajo en acierto. La cobertura que sigue siendo baja
Esto equivale a crear 53 combinaciones, es decir, 125 en total por 3 particiones de validación cruzada
supondría crear 375 modelos aunque el algoritmo sólo probará alguna de las opciones posibles de manera
aleatoria.
Y tenemos que definir ahora también los parámetros de búsqueda aleatoria definiendo un tiempo máximo, en
este caso 3 minutos o 180 segundos
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 80/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 81/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
|
| | 0%
|
| | 1%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|== | 4%
|
|=== | 4%
|
|=== | 5%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|===== | 8%
|
|====== | 8%
|
|====== | 9%
|
|======= | 10%
|
|======== | 11%
|
|======== | 12%
|
|========= | 12%
|
|========= | 13%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 15%
|
|=========== | 16%
|
|============ | 17%
|
|============ | 18%
|
|============= | 18%
|
|============= | 19%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 82/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|
|============== | 20%
|
|=============== | 21%
|
|=============== | 22%
|
|================ | 23%
|
|================= | 24%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 27%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 30%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 33%
|
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================= | 36%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 38%
|
|=========================== | 39%
|
|============================ | 40%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 43%
|
|=============================== | 44%
|
|=============================== | 45%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 83/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|
|================================ | 45%
|
|================================ | 46%
|
|================================= | 47%
|
|================================= | 48%
|
|================================== | 48%
|
|================================== | 49%
|
|=================================== | 49%
|
|=================================== | 50%
|
|=================================== | 51%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|====================================== | 55%
|
|======================================= | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|======================================== | 58%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 59%
|
|========================================== | 60%
|
|========================================== | 61%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 62%
|
|============================================ | 63%
|
|============================================= | 64%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 84/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|
|============================================= | 65%
|
|============================================== | 65%
|
|============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 68%
|
|================================================ | 69%
|
|================================================= | 70%
|
|================================================== | 71%
|
|================================================== | 72%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|==================================================== | 74%
|
|===================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 78%
|
|======================================================= | 79%
|
|======================================================== | 79%
|
|======================================================== | 80%
|
|======================================================== | 81%
|
|========================================================= | 81%
|
|========================================================= | 82%
|
|========================================================== | 82%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|=========================================================== | 85%
|
|============================================================ | 85%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 85/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|
|============================================================ | 86%
|
|============================================================= | 87%
|
|============================================================= | 88%
|
|============================================================== | 88%
|
|============================================================== | 89%
|
|=============================================================== | 90%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 92%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 97%
|
|===================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 100%
rf_grid_results_rand
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 86/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 87/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_4. Details: ERRR on field: _mtries: C
omputed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_34. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_22. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_39. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_7. Details: ERRR on field: _mtries: C
omputed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_8. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_9. Details: ERRR on field: _mtries: C
omputed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_13. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_20. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_36. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_28. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_29. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_30. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
## "Illegal argument(s) for DRF model: rf_grid_rand_model_31. Details: ERRR on field: _mtri
es: Computed mtries should be -1 or -2 or in interval [1,12[ but it is 15\nERRR on field: _mt
ries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field: _
mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\nERRR on field:
_mtries: Computed mtries should be -1 or -2 or in interval [1,13[ but it is 15\n"
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 88/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
"Illegal argument(s) for DRF model: rf_grid_rand_model_32. Details: ERRR on field: _mtries:
Computed mtries should be -1 or -2 or in interval [1,12[ but it is 12\n"
Algunos modelos nos dan error pero disponemos suficientes modelos para poder elegir y seleccionamos el
mejor en base a su AUC
Y lo evaluamos
rf_randwinner@model$validation_metrics
## H2OBinomialMetrics: drf
## ** Reported on validation data. **
##
## MSE: 0.1297066
## RMSE: 0.3601481
## LogLoss: 0.4016776
## Mean Per-Class Error: 0.2255278
## AUC: 0.8549033
## AUCPR: 0.6449117
## Gini: 0.7098067
## R^2: 0.3006686
##
## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
## 0 1 Error Rate
## 0 1085 227 0.173018 =227/1312
## 1 119 309 0.278037 =119/428
## Totals 1204 536 0.198851 =346/1740
##
## Maximum Metrics: Maximum metrics at their respective thresholds
## metric threshold value idx
## 1 max f1 0.372960 0.641079 148
## 2 max f2 0.264981 0.742754 212
## 3 max f0point5 0.438884 0.613861 112
## 4 max accuracy 0.488570 0.810345 93
## 5 max precision 0.745260 1.000000 0
## 6 max recall 0.020651 1.000000 391
## 7 max specificity 0.745260 1.000000 0
## 8 max absolute_mcc 0.372960 0.512061 148
## 9 max min_per_class_accuracy 0.328152 0.781250 175
## 10 max mean_per_class_accuracy 0.327098 0.784317 176
## 11 max tns 0.745260 1312.000000 0
## 12 max fns 0.745260 426.000000 0
## 13 max fps 0.013749 1312.000000 399
## 14 max tps 0.020651 428.000000 391
## 15 max tnr 0.745260 1.000000 0
## 16 max fnr 0.745260 0.995327 0
## 17 max fpr 0.013749 1.000000 399
## 18 max tpr 0.020651 1.000000 391
##
## Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>,
valid=<T/F>, xval=<T/F>)`
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 89/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
h2o.auc(rf_randwinner@model$validation_metrics)
## [1] 0.8549033
## Confusion Matrix (vertical: actual; across: predicted) for max f1 @ threshold = 0.3498003
83779214:
## 0 1 Error Rate
## 0 3060 802 0.207664 =802/3862
## 1 396 1045 0.274809 =396/1441
## Totals 3456 1847 0.225910 =1198/5303
Extraemos las principales variables para poder comparar con los modelos anteriores
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 90/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
|
| | 0%
## 16:25:07.835: User specified a validation frame with cross-validation still enabled. Pleas
e note that the models will still be validated using cross-validation only, the validation fr
ame will be used to provide purely informative validation metrics on the trained models.
|
|== | 2%
|
|== | 3%
|
|=== | 4%
|
|==== | 5%
|
|==== | 6%
|
|======== | 12%
|
|========= | 13%
|
|========== | 15%
|
|=========== | 15%
|
|============ | 17%
|
|============= | 18%
|
|============= | 19%
|
|============== | 20%
|
|================ | 22%
|
|================ | 23%
|
|================= | 24%
|
|================== | 25%
|
|================== | 26%
|
|=================== | 27%
|
|==================== | 28%
|
|==================== | 29%
|
|===================== | 30%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 33%
|
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 91/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|======================== | 34%
|
|======================== | 35%
|
|========================= | 35%
|
|========================== | 37%
|
|========================== | 38%
|
|=========================== | 39%
|
|============================ | 40%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 42%
|
|============================== | 44%
|
|=============================== | 45%
|
|================================ | 46%
|
|================================= | 47%
|
|================================== | 48%
|
|================================== | 49%
|
|=================================== | 50%
|
|==================================== | 51%
|
|==================================== | 52%
|
|===================================== | 53%
|
|====================================== | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 60%
|
|=========================================== | 61%
|
|=========================================== | 62%
|
|============================================ | 63%
|
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 92/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|============================================= | 64%
|
|============================================= | 65%
|
|============================================== | 66%
|
|=============================================== | 67%
|
|=============================================== | 68%
|
|================================================ | 69%
|
|================================================= | 70%
|
|================================================== | 71%
|
|=================================================== | 72%
|
|=================================================== | 73%
|
|==================================================== | 75%
|
|===================================================== | 76%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 79%
|
|======================================================== | 80%
|
|========================================================= | 81%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|============================================================ | 86%
|
|============================================================= | 87%
|
|============================================================== | 88%
|
|=============================================================== | 90%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================== | 94%
|
|==================================================================== | 97%
|
|===================================================================== | 98%
|
|======================================================================| 99%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 93/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
|
|======================================================================| 100%
automl_simple@leaderboard
print(automl_simple@leaderboard, n = nrow(automl_simple@leaderboard))
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 94/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 95/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
as.data.frame(automl_simple@leaderboard) %>%
select(model_id,auc) %>%
ggplot(aes(x = auc, y = reorder(model_id,auc))) +
geom_point() +
geom_label(aes(label = round(auc,3),label.size=0.9,color = auc),hjust = 'left') +
expand_limits(x = c(0.936,0.947)) + labs(x = "AUC",y = "Modelo Ganador Automl")
theme_bw()
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 96/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## List of 65
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0pt 0pt 0pt 0pt
## .. ..- attr(*, "valid.unit")= int 8
## .. ..- attr(*, "unit")= chr "pt"
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75pt 0pt 0pt 0pt
## .. ..- attr(*, "valid.unit")= int 8
## .. ..- attr(*, "unit")= chr "pt"
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0pt 0pt 2.75pt 0pt
## .. ..- attr(*, "valid.unit")= int 8
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 97/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 103/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Y lo evaluamos
automl_simple_winner@model$validation_metrics
## H2OBinomialMetrics: glm
## ** Reported on validation data. **
##
## MSE: 0.1343104
## RMSE: 0.3664839
## LogLoss: 0.4135095
## Mean Per-Class Error: 0.2449922
## AUC: 0.8396429
## AUCPR: 0.6442732
## Gini: 0.6792858
## R^2: 0.29016
## Residual Deviance: 1439.013
## AIC: 1517.013
##
## Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
## 0 1 Error Rate
## 0 1069 230 0.177059 =230/1299
## 1 138 303 0.312925 =138/441
## Totals 1207 533 0.211494 =368/1740
##
## Maximum Metrics: Maximum metrics at their respective thresholds
## metric threshold value idx
## 1 max f1 0.371949 0.622177 170
## 2 max f2 0.104322 0.728679 308
## 3 max f0point5 0.469174 0.616032 123
## 4 max accuracy 0.469174 0.805747 123
## 5 max precision 0.917766 1.000000 0
## 6 max recall 0.011659 1.000000 389
## 7 max specificity 0.917766 1.000000 0
## 8 max absolute_mcc 0.415660 0.486298 146
## 9 max min_per_class_accuracy 0.301000 0.756736 206
## 10 max mean_per_class_accuracy 0.323920 0.760622 195
## 11 max tns 0.917766 1299.000000 0
## 12 max fns 0.917766 439.000000 0
## 13 max fps 0.003412 1299.000000 399
## 14 max tps 0.011659 441.000000 389
## 15 max tnr 0.917766 1.000000 0
## 16 max fnr 0.917766 0.995465 0
## 17 max fpr 0.003412 1.000000 399
## 18 max tpr 0.011659 1.000000 389
##
## Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>,
valid=<T/F>, xval=<T/F>)`
h2o.auc(automl_simple_winner@model$validation_metrics)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 104/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [1] 0.8396429
automl_simple_winner@allparameters
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 105/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## $model_id
## [1] "GLM_1_AutoML_20200522_162507"
##
## $training_frame
## [1] "automl_training_RTMP_sid_9ee3_3"
##
## $validation_frame
## [1] "RTMP_sid_9ee3_5"
##
## $nfolds
## [1] 3
##
## $seed
## [1] "4955756915282139044"
##
## $keep_cross_validation_models
## [1] FALSE
##
## $keep_cross_validation_predictions
## [1] TRUE
##
## $keep_cross_validation_fold_assignment
## [1] FALSE
##
## $fold_assignment
## [1] "Modulo"
##
## $ignore_const_cols
## [1] TRUE
##
## $score_each_iteration
## [1] FALSE
##
## $family
## [1] "binomial"
##
## $tweedie_variance_power
## [1] 0
##
## $tweedie_link_power
## [1] 1
##
## $theta
## [1] 0.0000000001
##
## $solver
## [1] "COORDINATE_DESCENT"
##
## $alpha
## [1] 0.0 0.2 0.4 0.6 0.8 1.0
##
## $lambda
## [1] 8.95655041253 5.56216954709 3.45420152241 2.14511766613 1.33215441302
## [6] 0.82729045970 0.51376139134 0.31905452811 0.19813826734 0.12304722086
## [11] 0.07641440881 0.04745464247 0.02947013695 0.01830145432 0.01136551320
## [16] 0.00705817625 0.00438324703 0.00272207067 0.00169045200 0.00104979933
## [21] 0.00065194317 0.00040486775 0.00025142973 0.00015614212 0.00009696690
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 106/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## [26] 0.00006021809
##
## $lambda_search
## [1] TRUE
##
## $early_stopping
## [1] TRUE
##
## $nlambdas
## [1] 30
##
## $standardize
## [1] TRUE
##
## $missing_values_handling
## [1] "MeanImputation"
##
## $compute_p_values
## [1] FALSE
##
## $remove_collinear_columns
## [1] FALSE
##
## $intercept
## [1] TRUE
##
## $non_negative
## [1] FALSE
##
## $max_iterations
## [1] 300
##
## $objective_epsilon
## [1] 0.0001
##
## $beta_epsilon
## [1] 0.0001
##
## $gradient_epsilon
## [1] 0.000001
##
## $link
## [1] "logit"
##
## $calc_like
## [1] FALSE
##
## $HGLM
## [1] FALSE
##
## $prior
## [1] -1
##
## $lambda_min_ratio
## [1] 0.000001
##
## $max_active_predictors
## [1] 5000
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 107/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
##
## $obj_reg
## [1] 0.0001885725
##
## $balance_classes
## [1] FALSE
##
## $max_after_balance_size
## [1] 5
##
## $max_confusion_matrix_size
## [1] 20
##
## $max_hit_ratio_k
## [1] 0
##
## $max_runtime_secs
## [1] 0
##
## $x
## [1] "Tenure_DISC" "MonthlyCharges_DISC" "PaymentMethod"
## [4] "Contract" "InternetService" "OnlineSecurity"
## [7] "TechSupport" "SeniorCitizen" "Partner"
## [10] "OnlineBackup" "Dependents" "PaperlessBilling"
##
## $y
## [1] "Churn"
h2o.varimp(automl_simple@leader)
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 108/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## variable relative_importance
## 1 Tenure_DISC.01 <= 1 1.700969129
## 2 Tenure_DISC.08 > 70 1.563755883
## 3 InternetService.No 1.074071061
## 4 Tenure_DISC.02 <= 5 0.852526605
## 5 InternetService.Fiber optic 0.832620959
## 6 Tenure_DISC.07 <= 70 0.791501079
## 7 Contract.Month-to-month 0.741176041
## 8 Contract.Two year 0.719720396
## 9 MonthlyCharges_DISC.07_MAYOR_100 0.609053016
## 10 Tenure_DISC.06 <= 59 0.453122949
## 11 Tenure_DISC.03 <= 16 0.367075026
## 12 Tenure_DISC.05 <= 49 0.311786435
## 13 MonthlyCharges_DISC.03_DE_40_A_60 0.289515780
## 14 PaymentMethod.Electronic check 0.271825049
## 15 MonthlyCharges_DISC.01_MENOR_20 0.265946543
## 16 MonthlyCharges_DISC.04_DE_60_A_80 0.251795023
## 17 PaperlessBilling.No 0.238327312
## 18 PaperlessBilling.Yes 0.227138515
## 19 TechSupport.Yes 0.210028992
## 20 OnlineSecurity.Yes 0.204212929
## 21 TechSupport.No 0.182363289
## 22 PaymentMethod.Mailed check 0.181130586
## 23 OnlineSecurity.No 0.160424645
## 24 InternetService.DSL 0.148546487
## 25 SeniorCitizen.0 0.130674281
## 26 SeniorCitizen.1 0.122001297
## 27 MonthlyCharges_DISC.05_DE_80_A_100 0.111513727
## 28 OnlineBackup.No 0.105799666
## 29 Dependents.Yes 0.104187322
## 30 OnlineBackup.Yes 0.100511934
## 31 Dependents.No 0.097864806
## 32 PaymentMethod.Bank transfer (automatic) 0.090413734
## 33 PaymentMethod.Credit card (automatic) 0.074054005
## 34 Tenure_DISC.04 <= 22 0.064530411
## 35 MonthlyCharges_DISC.02_DE_20_A_40 0.047004183
## 36 Partner.Yes 0.024560960
## 37 Partner.No 0.020222667
## 38 Contract.One year 0.001422562
## scaled_importance percentage
## 1 1.0000000000 0.1237662960
## 2 0.9193323128 0.1137823551
## 3 0.6314465338 0.0781517986
## 4 0.5012005160 0.0620317314
## 5 0.4894979837 0.0605833523
## 6 0.4653236001 0.0575913784
## 7 0.4357375029 0.0539296168
## 8 0.4231237260 0.0523684563
## 9 0.3580623573 0.0443160517
## 10 0.2663910483 0.0329702333
## 11 0.2158034614 0.0267091951
## 12 0.1832992907 0.0226862743
## 13 0.1702063696 0.0210658119
## 14 0.1598059863 0.0197785950
## 15 0.1563500116 0.0193508618
## 16 0.1480303308 0.0183211657
## 17 0.1401126616 0.0173412251
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 109/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## 18 0.1335347665 0.0165271034
## 19 0.1234760752 0.0152821765
## 20 0.1200568109 0.0148589868
## 21 0.1072114043 0.0132691584
## 22 0.1064866982 0.0131794642
## 23 0.0943136722 0.0116728539
## 24 0.0873305017 0.0108085727
## 25 0.0768234292 0.0095081513
## 26 0.0717245805 0.0088770857
## 27 0.0655589363 0.0081139867
## 28 0.0621996393 0.0076982190
## 29 0.0612517421 0.0075809012
## 30 0.0590909809 0.0073134718
## 31 0.0575347336 0.0071208609
## 32 0.0531542474 0.0065787043
## 33 0.0435363606 0.0053883341
## 34 0.0379374381 0.0046953762
## 35 0.0276337659 0.0034201288
## 36 0.0144393920 0.0017871101
## 37 0.0118889091 0.0014714462
## 38 0.0008363244 0.0001035088
h2o.varimp_plot(automl_simple@leader)
Como hemos visto previamente en otros modelos las variables más importantes son:
La antigüedad
La presencia o no de servicio de internet
El tipo de contrato
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 110/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Confusion Matrix (vertical: actual; across: predicted) for max f1 @ threshold = 0.3460817
18948918:
## 0 1 Error Rate
## 0 3102 773 0.199484 =773/3875
## 1 370 1058 0.259104 =370/1428
## Totals 3472 1831 0.215538 =1143/5303
Extraemos las principales variables para poder comparar con los modelos anteriores
Obtenemos valores similares en la matriz de confusión a los de la regresión logísitica: un buen nivel
de acierto y de precisión pero con una cobertura algo baja
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 111/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Hay varios modelos con elevados niveles de AUC, sobre todo el de Regresión Logística y el de Automl
que además son los que obtienen la mayor cobertura que era la variable a dar prioridad desde un punto
de vista de negocio.
##
|
| | 0%
|
|======================================================================| 100%
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 112/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
## Observations: 7,043
## Variables: 16
## $ Contract <fct> Month-to-month, One year, Month-to-month, One yea…
## $ MonthlyCharges_DISC <fct> 02_DE_20_A_40, 03_DE_40_A_60, 03_DE_40_A_60, 03_D…
## $ InternetService <fct> DSL, DSL, DSL, DSL, Fiber optic, Fiber optic, Fib…
## $ PaymentMethod <fct> Electronic check, Mailed check, Mailed check, Ban…
## $ PaperlessBilling <fct> Yes, No, Yes, No, Yes, Yes, Yes, No, Yes, No, Yes…
## $ OnlineSecurity <fct> No, Yes, Yes, Yes, No, No, No, Yes, No, Yes, Yes,…
## $ TechSupport <fct> No, No, No, Yes, No, No, No, No, Yes, No, No, No,…
## $ SeniorCitizen <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Partner <fct> Yes, No, No, No, No, No, No, No, Yes, No, Yes, No…
## $ OnlineBackup <fct> Yes, No, Yes, No, No, No, Yes, No, No, Yes, No, N…
## $ Dependents <fct> No, No, No, No, No, No, Yes, No, No, Yes, Yes, No…
## $ customerID <chr> "7590-VHVEG", "5575-GNVDE", "3668-QPYBK", "7795-C…
## $ Churn <fct> 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0…
## $ Tenure_DISC <fct> 01 <= 1, 05 <= 49, 02 <= 5, 05 <= 49, 02 <= 5, 03…
## $ SCORING_RL_MANUAL <dbl> 0.67580519, 0.04855858, 0.35841520, 0.04855858, 0…
## $ SCORING_RL_H2O <dbl> 0.76646574, 0.04607989, 0.30235211, 0.03476043, 0…
Vemos la correlación entre ambos scoring, el obtenido ahora y el que sacamos con el modelo de regresión
logística manualmente
cor(df$SCORING_RL_MANUAL,df$SCORING_RL_H2O)
## [1] 0.9703489
La correlación de ambos scoring es de un 97.03489%. Eso implica que los scoring obtenidos en ambos
modelos son similares y nos da confianza en la calidad de los datos obtenidos por ambos modelos.
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 113/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 114/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
Hay varios modelos con un elevado AUC. Sin embargo, teniendo en cuenta las necesidades de negocio
vamos a seleccionar el modelo de regresión logística manual ya que es el que alcanza una mayor
cobertura
Eliminamos por tanto el Scoring generado en la fase de h2o, guardamos el modelo con el Scoring obtenido
con el primero modelo y la matriz con el resumen del los resultados de todos los modelos.
Ese scoring es el que vamos a emplear para definir el Churn de los cientes de la empresa de
telecomunicaciones y poder hacer acciones comerciales si fuera necesario
ls()
rm(list=setdiff(ls(),c('df','ComparativaModelosFinal')))
df <- select(df, -SCORING_RL_H2O)
saveRDS(df,'Modelo_Churn_final.rds')
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 115/116
24/12/2020 Proyecto de Cálculo de Abandono (Churn) en una compañía de telecomunicaciones
```
https://rstudio-pubs-static.s3.amazonaws.com/618170_c4a4de58d3ec4af38c6b326e3f593b6d.html 116/116