De los datos brutos a las clases de riesgo

¿El modelo falla no porque el algoritmo sea débil, sino porque las variables no se prepararon de una manera que el modelo pueda entender adecuadamente?

En la modelización del riesgo crediticio, a menudo nos centramos en la elección del modelo, las métricas de rendimiento, la selección de características o la validación. Pero antes de estimar cualquier coeficiente, otra pregunta merece atención: ¿cómo debe entrar cada variable en el modelo?

Una variable bruta no siempre es la mejor representación del riesgo.

Una variable continua puede tener una relación no lineal con el incumplimiento. Una variable categórica puede contener demasiadas modalidades. Algunas variables pueden incluir valores atípicos, valores perdidos, distribuciones inestables o categorías con muy pocas observaciones. Si se ignoran estos problemas, el modelo puede volverse inestable, difícil de interpretar y menos confiable en producción.

Aquí es donde la categorización se vuelve importante.

La categorización, también llamada clasificación aproximada, agrupación, clasificación o binning, consiste en transformar valores de variables sin procesar en un número menor de grupos significativos. En la calificación crediticia, estos grupos no se crean sólo por conveniencia. Se crean para hacer que la relación entre la variable y el riesgo de incumplimiento sea más clara, más estable y más fácil de usar en un modelo.

Este paso es particularmente útil cuando el modelo final es una regresión logística, que sigue siendo ampliamente utilizada en la calificación crediticia porque es transparente, interpretable y fácil de traducir a un cuadro de mando.

Para las variables categóricas, la categorización ayuda a reducir el número de modalidades. Para las variables continuas, ayuda a capturar patrones de riesgo no lineales, reducir el impacto de los valores atípicos, manejar los valores faltantes, mejorar la interpretabilidad y preparar las variables para la transformación del peso de la evidencia.

En este artículo, estudiaremos por qué la categorización es un paso esencial en la calificación crediticia y cómo se puede utilizar para transformar variables brutas en clases de riesgo estables.

En la Sección 1, explicamos por qué la categorización es útil tanto para variables categóricas como continuas, especialmente en el contexto de la regresión logística.

En la Sección 2, mostramos cómo analizar la relación entre las variables continuas y el riesgo de incumplimiento mediante un análisis gráfico de monotonicidad.

En la Sección 3, presentamos los principales métodos de categorización, incluida la agrupación en intervalos iguales, la agrupación en intervalos iguales, la agrupación basada en Chi-cuadrado y la agrupación basada en el peso de la evidencia.

Finalmente, en la Sección 4, nos centramos en la discretización de variables continuas utilizando el Peso de la Evidencia y mostramos cómo este enfoque ayuda a preparar variables para un modelo de calificación crediticia interpretable.

1. Por qué la categorización es importante en la calificación crediticia

Al construir un modelo de calificación crediticia, las variables pueden ser categóricas o continuas.

La categorización puede resultar útil para ambos tipos de variables, pero la motivación no es la misma.

Para las variables categóricas, el objetivo principal suele ser reducir el número de modalidades y categorías grupales con comportamientos de riesgo similares.

Para las variables continuas, el objetivo suele ser transformar una escala numérica bruta en un número menor de clases de riesgo ordenadas.

En ambos casos, el objetivo es el mismo: crear variables que sean estadísticamente significativas, económicamente interpretables y estables en el tiempo.

1.1 La categorización reduce la dimensionalidad

Comencemos con variables categóricas.

Supongamos que tenemos una variable llamada sector_industria y esta variable tiene 50 valores diferentes.

Si usamos esta variable directamente en un modelo de regresión logística, necesitamos crear variables ficticias.

Debido a la colinealidad, se debe utilizar una categoría como categoría de referencia. Por lo tanto, para 50 categorías, necesitamos:

50−1=49 variables ficticias.

Eso significa que el modelo debe estimar 49 parámetros para una sola variable.

Esto puede convertirse rápidamente en un problema.

Una variable categórica con demasiadas modalidades puede dar lugar a coeficientes inestables, sobreajuste, poca solidez, dificultad de interpretación y mayor complejidad durante el seguimiento.

Al agrupar categorías similares, reducimos la cantidad de parámetros que deben estimarse.

Por ejemplo, en lugar de mantener 50 sectores industriales, podemos agruparlos en 5 o 6 clases de riesgo. Estos grupos pueden basarse en tasas de incumplimiento observadas, experiencia empresarial, limitaciones del tamaño de la muestra o una combinación de estos criterios.

El resultado es un modelo más compacto, más estable y más fácil de interpretar.

Entonces, uno de los primeros beneficios de la categorización es la reducción de dimensiones.

1. 2. La categorización ayuda a capturar patrones de riesgo no lineales

Para variables continuas, la categorización también puede resultar muy útil.

