En el ámbito de la Inteligencia de Negocios y la gestión de riesgos financieros, el Credit Scoring es una de las aplicaciones más críticas. El objetivo de este análisis es evaluar los determinantes socioeconómicos e históricos que influyen en la probabilidad de que un cliente caiga en impago (default).
Para este estudio, utilizaremos el German Credit Dataset. A diferencia de un enfoque puramente predictivo de “caja negra”, aquí aplicaremos un rigor econométrico progresivo: comenzaremos evaluando las fallas estructurales del Modelo de Probabilidad Lineal (MPL), para luego justificar teóricamente la transición hacia los modelos de elección discreta no lineales (Logit y Probit), evaluando sus efectos marginales y su capacidad predictiva real.
El primer paso en cualquier flujo de trabajo de ciencia de datos es conocer la estructura de la información con la que contamos.
# Ver las dimensiones del dataset
dim(GermanCredit)
## [1] 1000 62
# Inspección de la estructura general
glimpse(GermanCredit[, 1:62])
## Rows: 1,000
## Columns: 62
## $ Duration <int> 6, 48, 12, 42, 24, 36, 24, 36, …
## $ Amount <int> 1169, 5951, 2096, 7882, 4870, 9…
## $ InstallmentRatePercentage <int> 4, 2, 2, 2, 3, 2, 3, 2, 2, 4, 3…
## $ ResidenceDuration <int> 4, 2, 3, 4, 4, 4, 4, 2, 4, 2, 1…
## $ Age <int> 67, 22, 49, 45, 53, 35, 53, 35,…
## $ NumberExistingCredits <int> 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1…
## $ NumberPeopleMaintenance <int> 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1…
## $ Telephone <dbl> 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1…
## $ ForeignWorker <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ Class <fct> Good, Bad, Good, Good, Bad, Goo…
## $ CheckingAccountStatus.lt.0 <dbl> 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0…
## $ CheckingAccountStatus.0.to.200 <dbl> 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1…
## $ CheckingAccountStatus.gt.200 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ CheckingAccountStatus.none <dbl> 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0…
## $ CreditHistory.NoCredit.AllPaid <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ CreditHistory.ThisBank.AllPaid <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ CreditHistory.PaidDuly <dbl> 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1…
## $ CreditHistory.Delay <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0…
## $ CreditHistory.Critical <dbl> 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0…
## $ Purpose.NewCar <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1…
## $ Purpose.UsedCar <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0…
## $ Purpose.Furniture.Equipment <dbl> 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0…
## $ Purpose.Radio.Television <dbl> 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ Purpose.DomesticAppliance <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Purpose.Repairs <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Purpose.Education <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0…
## $ Purpose.Vacation <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Purpose.Retraining <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Purpose.Business <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Purpose.Other <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ SavingsAccountBonds.lt.100 <dbl> 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1…
## $ SavingsAccountBonds.100.to.500 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ SavingsAccountBonds.500.to.1000 <dbl> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0…
## $ SavingsAccountBonds.gt.1000 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ SavingsAccountBonds.Unknown <dbl> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0…
## $ EmploymentDuration.lt.1 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1…
## $ EmploymentDuration.1.to.4 <dbl> 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0…
## $ EmploymentDuration.4.to.7 <dbl> 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0…
## $ EmploymentDuration.gt.7 <dbl> 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0…
## $ EmploymentDuration.Unemployed <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0…
## $ Personal.Male.Divorced.Seperated <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ Personal.Female.NotSingle <dbl> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1…
## $ Personal.Male.Single <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0…
## $ Personal.Male.Married.Widowed <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0…
## $ Personal.Female.Single <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ OtherDebtorsGuarantors.None <dbl> 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1…
## $ OtherDebtorsGuarantors.CoApplicant <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ OtherDebtorsGuarantors.Guarantor <dbl> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0…
## $ Property.RealEstate <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0…
## $ Property.Insurance <dbl> 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0…
## $ Property.CarOther <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1…
## $ Property.Unknown <dbl> 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0…
## $ OtherInstallmentPlans.Bank <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ OtherInstallmentPlans.Stores <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ OtherInstallmentPlans.None <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ Housing.Rent <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1…
## $ Housing.Own <dbl> 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0…
## $ Housing.ForFree <dbl> 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0…
## $ Job.UnemployedUnskilled <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Job.UnskilledResident <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0…
## $ Job.SkilledEmployee <dbl> 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1…
## $ Job.Management.SelfEmp.HighlyQualified <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0…
# Verificamos si existen valores nulos en el dataset
total_nulos <- sum(is.na(GermanCredit))
cat("Total de valores nulos en el dataset:", total_nulos, "\n")
## Total de valores nulos en el dataset: 0
La inspección inicial revela características cruciales sobre la naturaleza de nuestros datos que dictarán nuestra estrategia de modelado:
Tipos de Datos y Preparación para el Modelado
(<dbl>): Notamos que la gran mayoría de las
variables están en formato <dbl> (numérico decimal),
a pesar de que conceptualmente representan categorías (ej.
Housing.Rent). Esto ocurre porque el dataset original ha
sido preprocesado aplicando One-Hot Encoding. Lejos de ser un
problema, esta estructura numérica es estrictamente necesaria en
econometría. Funciones como lm() (para nuestro modelo base)
y glm() (para Logit/Probit) resuelven los coeficientes
(\(\beta\)) mediante álgebra matricial;
al estar ya codificadas numéricamente, las variables están listas para
el cálculo sin consumir memoria extra en transformaciones
internas.
Entendiendo las Variables Dummy: Una variable
dummy (o dicótoma) es la transformación numérica de un atributo
cualitativo, tomando el valor de 1 si la característica está presente y
0 si está ausente. En nuestro glimpse, las reconocemos
fácilmente porque su nombre combina la categoría original y su valor
(ej. Purpose.NewCar), y sus únicos valores posibles son 0 o
1. Sirven para cuantificar “saltos” o diferencias en la probabilidad
base en comparación con un grupo de referencia.
La Trampa de las Variables Dummy y la
Multicolinealidad: La existencia de tantas variables dummy
exige cautela. Tomemos el caso del tipo de vivienda, dividido en
Housing.Rent, Housing.Own y
Housing.ForFree. Si incluimos las tres en el modelo,
caeremos en la trampa de la variable dummy, causando
multicolinealidad perfecta (ya que la suma de las tres
siempre será 1, siendo colineales con el intercepto). La
multicolinealidad ocurre cuando las variables explicativas están
altamente correlacionadas entre sí. Esto es fatal en econometría porque
infla artificialmente los errores estándar de los coeficientes,
destruyendo la fiabilidad de nuestras pruebas de significancia
individual (los valores p). Siempre debemos omitir una
categoría para que sirva como base de comparación.
La Maldición de la Dimensionalidad y el Principio de Parsimonia: El dataset cuenta con 62 columnas. Si introducimos todas estas variables explicativas en un modelo Logit con 1000 observaciones, sufriremos un sobreajuste masivo y una multicolinealidad severa. A diferencia de un enfoque puro de Machine Learning tipo “caja negra”, en econometría buscamos la inferencia causal (el “por qué”). Explicar los efectos marginales de 62 variables carece de sentido práctico. Por ello, aplicaremos el Principio de Parsimonia, el cual dicta que “el modelo más simple que logre explicar de forma adecuada el fenómeno es el mejor”.
Guiados por estos criterios, procederemos a seleccionar un subconjunto parsimonioso de variables explicativas con un fuerte sentido económico y financiero, reduciendo la dimensionalidad antes de estimar nuestro Modelo de Probabilidad Lineal.
La selección de características (Feature Selection) no puede ser un ejercicio arbitrario. Para garantizar la parsimonia y la validez inferencial de nuestros modelos, aplicaremos un enfoque híbrido que combina la teoría del riesgo crediticio con la validación estadística.
A. Fundamento Teórico (Las 5 C’s del Crédito): La
literatura financiera evalúa el riesgo bajo 5 pilares fundamentales. De
nuestras 62 variables iniciales, preseleccionamos aquellas que
representan: 1. Capacidad de pago: Amount
(Monto), Duration (Plazo),
InstallmentRatePercentage (Carga de la cuota). 2.
Carácter (Historial):
CreditHistory.Critical (Malos antecedentes),
NumberExistingCredits. 3.
Capital/Condiciones: Age (Edad),
Housing.Rent (Falta de propiedad),
EmploymentDuration.gt.7 (Estabilidad laboral),
NumberPeopleMaintenance (número de dependientes
económicos).
B. Validación Estadística (Multicolinealidad y
Relevancia): Antes de introducir las variables continuas y
enteras al modelo, debemos comprobar que tengan algún grado de
asociación con el riesgo de Default y, más importante aún
en econometría, que no presenten multicolinealidad
entre ellas (lo cual inflaría los errores estándar y arruinaría la
inferencia).
# Creamos Y: 1 si es mal pagador, 0 si es buen pagador
df_credito <- GermanCredit %>%
mutate(Default = ifelse(Class == "Bad", 1, 0))
# Seleccionamos solo las variables numéricas clave para evaluar su correlación
vars_numericas <- df_credito %>%
select(Default, Amount, Duration, Age, InstallmentRatePercentage, NumberExistingCredits, ResidenceDuration, NumberPeopleMaintenance)
# Calculamos la matriz de correlación (Método de Pearson)
matriz_corr <- cor(vars_numericas)
# Graficamos el mapa de calor
corrplot(matriz_corr, method = "color", type = "lower",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
number.cex = 0.7, diag = FALSE)
Matriz de Correlación de Variables Numéricas
Análisis de la Matriz de Correlación y Decisiones de Modelado:
La evaluación del mapa de calor nos proporciona evidencia empírica crucial para filtrar nuestras variables continuas y enteras antes de la estimación econométrica:
Amount) y el plazo (Duration). Teóricamente
es coherente (créditos más grandes requieren más meses para pagarse).
Aunque esto es una alerta roja de colinealidad, mantendremos ambas
variables en la estimación inicial del Modelo de Probabilidad Lineal
(MPL) para someterlas a la prueba formal del Factor de Inflación de la
Varianza (VIF) y cuantificar su impacto real en los errores estándar
antes de descartar alguna.NumberPeopleMaintenance (dependientes económicos)
y ResidenceDuration (tiempo en la vivienda actual)
presentan una correlación bivariada de exactamente 0.00 con nuestra
variable dependiente (Default). Incluir variables que no
aportan poder explicativo inicial solo penaliza los grados de libertad
del modelo. Respaldados por esta nula asociación estadística, decidimos
excluirlas del modelo final para mantener la parsimonia.Age (-0.09) e InstallmentRatePercentage (0.07)
muestran asociaciones coherentes con la teoría del riesgo: mayor edad
sugiere menor riesgo de impago, mientras que una mayor carga de la cuota
sobre el ingreso sugiere un riesgo superior.En conclusión, el bloque de variables numéricas para nuestro modelo
base quedará conformado por: Amount, Duration,
Age, e InstallmentRatePercentage.
A diferencia de las variables numéricas, la selección de variables dicótomas (dummies) no puede basarse en la correlación de Pearson. Para evitar la trampa de la variable dummy y mantener un modelo estrictamente parsimonioso, filtraremos las categorías guiándonos por el marco teórico de las 5 C’s del Crédito (Capacidad, Capital, Colateral, Condiciones y Carácter), y descartando aquellas irrelevantes o éticamente cuestionables.
Personal.*), ya que nuestro
análisis previo demostró que variables familiares no tenían correlación
bivariada. Asimismo, descartamos Telephone y
ForeignWorker por normativas de cumplimiento ético en
riesgo crediticio, y la familia Purpose.* (propósito del
crédito) debido a que su alta fragmentación diluiría los grados de
libertad del modelo. Finalmente, para evaluar el empleo, priorizamos la
estabilidad (EmploymentDuration) sobre la etiqueta del
puesto (Job.*).CheckingAccountStatus.lt.0) o tener bajos ahorros
(SavingsAccountBonds.lt.100) aumentan el riesgo.CreditHistory.Critical como el principal indicador de
comportamiento pasado.OtherInstallmentPlans.Bank bajo la hipótesis de que deudas
paralelas reducen la capacidad de pago.Property.RealEstate (Bienes raíces) y
OtherDebtorsGuarantors.Guarantor (Tener un garante) como
atenuantes fuertes de riesgo (banderas verdes).Para comprobar si estas variables categóricas seleccionadas tienen un impacto real sobre la probabilidad de Default, ejecutaremos pruebas de independencia Chi-Cuadrado (\(\chi^2\)) y visualizaremos la proporción de impago.
# Variables dummy a evaluar
dummies_evaluar <- c("CheckingAccountStatus.lt.0", "CreditHistory.Critical",
"EmploymentDuration.lt.1", "OtherInstallmentPlans.Bank",
"SavingsAccountBonds.lt.100", "Property.RealEstate",
"OtherDebtorsGuarantors.Guarantor")
# 1. Bucle para calcular pruebas Chi-Cuadrado de independencia
cat("--- Pruebas de Independencia Chi-Cuadrado (p-value < 0.05 indica relación significativa) ---\n")
## --- Pruebas de Independencia Chi-Cuadrado (p-value < 0.05 indica relación significativa) ---
for(var in dummies_evaluar) {
# Creamos una tabla de contingencia entre Default y la variable Dummy
tabla_cont <- table(df_credito[[var]], df_credito$Default)
prueba_chi <- chisq.test(tabla_cont, correct = FALSE)
# Imprimimos los resultados de forma legible
cat(sprintf("Variable: %-35s | P-value: %.4f\n", var, prueba_chi$p.value))
}
## Variable: CheckingAccountStatus.lt.0 | P-value: 0.0000
## Variable: CreditHistory.Critical | P-value: 0.0000
## Variable: EmploymentDuration.lt.1 | P-value: 0.0008
## Variable: OtherInstallmentPlans.Bank | P-value: 0.0023
## Variable: SavingsAccountBonds.lt.100 | P-value: 0.0000
## Variable: Property.RealEstate | P-value: 0.0002
## Variable: OtherDebtorsGuarantors.Guarantor | P-value: 0.0818
# 2. Visualización del impacto (Ejemplo con CreditHistory.Critical)
# Calculamos la proporción de malos pagadores para cada grupo
grafico_historial <- df_credito %>%
group_by(CreditHistory.Critical, Default) %>% # Directo a agrupar, sin el error
summarise(n = n(), .groups = "drop") %>%
group_by(CreditHistory.Critical) %>%
mutate(Proporcion = n / sum(n) * 100) %>%
filter(Default == 1) %>% # Solo nos interesa la barra de malos pagadores
mutate(Historial = ifelse(CreditHistory.Critical == 1, "Crítico (1)", "Sano/Bueno (0)"))
# Gráfico de barras
ggplot(grafico_historial, aes(x = Historial, y = Proporcion, fill = Historial)) +
geom_bar(stat = "identity", width = 0.5, show.legend = FALSE) +
geom_text(aes(label = sprintf("%.1f%%", Proporcion)), vjust = -0.5, fontface = "bold") +
scale_fill_manual(values = c("Crítico (1)" = "#E74C3C", "Sano/Bueno (0)" = "#2E86C1")) +
theme_minimal() +
labs(title = "Probabilidad de Default: Impacto del Historial Crediticio",
subtitle = "¿Tener un historial crítico aumenta el riesgo estadísticamente?",
y = "Porcentaje de Clientes en Default",
x = "Estado del Historial Crediticio") +
ylim(0, 50)
Tasa de Impago (Default) según Historial Crediticio
Conclusión de la Validación Estadística e Insights de Negocio:
Los resultados de las pruebas no paramétricas Chi-Cuadrado justifican
empíricamente nuestra selección teórica, pero con una excepción. Seis de
las siete variables evaluadas arrojaron valores \(p\) sustancialmente menores al umbral de
significancia del 0.05 (la mayoría con \(p
< 0.01\)), confirmando una asociación estadística robusta con
la probabilidad de Default. Sin embargo, la variable
correspondiente a tener un garante
(OtherDebtorsGuarantors.Guarantor) arrojó un valor \(p\) de 0.0818. Para mantener un rigor
econométrico estricto del 95% de confianza y favorecer la parsimonia del
modelo, esta variable será excluida de las estimaciones posteriores.
Adicionalmente, el análisis visual revela “insights” de negocio contra-intuitivos sumamente valiosos. Como se observa en el gráfico de barras, la proporción de impago en clientes catalogados con un historial “Crítico” es sorprendentemente inferior (17.1%) en comparación con aquellos de historial “Sano/Bueno” (35.4%). En el contexto de la banca alemana, un historial crítico suele denotar la existencia de múltiples créditos activos en otras instituciones, lo cual se traduce en un cliente experimentado y rastreable dentro del sistema financiero. Por el contrario, un historial “sano” a menudo agrupa a clientes sin antecedentes crediticios previos, cuyo comportamiento incierto representa un riesgo de impago matemáticamente superior para la institución.
Por lo tanto, nuestro dataset analítico final para la modelización
econométrica constará de la variable dependiente binaria
Default y un subconjunto parsimonioso de variables
explicativas altamente significativas:
Amount,
Duration Age,
InstallmentRatePercentage.CheckingAccountStatus.lt.0,
CreditHistory.Critical,
EmploymentDuration.lt.1,
OtherInstallmentPlans.Bank,
SavingsAccountBonds.lt.100,
Property.RealEstate.Como punto de partida teórico, estimaremos un Modelo de Probabilidad Lineal (MPL) mediante Mínimos Cuadrados Ordinarios (MCO). Aunque la literatura econométrica (Gujarati, 2004) advierte sobre las deficiencias estructurales de aplicar MCO a variables dependientes dicótomas, este modelo servirá como línea base para realizar diagnósticos críticos, específicamente la evaluación de multicolinealidad multilateral y la comprobación de heteroscedasticidad.
# 1. Consolidación del dataset final con las variables rigurosamente seleccionadas
df_final <- df_credito %>%
select(
Default,
Amount, Duration, Age, InstallmentRatePercentage, # Variables Numéricas
CheckingAccountStatus.lt.0, CreditHistory.Critical, # Dummies
EmploymentDuration.lt.1, OtherInstallmentPlans.Bank,
SavingsAccountBonds.lt.100, Property.RealEstate
)
# 2. Estimación del MPL
mpl_model <- lm(Default ~ ., data = df_final)
# (Omitimos el summary completo temporalmente para enfocarnos en los diagnósticos)
En la fase exploratoria detectamos una correlación bivariada de 0.62 entre el Monto (Amount) y el Plazo (Duration). Para determinar si esta relación infla artificialmente las varianzas de nuestros estimadores, aplicaremos el Factor de Inflación de la Varianza (VIF). Un VIF superior a 5 (o estrictamente > 4) indicaría multicolinealidad severa.
# Calculamos el VIF
vif_resultados <- vif(mpl_model)
print(vif_resultados)
## Amount Duration
## 2.039793 1.880233
## Age InstallmentRatePercentage
## 1.088016 1.230533
## CheckingAccountStatus.lt.0 CreditHistory.Critical
## 1.077514 1.051205
## EmploymentDuration.lt.1 OtherInstallmentPlans.Bank
## 1.066093 1.010652
## SavingsAccountBonds.lt.100 Property.RealEstate
## 1.082350 1.095837
Una de las violaciones fundamentales del MPL es que, por construcción matemática (dado que los errores siguen una distribución de Bernoulli), la varianza del error no es constante, sino que depende de los valores de \(X\). Probaremos esto formalmente.
# Prueba de Breusch-Pagan
bptest(mpl_model)
##
## studentized Breusch-Pagan test
##
## data: mpl_model
## BP = 85.596, df = 10, p-value = 3.981e-14
La ejecución de las pruebas de diagnóstico sobre el Modelo de Probabilidad Lineal (MPL) nos arroja dos conclusiones fundamentales que dictarán nuestras siguientes decisiones metodológicas:
1. Superación de la Multicolinealidad (VIF): A pesar
de la alta correlación bivariada inicial (0.62) observada en el mapa de
calor entre el monto (Amount) y el plazo
(Duration), el cálculo del Factor de Inflación de la
Varianza (VIF) descarta la existencia de multicolinealidad multilateral
severa. Todos los valores VIF se encuentran muy por debajo del umbral
crítico de 4 (el valor máximo es 2.03 para Amount). Esto
nos otorga el respaldo estadístico para mantener ambas variables en el
modelo, preservando la riqueza interpretativa del riesgo crediticio sin
comprometer las varianzas de los estimadores.
2. Confirmación de la Heteroscedasticidad (Breusch-Pagan): La prueba de Breusch-Pagan arroja un valor \(p\) de \(3.981 \times 10^{-14}\), rechazando contundentemente la hipótesis nula de varianza constante. Este resultado empírico no es una sorpresa, sino una demostración de la falla estructural inherente al MPL. Como advierte la teoría econométrica, dado que la variable dependiente \(Y\) sigue una distribución de Bernoulli, la varianza del término de error depende lógicamente de los valores de las variables explicativas (\(Var(u_i) = P_i(1-P_i)\)).
Nota metodológica: En este contexto, resulta innecesario aplicar pruebas adicionales de heteroscedasticidad (como White, Glejser o Goldfeld-Quandt). El objetivo en un MPL no es “descubrir” la forma de la heteroscedasticidad, sino simplemente probar empíricamente su existencia inevitable para justificar la corrección de los errores estándar.
Dado que hemos comprobado la heteroscedasticidad, los errores estándar clásicos calculados por MCO están sesgados, invalidando cualquier inferencia sobre los p-values tradicionales. Para corregir esto, aplicaremos la matriz de varianzas y covarianzas consistente con la heteroscedasticidad (Corrección HCCM).
Aún con esta corrección, expondremos el defecto más grave del MPL: su incapacidad para restringir las estimaciones dentro del rango lógico de probabilidades. Someteremos el modelo a una “prueba de estrés” creando dos perfiles de clientes diametralmente opuestos para observar cómo el modelo genera probabilidades ilógicas (\(< 0\) o \(> 1\)).
# 1. Aplicación de Errores Estándar Robustos (HCCM)
# Muestra los coeficientes con los p-values corregidos
coeftest(mpl_model, vcov = hccm)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.1213e-02 6.6580e-02 0.1684 0.8662889
## Amount 1.4752e-05 7.9279e-06 1.8607 0.0630794 .
## Duration 4.9089e-03 1.6613e-03 2.9549 0.0032018 **
## Age -2.0290e-03 1.2171e-03 -1.6671 0.0958199 .
## InstallmentRatePercentage 3.6603e-02 1.3455e-02 2.7205 0.0066336 **
## CheckingAccountStatus.lt.0 2.1731e-01 3.3480e-02 6.4906 1.350e-10 ***
## CreditHistory.Critical -1.3734e-01 2.8112e-02 -4.8856 1.202e-06 ***
## EmploymentDuration.lt.1 1.0202e-01 3.9341e-02 2.5933 0.0096466 **
## OtherInstallmentPlans.Bank 1.0568e-01 4.4093e-02 2.3967 0.0167265 *
## SavingsAccountBonds.lt.100 1.0769e-01 2.7724e-02 3.8844 0.0001094 ***
## Property.RealEstate -5.4099e-02 2.9711e-02 -1.8209 0.0689273 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 2. Prueba de Estrés: Creación de perfiles extremos
# Perfil 1: El "Cliente Ideal" (Bajo riesgo) vs Perfil 2: El "Cliente de Alto Riesgo"
perfiles_extremos <- data.frame(
Amount = c(1000, 15000), # Monto bajo vs Monto muy alto
Duration = c(6, 48), # Plazo corto vs Plazo muy largo
Age = c(60, 20), # Mayor edad vs Muy joven
InstallmentRatePercentage = c(1, 4), # Cuota cómoda vs Cuota asfixiante
CheckingAccountStatus.lt.0 = c(0, 1), # Cuenta sana vs Cuenta en negativo
CreditHistory.Critical = c(1, 0), # Con historial previo vs Sin historial (fantasma)
EmploymentDuration.lt.1 = c(0, 1), # Empleo estable vs Empleo muy reciente
OtherInstallmentPlans.Bank = c(0, 1), # Sin otras deudas vs Con deudas paralelas
SavingsAccountBonds.lt.100 = c(0, 1), # Con ahorros vs Sin ahorros
Property.RealEstate = c(1, 0) # Con propiedad vs Sin propiedad (inquilino)
)
# 3. Predicción de la probabilidad de Default para estos perfiles
predicciones_mpl <- predict(mpl_model, newdata = perfiles_extremos)
print(predicciones_mpl)
## 1 2
## -0.2211587 1.1066514
Análisis de Significancia con Errores Robustos (HCCM): La aplicación de la matriz de varianzas y covarianzas consistente con la heteroscedasticidad (Corrección HCCM) nos permite realizar inferencia válida sobre los coeficientes del MPL, blindando nuestros valores p contra el sesgo inducido por la varianza no constante.
Al observar la salida robusta, extraemos conclusiones vitales sobre los determinantes del riesgo crediticio:
CheckingAccountStatus.lt.0,
CreditHistory.Critical y
SavingsAccountBonds.lt.100) mantienen una significancia
estadística rotunda (p-value < 0.001). Por ejemplo, el coeficiente de
la cuenta corriente en negativo indica que, ceteris paribus,
esta condición incrementa la probabilidad de impago en aproximadamente
21.7 puntos porcentuales. Se confirma también el hallazgo exploratorio
sobre el historial crediticio crítico, el cual reduce la probabilidad de
impago en 13.7 puntos porcentuales (reflejando el perfil del cliente
bancarizado recurrente).Age) y
la tenencia de bienes raíces (Property.RealEstate), así
como el monto del crédito (Amount), pierden su
significancia estricta al 5% tras la corrección robusta (sus valores p
se ubican entre 0.06 y 0.09). Esto demuestra el valor empírico de la
corrección de White/HCCM, previniendo que el banco tome decisiones
basadas en “falsos positivos” estadísticos (Errores Tipo I) generados
por la heteroscedasticidad del modelo clásico.Conclusión de la Prueba de Estrés (El Colapso del MPL): Los resultados de la predicción evidencian la falla más crítica del Modelo de Probabilidad Lineal advertida por la teoría econométrica. Para el “Perfil 1” (cliente de bajo riesgo), el modelo estima una probabilidad de impago de -0.22 (-22%), un valor matemáticamente imposible. Para el “Perfil 2” (cliente de altísimo riesgo), la probabilidad estimada asciende a 1.10 (110%), superando el límite superior lógico.
Al no poder acotar las predicciones al intervalo \([0,1]\), el MPL queda descartado como herramienta predictiva y analítica para este problema de Credit Scoring, obligándonos a abandonar el método de Mínimos Cuadrados Ordinarios (MCO) y transitar hacia modelos de elección discreta estimados por Máxima Verosimilitud (MV).
Para corregir los defectos estructurales del MPL, ajustaremos la estimación utilizando funciones de distribución acumulativa (FDA) que garantizan en todo momento que \(0 \leq P(Y=1) \leq 1\).
Dado que estamos trabajando con datos a nivel individual (no agrupados), el método de estimación a utilizar será estrictamente el de Máxima Verosimilitud.
# 1. Estimación del Modelo Logit
modelo_logit <- glm(Default ~ ., data = df_final, family = binomial(link = "logit"))
# 2. Estimación del Modelo Probit
modelo_probit <- glm(Default ~ ., data = df_final, family = binomial(link = "probit"))
# 3. Cuadro Comparativo Estilo Académico (Stargazer)
stargazer(mpl_model, modelo_logit, modelo_probit,
type = "html", # <--- "latex" para pdf "html" para html
title = "Comparación de Modelos: MPL vs Logit vs Probit",
column.labels = c("MCO (MPL)", "Logit", "Probit"),
dep.var.labels = "Probabilidad de Default",
covariate.labels = c("Monto del Crédito", "Plazo (Meses)", "Edad",
"Carga de la Cuota (%)", "Cuenta Corriente (<0)",
"Historial Crítico", "Empleo Reciente (<1 año)",
"Otras Deudas Bancarias", "Ahorros Bajos (<100)",
"Bienes Raíces (Sí)"),
star.cutoffs = c(0.05, 0.01, 0.001),
keep.stat = c("n", "rsq", "ll", "aic"),
notes = "Errores estándar en paréntesis.")
| Dependent variable: | |||
| Probabilidad de Default | |||
| OLS | logistic | probit | |
| MCO (MPL) | Logit | Probit | |
| (1) | (2) | (3) | |
| Monto del Crédito | 0.00001* | 0.0001* | 0.00005* |
| (0.00001) | (0.00004) | (0.00002) | |
| Plazo (Meses) | 0.005** | 0.026** | 0.016** |
| (0.002) | (0.008) | (0.005) | |
| Edad | -0.002 | -0.014 | -0.008 |
| (0.001) | (0.007) | (0.004) | |
| Carga de la Cuota (%) | 0.037** | 0.222** | 0.126** |
| (0.013) | (0.077) | (0.045) | |
| Cuenta Corriente (<0) | 0.217*** | 1.071*** | 0.639*** |
| (0.031) | (0.166) | (0.099) | |
| Historial Crítico | -0.137*** | -0.851*** | -0.499*** |
| (0.030) | (0.189) | (0.107) | |
| Empleo Reciente (<1 año) | 0.102** | 0.525** | 0.309** |
| (0.036) | (0.197) | (0.117) | |
| Otras Deudas Bancarias | 0.106** | 0.574** | 0.348** |
| (0.038) | (0.208) | (0.124) | |
| Ahorros Bajos (<100) | 0.108*** | 0.646*** | 0.370*** |
| (0.028) | (0.168) | (0.097) | |
| Bienes Raíces (Sí) | -0.054 | -0.337 | -0.204 |
| (0.031) | (0.186) | (0.108) | |
| Constant | 0.011 | -2.512*** | -1.472*** |
| (0.067) | (0.404) | (0.234) | |
| Observations | 1,000 | 1,000 | 1,000 |
| R2 | 0.174 | ||
| Log Likelihood | -518.526 | -518.618 | |
| Akaike Inf. Crit. | 1,059.052 | 1,059.237 | |
| Note: | p<0.05; p<0.01; p<0.001 | ||
| Errores estándar en paréntesis. | |||
Al observar la tabla de resultados, extraemos tres conclusiones teóricas fundamentales:
Para recuperar la interpretación práctica que requiere la Inteligencia de Negocios, el siguiente paso será evaluar la bondad de ajuste de estos modelos (pseudo-\(R^2\)) y, primordialmente, calcular los Efectos Marginales Promedio (AME).
En los modelos de elección discreta, el coeficiente de determinación tradicional (\(R^2\)) derivado de MCO pierde su validez teórica. En su lugar, evaluaremos la capacidad explicativa del modelo mediante el Pseudo-\(R^2\) de McFadden, el cual compara el valor de la función de log-verosimilitud del modelo estimado frente a un modelo restringido (que solo incluye el intercepto).
Valores de McFadden entre 0.20 y 0.40 son considerados indicadores de un ajuste excelente en estudios empíricos de corte transversal.
# Cálculo del Pseudo-R2 de McFadden
mcfadden_logit <- 1 - (modelo_logit$deviance / modelo_logit$null.deviance)
mcfadden_probit <- 1 - (modelo_probit$deviance / modelo_probit$null.deviance)
cat("Pseudo-R2 McFadden (Logit):", round(mcfadden_logit, 4), "\n")
## Pseudo-R2 McFadden (Logit): 0.1512
cat("Pseudo-R2 McFadden (Probit):", round(mcfadden_probit, 4), "\n")
## Pseudo-R2 McFadden (Probit): 0.151
cat("AIC (Logit):", AIC(modelo_logit), "| AIC (Probit):", AIC(modelo_probit), "\n")
## AIC (Logit): 1059.052 | AIC (Probit): 1059.237
Tras la ejecución de los modelos, es imperativo evaluar qué tan bien explican el fenómeno del riesgo crediticio. A diferencia del \(R^2\) de MCO, utilizamos métricas basadas en la verosimilitud:
La limitación principal de los coeficientes obtenidos por Máxima Verosimilitud en Logit y Probit es que no representan cambios directos en la probabilidad. Como la función de probabilidad es no lineal, el efecto marginal de una variable depende de los valores del resto de variables.
Para resolver esto, la teoría econométrica propone dos enfoques:
Calcularemos ambos enfoques, además de demostrar que, tal como dicta la teoría, los efectos marginales obtenidos por Logit y Probit son virtualmente idénticos en la práctica.
Mientras que los coeficientes del modelo original nos dan la dirección del efecto, el AME nos otorga la magnitud promedio real sobre la probabilidad de impago para toda la muestra.
# 1. Efectos Marginales Promedio (AME) - Logit vs Probit
ame_logit <- margins(modelo_logit)
ame_probit <- margins(modelo_probit)
cat("--- AME: Modelo Logit ---\n")
## --- AME: Modelo Logit ---
summary(ame_logit)[, c("factor", "AME", "SE", "z", "p")]
## factor AME SE z p
## Age -0.0024 0.0013 -1.9132 0.0557
## Amount 0.0000 0.0000 2.2088 0.0272
## CheckingAccountStatus.lt.0 0.1843 0.0263 7.0120 0.0000
## CreditHistory.Critical -0.1465 0.0315 -4.6533 0.0000
## Duration 0.0045 0.0014 3.2613 0.0011
## EmploymentDuration.lt.1 0.0904 0.0334 2.7057 0.0068
## InstallmentRatePercentage 0.0381 0.0131 2.9218 0.0035
## OtherInstallmentPlans.Bank 0.0987 0.0353 2.7965 0.0052
## Property.RealEstate -0.0580 0.0318 -1.8221 0.0684
## SavingsAccountBonds.lt.100 0.1111 0.0282 3.9326 0.0001
cat("\n--- AME: Modelo Probit ---\n")
##
## --- AME: Modelo Probit ---
summary(ame_probit)[, c("factor", "AME", "SE", "z", "p")]
## factor AME SE z p
## Age -0.0024 0.0012 -1.9173 0.0552
## Amount 0.0000 0.0000 2.1502 0.0315
## CheckingAccountStatus.lt.0 0.1871 0.0272 6.8869 0.0000
## CreditHistory.Critical -0.1461 0.0306 -4.7798 0.0000
## Duration 0.0046 0.0014 3.2361 0.0012
## EmploymentDuration.lt.1 0.0906 0.0340 2.6670 0.0077
## InstallmentRatePercentage 0.0368 0.0130 2.8214 0.0048
## OtherInstallmentPlans.Bank 0.1018 0.0359 2.8347 0.0046
## Property.RealEstate -0.0598 0.0314 -1.9073 0.0565
## SavingsAccountBonds.lt.100 0.1082 0.0280 3.8661 0.0001
Conclusiones de los resultados AME (Logit): Al
observar la columna AME del resumen, identificamos los
determinantes con mayor peso económico: 1. Estado de
Liquidez: Tener la cuenta corriente en negativo
(CheckingAccountStatus.lt.0) incrementa la probabilidad de
default en un 18.43% en promedio para toda la
población estudiada. Es el factor de riesgo individual más potente del
modelo. 2. Historial de Carácter: Poseer un historial
crítico (CreditHistory.Critical) reduce la probabilidad de
impago en un 14.65%. Como se analizó previamente, esto
valida que los clientes bancarizados con experiencia crediticia previa
son sujetos de menor riesgo para el banco. 3. Escasez de
Reservas: No contar con ahorros significativos
(SavingsAccountBonds.lt.100) eleva el riesgo de impago en
un 11.11%. 4. Carga Financiera y
Tiempo: Por cada mes adicional de plazo
(Duration), el riesgo de default aumenta un
0.45%, mientras que cada punto porcentual de carga de
la cuota sobre el ingreso (InstallmentRatePercentage) lo
incrementa en un 3.81%.
Conclusiones de los resultados AME (Probit): Al
evaluar el modelo Probit, observamos una convergencia casi total con los
resultados del Logit, lo que refuerza la robustez de nuestras
inferencias: * Consistencia de Magnitudes: El impacto
de tener la cuenta corriente en negativo
(CheckingAccountStatus.lt.0) se estima en un
18.71%, una diferencia de apenas 0.28 puntos
porcentuales respecto al Logit. * Validación del
Historial: El efecto de poseer un historial crítico
(CreditHistory.Critical) reduce la probabilidad de impago
en un 14.61%, confirmando que la elección entre una
distribución logística o una normal estándar no altera las conclusiones
estratégicas para el banco. * Significancia
Estadística: Todas las variables que resultaron significativas
en el Logit mantienen su relevancia en el Probit con niveles de
confianza superiores al 99% (\(p <
0.01\)).
A diferencia del AME, el PEA (Partial Effect at Average) evalúa el impacto de las variables sobre un único individuo hipotético. La literatura econométrica advierte que utilizar la media aritmética para variables dicótomas genera perfiles imposibles (ej. “0.3 cuentas corrientes”).
Para solucionar este sesgo de agregación y proveer una interpretación de negocio clara, construiremos un “Individuo Base” o “Perfil de Referencia”. Este cliente hipotético poseerá la media muestral en todas sus variables continuas, pero mantendrá un estado base (valor \(0\)) en todas sus variables de riesgo categóricas. Así, aislaremos el impacto exacto que tendría “encender” (pasar de 0 a 1) una bandera de riesgo sobre un cliente estándar.
# Definición del Individuo Base (Perfil de Referencia "Limpio")
perfil_base <- list(
Amount = mean(df_final$Amount),
Duration = mean(df_final$Duration),
Age = mean(df_final$Age),
InstallmentRatePercentage = mean(df_final$InstallmentRatePercentage),
CheckingAccountStatus.lt.0 = 0, # Cliente sin cuenta en negativo
CreditHistory.Critical = 0, # Cliente sin historial crítico
EmploymentDuration.lt.1 = 0, # Empleo estable (> 1 año)
OtherInstallmentPlans.Bank = 0, # Sin deudas paralelas
SavingsAccountBonds.lt.100 = 0, # Con ahorros suficientes
Property.RealEstate = 0 # Sin bienes raíces (inquilino base)
)
# Cálculo del PEA para Logit y Probit sobre el Perfil Base
pea_logit <- margins(modelo_logit, at = perfil_base)
pea_probit <- margins(modelo_probit, at = perfil_base)
cat("--- PEA: Modelo Logit (Individuo Base) ---\n")
## --- PEA: Modelo Logit (Individuo Base) ---
summary(pea_logit)[, c("factor", "AME", "SE", "z", "p")]
## factor AME SE z p
## Age -0.0020 0.0011 -1.8909 0.0586
## Amount 0.0000 0.0000 2.1793 0.0293
## CheckingAccountStatus.lt.0 0.1555 0.0253 6.1402 0.0000
## CreditHistory.Critical -0.1236 0.0329 -3.7590 0.0002
## Duration 0.0038 0.0012 3.1728 0.0015
## EmploymentDuration.lt.1 0.0763 0.0278 2.7465 0.0060
## InstallmentRatePercentage 0.0322 0.0114 2.8238 0.0047
## OtherInstallmentPlans.Bank 0.0833 0.0290 2.8679 0.0041
## Property.RealEstate -0.0489 0.0288 -1.6993 0.0893
## SavingsAccountBonds.lt.100 0.0938 0.0203 4.6078 0.0000
cat("\n--- PEA: Modelo Probit (Individuo Base) ---\n")
##
## --- PEA: Modelo Probit (Individuo Base) ---
summary(pea_probit)[, c("factor", "AME", "SE", "z", "p")]
## factor AME SE z p
## Age -0.0021 0.0011 -1.8986 0.0576
## Amount 0.0000 0.0000 2.1324 0.0330
## CheckingAccountStatus.lt.0 0.1684 0.0266 6.3379 0.0000
## CreditHistory.Critical -0.1315 0.0330 -3.9893 0.0001
## Duration 0.0041 0.0013 3.1715 0.0015
## EmploymentDuration.lt.1 0.0815 0.0301 2.7126 0.0067
## InstallmentRatePercentage 0.0331 0.0120 2.7555 0.0059
## OtherInstallmentPlans.Bank 0.0917 0.0316 2.9026 0.0037
## Property.RealEstate -0.0539 0.0300 -1.7976 0.0722
## SavingsAccountBonds.lt.100 0.0974 0.0221 4.3973 0.0000
Conclusiones de los resultados PEA (Logit): Al analizar el impacto sobre este perfil específico, notamos que las magnitudes son ligeramente menores pero mantienen la misma jerarquía de importancia: * Para este cliente “estándar”, el hecho de que su cuenta pase a estado negativo incrementaría su probabilidad de default en un 15.55%. * Si este mismo individuo base no tuviera historial crediticio previo y pasara a tener uno crítico (recurrente), su riesgo disminuiría en un 12.36%. * La falta de ahorros impacta a este perfil promedio aumentando su riesgo en un 9.38%.
Conclusiones de los resultados PEA (Probit): Al
aplicar el enfoque del “Individuo Base” al modelo Probit, los resultados
mantienen la jerarquía de riesgo observada: * Para el perfil de
referencia, la activación de la bandera de cuenta corriente negativa
genera un incremento del 16.84% en la probabilidad de
default. * El efecto de la carga financiera
(InstallmentRatePercentage) para este individuo específico
es de un 3.31% por cada punto porcentual adicional de
deuda sobre el ingreso. * Al comparar con el PEA Logit
(15.55% para la cuenta corriente), notamos que el
Probit tiende a ser ligeramente más sensible en los perfiles cercanos a
la media.
Para demostrar definitivamente la superioridad de la especificación no lineal, someteremos el modelo Logit a los mismos dos perfiles extremos (Ideal y Alto Riesgo) que hicieron colapsar al Modelo de Probabilidad Lineal (MPL) en la sección 3.5.
Evaluaremos dos aspectos: la predicción de probabilidad acotada y el comportamiento asintótico del efecto marginal en las “colas” de la distribución.
# 1. Recuperamos los perfiles extremos usados en el MPL
perfil_ideal <- data.frame(
Amount=1000, Duration=6, Age=60, InstallmentRatePercentage=1,
CheckingAccountStatus.lt.0=0, CreditHistory.Critical=1, EmploymentDuration.lt.1=0,
OtherInstallmentPlans.Bank=0, SavingsAccountBonds.lt.100=0, Property.RealEstate=1
)
perfil_riesgo <- data.frame(
Amount=15000, Duration=48, Age=20, InstallmentRatePercentage=4,
CheckingAccountStatus.lt.0=1, CreditHistory.Critical=0, EmploymentDuration.lt.1=1,
OtherInstallmentPlans.Bank=1, SavingsAccountBonds.lt.100=1, Property.RealEstate=0
)
# 2. Predicción de Probabilidades acotadas (El fin del problema de MCO)
prob_ideal <- predict(modelo_logit, newdata = perfil_ideal, type = "response")
prob_riesgo <- predict(modelo_logit, newdata = perfil_riesgo, type = "response")
cat("--- Probabilidad P(Y=1) Predicha ---\n")
## --- Probabilidad P(Y=1) Predicha ---
cat("Perfil Ideal:", round(prob_ideal * 100, 2), "%\n")
## Perfil Ideal: 1.66 %
cat("Perfil Alto Riesgo:", round(prob_riesgo * 100, 2), "%\n\n")
## Perfil Alto Riesgo: 96.64 %
# 3. Efectos Marginales en los Extremos (Demostración de la Curva S)
pea_riesgo <- margins(modelo_logit, at = perfil_riesgo)
cat("--- Efecto Marginal (PEA) en el Perfil de Alto Riesgo ---\n")
## --- Efecto Marginal (PEA) en el Perfil de Alto Riesgo ---
summary(pea_riesgo)[, c("factor", "AME", "p")]
## factor AME p
## Age -0.0005 0.0912
## Amount 0.0000 0.0057
## CheckingAccountStatus.lt.0 0.0348 0.0214
## CreditHistory.Critical -0.0276 0.0428
## Duration 0.0009 0.0870
## EmploymentDuration.lt.1 0.0171 0.0384
## InstallmentRatePercentage 0.0072 0.0212
## OtherInstallmentPlans.Bank 0.0186 0.0280
## Property.RealEstate -0.0109 0.1783
## SavingsAccountBonds.lt.100 0.0210 0.0445
Análisis de los Extremos y el Fin del MPL: Los resultados obtenidos confirman la solidez teórica de la estimación por Máxima Verosimilitud frente a MCO. En primer lugar, el modelo Logit logra acotar perfectamente las predicciones dentro del intervalo lógico \([0,1]\): el perfil “Ideal” arroja una probabilidad de impago de apenas 1.66%, eliminando definitivamente el absurdo -22% generado por el MPL. Por su parte, el perfil de “Alto Riesgo” alcanza una probabilidad del 96.64%, bordeando el límite asintótico sin generar el imposible 110% de su contraparte lineal.
Aún más revelador es el comportamiento de los efectos marginales en los extremos de la curva “S”. Al observar el PEA del cliente de alto riesgo, notamos que el impacto de variables críticas colapsa. Por ejemplo, tener la cuenta corriente en negativo solo suma un 3.48% adicional a su probabilidad de impago, en brutal contraste con el 15.55% que afectaba al individuo base. Esto ilustra matemáticamente las “colas planas” de la distribución logística: si un cliente ya está probabilísticamente condenado al impago (96.64%), añadir una bandera de riesgo extra apenas altera su estado fundamental.
(Nota metodológica: Aunque la salida estándar de la librería
margins etiqueta la columna de estimaciones como “AME” por
defecto en su función summary, el uso explícito del argumento
at para forzar un vector de características idénticas en
todas las observaciones garantiza que el cálculo matemático subyacente
corresponde estrictamente a un Efecto Marginal en un Perfil Específico o
PEA).
El tránsito desde el Modelo de Probabilidad Lineal (MPL) hacia los modelos de elección discreta (Logit y Probit) demostró ser no solo una corrección estadística, sino una necesidad conceptual absoluta para el Credit Scoring. Mientras que el MPL asume erróneamente que el riesgo aumenta de forma constante y perpetua, la realidad financiera demostrada por la curva logística dicta que el impacto de una variable está estrictamente condicionado por el perfil integral del solicitante.
El Espectro de la Inferencia Causal (AME vs. PEA Base vs. PEA Extremo)
La riqueza de este análisis radica en haber cuantificado el riesgo desde tres perspectivas distintas, comprobando de manera empírica la no linealidad de la probabilidad de Default:
En conclusión, este estudio demuestra que la evaluación del riesgo crediticio es un fenómeno altamente dinámico. Un sistema de Inteligencia de Negocios verdaderamente eficiente no penaliza a todos los solicitantes con la misma rigidez ante una misma falta, sino que pondera el impacto marginal basándose en la posición inicial del cliente dentro de la curva de probabilidad. Los modelos Logit y Probit, estimados por Máxima Verosimilitud, proporcionan exactamente el marco matemático para lograr esta personalización del riesgo.