Credit Scoring and Segmentation using Python

Machine Learning

FICO
Credit Scores
Python
sklearn
Author

Juan Isaula

Published

September 13, 2023

La calificación crediticia y la segmentación se refieren al proceso de evaluar la solvencia de personas o empresas y dividirlos en distintos grupos según sus perfiles crediticios. Su objetivo es evaluar la probabilidad de que los prestatarios pagen sus deudas y ayuda a las instituciones financieras a tomar decisiones informadas sobre préstamos y gestión del riesgo crediticio. Si desea aprender a calcular puntajes crediticios y segmentar clientes en función de sus puntajes crediticios, este artículo es para usted. En este artículo, lo guiaré a través de la tarea de segementación y calificación crediticia usando Python.

Calificación crediticia y segmentación: descripción general

El proceso de calcular puntajes crediticios y segmentar clientes en función de sus puntajes crediticios implica varios pasos. En primer lugar, se recopilan y organizan datos relevantes sobre los prestatarios, como:

  • historial de pagos,

  • utilización del crédito

  • historial crediticio

  • combinación de créditos.

Luego, utilizando algoritmos complejos y modelos estadísticos, los datos recopilados se analizan para generar calificaciones crediticias para cada prestatario.

Estos puntajes crediticios son representación numéricas de la solvencia del prestatario e indican la probabilidad de incumplimiento o pago oportuno. Una vez que se calculan los puntajes crediticios, los clientes se segmentan en diferentes categorías de riesgo o niveles de crédito según umbrales predefinidos.

Esta segmentación ayuda a las instituciones financieras a evaluar el riesgo crediticio asociado con cada cliente y a tomar decisiones informadas sobre aprobaciones de préstamos, tasas de interés y límites de crédito. Al clasificar a los clientes en segmentos, las instituciones financieras pueden gestionar mejor sus carteras de préstamos y mitigar eficazmente el riesgo de posibles incumplimientos.

Entonces, para comenzar con la tarea de calificación y segmentación crediticia, primero necesitamos tener los datos apropiados. Encontré un conjuntos de datos ideal para esta tarea. Puede descargar el conjunto de datos desde Aquí.

Calificación crediticia y segmentación usando Python

Ahora comencemos con la tarea de segmentación y calificación crediticia importando las bibliotecas de Python necesarias y el conjunto de datos

import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import plotly.io as pio
pio.templates.default = "plotly_white"

data = pd.read_csv("credit_scoring.csv")
data.head()
Age Gender Marital Status Education Level Employment Status Credit Utilization Ratio Payment History Number of Credit Accounts Loan Amount Interest Rate Loan Term Type of Loan
0 60 Male Married Master Employed 0.22 2685.0 2 4675000 2.65 48 Personal Loan
1 25 Male Married High School Unemployed 0.20 2371.0 9 3619000 5.19 60 Auto Loan
2 30 Female Single Master Employed 0.22 2771.0 6 957000 2.76 12 Auto Loan
3 58 Female Married PhD Unemployed 0.12 1371.0 2 4731000 6.57 60 Auto Loan
4 32 Male Married Bachelor Self-Employed 0.99 828.0 2 3289000 6.28 36 Personal Loan

A continuación se muestra la descripción de todas los campos de los datos:

  1. Age: representa la edad del individuo

  2. Gender: identifica el género del individuo

  3. Marital Status: denota el estado civil del individuo

  4. Education Level: representa en nivel más alto de educación alcanzado por el individuo.

  5. Employment Status: indica el estado de empleo actual del individuo

  6. Credit Utilization: refleja la proporción de crédito utilizado por el individuo en comparación con su límite de crédito total disponible.

  7. Interest Rate: tasa de interés asociada con el préstamo.

  8. Payment History: representa el comportamiento de pago neto mensual de cada cliente, tomando en cuenta factores como pagos a tiempo, pagos atrasados, pagos atrasados e incumplimientos.

  9. Number of Credit Accounts: representa el conteo de cuentas de crédito activas que posee la persona.

  10. Loan Amount: indica el valor monetario del préstamo.

  11. Loan Term: indica la duraciòn o plazo del préstamo.

  12. Type of Loan: incluye categorías como “Préstamo personal”, “Préstamo para automovil” o potencialmente otro tipos de préstamos.

Ahora echemos un vistazo a las estadísticas de las columnas antes de seguir adelante:

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 12 columns):
 #   Column                     Non-Null Count  Dtype  
---  ------                     --------------  -----  
 0   Age                        1000 non-null   int64  
 1   Gender                     1000 non-null   object 
 2   Marital Status             1000 non-null   object 
 3   Education Level            1000 non-null   object 
 4   Employment Status          1000 non-null   object 
 5   Credit Utilization Ratio   1000 non-null   float64
 6   Payment History            1000 non-null   float64
 7   Number of Credit Accounts  1000 non-null   int64  
 8   Loan Amount                1000 non-null   int64  
 9   Interest Rate              1000 non-null   float64
 10  Loan Term                  1000 non-null   int64  
 11  Type of Loan               1000 non-null   object 