Pero antes de decidir si categorizar una variable continua, primero debemos entender su relación con el riesgo de incumplimiento.

Una forma muy sencilla de hacerlo es trazar la tasa de incumplimiento frente a la variable.

Por ejemplo, si tenemos una variable continua como la variable de ingreso de la persona, podemos dividirla en varios intervalos y calcular la tasa de incumplimiento en cada intervalo.

Luego, trazamos:

los valores agrupados de la variable en el eje x, la tasa predeterminada en el eje y.

Esto nos permite inspeccionar visualmente el patrón de riesgo.

Si la relación es monótona, entonces la variable ya tiene una dirección de riesgo clara.

Por ejemplo:

A medida que aumentan los ingresos, la tasa de morosidad disminuye. A medida que aumenta la tasa de interés del préstamo, aumenta la tasa de incumplimiento.

En este caso, la relación es fácil de entender.

Sin embargo, si la relación no es monótona, la situación se vuelve más compleja.

Supongamos que el riesgo de incumplimiento disminuye para niveles de ingresos bajos a medios, pero luego aumenta nuevamente para niveles de ingresos muy altos. Es posible que un modelo de regresión logística simple no capture adecuadamente este patrón porque estima un efecto lineal entre la variable y las probabilidades logarítmicas de incumplimiento.

El modelo de regresión logística tiene la siguiente forma:

log⁡(P(Y=1|X)1−P(Y=1|X))=β0+β1Xlog left( frac{P(Y = 1 mid X)}{1 – P(Y = 1 mid X)} right) = beta_0 + beta_1 X

donde Y=1 representa el incumplimiento y X es una variable explicativa.

Esta ecuación significa que el modelo supone una relación lineal entre X y las probabilidades logarítmicas de incumplimiento.
Si el efecto de X no es lineal, el modelo puede pasar por alto una parte importante de la estructura de riesgo.

Los modelos no lineales, como las redes neuronales, los árboles de decisión, el aumento de gradiente o las máquinas de vectores de soporte, pueden capturar relaciones complejas de forma natural.

Pero en la calificación crediticia, la regresión logística todavía se utiliza ampliamente porque es simple, transparente y fácil de explicar.

Al categorizar las variables continuas en grupos de riesgo, podemos introducir parte de la no linealidad en un modelo lineal.

Ésta es una de las razones más importantes por las que el agrupamiento es tan común en el modelado de cuadros de mando.

1.3. La categorización reduce el impacto de los valores atípicos

Otro beneficio importante de la categorización es la gestión de valores atípicos.

Las variables continuas suelen contener valores extremos.

Por ejemplo:

Ingresos muy altos, montos de préstamos extremadamente grandes, duración inusual del empleo, índices anormales de utilización del crédito.

Si estos valores se utilizan directamente en una regresión logística, pueden tener una fuerte influencia en los coeficientes estimados.

Cuando categorizamos la variable, los valores atípicos se asignan a un contenedor específico.

Por ejemplo, todos los valores de ingresos superiores a un determinado umbral se pueden agrupar en la misma categoría.

Esto reduce la influencia de observaciones extremas y hace que el modelo sea más robusto.

En lugar de permitir que un valor extremo afecte fuertemente al modelo, solo utilizamos la información de riesgo contenida en su grupo.

1.4. La categorización ayuda a lidiar con los valores faltantes

Los valores faltantes son muy comunes en los conjuntos de datos de calificación crediticia.

Un cliente no puede proporcionar información sobre sus ingresos.

Es posible que falte una duración del empleo.

Es posible que una variable del historial crediticio no esté disponible.

Una forma de manejar los valores faltantes es crear una categoría dedicada para ellos.

Esto permite que el modelo aprenda el comportamiento específico de los individuos a los que les faltan valores.

Esto es muy importante porque la desaparición no siempre es aleatoria.

En la calificación crediticia, un valor faltante puede contener información de riesgo.

Por ejemplo, los clientes que no declaran sus ingresos pueden tener un comportamiento predeterminado diferente al de los clientes que sí lo hacen.

Al crear una categoría faltante, permitimos que el modelo capture este comportamiento.

1.5 La categorización mejora la interpretabilidad

La interpretabilidad es uno de los requisitos más importantes en la calificación crediticia.

Un modelo de calificación crediticia no es sólo un motor de predicción de caja negra.

A menudo lo utilizan:

analistas de riesgo, oficiales de crédito, equipos de validación de modelos, reguladores, tomadores de decisiones comerciales.

Cuando se categorizan las variables, el modelo se vuelve mucho más fácil de explicar.

Por ejemplo, en lugar de decir:

Un aumento de una unidad en la tasa de interés del préstamo aumenta las probabilidades logarítmicas de incumplimiento en una cierta cantidad.

