Este informe presenta el desarrollo de un modelo de credit scoring (Sistema automatizado de calificación de crédito), que le permitirá a la entidad identificar la probabilidad de incumplimiento de un cliente en la etapa de otorgación del crédito por libranza y se desarrollará con la información de los clientes que han solicitado algún crédito entre los años 2020 y 2022. La metodología a implementar pretende identificar las principales variables a tener en cuenta al momento de medir la probabilidad de ocurrencia en pago de estos clientes y así poderlos clasificar en diferentes perfiles de riesgo.
Finalmente, con los resultados que se obtengan, se pretende emitir una serie de recomendaciones hacía la entidad con el fin de evaluar la implementación del modelo dentro del proceso de otorgación de crédito por libranza.
Diseñar un modelo de scoring que permita identificar a probabilidad de incumplimiento en la etapa de otorgamiento de un crédito por libranza.
Proporcionar una evaluación más precisa del riesgo crediticio asociado con cada solicitante. Este enfoque tiene la intención de reducir las pérdidas asociadas con la concesión de crédito a clientes de alto riesgo y, al mismo tiempo, facilitar el acceso al crédito para aquellos con un menor riesgo crediticio.
Aumentar la eficiencia operativa al automatizar la evaluación de riesgos. Al reducir la carga de trabajo manual asociada con la toma de decisiones, se espera mejorar los tiempos de respuesta y reducir los costos operativos.
Garantizar el cumplimiento normativo. El modelo de scoring se diseñará considerando las regulaciones aplicables, contribuyendo así a un proceso de toma de decisiones que cumple con los estándares legales y éticos.
Desarrollar un modelo que sea adaptable a cambios en los datos y que mantenga su rendimiento predictivo a lo largo del tiempo.
Realizar las pruebas correspondientes a los modelos estimados, con el fin de seleccionar el modelo que estadísticamente refleje la realidad.
El modelo logístico arroja un resultado binario, en donde la variable dependiente toma el valor de 0 o de 1, siendo un modelo de predicción de probabilidad de ocurrencia de una variable dicotómica categórica. La regresión binaria es un tipo de análisis de regresión, donde la variable dependiente es una variable dummy, ejemplo: Buen cliente (0) o Mal cliente (1)
A continuación se describen las variables a utilizar en el modelo.
| Variables | Descripción |
|---|---|
| Edad | Edad del cliente al momento de la otorgación del crédito |
| Ingresos | Valor de la mesada pensional |
| Descuentos | Valor de los descuentos registrados en despendible de pago |
| Monto | Valor aprobado del crédito |
| Score | Puntaje en centrales de riesgo |
| Plazo | Número de meses pactados con el cliente. |
| Variables | Descripción |
|---|---|
| Genero | Sexo del cliente (Masculino o Femenino) |
| Nivel_Academico | Nivel de escolaridad del cliente |
| Estado_Civil | Estado civil actual descrito por el cliente |
| Tipo_Vivienda | Tipo familiar, propia o arrendada |
| Estrato | Estrato sociodemografico (1 al 6) |
| Empresa | Pagaduría del cliente |
| Region | Region donde reside el cliente |
| Region_Nacimiento | Region donde nació el cliente |
| Perfil | Perfil de riesgo designado al cliente (Tipo A, B C o D) |
| Canal | Canal de originación del crédito (Interno, extero, almacen) |
| Destino | Destino del crédito (Libre inversión, retanqueo, compra) |
| Default | Variable que toma valores de 0 o 1 (0 = Al día/1 = En Mora) |
| Dpto_Residencia | Departamento de residencia del cliente |
| Entidad | Agrupa las pagadurias por tipo de convenio |
Como recomendación todas aquellas variables cualitativas deben ser transformadas a tipo factor, es decir, asignarles un valor que las identifica, por ejemplo:
datos = datos %>%
mutate(Genero= as.factor(Genero),
Estado_Civil = as.factor(Estado_Civil),
Perfil = as.factor(Perfil),
Canal = as.factor(Canal),
Region = as.factor(Region),
Destino = as.factor(Destino),
Estrato = as.factor(Estrato),
Empresa = as.factor(Empresa),
Entidad = as.factor(Entidad),
Dpto_Residencia = as.factor(Dpto_Residencia),
Tipo_Vivienda = as.factor(Tipo_Vivienda))
Por otro lado se realiza la transformación de variables categoricas a factores ordinales, en este caso, se le da une jerarquia a la variable. El nivel educativo puede ser categorizada como variable ordinal ya que se puede jerarquizar por niveles de la siguiente manera:
El análisis exploratorio de datos (AED) es una fase inicial en el proceso de análisis de datos que tiene como objetivo examinar y comprender la naturaleza de los datos antes de realizar inferencias estadísticas formales o modelado. El AED se realiza típicamente utilizando técnicas gráficas y descriptivas para resumir y visualizar los datos. En este punto se puede identificar los patrones o tendencias que tienen las variables a analizar, así mismo se pretende detectar anomalías o errores en la base de datos.
Para el caso en estudio contamos con un set de datos de 25 variables y 9.866 observaciones. A continuación se mostrará la distribución de los clientes buenos y malos que serán caso de estudio.
##
## 0 1
## 9147 719
##
## 0 1
## 92.7 7.3
La base cuenta con 719 (7.3%) registros de clientes morosos y 9147 (92.7%) clientes al día.
Después de validada la variable Defautl, lo mismo se realizará con las demás variables categóricas.
##
## Femenino Masculino
## 4445 5421
##
## Femenino Masculino
## 45.1 54.9
Se encuentran 5421 hombres y 4445 mujeres en la base de estudio.
Así como se analizó previamente las variables categoricas, se requiere dentro del AED, validar como se comportan cada una de las variables cuantitativas que serán motivo de análisis. Incialmente se realiza el cálculo de algunas estadisticas relevantes, a continuación se dará una breve descripción de cada una de ellas.
datatable(estadisticas(datos$Edad), options = list(pageLength = 5, lengthMenu = c(5, 10, 15, 20)))
datatable(estadisticas(datos$Monto), options = list(pageLength = 5, lengthMenu = c(5, 10, 15, 20)))
datatable(estadisticas(datos$Plazo),options = list(pageLength = 5, lengthMenu = c(5, 10, 15, 20)))
datatable(estadisticas(datos$Ingresos),options = list(pageLength = 5, lengthMenu = c(5, 10, 15, 20)))
datatable(estadisticas(datos$Score),options = list(pageLength = 5, lengthMenu = c(5, 10, 15, 20)))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
La partición permite dividir el conjunto de datos en dos partes: una para entrenar el modelo y otra para evaluar su rendimiento. La primera parte (conjunto de entrenamiento) se utiliza para ajustar los parámetros del modelo, mientras que la segunda parte (conjunto de prueba o validación) se utiliza para evaluar su capacidad predictiva en datos no utilizados durante el entrenamiento.
Al tener un conjunto de datos de prueba independiente, se obtiene una estimación más realista del rendimiento general del modelo en nuevos datos no vistos. Esto ayuda a evaluar la capacidad del modelo para generalizar patrones en lugar de simplemente memorizar el conjunto de datos de entrenamiento.
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
dim(train)
## [1] 6907 25
dim(test)
## [1] 2959 25
tasa_de_malos = mean(train$Default)
tasa_de_malos
## [1] 0.07354857
## `summarise()` has grouped output by 'Genero'. You can override using the
## `.groups` argument.
train %>%
group_by(Genero, Default) %>%
summarise(total = n())
## `summarise()` has grouped output by 'Genero'. You can override using the
## `.groups` argument.
## # A tibble: 4 × 3
## # Groups: Genero [2]
## Genero Default total
## <fct> <dbl> <int>
## 1 Femenino 0 2903
## 2 Femenino 1 175
## 3 Masculino 0 3496
## 4 Masculino 1 333
## `summarise()` has grouped output by 'Perfil'. You can override using the
## `.groups` argument.
## `summarise()` has grouped output by 'Nivel_Academico'. You can override using
## the `.groups` argument.
## `summarise()` has grouped output by 'Region'. You can override using the
## `.groups` argument.
## `summarise()` has grouped output by 'Entidad'. You can override using the
## `.groups` argument.
train %>%
group_by(Genero) %>%
summarise(riesgo = mean(Default),
contribucion = riesgo/riesgo_global)
## # A tibble: 2 × 3
## Genero riesgo contribucion
## <fct> <dbl> <dbl>
## 1 Femenino 0.0569 0.773
## 2 Masculino 0.0870 1.18