Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

1. Exploración de datos (EDA)

Este capítulo corresponde a la sección 9.10.4.1 del proyecto. Se analiza el dataset Lending Club Loan Data completo (archivo accepted_2007_to_2018Q4.csv, sin muestreo ni reducción de filas) para entender su estructura, calidad y las relaciones iniciales con la variable objetivo default antes del preprocesamiento y del modelado.

Convención. Todas las estadísticas, pruebas y tablas se calculan sobre la totalidad de las filas. Únicamente el pairplot se dibuja sobre una submuestra aleatoria estratificada, tal como lo permite el enunciado, porque dibujar 1,3 millones de puntos por panel no es legible; esa submuestra no se usa para ningún cálculo.

CSV: C:\Users\User\Desktop\GEOLOGÍA\MAESTRÍA\Semestre 2\MachineLearning\Tarea 1\accepted_2007_to_2018Q4.csv | existe: True | tamaño: 1.68 GB

1.1 Carga inicial y visión general

El CSV original tiene 151 columnas y pesa 1,7 GB. Cargar todas las columnas a la vez en pandas requiere más de 8 GB de RAM, así que la lectura completa se hace en dos pasadas, ambas sobre todas las filas:

  1. Pasada 1, por bloques de 100 mil filas y con las 151 columnas. Cuenta las filas totales, registra el tipo inferido y los valores nulos de cada columna, y conserva las primeras y últimas filas del archivo.

  2. Pasada 2, con las columnas de interés (usecols). Carga en memoria las variables que se analizan en el resto del capítulo.

Dimensión del CSV original: 2,260,701 filas x 151 columnas  (pasada 1: 39 s)
Loading...
Loading...

Las últimas filas del archivo no son préstamos: son líneas de resumen (Total amount funded in policy code ...) que se cuelan en la columna id y dejan vacías las demás. Tienen loan_status nulo y desaparecen con el filtro del target.

Loading...

Definición del universo de análisis. El target se define sobre préstamos con desenlace conocido: Fully Paid (0) y Charged Off (1). Se excluyen:

  • Current, In Grace Period y Late (…): préstamos vivos cuyo desenlace aún no se conoce.

  • Does not meet the credit policy. Status: …: préstamos originados bajo una política de crédito distinta.

  • Default: 40 casos en un estado transitorio previo a Charged Off.

  • Las filas con loan_status nulo, que son las líneas de resumen.

Pasada 2 (pandas, 30 columnas): 24.1 s
Dataset de análisis: 1,345,310 filas x 30 columnas
id único: True

Comparación opcional del tiempo de carga con Spark. Se lee el mismo CSV completo con SparkSession, se filtra loan_status y se cuenta el resultado. Como Spark es perezoso (lazy), el count() obliga a leer el archivo entero.

Detalle de lectura. Por defecto, Spark trata \ como carácter de escape dentro de los campos entrecomillados. Este CSV sigue en cambio la norma RFC 4180 (comillas dobladas ""), igual que pandas. Con las opciones por defecto, Spark desplaza las columnas del préstamo 61400928 y obtiene una fila menos que pandas (1.345.309 frente a 1.345.310). Por eso todos los capítulos leen con escape='"' (U.SPARK_CSV_OPTIONS). En este capítulo el driver usa 4 GB y no 8 GB, porque el mismo proceso ya tiene cargados los datos de pandas y el equipo tiene 16 GB de RAM.

Loading...

Los dos entornos obtienen el mismo número de filas. Spark reparte el archivo en particiones que procesa en paralelo; pandas lo analiza con un solo hilo, aunque además convierte tipos y crea las variables derivadas. Por eso la comparación sirve solo como referencia: el tiempo de los modelos se compara con detalle en los capítulos de modelado.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1345310 entries, 0 to 1345309
Data columns (total 30 columns):
 #   Column                  Non-Null Count    Dtype         