Podemos decir:

Los clientes con una tasa de interés superior al 15% tienen un riesgo de incumplimiento significativamente mayor que los clientes con una tasa de interés inferior al 10%.

Esta interpretación es más intuitiva.

También es más fácil traducirlo en puntos del cuadro de mando.

1.6. La categorización mejora la estabilidad del modelo

Un buen modelo de calificación crediticia no sólo debería funcionar bien durante el desarrollo.

También debería permanecer estable en producción.

La categorización ayuda a que las variables sean menos sensibles a pequeños cambios en los datos.

Por ejemplo, si los ingresos de un cliente cambian ligeramente de 2990 a 3010, el valor numérico bruto cambia.

Pero si ambos valores pertenecen a la misma banda de ingresos, el valor categorizado sigue siendo el mismo.

Esto hace que el modelo sea más estable en el tiempo.

La categorización también es muy útil para el seguimiento.

Una vez que las variables se agrupan en clases, podemos rastrear fácilmente su distribución en la producción y compararla con la muestra de desarrollo utilizando indicadores como el Índice de Estabilidad de la Población.

Para resumir esta primera parte, categorizamos variables principalmente para reducir la dimensionalidad, capturar patrones de riesgo no lineales, manejar valores faltantes y valores atípicos, mejorar la interpretabilidad y la estabilidad.

2. Análisis gráfico de monotonicidad antes del binning

Antes de categorizar una variable continua, debemos comprender su relación con la tasa de incumplimiento.

Este paso es importante porque la categorización no debe ser arbitraria.

El objetivo no es sólo crear contenedores. El objetivo es crear contenedores que tengan sentido desde una perspectiva de riesgo.

Un buen binning debería responder a las siguientes preguntas:

¿Tiene la variable una relación clara con el riesgo de incumplimiento? ¿La relación está aumentando o disminuyendo? ¿La relación es monótona o no monótona?

Para responder a estas preguntas, comenzamos con un análisis de monotonicidad gráfico.

Una variable es monótona con respecto al riesgo de incumplimiento si la tasa de incumplimiento se mueve en una dirección cuando la variable aumenta.

Por ejemplo, si el ingreso aumenta y el riesgo de incumplimiento disminuye, la relación es monótona y decreciente.

Si la tasa de interés aumenta y el riesgo de incumplimiento aumenta, la relación es creciente y monótona.

La monotonicidad es importante en la calificación crediticia porque hace que el modelo sea más fácil de interpretar.

Una variable monótona tiene un claro significado de riesgo.

Por ejemplo:

Mayores ingresos significan menores riesgos. Una mayor carga crediticia significa un mayor riesgo. Una tasa de interés más alta significa mayor riesgo. Una mayor duración del empleo significa menor riesgo.

Estas relaciones son fáciles de explicar y suelen ser coherentes con la intuición empresarial.

Sin embargo, si la relación no es monótona, la variable puede requerir un tratamiento más cuidadoso.

Un patrón no monótono puede indicar:

un efecto de riesgo no lineal real, datos ruidosos, intervalos dispersos, valores atípicos, interacciones con otras variables, inestabilidad entre conjuntos de datos.

Es por eso que siempre debemos inspeccionar la curva de la tasa de incumplimiento antes de decidir cómo agrupar una variable.

2.1 Agrupación en intervalos iguales para diagnóstico visual

Un primer enfoque sencillo consiste en dividir la variable en intervalos de igual anchura. Esto se llama agrupación en intervalos iguales.
Supongamos que una variable toma los siguientes valores:

1000, 1200, 1300, 1400, 1800, 2000

El valor mínimo es 1000 y el valor máximo es 2000.
Si queremos crear dos contenedores del mismo ancho, el ancho es:

2000–10002=500frac{2000–1000}{2} = 500

Entonces obtenemos:

Bin 1: 1000 a 1500 Bin 2: 1500 a 2000

Luego, para cada contenedor, calculamos la tasa predeterminada:

Esto nos da una tabla como esta:

Luego trazamos la tasa de incumplimiento por contenedor.

Esta trama da una primera intuición sobre la forma de la relación.

La agrupación en intervalos iguales es sencilla y fácil de entender. Sin embargo, puede crear grupos con números muy diferentes de observaciones, especialmente cuando la variable está muy sesgada.

Por esta razón, a menudo se prefiere la combinación de frecuencias iguales para el análisis exploratorio de monotonicidad.

2.2 Agrupación de igual frecuencia para curvas de riesgo

La agrupación en intervalos de igual frecuencia divide la variable en intervalos que contienen aproximadamente el mismo número de observaciones.

Por ejemplo, la agrupación de deciles divide la muestra en 10 grupos, cada uno de los cuales contiene alrededor del 10% de las observaciones.