dtypes: float64(3), int64(4), object(5)
memory usage: 93.9+ KB

Ahora echemos un vistazo a las estadísticas descriptivas de los datos:

data.describe()
Age Credit Utilization Ratio Payment History Number of Credit Accounts Loan Amount Interest Rate Loan Term
count 1000.000000 1000.000000 1000.000000 1000.000000 1.000000e+03 1000.000000 1000.000000
mean 42.702000 0.509950 1452.814000 5.580000 2.471401e+06 10.686600 37.128000
std 13.266771 0.291057 827.934146 2.933634 1.387047e+06 5.479058 17.436274
min 20.000000 0.000000 0.000000 1.000000 1.080000e+05 1.010000 12.000000
25% 31.000000 0.250000 763.750000 3.000000 1.298000e+06 6.022500 24.000000
50% 42.000000 0.530000 1428.000000 6.000000 2.437500e+06 10.705000 36.000000
75% 54.000000 0.750000 2142.000000 8.000000 3.653250e+06 15.440000 48.000000
max 65.000000 1.000000 2857.000000 10.000000 4.996000e+06 19.990000 60.000000

Ahora echemos un vistazo a la distribución del índice de utilización del crédito en los datos:

credit_utilization_fig = px.box(data, y='Credit Utilization Ratio',
                                title='Distribución del índice de utilización del crédito')
credit_utilization_fig.show()

Ahora echemos un vistazo a la distribución del monto del préstamo en los datos:

loan_amount_fig = px.histogram(data, x='Loan Amount', 
                               nbins=20, 
                               title='Distribución del monto del préstamo')
loan_amount_fig.show()

Luego, echemos un vistazo a la correlación en los datos:

numeric_df = data[['Credit Utilization Ratio', 
                   'Payment History', 
                   'Number of Credit Accounts', 
                   'Loan Amount', 'Interest Rate', 
                   'Loan Term']]
correlation_fig = px.imshow(numeric_df.corr(), 
                            title='Mapa de calor de correlación')
correlation_fig.show()

Calcular puntajes de crédito

El conjunto de datos no tiene ninguna característica que represente los puntajes crediticios de las personas. Para calcular las puntuaciones de crédito, debemos utilizar una técnica adecuada. Existen varias técnicas ampliamente utilizadas para calcular puntajes credeticios, cada una con su propio proceso de cálculo. Un ejemplo es el puntaje FICO, es un modelo de calificación crediticia comúnmente utilizado en la industria.

A continuación se muestra cómo podemos implementar el método de puntuación FICO para calcular las puntuaciones de crédito.

# Definir el mapeo para características categóricas
education_level_mapping = {'High School': 1, 'Bachelor': 2, 'Master': 3, 'PhD': 4}
employment_status_mapping = {'Unemployed': 0, 'Employed': 1, 'Self-Employed': 2}

# Aplicar mapeo  a características categóricas
data['Education Level'] = data['Education Level'].map(education_level_mapping)
data['Employment Status'] = data['Employment Status'].map(employment_status_mapping)

# Calcule puntajes de crédito utilizando la fórmula FICO completa
credit_scores = []

for index, row in data.iterrows():
    payment_history = row['Payment History']
    credit_utilization_ratio = row['Credit Utilization Ratio']
    number_of_credit_accounts = row['Number of Credit Accounts']
    education_level = row['Education Level']
    employment_status = row['Employment Status']
    
    # Apliaue la fórmula FICO para calcular el puntaje crediticio
    credit_score = (payment_history * 0.35) + (credit_utilization_ratio * 0.30) + (number_of_credit_accounts * 0.15) + (education_level * 0.10) + (employment_status * 0.10)
    credit_scores.append(credit_score)

# Agregue los puntajes de crédito como una nueva columna al DataFrame
data['Credit Score'] = credit_scores

data.head()
Age Gender Marital Status Education Level Employment Status Credit Utilization Ratio Payment History Number of Credit Accounts Loan Amount Interest Rate Loan Term Type of Loan Credit Score
0 60 Male Married 3 1 0.22 2685.0 2 4675000 2.65 48 Personal Loan 940.516
1 25 Male Married 1 0 0.20 2371.0 9 3619000 5.19 60 Auto Loan 831.360
2 30 Female Single 3 1 0.22 2771.0 6 957000 2.76 12 Auto Loan 971.216
3 58 Female Married 4 0 0.12 1371.0 2 4731000 6.57 60 Auto Loan 480.586
4 32 Male Married 2 2 0.99 828.0 2 3289000 6.28 36 Personal Loan 290.797

