1. Introducción y Entendimiento del Negocio

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.

2. Análisis Exploratorio de Datos (EDA) y Preprocesamiento

2.1 Descubrimiento del Dataset

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

2.1.1. Diagnóstico Estructural y Criterios Econométricos

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.

2.2 Selección de Variables: Un Enfoque Teórico y Estadístico

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

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:

  1. Evidencia de Multicolinealidad: Observamos una fuerte correlación positiva (0.62) entre el monto del crédito (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.
  2. Depuración por Principio de Parsimonia: Las variables 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.
  3. Consistencia Teórica de los Signos: Las variables 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.

2.3 Justificación Teórica de Variables Categóricas (Las 5 C’s del Crédito)

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.

  • Exclusiones estratégicas: Descartamos las variables sociodemográficas puras (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.*).
  • Inclusiones estratégicas (Banderas Rojas y Verdes):
    1. Liquidez y Reservas (Capital): Evaluaremos si tener la cuenta corriente en negativo (CheckingAccountStatus.lt.0) o tener bajos ahorros (SavingsAccountBonds.lt.100) aumentan el riesgo.
    2. Historial (Carácter): Consideramos CreditHistory.Critical como el principal indicador de comportamiento pasado.
    3. Sobreendeudamiento (Capacidad): Incluimos OtherInstallmentPlans.Bank bajo la hipótesis de que deudas paralelas reducen la capacidad de pago.
    4. Avales y Activos (Colateral): Incluimos Property.RealEstate (Bienes raíces) y OtherDebtorsGuarantors.Guarantor (Tener un garante) como atenuantes fuertes de riesgo (banderas verdes).

2.4 Validación Estadística (Análisis de Proporciones y Chi-Cuadrado)

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

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:

  1. Continuas/Enteras: Amount, Duration Age, InstallmentRatePercentage.
  2. Dicótomas (Dummies): CheckingAccountStatus.lt.0, CreditHistory.Critical, EmploymentDuration.lt.1, OtherInstallmentPlans.Bank, SavingsAccountBonds.lt.100, Property.RealEstate.

3. Estimación y Diagnóstico del Modelo de Probabilidad Lineal (MPL)

3.1 Construcción del Modelo Base (MCO)

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)

3.2 Diagnóstico 1: Evaluación de Multicolinealidad (VIF)

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

3.3 Diagnóstico 2: Prueba de Heteroscedasticidad (Breusch-Pagan)

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

3.4 Interpretación de los Diagnósticos Estructurales

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.

3.5 El “Golpe de Gracia” al MPL: Errores Robustos y Predicciones Ilógicas

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:

  1. Predictores Estructurales (Alta Significancia): Las variables relacionadas con la liquidez inmediata y el comportamiento histórico (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).
  2. Impacto de la Corrección (Significancia Marginal): Variables demográficas y de patrimonio como la edad (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).

4. Modelos de Elección Discreta: Logit y Probit

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\).

  1. Modelo Logit: Utiliza la función de distribución logística. Modela el logaritmo de la razón de probabilidades (Log-Odds).
  2. Modelo Probit (Normit): Basado en la teoría de la elección racional y variables latentes inobservables, utiliza la función de distribución normal estándar.

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.")
Comparación de Modelos: MPL vs Logit vs Probit
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.

4.1 Análisis Comparativo de Estimaciones

Al observar la tabla de resultados, extraemos tres conclusiones teóricas fundamentales:

  1. Consistencia de Signos e Inferencia: Los tres modelos (MPL, Logit y Probit) son absolutamente consistentes en la dirección de los efectos. Las variables que incrementan el riesgo en el MPL (signo positivo) también lo hacen en Logit y Probit. Asimismo, la significancia estadística (los valores \(p\)) se mantiene estable a través de las tres metodologías.
  2. Escala de los Coeficientes (Regla del 1.6): Como advierte la literatura econométrica (Gujarati, 2004), la magnitud de los coeficientes difiere entre los modelos no lineales debido a las escalas de sus distribuciones subyacentes. Se cumple empíricamente la regla de proporcionalidad: los estimadores Logit son aproximadamente 1.6 veces mayores que los del Probit. Por ejemplo, el coeficiente de Cuenta Corriente (<0) en el Logit (1.071) es \(\approx 1.67\) veces el del Probit (0.639).
  3. Pérdida de Interpretación Directa: A diferencia del MPL, los coeficientes de Logit y Probit mostrados en la tabla carecen de una interpretación económica directa. Un estimador de 1.071 en el Logit no significa que la probabilidad aumente en un 107%; significa que el Log-Odds (el logaritmo de la razón de probabilidades) aumenta en 1.071 unidades.

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

5. Evaluación de Bondad de Ajuste (Goodness of Fit)

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

5.1 Interpretación de la Bondad de Ajuste

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:

  • Pseudo-\(R^2\) de McFadden: Obtuvimos valores de 0.1512 para el modelo Logit y 0.151 para el Probit. En econometría de corte transversal, valores entre 0.2 y 0.4 se consideran un ajuste excelente; por lo tanto, un valor de ~0.15 indica que nuestros modelos tienen una capacidad explicativa sólida y muy superior a un modelo aleatorio.
  • Criterio de Información de Akaike (AIC): Esta métrica penaliza la inclusión de variables innecesarias. El modelo Logit presenta un AIC de 1059.052, ligeramente inferior al del Probit (1059.237). Aunque la diferencia es mínima, matemáticamente el modelo Logit ofrece una mejor relación entre complejidad y capacidad de ajuste para este dataset específico.

6. Inferencia Causal: Efectos Marginales (AME vs PEA)

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:

  1. Efecto Marginal en la Media (PEA - Partial Effect at Average): Evalúa el cambio en la probabilidad para un individuo hipotético que posee exactamente las características promedio de la muestra.
  2. Efecto Marginal Promedio (AME - Average Marginal Effect): Calcula el efecto marginal para cada individuo real de la muestra y luego promedia dichos efectos. Este enfoque es preferido en la econometría moderna porque no se basa en perfiles promedios inexistentes (ej. “alguien con 0.3 casas”).

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.

6.1 Efecto Marginal Promedio (AME)

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\)).

6.2 Efecto Marginal en un Perfil Específico (PEA)

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.

6.3 Comprobación de Extremos: El Cierre del Problema MPL

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

7. Conclusión General: La Naturaleza No Lineal y Decisiones de Negocio

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:

  1. La Visión Macroeconómica (AME - Promedio Poblacional): Al promediar los efectos en toda la muestra, obtuvimos las magnitudes de impacto más altas (ej. la falta de liquidez aumenta el riesgo poblacional en un 18.43%). Esta es la métrica ideal para diseñar políticas de crédito generales, ya que captura la vulnerabilidad promedio del portafolio completo del banco.
  2. La Visión Microeconómica Estándar (PEA - Individuo Base): Al evaluar a un cliente “limpio” o promedio, el riesgo marginal se modera (15.55% para la misma variable). En el centro de la curva “S”, la pendiente es pronunciada, lo que advierte al negocio que un cliente sano puede arruinar su perfil crediticio rápidamente con un solo mal comportamiento financiero.
  3. La Visión Asintótica (PEA - Perfiles Extremos): Como comprobamos en la prueba de estrés final, para un cliente catalogado de “Alto Riesgo” (con un 96.64% de probabilidad de impago), los factores de riesgo pierden su fuerza marginal y caen drásticamente (a impactos del 3.48%). El daño ya está hecho; el cliente se encuentra en la “cola plana” superior de la curva de distribución, donde ninguna variable individual cambiará su ya inminente destino de impago.

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.