---  ------                  --------------    -----         
 0   id                      1345310 non-null  int64         
 1   issue_d                 1345310 non-null  datetime64[ns]
 2   default                 1345310 non-null  int8          
 3   loan_amnt               1345310 non-null  float64       
 4   int_rate                1345310 non-null  float64       
 5   installment             1345310 non-null  float64       
 6   annual_inc              1345310 non-null  float64       
 7   dti                     1344936 non-null  float64       
 8   fico_range_low          1345310 non-null  float64       
 9   fico_range_high         1345310 non-null  float64       
 10  emp_length              1266799 non-null  float64       
 11  credit_hist_years       1345310 non-null  float64       
 12  delinq_2yrs             1345310 non-null  float64       
 13  inq_last_6mths          1345309 non-null  float64       
 14  mths_since_last_delinq  666567 non-null   float64       
 15  open_acc                1345310 non-null  float64       
 16  pub_rec                 1345310 non-null  float64       
 17  revol_bal               1345310 non-null  float64       
 18  revol_util              1344453 non-null  float64       
 19  total_acc               1345310 non-null  float64       
 20  mort_acc                1298029 non-null  float64       
 21  pub_rec_bankruptcies    1344613 non-null  float64       
 22  term                    1345310 non-null  category      
 23  grade                   1345310 non-null  category      
 24  home_ownership          1345310 non-null  category      
 25  verification_status     1345310 non-null  category      
 26  purpose                 1345310 non-null  category      
 27  addr_state              1345310 non-null  category      
 28  initial_list_status     1345310 non-null  category      
 29  application_type        1345310 non-null  category      
dtypes: category(8), datetime64[ns](1), float64(19), int64(1), int8(1)
memory usage: 227.1 MB

La estructura de análisis contiene 1.345.310 registros y 30 columnas que ocupan 227 MB en memoria: diecinueve variables numéricas de punto flotante, ocho categóricas, la fecha de emisión, el identificador y el objetivo binario. Los conteos de valores no nulos anticipan que los faltantes se concentran en unas pocas variables (mths_since_last_delinq, emp_length y mort_acc), mientras que las categóricas y el objetivo están completos. La conversión de las variables de texto al tipo category reduce de forma sustancial el uso de memoria y facilita las tabulaciones posteriores.

Loading...
Loading...
Loading...

Las estadísticas descriptivas muestran escalas muy heterogéneas, desde contadores con mediana nula (delinq_2yrs, pub_rec) hasta montos del orden de decenas de miles de dólares, lo que justifica la estandarización para los modelos sensibles a la escala. También revelan valores implausibles que deben tratarse antes del modelado: ingresos anuales de cero y de hasta 11 millones de dólares, una razón deuda/ingreso (dti) negativa (−1) o igual a 999, y una utilización del crédito revolvente de hasta 892 %. La brecha entre media y mediana en annual_inc (76.248 frente a 65.000) y en revol_bal (16.248 frente a 11.134) anticipa la asimetría positiva que se cuantifica en la sección 1.2.1.

Loading...

Entre las variables categóricas predominan los préstamos a 36 meses (75,9 %), de grado B, con hipoteca, con ingresos verificados por la fuente y destinados a la consolidación de deudas (58,0 %). addr_state, con 51 niveles y California como moda, es la variable de mayor cardinalidad y la que más columnas aportará tras la codificación one-hot.

Variables derivadas y exclusión de columnas

  • emp_length: se convierte de texto a años (< 1 year → 0, 10+ years → 10).

  • credit_hist_years: antigüedad del historial crediticio al emitir el préstamo, (issue_d − earliest_cr_line) en años.

  • issue_d se conserva solo como contexto temporal; no se usa como predictor.

La tabla siguiente clasifica las 151 columnas originales. Se descartan tres grupos:

  • Fuga de información (leakage): variables que solo existen después de otorgar el préstamo (pagos recibidos, recuperaciones, último FICO, acuerdos de liquidación, …). Usarlas equivaldría a predecir el desenlace conociéndolo de antemano.

  • Identificadores y texto libre: url, desc, title, emp_title, zip_code, member_id.

  • Columnas con más del 30 % de nulos en el universo de análisis. Se analizan en la sección 1.4.

rol
no analizada (originación)     43
fuga de información            38
descartada (>30% nulos)        34
analizada                      29
identificador / texto libre     7
Loading...

Las columnas marcadas como no analizada (originación) están disponibles al otorgar el préstamo y tienen pocos nulos, pero no se incluyen en el análisis. Son contadores muy detallados del buró de crédito (num_*, tot_*, bc_*, acc_open_past_24mths, …), redundantes con los totales que sí se analizan (open_acc, total_acc, revol_bal, revol_util, mort_acc). Además, funded_amnt y funded_amnt_inv coinciden casi siempre con loan_amnt. Así se sigue la lista de variables sugerida en el enunciado y el espacio de variables queda manejable para los seis modelos de los dos entornos.

1.2 Análisis unidimensional

1.2.1 Variables numéricas

