#Se construye un modelo predictivo de deserción de clientes en un banco utilizando RStudio, podemos emplear un enfoque de clasificación, dado que nuestro objetivo es predecir si un cliente de una tienda departamental que otorga crédito desertará (categoría 1) o no (categoría 0). Un algoritmo comúnmente utilizado de acuerdo a la literarura para este tipo de problemas es el Árbol de Decisión a través de Machine Learning (ML), por su facilidad de interpretación y eficacia.
# Instalar paquetes necesarios si aún no están instalados
#install.packages("rpart")
#install.packages("rpart.plot")
#install.packages("caret")
# Cargar los paquetes necesarios
library(rpart)
library(rpart.plot)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
#Cargar base de datos
# Cargar la librería necesaria
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ purrr::lift() masks caret::lift()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
# Establecer una semilla para reproducibilidad
set.seed(123)
# Crear un data frame con 1000 registros
datos_desercion_coppel <- tibble(
ID_Cliente = 1:1000,
Edad = sample(18:70, 1000, replace = TRUE),
Genero = sample(c("Masculino", "Femenino"), 1000, replace = TRUE),
Nivel_Educativo = sample(c("Secundaria", "Universitario", "Postgrado"), 1000, replace = TRUE),
Estado_Civil = sample(c("Soltero", "Casado", "Divorciado"), 1000, replace = TRUE),
Ingresos_Anuales = sample(20000:120000, 1000, replace = TRUE),
Balance_Cuenta = runif(1000, min = 0, max = 75000),
Numero_Productos = sample(1:5, 1000, replace = TRUE),
Es_Cliente_Activo = sample(c(0, 1), 1000, replace = TRUE, prob = c(0.7, 0.3)),
Antiguedad_Banco = sample(1:30, 1000, replace = TRUE),
Desercion = sample(c(0, 1), 1000, replace = TRUE, prob = c(0.7, 0.3))
)
# Escribir el data frame a un archivo CSV
write_csv(datos_desercion_coppel, "datos_desercion_coppel_1000.csv")
# Visualizar los primeros registros para verificar la carga
head(datos_desercion_coppel)
## # A tibble: 6 × 11
## ID_Cliente Edad Genero Nivel_Educativo Estado_Civil Ingresos_Anuales
## <int> <int> <chr> <chr> <chr> <int>
## 1 1 48 Masculino Universitario Soltero 105705
## 2 2 32 Masculino Secundaria Divorciado 92618
## 3 3 68 Masculino Secundaria Divorciado 88653
## 4 4 31 Femenino Postgrado Soltero 44197
## 5 5 20 Masculino Postgrado Casado 81654
## 6 6 59 Masculino Secundaria Divorciado 112862
## # ℹ 5 more variables: Balance_Cuenta <dbl>, Numero_Productos <int>,
## # Es_Cliente_Activo <dbl>, Antiguedad_Banco <int>, Desercion <dbl>
# Dividir los datos en conjuntos de entrenamiento y prueba
set.seed(123) # Para reproducibilidad
index <- createDataPartition(datos_desercion_coppel$Desercion, p = .8, list = FALSE)
trainData <- datos_desercion_coppel[index,]
testData <- datos_desercion_coppel[-index,]
# Entrenar el modelo
modelo <- rpart(Desercion ~ ., data = trainData, method = "class")
# Visualizar el árbol de decisión
rpart.plot(modelo, main="Árbol de Decisión para Deserción de Clientes")

#Nodo Raíz (Ingresos Anuales ≥ 22e+3): La primera división del árbol se hace con base en si los ingresos anuales del cliente son mayores o iguales a 22,000. Si los ingresos anuales son menores a 22,000, se pasa al nodo de la izquierda; si son mayores o iguales, se va al nodo de la derecha.
#Nodo de la Izquierda (Ingresos Anuales < 120e+3): Dentro de los clientes con ingresos anuales menores a 22,000, el árbol vuelve a dividir en función de si los ingresos son menores de 120,000. Si es así, se predice que el cliente no desertará (clasificado como "0"), con una probabilidad de error del 1% (98% de confianza en la predicción de no deserción).
#Nodo Central (Ingresos Anuales ≥ 22e+3): Para aquellos clientes con ingresos anuales mayores o iguales a 22,000, el modelo predice que estos no desertarán (clasificado como "0"), y lo hace con una confianza del 100%, lo que indica que en el conjunto de entrenamiento, todos los clientes con ingresos en este rango no desertaron.
#Nodo de la Derecha (Ingresos Anuales ≥ 120e+3): Para clientes con ingresos anuales mayores o iguales a 120,000 (habiendo ya pasado el filtro de ingresos anuales mayor o igual a 22,000), el modelo predice que estos clientes desertarán (clasificado como "1"), con una confianza del 99% (1% de probabilidad de error).
##Cada nodo muestra tres números:
#El primero es la clasificación predicha (0 para no deserción, 1 para deserción).
#El segundo es el porcentaje de los datos de entrenamiento en ese nodo que tienen el valor de la variable de salida correspondiente al número de clasificación.
#El tercero es el porcentaje de confianza del modelo en esa predicción.
# Realizar predicciones en el conjunto de prueba
predicciones <- predict(modelo, testData, type = "class")
predicciones
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## Levels: 0 1
#En resumen, el modelo sugiere que los clientes con ingresos anuales inferiores a 22,000 o entre 22,000 y 120,000 no tienen tendencia a desertar, mientras que aquellos con ingresos anuales superiores a 120,000 tienen una alta tendencia a desertar. Esto podría reflejar una situación donde los clientes con ingresos más altos buscan otras opciones bancarias o servicios más sofisticados, también podría influir la distribución los datos de entrenamiento o los datos reales de la empresa (Banco o tienda departamental que otorga crédito)
#Referencias
#Garland, R. (2002). Estimating customer defection in personal retail banking. International Journal of Bank Marketing, 20(7), 317-324.
#Piha, L. P., & Avlonitis, G. J. (2015). Customer defection in retail banking: Attitudinal and behavioural consequences of failed service quality. Journal of Service Theory and Practice, 25(3), 304-326.
#Oliveira, S. A. D., Mesquita, J. M. C., & Oliveira, R. R. (2019). Factors that influence customer defection: Analysis of the banking sector. REBRAE, 12(2), 119-135.
#Colgate, M., Stewart, K., & Kinsella, R. (1996). Customer defection: a study of the student market in Ireland. International journal of bank marketing, 14(3), 23-29.