Este enfoque es útil porque cada contenedor tiene datos suficientes para calcular una tasa de incumplimiento más confiable.

En Python, esto se puede hacer con pd.qcut.

Sin embargo, es importante notar la diferencia:

pd.cut realiza agrupaciones de igual ancho; pd.qcut realiza agrupaciones de igual frecuencia.

Esta distinción es importante porque la interpretación de los contenedores no es la misma.

En nuestro caso, utilizamos binning de igual frecuencia para estudiar el patrón de riesgo de variables continuas.

2.3 Conjunto de datos y variables seleccionadas

En artículos anteriores, realizamos varios pasos importantes en el mismo conjunto de datos.

Ya cubrimos:

análisis de datos exploratorios, preselección de variables, análisis de estabilidad, análisis de monotonicidad a lo largo del tiempo, comparación entre conjuntos de datos de tren, prueba y fuera de tiempo.

Después de estos pasos, seleccionamos las variables más relevantes para el modelado.

En este artículo, nos centramos en la categorización de variables continuas. Las variables cualitativas ya tenían un número limitado de modalidades y, según el análisis previo, su estabilidad y monotonicidad eran aceptables.

Por tanto, nuestro objetivo aquí es estudiar gráficamente las variables continuas, entender su relación con el riesgo de impago y definir una estrategia de discretización adecuada.

Las variables continuas seleccionadas son:

persona_ingreso persona_emp_longitud préstamo_int_tasa préstamo_porcentaje_ingreso

2.4 Código Python para curvas de tasas predeterminadas

No existe una función nativa de Python en pandas o scikit-learn que realice un diagnóstico completo de monotonicidad de calificación crediticia exactamente como se requiere para el modelado de cuadros de mando.

Por lo tanto, necesitamos codificar el procedimiento nosotros mismos o utilizar una biblioteca de cuadros de mando especializada.

Aquí lo codificamos manualmente con pandas y matplotlib.

importar pandas como pd importar matplotlib.pyplot como plt def plot_default_rate_ax(data, variable, target, bins=10, ax=None): """ Trazar la tasa predeterminada por variable numérica agrupada en un eje matplotlib determinado. """ df = data[[variable, target]].copy() # Crear bins df[f"{variable}_bin"] = pd.qcut( df[variable], q=bins, duplicados="drop" ) # Calcular la tasa predeterminada por resumen de bin = ( df.groupby(f"{variable}_bin", observe=True)[target] .mean() .reset_index() ) # Convertir intervalos en cadenas para trazar resumen[f"{variable}_bin"] = resumen[f"{variable}_bin"].astype(str) # Trazar ax.plot( resumen[f"{variable}_bin"], resumen[objetivo], marcador="o" ) ax.set_title(f"Tasa predeterminada por {variable}") ax.set_xlabel(variable) ax.set_ylabel("Tasa predeterminada") ax.tick_params(axis="x", rotación=45) return ax variables = [ "person_ Income", "person_emp_length", "loan_int_rate", "préstamo_porcentaje_ingresos" ] fig, ejes = plt.subplots(2, 2, figsize=(16, 10)) ejes = ejes.flatten() para ax, variable en zip(ejes, variables): plot_default_rate_ax( train_imputed, variable=variable, target="def", bins=10, ax=ax ) plt.tight_layout() plt.show()

Después de trazar las curvas de tasa de incumplimiento, podemos analizar la dirección del riesgo de cada variable.

En el caso de ingresos_persona, generalmente esperamos que la tasa de incumplimiento disminuya cuando aumentan los ingresos.

Esto tiene sentido porque los clientes con mayores ingresos suelen tener más capacidad de pago.

Para person_emp_length, también esperamos que la tasa predeterminada disminuya cuando aumenta la duración del empleo.

Una historia laboral más larga puede indicar una mayor estabilidad profesional.

Para lend_int_rate, esperamos que la tasa de incumplimiento aumente cuando aumenta la tasa de interés.

Esto es coherente porque las tasas de interés más altas suelen estar asociadas con prestatarios más riesgosos.

Para préstamo_porcentaje_ingresos, esperamos que la tasa de incumplimiento aumente cuando el monto del préstamo aumente en relación con los ingresos.

Esta variable mide la carga del préstamo en comparación con los ingresos del prestatario. Un valor más alto suele significar más presión de pago.

Si las curvas observadas confirman estas expectativas, entonces las variables son coherentes desde una perspectiva empresarial.

En nuestro caso, el análisis gráfico muestra que las variables seleccionadas tienen patrones monótonos significativos.

La tasa predeterminada disminuye cuando aumentan los ingresos de persona y la longitud de emp_persona. Por otro lado, la tasa de incumplimiento aumenta cuando aumentan la tasa_int_préstamo y el porcentaje_ingreso_préstamo.