Para cada variable se reportan media, mediana, desviación estándar, mínimo, máximo, percentiles 25, 50 y 75, rango intercuartílico (IQR), asimetría, curtosis, proporción de atípicos según Tukey (fuera de [Q1−1.5 IQR, Q3+1.5 IQR][Q_1 - 1.5\,IQR,\ Q_3 + 1.5\,IQR]) y porcentaje de faltantes.

Loading...

La tabla pone de relieve tres patrones. En primer lugar, las variables de conteo (delinq_2yrs, pub_rec y pub_rec_bankruptcies) tienen rango intercuartílico nulo, de modo que el criterio de Tukey clasifica como atípico cualquier valor distinto de cero (19,3 %, 16,9 % y 12,5 % de los casos). En ellas el “atípico” no es un error de registro, sino la minoría de prestatarios con antecedentes negativos, y por tanto no debe eliminarse. En segundo lugar, annual_inc, dti y revol_bal presentan asimetrías de 46, 27 y 14 y curtosis de tres a cuatro órdenes de magnitud, producto de colas poco numerosas (menos del 6 % de atípicos) pero muy alejadas del cuerpo de la distribución. En tercer lugar, las variables centrales del riesgo, int_rate, fico_range_high y loan_amnt, muestran asimetrías moderadas, pocos atípicos (1,9 %, 3,5 % y 0,5 %, respectivamente) y ningún valor imposible.

Histogramas. Para que la forma de la distribución sea legible, el eje horizontal se limita al percentil 99,5 de cada variable. Las colas extremas se ven en los boxplots siguientes.

<Figure size 1800x2000 with 19 Axes>

Los histogramas evidencian el carácter institucional de varias variables. loan_amnt concentra la masa en montos redondos (10.000, 12.000, 15.000, 20.000 y 35.000 dólares) e int_rate presenta picos asociados a los subgrados de Lending Club. fico_range_* comienza abruptamente cerca de 660 puntos, el mínimo de aceptación de la plataforma durante la mayor parte del periodo: la distribución está truncada por la política de crédito y no representa a la población general de solicitantes. emp_length es claramente bimodal por la acumulación en la categoría abierta “10+ años”, que reúne alrededor de un tercio de los casos. Por último, dti y revol_util son aproximadamente simétricas dentro del percentil 99,5, lo que indica que su asimetría global se debe a un grupo reducido de valores extremos y no a la forma del cuerpo de la distribución.

<Figure size 1800x1800 with 19 Axes>

Los diagramas de caja sobre la totalidad de los datos muestran la magnitud de esas colas. annual_inc alcanza 11 millones de dólares con una caja comprimida por debajo de 100 mil; dti y revol_util presentan valores aislados cercanos a 1000 y 900, y revol_bal llega a 2,9 millones. Aunque escasos, estos extremos dominarían la media y la varianza que estima el StandardScaler, y con ello el ajuste de los modelos lineales. Por ello se opta por recortar dti y revol_util a los percentiles 0,1 y 99,9 y por aplicar log1p a annual_inc y revol_bal. Los modelos basados en árboles son invariantes a estas transformaciones monótonas, de modo que la decisión no los perjudica.

Normalidad. Con n≈1,3n \approx 1{,}3 millones, cualquier prueba formal rechaza la normalidad ante desviaciones mínimas, y Shapiro-Wilk además solo es válida hasta n=5000n = 5000. Por eso se evalúa sobre todo la magnitud de la asimetría (∣g1∣<0,5|g_1| < 0{,}5 aproximadamente simétrica, 0,50{,}5–1 moderada, >1> 1 severa). Como referencia se incluye:

  • la prueba de D’Agostino-Pearson sobre todos los datos;

  • Shapiro-Wilk sobre 5000 observaciones aleatorias, solo como ilustración.

Para cada variable se muestra también la asimetría tras aplicar log1p o Yeo-Johnson, para decidir si conviene transformarla.

Loading...

Como era previsible con n≈1,3n \approx 1{,}3 millones, ambas pruebas rechazan la normalidad en todas las variables (p<0,001p < 0{,}001), incluso en aquellas casi simétricas como revol_util (asimetría de −0,04). La decisión, por tanto, se apoya en la magnitud del sesgo: trece de las diecinueve variables presentan asimetría severa. La transformación log1p reduce notablemente la de annual_inc (de 46,3 a −1,9) y la de revol_bal (de 13,8 a −2,7), mientras que Yeo-Johnson las lleva prácticamente a la simetría (0,19 y 0,20). Se prefiere log1p por su interpretabilidad y porque se reproduce de forma trivial en Spark. En los contadores discretos (pub_rec, delinq_2yrs), ninguna transformación corrige la asimetría, que obedece a la masa concentrada en cero; por ello se mantienen en su escala original.