A continuación se muestra cómo funciona el código anterior:

  1. En primer lugar, define asignaciones para dos características categóricas: “Nivel de educación” y “Estado laboral”. La asignación de “Nivel de educación” asigna valores numéricos a diferentes niveles de educación, como “Escuela secundaria” asignada a 1, “Licenciatura” a 2, “Maestría” a 3 y “Doctorado” a 4. El “Estado de empleo” el mapeo asigna valores numéricos a diferentes estados laborales, como “desempleado” asignado a 0, “empleado” asigna 1 y “autónomo” a 2.

  2. A continuación, el código aplica las asignaciones definidas a las columnas correspondientes en el DataFrame. Transforma los valores de las columnas “Nivel de educación” y “Estado de empleo” de su forma categórica original a las representaciones numéricas asignadas.

  3. Después de eso, el código inicia una iteración sobre cada fila del DataFrame para calcular las puntuaciones de crédito de cada individuo. Recupera los valores de características relevantes, como “Historial de pagos”, “índice de utilización de crédito”, “Número de cuentas de crédito”, “Nivel de educación” y “Estado de empleo”, de cada fila.

Dentro de la iteración, se aplica la fórmula FICO para calcular el puntaje de crediticio de cada individuo. La fórmula incorpora los valores ponderados de las características mencionadas anteriormente:

  1. Peso del 35% para “Historial de pagos (Payment History)”
  2. Peso del 30% para el “índice de utilización de crédito (Credit Utilization Ratio)”
  3. Peso del 15% para “Número de cuentas de crédito (Number of Credit Accounts)”
  4. 10% de peso para “Nivel de educación (Education Level)”
  5. y 10% de ponderación para “Estatus laboral (Employment Status)”

Luego, el puntaje crediticio calculado se almacena en una lista llamada "credit_scores".

Segmentación basada en puntakes crediticios

Ahora, usemos el algoritmo de agrupamiento KMeans para segmentar a los clientes según sus puntajes crediticios.

import warnings
warnings.filterwarnings('ignore')
import numpy as np
from sklearn.cluster import KMeans

X = data[['Credit Score']]
X = np.nan_to_num(X)
kmeans = KMeans(n_clusters=4, n_init=10, random_state=42)
kmeans.fit(X)
data['Segment'] = kmeans.labels_

Ahora echemos un vistazo a los segmentos:

data.head()
Age Gender Marital Status Education Level Employment Status Credit Utilization Ratio Payment History Number of Credit Accounts Loan Amount Interest Rate Loan Term Type of Loan Credit Score Segment
0 60 Male Married 3 1 0.22 2685.0 2 4675000 2.65 48 Personal Loan 940.516 3
1 25 Male Married 1 0 0.20 2371.0 9 3619000 5.19 60 Auto Loan 831.360 3
2 30 Female Single 3 1 0.22 2771.0 6 957000 2.76 12 Auto Loan 971.216 3
3 58 Female Married 4 0 0.12 1371.0 2 4731000 6.57 60 Auto Loan 480.586 0
4 32 Male Married 2 2 0.99 828.0 2 3289000 6.28 36 Personal Loan 290.797 0
# Convertir la columna segmento al tipo de datos categoría
data['Segment'] = data['Segment'].astype('category')

# Visualiza los segmentos usando Plotly
fig = px.scatter(data, x=data.index, y='Credit Score', color='Segment',
                 color_discrete_sequence=['green', 'blue', 'yellow', 'red'])
fig.update_layout(
    xaxis_title='Indice de clientes',
    yaxis_title='Credit Score',
    title='Customer Segmentation based on Credit Scores'
)
fig.show()

Ahora nombremos los segmentos según los grupos anteriores y echemos un vistazo a los segmentos nuevamente:

data['Segment'] = data['Segment'].map({2: 'Muy baja', 
                                       0: 'Baja',
                                       1: 'Buena',
                                       3: "Excelente"})

# Convertir la columna segmento al tipo de datos de categoria
data['Segment'] = data['Segment'].astype('category')

# Visualiza los segmentos usando Plotly
fig = px.scatter(data, x=data.index, y='Credit Score', color='Segment',
                 color_discrete_sequence=['green', 'blue', 'yellow', 'red'])
fig.update_layout(
    xaxis_title='Customer Index',
    yaxis_title='Credit Score',
    title='Customer Segmentation based on Credit Scores'
)
fig.show()

Así es como puede realizar la segmentación y la calificación crediticia utilizando Python.

Resumen

La calificación crediticia y la segmentación se refieren al proceso de evaluar la solvencia de personas o empresas y dividirlos en distintos grupos según sus perfiles crediticios. Su objetivo es evaluar la probabilidad de que los prestatarios paguen sus dedudas y ayuda a las instituciones financieras a tomar decisiones informadas sobre préstamos y gestión del riesgo crediticio.

Espero que te haya gustado este artículo sobre segmentación y calificación crediticia usando Python. No dude en hacer preguntas valiosas en la sección de comentarios a continuación.