Esto es exactamente lo que esperamos en la modelización del riesgo crediticio.

3. Principales métodos de categorización

Una vez que comprendamos la relación entre cada variable continua y la tasa de incumplimiento, podemos definir una estrategia de categorización.

Hay muchas formas de categorizar una variable.

Algunos métodos son simples y no supervisados. No utilizan la variable objetivo:

agrupamiento de intervalos iguales, agrupamiento de frecuencias iguales,

Otros están supervisados. Utilizan la variable predeterminada para crear grupos basados ​​en riesgos:

Agrupación basada en chi-cuadrado, agrupación basada en el peso de la evidencia.

En la calificación crediticia, a menudo se prefieren los métodos supervisados ​​porque el objetivo no es sólo dividir la variable en intervalos. El objetivo es crear intervalos que sean significativos en términos de riesgo de incumplimiento.

En esta sección, presentamos con más detalle los dos métodos supervisados.

3.1 Agrupación basada en chi-cuadrado

Es un método de agrupamiento supervisado. La idea es sencilla. Comenzamos con muchos contenedores iniciales. Luego comparamos contenedores adyacentes. Si dos contenedores adyacentes tienen un comportamiento predeterminado similar, los fusionamos.

Para dos contenedores adyacentes i y j, construimos una tabla de contingencia:

Luego aplicamos una prueba de Chi-cuadrado.

El estadístico Chi-cuadrado es:

χ2=∑(O−E)2Echi^2 = sum frac{(O – E)^2}{E}

dónde:

O es la frecuencia observada, E es la frecuencia esperada en condiciones de independencia.

La hipótesis nula es:

H0: Los dos contenedores tienen la misma distribución predeterminada.

La hipótesis alternativa es:

H1: Los dos contenedores tienen distribuciones predeterminadas diferentes.

Si los dos contenedores tienen un comportamiento predeterminado similar, podemos fusionarlos.

El procedimiento se repite hasta obtener menos clases estables.

La ventaja de este método es que utiliza directamente la variable predeterminada.

Por tanto, los grupos finales están más alineados con el riesgo.

Sin embargo, el método debe utilizarse con cuidado.

Con muestras muy grandes, las pequeñas diferencias pueden llegar a ser estadísticamente significativas. Con muestras muy pequeñas, la prueba puede no ser confiable.

Esta es la razón por la que la clasificación estadística siempre debe combinarse con el criterio empresarial.

3.2 Peso de la agrupación basada en evidencia

Otro método muy común en la calificación crediticia se basa en el Peso de la Evidencia, también llamado WoE. WoE mide la distribución relativa de eventos y no eventos en cada categoría.

En este artículo definimos:

Malo = predeterminado (def = 1) = Eventos Bueno = no predeterminado (def = 0) = Sin eventos

Para una categoría i determinada, la WoE se define como:

WoE=ln⁡(%Eventos%NonEventos)WoE = ln left( frac{%Eventos}{%NonEventos} right)

Con esta convención:

WoE positivo significa mayor concentración de evento/predeterminado; WoE negativo significa mayor concentración de no eventos/buenos. WoE cercano a cero, el contenedor tiene un nivel de riesgo cercano al de la población promedio.

La agrupación basada en WoE consiste en fusionar contenedores adyacentes con valores de WoE similares. El objetivo es crear grupos estables con un orden de riesgo claro.

En la práctica, el procedimiento generalmente comienza cortando variables continuas en contenedores finos iniciales, a menudo usando intervalos de igual frecuencia. Luego, los intervalos adyacentes se fusionan progresivamente cuando sus valores de WoE son cercanos o cuando uno de ellos no aporta suficiente diferenciación de riesgo.

La idea no es sólo reducir el número de clases. La idea es crear clases que aporten información útil sobre riesgos.

Por ejemplo, si un contenedor tiene un WoE muy cercano a cero, es posible que no proporcione una fuerte discriminación. En ese caso, a veces se puede fusionar con un contenedor adyacente, siempre que la fusión siga siendo coherente desde una perspectiva empresarial y de riesgo.

Para maximizar la diferenciación de riesgos entre clases finales, también es útil comprobar que las tasas de incumplimiento están suficientemente separadas. Una regla práctica es mantener una diferencia relativa de al menos el 30% en riesgo entre clases adyacentes, asegurando al mismo tiempo que cada clase final contenga al menos el 1% de la población.

Estos umbrales no deberían aplicarse mecánicamente, pero proporcionan salvaguardias útiles:

evite crear clases que sean demasiado pequeñas; evitar mantener clases con niveles de riesgo casi idénticos; evitar sobreajustar la muestra de desarrollo; mantener la agrupación final interpretable y estable.