1.2.2 Variables categóricas

Para cada variable se reportan la frecuencia absoluta y relativa de cada categoría y se marcan las categorías con menos del 1 % de las observaciones, candidatas a agruparse en OTHER.


=== term: 2 categorías, 0.00% nulos
Loading...

=== grade: 7 categorías, 0.00% nulos
Loading...

=== home_ownership: 6 categorías, 0.00% nulos
Loading...

=== verification_status: 3 categorías, 0.00% nulos
Loading...

=== purpose: 14 categorías, 0.00% nulos
Loading...

=== addr_state: 51 categorías, 0.00% nulos
Loading...

=== initial_list_status: 2 categorías, 0.00% nulos
Loading...

=== application_type: 2 categorías, 0.00% nulos
Loading...

Las frecuencias revelan distribuciones muy concentradas: debt_consolidation y credit_card suman el 80 % de los propósitos, las solicitudes individuales representan el 98,1 % y las categorías MORTGAGE y RENT el 89,2 % de la tenencia de vivienda. Las categorías residuales ANY, OTHER y NONE de home_ownership reúnen apenas 478 préstamos y corresponden a códigos heredados de las primeras etapas de la plataforma, por lo que se agrupan en una sola clase.

<Figure size 1800x2200 with 8 Axes>

Los gráficos ponen de manifiesto la cola larga de purpose y de addr_state: seis propósitos y veintitrés estados tienen menos del 1 % de los préstamos. En purpose las categorías raras se agrupan en other. En addr_state, en cambio, se conservan los 51 niveles, porque la agrupación mezclaría estados con tasas de default muy distintas (sección 1.3.2) y el costo de 51 columnas binarias es moderado frente a 1,08 millones de observaciones de entrenamiento.

{'grade': ['G'], 'home_ownership': ['ANY', 'OTHER', 'NONE'], 'purpose': ['moving', 'vacation', 'house', 'wedding', 'renewable_energy', 'educational'], 'addr_state': ['KY', 'OK', 'KS', 'AR', 'UT', 'NM', 'HI', 'MS', 'NH', 'RI', 'WV', 'MT', 'DE', 'NE', 'DC', 'AK', 'WY', 'SD', 'VT', 'ME', 'ID', 'ND', 'IA']}

La lista confirma las categorías minoritarias identificadas en los gráficos. El grado G (0,68 %) no se agrupa, pues tiene un significado ordinal y la mayor tasa de default del conjunto. De todos modos, grade se excluye finalmente del modelado por su redundancia con int_rate (sección 1.3.3).

1.2.3 Variable objetivo default

Loading...
<Figure size 1200x450 with 2 Axes>

La variable objetivo presenta un desbalance moderado, con 19,96 % de préstamos en default (268.559 casos). No se trata de un desbalance extremo que obligue a remuestrear, pero sí basta para que la exactitud resulte engañosa (un clasificador trivial que nunca predijera default alcanzaría 80 %) y para que el umbral convencional de 0,5 produzca muy pocos positivos. En consecuencia, la partición y la validación cruzada se estratifican, la selección de modelos se basa en el ROC AUC y se reportan además el AUC-PR y el F1, métricas más sensibles al desempeño en la clase minoritaria.

<Figure size 1100x400 with 2 Axes>
Loading...

La tasa de default no es estable en el tiempo. Desciende de 17,9 % en 2007 a 12,6 % en 2009, en un periodo de volumen reducido y criterios de aprobación más estrictos tras la crisis financiera, y crece de forma sostenida hasta 23,3 % en 2016, a medida que la plataforma amplía su oferta hacia segmentos de mayor riesgo. El descenso a 15,7 % en 2018 no refleja una mejora de la cartera, sino un sesgo de selección por censura. El archivo termina en el cuarto trimestre de 2018, de modo que de las emisiones recientes solo se observan los préstamos que ya concluyeron: los prepagados anticipadamente y los que cayeron en default temprano. Por esta razón issue_d no se emplea como predictor. Cabe advertir además que un modelo entrenado con una partición aleatoria mezcla cohortes, y su desempeño podría deteriorarse en una validación temporal.

1.3 Análisis bidimensional

1.3.1 Variables numéricas frente a default

<Figure size 1800x2000 with 19 Axes>

La comparación por clase muestra que la variable con mayor separación es int_rate: la mediana de los préstamos en default (15,05 %) se sitúa cerca del tercer cuartil de los pagados. En fico_range_high la caja de los defaults se desplaza hacia abajo y queda truncada en el mínimo de aceptación, y en dti y revol_util se desplaza moderadamente hacia arriba. En el resto de las variables las cajas se superponen casi por completo, lo que anticipa efectos individuales pequeños.

<Figure size 1800x2000 with 19 Axes>

Los violines confirman que las diferencias entre clases son de posición y no de forma. Las densidades de ambos grupos comparten la misma estructura multimodal en loan_amnt y emp_length, y solo en int_rate se aprecia un desplazamiento sustancial de toda la masa de probabilidad. Esta superposición generalizada indica que ningún predictor aislado separa adecuadamente las clases: se trata de un problema de discriminación intrínsecamente difícil, en el que un AUC cercano a 0,70 constituye un resultado razonable.

Pruebas de diferencia entre clases. Ninguna variable es normal (sección 1.2.1), así que la prueba principal es Mann-Whitney U. Se reporta también la t de Welch, que es robusta a varianzas distintas y válida asintóticamente con este nn por el teorema central del límite. Como tamaños de efecto se incluyen:

  • la correlación biserial por rangos, rrb=1−2U/(n0n1)r_{rb} = 1 - 2U/(n_0 n_1);

  • la correlación punto-biserial rpbr_{pb} con default.

Con más de un millón de observaciones casi cualquier diferencia resulta significativa (p<0,05p < 0{,}05), por lo que el orden de relevancia se establece por el tamaño del efecto y no por el valor p.

Loading...

Todas las diferencias resultan estadísticamente significativas (el mayor valor p es del orden de 10-23), lo que ilustra la trivialidad de la significancia con muestras de este tamaño. El tamaño del efecto, en cambio, ordena con claridad las variables. int_rate domina con amplitud (correlación biserial por rangos de 0,37 y punto-biserial de 0,26), seguida de fico_range (−0,19 y −0,13) y de dti (0,15 y 0,08). mort_acc, loan_amnt, inq_last_6mths, revol_util, installment y annual_inc forman un segundo grupo con efectos pequeños (∣rpb∣|r_{pb}| entre 0,04 y 0,08), y el resto tiene efectos despreciables (∣rpb∣<0,035|r_{pb}| < 0{,}035). La coincidencia de signo y orden entre la correlación biserial por rangos, que no supone normalidad, y la punto-biserial indica que las conclusiones son robustas al supuesto distribucional.

<Figure size 900x600 with 1 Axes>

El gráfico sintetiza la dirección de los efectos. Un mayor costo del crédito, mayor endeudamiento, más consultas recientes, una mayor utilización del cupo revolvente y un monto solicitado más alto se asocian con más default. Un mejor puntaje FICO, más créditos hipotecarios, un ingreso mayor y un historial crediticio más largo actúan como factores protectores. Estos signos son coherentes con la teoría del riesgo de crédito, lo que respalda la validez de los datos.

1.3.2 Variables categóricas frente a default

Para cada variable se calculan la tasa de default por categoría (tabla de contingencia normalizada), la prueba chi-cuadrado de independencia y la V de Cramér como tamaño del efecto.

Loading...

La prueba chi-cuadrado rechaza la independencia en las ocho variables, pero la V de Cramér distingue tres niveles de asociación: fuerte en grade (0,26) y moderada en term (0,18); débil en verification_status, home_ownership, purpose y addr_state (entre 0,05 y 0,09), y prácticamente nula en application_type e initial_list_status (menos de 0,02). En esta última, pese a un valor p de 3×10−173 \times 10^{-17}, la diferencia entre las tasas de default de sus dos categorías es inferior a un punto porcentual, sin relevancia práctica alguna.

<Figure size 1800x2200 with 8 Axes>

Las barras apiladas muestran el gradiente de riesgo más nítido del conjunto: la tasa de default crece de forma monótona desde cerca del 6 % en el grado A hasta el 50 % en el G, y en los préstamos a 60 meses es 1,6 veces la tasa global. Resulta contraintuitivo que los préstamos con ingresos verificados presenten más default (23,9 %) que los no verificados. La explicación más plausible es un sesgo de selección: la plataforma exige la verificación precisamente a los solicitantes de mayor riesgo o de mayor monto. En purpose destaca small_business (29,7 %), muy por encima del promedio, mientras que wedding y car quedan por debajo. En addr_state las tasas oscilan aproximadamente entre 13 % y 26 %, con Misisipi, Nebraska y Arkansas en el extremo superior.