Este método es especialmente útil cuando el modelo final es una regresión logística, porque las variables transformadas por WoE están bien alineadas con la estructura logarítmica de probabilidades del modelo.

4. Implementación en Python de la categorización basada en WoE

Ahora pasamos a la implementación de Python.

El objetivo es construir un marco simple y transparente para analizar variables agrupadas y respaldar la decisión de categorización final.

Necesitamos tres herramientas principales.

La primera herramienta calcula el WoE para una variable dado un número predefinido de contenedores.

La segunda herramienta resume el número de observaciones y la tasa de incumplimiento para cada clase discretizada.

La tercera herramienta analiza la evolución de la tasa de morosidad por clases a lo largo del tiempo. Esto nos ayudará a evaluar tanto la monotonicidad como la estabilidad.

Esto es importante porque un agrupamiento no es bueno sólo porque funciona en la muestra de entrenamiento. También debe permanecer estable a lo largo del tiempo y en todos los conjuntos de datos de modelado, como muestras de entrenamiento, de prueba y fuera de tiempo.

En otras palabras, una buena categorización debe cumplir tres condiciones:

Debe ser estadísticamente significativo; Debe ser coherente desde la perspectiva del riesgo crediticio. Debe ser estable en el tiempo. def iv_woe(data, target, bins=5, show_woe=False, epsilon=1e-16): """ Calcule el valor de la información (IV) y el peso de la evidencia (WoE) para todas las variables explicativas en un conjunto de datos. Las variables numéricas con más de 10 valores únicos se discretizan primero en contenedores basados en cuantiles. Las variables categóricas y las variables numéricas con pocos valores únicos se utilizan tal como están. Parámetros ———- data: pandas DataFrame Conjunto de datos de entrada que contiene las variables explicativas y el objetivo: str Nombre de la variable de destino binaria. El objetivo debe codificarse como 1 para evento/predeterminado y 0 para contenedores sin evento/no predeterminados: int, default=5 Número de contenedores de cuantiles utilizados para discretizar variables continuas: bool, default=False Si es Verdadero, muestra la tabla WoE detallada para cada variable. float, default=1e-16 Valor pequeño usado para evitar la división por cero y log(0). Devuelve ——- newDF: tabla de resumen del DataFrame de pandas que contiene el valor de información de cada variable. woeDF: tabla WoE detallada del DataFrame de pandas para todas las variables y todos los grupos """ # Inicializar los DataFrames de salida newDF = pd.DataFrame() woeDF = pd.DataFrame() # Obtener todos los nombres de columnas cols = data.columns # Ejecute el cálculo WoE y IV en todas las variables explicativas para ivars en cols[~cols.isin([target])]: # Si la variable es numérica y tiene muchos valores únicos, # discretícela en contenedores basados en cuantiles if (data[ivars].dtype.kind in "bifc") y (len(np.unique(data[ivars].dropna())) > 10): binned_x = pd.qcut( data[ivars], bins, duplicados="drop" ) d0 = pd.DataFrame({ "x": binned_x, "y": data[target] }) # De lo contrario, use la variable como está: d0 = pd.DataFrame({ "x": data[ivars], "y": data[target] }) # Calcula el número de observaciones y eventos en cada grupo d = ( d0.groupby("x", as_index=False, observe=True) .agg({"y": ["count", "sum"]}) ) # Cambiar el nombre de las columnas d.columns = ["Cutoff", "N", "Events"] # Calcular el porcentaje de eventos en cada grupo d["% of Events"] = ( np.maximum(d["Events"], epsilon) / (d["Events"].sum() + epsilon) ) # Calcular el número de no eventos en cada grupo d["Non-Events"] = d["N"] – d["Events"] # Calcular el porcentaje de no eventos en cada grupo d["% of Non-Events"] = ( np.maximum(d["Non-Events"], epsilon) / (d["Non-Events"].sum() + epsilon) ) # Calcular el peso de la evidencia # Aquí, WoE se define como log(%Events / %Non-Events) # Con esta convención, WoE positivo indica mayor riesgo de incumplimiento/evento d["WoE"] = np.log( d["% of Events"] / d["% of Non-Events"] ) # Calcula la contribución IV de cada grupo d["IV"] = d["WoE"] * ( d["% de eventos"] – d["% de no eventos"] ) # Agregar el nombre de la variable a la tabla detallada d.insert( loc=0, column="Variable", value=ivars ) # Imprimir el valor de información global de la variable print("=" * 30 + "n") print( "Valor de información de la variable " + ivars + " es " + str(round(d["IV"].sum(), 6)) ) # Almacena el IV global de la variable temp = pd.DataFrame( { "Variable": [ivars], "IV": [d["IV"].sum()] }, columns=["Variable", "IV"] ) newDF = pd.concat([newDF, temp], axis=0) woeDF = pd.concat([woeDF, d], axis=0) # Muestra la tabla detallada de WoE si se solicita if show_woe: print(d) return newDF, woeDF def tx_rsq_par_var(df, categ_vars, date, target, cols=2, sharey=False): """ Genera una cuadrícula de gráficos de líneas que muestran la tasa de eventos promedio por categoría a lo largo del tiempo para obtener una lista de variables categóricas. Parámetros ———- df: pandas DataFrame Conjunto de datos de entrada. categ_vars: lista de str Lista de variables categóricas para analizar. fecha: str Nombre de la columna de fecha o período de tiempo: str Nombre de la variable de destino binaria. traza directamente. """ # Trabaje en una copia para evitar modificar el DataFrame original df = df.copy() # Compruebe si todas las columnas requeridas están presentes en el DataFrame. valores faltantes en la columna de fecha o variables categóricas df = df.dropna(subset=[date] + categ_vars) # Determinar el número de variables y el número requerido de filas de subtrama num_vars = len(categ_vars) filas = math.ceil(num_vars / cols) # Crear la cuadrícula de subtrama fig, axes = plt.subplots( rows, cols, figsize=(cols * 6, rows * 4), sharex=False, sharey=sharey ) # Aplana la matriz de ejes para facilitar la iteración axes = axes.flatten() # Recorre cada variable categórica y crea un gráfico por variable para i, categ_var en enumerate(categ_vars): # Calcula el valor objetivo promedio por fecha y categoría df_times_series = ( df.groupby([date, categ_var])[target] .mean() .reset_index() ) # Remodelar los datos para que cada categoría se convierta en una línea en el gráfico df_pivot = df_times_series.pivot( index=date, columns=categ_var, value=target ) # Seleccionar el eje correspondiente a la variable actual ax = axes[i] # Trazar una línea por categoría para la categoría en df_pivot.columns: ax.plot( df_pivot.index, df_pivotData Science, label=str(category).strip() ) # Establecer título del gráfico y etiquetas de ejes ax.set_title(f"{categ_var.strip()}") ax.set_xlabel("Fecha") ax.set_ylabel("Tasa predeterminada (%)") # Ajustar la leyenda dependiendo del número de categorías si len(df_pivot.columns) > 10: ax.legend( title="Categories", fontsize="x-small", loc="upper left", ncol=2 ) else: ax.legend( title="Categories", fontsize="small", loc="upper left" ) # Elimina los ejes de subtrama no utilizados cuando la cuadrícula es mayor que el número de variables para j en el rango (i + 1, len(axes)): fig.delaxes(axes[j]) # Agrega un título global a la figura fig.suptitle( "Tasa predeterminada por variable categórica", fontsize=10, x=0.5, y=1.02, ha="center" ) # Ajustar el diseño para evitar elementos superpuestos plt.tight_layout() # Mostrar la figura final plt.show() def combinado_barplot_lineplot(df, cat_vars, cible, cols=2): """ Generar una cuadrícula de gráficos de barras y gráficos de líneas combinados para una lista de variables categóricas. Para cada variable categórica: – el gráfico de barras muestra la frecuencia relativa de cada categoría; – el gráfico de líneas muestra la tasa objetivo promedio para cada categoría. Parámetros ———- df: pandas DataFrame Conjunto de datos de entrada. subplot grid. Devuelve ——- Ninguno La función muestra los gráficos directamente. """ # Cuente el número de variables categóricas para trazar num_vars = len(cat_vars) # Calcule el número de filas necesarias para la cuadrícula de subtrama rows = math.ceil(num_vars / cols) # Cree la cuadrícula de subtrama fig, axes = plt.subplots( rows, cols, figsize=(cols * 6, rows * 4) ) # Aplana la matriz de ejes para facilitar la iteración axes = axes.flatten() # Recorre cada variable categórica para i, cat_col en enumerate(cat_vars): # Selecciona el eje de subtrama actual para el gráfico de barras ax1 = axes[i] # Convierte variables categóricas de tipo d en cadena si es necesario # Esto evita problemas de trazado con intervalos categóricos o categorías ordenadas si pd.api.types.is_categorical_dtype(df[cat_col]): df[cat_col] = df[cat_col].astype(str) # Calcular la tasa objetivo promedio por categoría tx_rsq = ( df.groupby([cat_col])[cible] .mean() .reset_index() ) # Calcular la frecuencia relativa de cada categoría effectifs = ( df[cat_col] .value_counts(normalize=True) .reset_index() ) # Cambiar el nombre de las columnas para mayor claridad effectifs.columns = [cat_col, "count"] # Fusionar frecuencias de categorías con tasas objetivo merged_data = ( effectifs .merge(tx_rsq, on=cat_col) .sort_values(by=cible, ascending=True) ) # Crear un eje y secundario para el gráfico de líneas ax2 = ax1.twinx() # Trazar frecuencias de categorías como barras sns.barplot( data=merged_data, x=cat_col, y="count", color="grey", ax=ax1 ) # Trazar la tasa objetivo promedio como una línea sns.lineplot( data=merged_data, x=cat_col, y=cible, color="red", marcador="o", ax=ax2 ) # Establecer el título de la subtrama y las etiquetas de los ejes ax1.set_title(f"{cat_col}") ax1.set_xlabel("") ax1.set_ylabel("Frecuencia de categoría") ax2.set_ylabel("Tasa de riesgo (%)") # Rotar etiquetas del eje x para una mejor legibilidad ax1.tick_params(axis="x", rotación=45) # Eliminar subtrama ax no utilizada