Loading...

Restringiendo el análisis a categorías con al menos mil préstamos, las de mayor riesgo relativo son los grados G, F y E (2,5, 2,3 y 1,9 veces la tasa global), el plazo de 60 meses (1,6), el grado D (1,5) y el propósito small_business (1,5). Que los primeros lugares correspondan a grade y term confirma que la evaluación de riesgo de la propia plataforma concentra buena parte de la información predictiva disponible.

1.3.3 Relaciones entre variables independientes (multicolinealidad)

<Figure size 1400x1100 with 2 Axes>

La matriz de correlación de Pearson muestra que la mayoría de los pares de variables numéricas presenta correlaciones bajas (∣r∣<0,3|r| < 0{,}3), lo que indica que aportan información en gran medida complementaria. Las excepciones se concentran en pares con una relación estructural evidente, que se detallan en la tabla siguiente.

Loading...

Los dos primeros pares son redundancias casi perfectas de origen mecánico: fico_range_low y fico_range_high difieren en una constante de cuatro puntos (r=1,00r = 1{,}00), e installment es una función determinista de loan_amnt, int_rate y term (r=0,95r = 0{,}95). Por ello se conserva una sola variable de cada par (fico_range_high y loan_amnt). Las correlaciones entre total_acc y open_acc (0,70) y entre pub_rec y pub_rec_bankruptcies (0,65) rozan el umbral de multicolinealidad, pero cada variable aporta un matiz distinto (cuentas históricas frente a vigentes; registros públicos en general frente a quiebras). Por eso se mantienen, y la regularización L2 de los modelos lineales controla la posible inestabilidad de los coeficientes.

<Figure size 900x700 with 2 Axes>

Entre las variables categóricas, la única asociación apreciable es la de term con grade (V=0,43V = 0{,}43): los préstamos a 60 meses se concentran en los grados de menor calidad. El resto de los pares presenta valores de V inferiores a 0,2, de modo que no existe una redundancia que justifique excluir variables categóricas por este motivo.

Asociación entre variables numéricas y categóricas. El enunciado menciona redundancias del tipo fico_range_high ~ int_rate. Por eso también se revisa la asociación entre las variables numéricas y la categórica más ligada al riesgo, grade, mediante la razón de correlación η\eta, que es la proporción de la varianza de la variable numérica explicada por la categoría.

Loading...

La razón de correlación confirma la redundancia más importante del conjunto: grade explica el 91 % de la varianza de int_rate (η=0,953\eta = 0{,}953, η2=0,91\eta^2 = 0{,}91), porque la tasa de interés se asigna a partir del grado y el subgrado. También explica una fracción menor de fico_range (η=0,49\eta = 0{,}49) y de revol_util (η=0,27\eta = 0{,}27). Como int_rate contiene la información de grade con mayor resolución, se conserva int_rate y se excluye grade del modelado.

<Figure size 1400x450 with 3 Axes>

El diagrama de caja muestra la escalera de tasas por grado, con rangos que apenas se solapan entre grados adyacentes. El diagrama hexagonal evidencia la relación negativa entre FICO e int_rate (r=−0,41r = -0{,}41): los puntajes altos obtienen tasas bajas, aunque con una dispersión considerable para un mismo puntaje. Esa dispersión indica que la tasa incorpora información adicional al FICO, como el plazo, el endeudamiento o el historial, y por ello ambas variables se conservan.

1.3.4 Visualizaciones avanzadas

Pairplot o matriz de dispersión de las cinco variables numéricas más asociadas con default, coloreado por clase. Se dibuja sobre una submuestra aleatoria estratificada de 20 000 préstamos, solo para que el gráfico sea legible (el enunciado permite submuestrear en este caso). La submuestra no interviene en ningún cálculo.

<Figure size 1313x1250 with 20 Axes>

El pairplot confirma visualmente las relaciones descritas. La distribución marginal de int_rate en los préstamos en default está desplazada hacia la derecha, y la relación entre fico_range_low y fico_range_high es una recta perfecta. En los diagramas de dispersión, las dos clases se superponen extensamente, sin fronteras lineales ni no lineales evidentes en ningún par de variables. Se aprecian también la discretización de fico_range en saltos de cinco puntos y algunos valores de dti superiores a 100, casos aislados que motivan el recorte aplicado en el preprocesamiento.

<Figure size 1700x800 with 6 Axes>

Las densidades por clase, estimadas con todas las observaciones, muestran que el desplazamiento de int_rate es el más marcado: los préstamos pagados tienen una moda cercana al 7 %, correspondiente al grado A, mientras que los defaults se concentran en torno al 14 % y exhiben una cola derecha mucho más pesada. En fico_range, los defaults acumulan su masa entre 660 y 690 puntos; en dti su densidad aparece desplazada unos tres puntos hacia valores mayores, y en loan_amnt y mort_acc las diferencias son perceptibles pero pequeñas, en coherencia con las correlaciones de la sección 1.3.1.

1.4 Valores faltantes

Loading...

Solo siete de las variables analizadas tienen valores faltantes. mths_since_last_delinq (50,5 %) supera el umbral del 30 % y, como se discute más adelante, su ausencia es estructural. emp_length (5,8 %) y mort_acc (3,5 %) presentan tasas moderadas, y las cuatro variables restantes afectan a menos del 0,1 % de los préstamos, de modo que su tratamiento apenas influye en los resultados.

<Figure size 1400x600 with 1 Axes>

La matriz de nulidad, con las filas ordenadas por fecha de emisión, revela que los faltantes no se distribuyen al azar a lo largo del tiempo. mort_acc falta en un bloque compacto al comienzo del periodo, correspondiente a los primeros años de la plataforma, mientras que mths_since_last_delinq y emp_length presentan faltantes dispersos en todo el horizonte.

<Figure size 800x600 with 2 Axes>

La correlación de nulidad entre pares de variables es prácticamente nula, con valores absolutos de 0,1 como máximo: la ausencia de un dato no predice la ausencia de otro. Los faltantes obedecen, por tanto, a mecanismos independientes en cada variable y pueden tratarse de forma individual.

<Figure size 1100x400 with 1 Axes>

La evolución anual precisa esos mecanismos. mort_acc falta en el 100 % de los préstamos de 2007 a 2011 y en el 14 % de los de 2012, y pub_rec_bankruptcies en los de 2007 y buena parte de 2008: son campos que la plataforma comenzó a registrar más tarde. La proporción de nulos de emp_length crece gradualmente desde cerca de cero hasta el 8,6 %, y la de mths_since_last_delinq oscila entre el 45 % y el 67 %, según la proporción de solicitantes sin antecedentes de mora en cada cohorte.

¿Faltan los datos completamente al azar (MCAR)? Bajo MCAR, que un valor falte no depende ni de las demás variables ni del target. Se hacen dos verificaciones:

  1. Relación con el target. Se compara la tasa de default entre las filas con y sin nulo en cada variable, con una prueba chi-cuadrado.

  2. Relación con otras variables observadas. El gráfico anterior ya muestra si la proporción de nulos cambia con el año de emisión.

La prueba global de Little (1988) no está disponible en las librerías del curso; con este nn las dos verificaciones anteriores bastan para descartar MCAR cuando hay dependencia.

Loading...

Los resultados descartan que los faltantes sean completamente aleatorios en las tres variables con más nulos. En emp_length la ausencia es informativa: la tasa de default sube de 19,5 % a 26,9 % cuando el dato falta, posiblemente porque corresponde a solicitantes sin empleo formal o con ingresos irregulares. En mort_acc la ausencia está determinada casi por completo por el año de emisión (V=0,93V = 0{,}93), un mecanismo de tipo MAR, y su menor tasa de default (14,6 %) refleja el perfil de las cohortes tempranas. En mths_since_last_delinq el faltante es estructural, pues indica que el prestatario nunca estuvo en mora, y por ello se asocia a una tasa de default algo menor (19,3 % frente a 20,7 %). Las variables con menos del 0,1 % de nulos no muestran asociación significativa con el objetivo (p>0,05p > 0{,}05), lo que es compatible con un mecanismo MCAR.

Plan de tratamiento de faltantes

Se usan los umbrales del enunciado: más de 70 % de nulos → eliminar; más de 30 % → eliminar o tratamiento avanzado. Por debajo se imputa con la mediana (numéricas, por su asimetría) o con la moda (categóricas). Si el nulo es informativo (no MCAR) se añade un indicador binario <var>_missing. Los imputadores se ajustan solo con el conjunto de entrenamiento.

Loading...

El plan resultante combina eliminación e imputación según el mecanismo identificado en cada caso. mths_since_last_delinq se elimina, pero su información principal se conserva mediante el indicador has_delinq_history. emp_length y mort_acc se imputan con la mediana y se acompañan de indicadores de nulidad, dado que su ausencia es informativa; el resto se imputa con la mediana, robusta frente a la asimetría descrita. Todas las medianas se estiman exclusivamente con el conjunto de entrenamiento (capítulo 2), para evitar cualquier fuga de información desde el conjunto de prueba.