El primer paso consiste en realizar una discretización inicial mediante WoE. Decidimos dividir la variable en tres clases y calcular el WoE de cada clase.

Los resultados muestran que WoE es monótono.

Los prestatarios con ingresos más bajos, especialmente aquellos con ingresos inferiores a aproximadamente 45.000, tienen una WoE positiva. Según nuestra convención, esto significa que tienen una mayor concentración de incumplimientos.

Los prestatarios con mayores ingresos, especialmente aquellos con ingresos superiores a aproximadamente 71.000, tienen el valor WoE más bajo. Esto indica una menor concentración de impagos.

Este resultado es coherente con la intuición sobre el riesgo crediticio: mayores ingresos generalmente se asocian con una mayor capacidad de pago y, por lo tanto, un menor riesgo de incumplimiento.

Luego podemos aplicar esta segmentación para crear una variable discretizada llamada persona_ingresos_dis.

Un binning es útil sólo si permanece estable.

Una variable puede mostrar un buen patrón de riesgo en la muestra de entrenamiento pero volverse inestable con el tiempo.

Por eso también analizamos la evolución de la tasa de morosidad por categorías a lo largo del tiempo:

También es útil visualizar, para cada categoría:

la proporción de población; la tasa de incumplimiento.

Esto se puede hacer usando un gráfico de barras y un gráfico de líneas combinados.