1.5 Guardado del dataset de análisis

Se guarda en Parquet el dataset filtrado (id, fecha, target y variables analizadas), que el capítulo de preprocesamiento reutiliza en scikit-learn. PySpark volverá a leer el CSV original, como exige el enunciado.

C:\Users\User\Desktop\GEOLOGÍA\MAESTRÍA\Semestre 2\MachineLearning\jbook_ml202330\data\lc_eda.parquet 37.6 MB

1.6 Resumen ejecutivo del EDA

El análisis se realizó sobre la totalidad del archivo accepted_2007_to_2018Q4.csv (2.260.701 registros y 151 columnas), del que se retuvieron los 1.345.310 préstamos con desenlace conocido: 80,04 % pagados por completo y 19,96 % en default. Ambos entornos de trabajo leen exactamente las mismas filas, siempre que Spark interprete las comillas según la norma RFC 4180 (escape='"'). De las 151 columnas se descartaron 38 por constituir fuga de información (pagos, recuperaciones, último FICO o acuerdos de liquidación, todos posteriores a la originación), 7 identificadores o campos de texto libre y 34 variables con más del 30 % de nulos. El análisis se concentró en 29 variables disponibles al originar el préstamo, más dos derivadas: la antigüedad del historial crediticio y la antigüedad laboral en años.

En cuanto a la calidad de los datos, los principales problemas son las colas extremas de annual_inc, dti, revol_bal y revol_util, que incluyen valores implausibles (ingresos nulos o de 11 millones, dti de 999, utilización de 892 %), y tres patrones de valores faltantes con mecanismos distintos. En mths_since_last_delinq la ausencia es estructural, porque el nulo indica ausencia de mora previa. En emp_length es informativa, pues el default sube a 26,9 % cuando falta. En mort_acc depende del periodo, ya que el campo no se registró antes de 2012. Ninguna variable es normal, y trece presentan asimetría severa.

La capacidad predictiva se concentra en pocas variables. La tasa de interés es, con amplitud, el predictor más asociado al default (rpb=0,26r_{pb} = 0{,}26; correlación biserial por rangos de 0,37), seguida del grado (V = 0,26), el plazo (V = 0,18; 32,4 % de default a 60 meses) y el puntaje FICO (rpb=−0,13r_{pb} = -0{,}13). La razón deuda/ingreso, el número de hipotecas, el monto, las consultas recientes y la utilización revolvente aportan efectos pequeños pero consistentes, y variables como el estado de residencia, el tipo de solicitud o el estado de listado inicial tienen una asociación prácticamente nula. La superposición de las distribuciones de ambas clases en todas las variables anticipa un problema de discriminación difícil, con un techo de desempeño modesto.

Se identificaron además redundancias fuertes (fico_range_low y fico_range_high, r=1,00r = 1{,}00; installment y loan_amnt, r=0,95r = 0{,}95; grade e int_rate, η=0,95\eta = 0{,}95), un desbalance moderado de clases y un efecto temporal marcado, con cohortes recientes censuradas que sesgan a la baja su tasa de default observada.

Estas observaciones fijan las decisiones del preprocesamiento. Se modelan dieciséis variables numéricas (loan_amnt, int_rate, annual_inc, dti, fico_range_high, emp_length, credit_hist_years, delinq_2yrs, inq_last_6mths, open_acc, pub_rec, revol_bal, revol_util, total_acc, mort_acc y pub_rec_bankruptcies), tres indicadores (has_delinq_history, emp_length_missing y mort_acc_missing) y siete categóricas (term, home_ownership, verification_status, purpose, addr_state, initial_list_status y application_type). Se excluyen fico_range_low, installment y grade por redundancia, y mths_since_last_delinq e issue_d por las razones expuestas. Las categorías minoritarias de home_ownership y purpose se agrupan; dti y revol_util se recortan a los percentiles 0,1 y 99,9; annual_inc y revol_bal se transforman con log1p; los faltantes se imputan con la mediana, y las variables numéricas se estandarizan. Todos los parámetros se estiman únicamente con el conjunto de entrenamiento. El desbalance se aborda con partición y validación cruzada estratificadas, selección por ROC AUC, reporte de AUC-PR y un umbral de decisión fijado con datos de entrenamiento, sin remuestreo, para preservar la comparabilidad entre scikit-learn y PySpark.