Este cuadro es útil porque proporciona dos datos al mismo tiempo.

El diagrama de barras nos dice si la categoría contiene suficientes observaciones.

El gráfico de líneas nos dice si la categoría tiene una tasa de incumplimiento coherente.

Un buen agrupamiento final debería tener un tamaño de población suficiente y un patrón de riesgo significativo.

Luego se deben aplicar los mismos puntos de corte a los conjuntos de datos de prueba y fuera de tiempo.

Este punto es importante.

La agrupación debe definirse en la muestra de entrenamiento y luego aplicarse sin cambios a las muestras de validación. De lo contrario, introducimos una fuga de datos y hacemos que la validación sea menos confiable.

Conclusión

En este artículo, estudiamos por qué la categorización es un paso clave en el desarrollo del modelo de calificación crediticia.

La categorización se aplica tanto a variables categóricas como continuas.

Para las variables categóricas, ayuda a reducir el número de modalidades y hace que el modelo sea más fácil de estimar e interpretar.

Para las variables continuas, ayuda a capturar patrones de riesgo no lineales, reducir el impacto de los valores atípicos, manejar los valores faltantes, mejorar la estabilidad y preparar variables para la transformación del peso de la evidencia.

También analizamos varios métodos de categorización, incluida la agrupación en intervalos iguales, la agrupación en intervalos iguales, la agrupación basada en Chi-cuadrado y la agrupación basada en el peso de la evidencia.

En la práctica, la categorización no debe tratarse como un paso de preprocesamiento mecánico. Una buena categorización debe satisfacer requisitos estadísticos, comerciales y de estabilidad.

Debería crear clases que estén suficientemente pobladas, claramente ordenadas en términos de riesgo, estables en el tiempo y fáciles de explicar.

Esto es especialmente importante cuando el modelo final es un cuadro de mando de regresión logística. En ese contexto, la categorización basada en WoE ayuda a transformar las variables brutas en clases de riesgo estables que están naturalmente alineadas con la estructura logarítmica de probabilidades del modelo.

La conclusión principal es esta:

Un modelo de calificación crediticia es tan confiable como las variables que lo integran.

Si las variables son ruidosas, inestables, mal agrupadas o difíciles de interpretar, incluso un buen algoritmo puede producir un modelo débil.

Pero cuando las variables se clasifican cuidadosamente, el modelo se vuelve más sólido, más interpretable y más fácil de monitorear en producción.

¿Qué pasa contigo? ¿En qué situaciones clasifica las variables, por qué razones y utilizando qué métodos?