---
# System prepended metadata

title: Reporte

---

# **Predicción de Incumplimiento Crediticio con Redes Neuronales Artificiales**  
![output-onlinepngtools(2)](https://hackmd.io/_uploads/ryeYkNws1e.png)


## Tabla de Contenidos

**1. Introducción**  
**2. Exploración y Preparación de Datos**  
**3. Modelo de Redes Neuronales**  
**4. Scorecard**  
**5. Desarrollo de la App Web**  
**6. Repositorio de Github y reporte en Latex/pdf**  
**7. Reporte de contribucion individual**
**8. Referencias**  

---

**Nota:** En la entrada de blog, se incluye un panel lateral interactivo a la izquierda para facilitar la navegación entre los contenidos.

#### **Trabajo 2 – Redes Neuronales y Algoritmos Bioinspirados**  
**Universidad Nacional – 2025**

---

#### **Equipo de Trabajo**
- **Pablo Andrés Usuga Gómez**  
- **Felipe Muñoz Echeverri**  
- **Russbell Noreña Mejía**  
- **Samuel Rivera Botero**  

---
## 1. Introduccion

El incumplimiento en el pago de créditos representa un desafío significativo para las instituciones financieras, afectando tanto su rentabilidad como su sostenibilidad. Identificar a tiempo a los clientes con mayor probabilidad de incumplimiento es esencial para implementar estrategias preventivas y minimizar el riesgo.

Como estudiantes de la carrera de Sistemas y Computación, cursando la asignatura **Redes Neuronales y Algoritmos Bioinspirados**, hemos asumido el reto de desarrollar un modelo predictivo basado en redes neuronales artificiales para estimar la probabilidad de incumplimiento crediticio. Este modelo será complementado con una **scorecard** que permita interpretar los resultados de manera clara y práctica, facilitando la toma de decisiones tanto para los usuarios como para las instituciones financieras.

El proyecto incluye además el desarrollo de una aplicación web interactiva, que permitirá a los usuarios ingresar sus características y obtener una visualización personalizada de su scorecard, comparándola con la población general. Esto busca hacer el modelo no solo técnicamente preciso, sino también accesible y comprensible para todos los interesados.

Este **reporte técnico**, está acompañado de un **video promocional** de la aplicación web. y un reporte se detalla la contribución específica de cada integrante del equipo, destacando el esfuerzo colectivo y el aprendizaje colaborativo en el desarrollo de esta solución.

Trabajos previos han abordado el modelamiento del riesgo crediticio utilizando diversas metodologías. En particular, [Listendata (2019)](https://www.listendata.com/2019/08/credit-risk-modelling.html) presenta un enfoque basado en técnicas estadísticas y de aprendizaje automático para evaluar la solvencia de los prestatarios. Dicho estudio destaca la importancia de seleccionar variables adecuadas y de optimizar los modelos para mejorar la precisión de las predicciones, lo cual está en línea con los objetivos del presente trabajo.


## 2. Exploración y Preparación de Datos

En este proyecto, utilizamos el conjunto de datos **Credit Risk Analysis**, tomado de la plataforma **Kaggle**, según lo solicitado. Este dataset está disponible en el siguiente enlace: [Credit Risk Dataset en Kaggle](https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data).

El dataset representa un escenario relevante en la gestión del riesgo crediticio para instituciones financieras. Contiene información detallada sobre el historial crediticio de los clientes, con el objetivo de predecir posibles incumplimientos de pago y ayudar a las entidades financieras a tomar medidas proactivas.


### Descripción del Dataset

El dataset incluye información detallada sobre préstamos y características asociadas a los clientes, tales como montos del préstamo, tasas de interés, duración, estado del préstamo, historial crediticio, ingresos anuales y otras variables clave. A continuación, se presenta una lista de las columnas más relevantes:

- **`id`**: Identificador único del préstamo.
- **`loan_amnt`**: Monto solicitado por el cliente.
- **`term`**: Duración del préstamo.
- **`int_rate`**: Tasa de interés asociada.
- **`grade`** y **`sub_grade`**: Calificación crediticia del cliente.
- **`emp_length`**: Años de experiencia laboral del cliente.
- **`home_ownership`**: Tipo de propiedad del cliente (por ejemplo, `RENT`, `OWN`, `MORTGAGE`).
- **`annual_inc`**: Ingresos anuales del cliente.
- **`loan_status`**: Estado del préstamo (por ejemplo, `Fully Paid`, `Charged Off`).
- **`purpose`**: Propósito del préstamo.
- **`dti`**: Relación deuda/ingresos.
- **`earliest_cr_line`**: Fecha de la primera línea de crédito.
- **`total_acc`**: Número total de cuentas de crédito.
- **`revol_util`**: Porcentaje de utilización de crédito rotativo.
- **`total_pymnt`**: Total de pagos realizados por el cliente.

### Exploración Inicial

Antes de proceder con la limpieza de los datos, realizamos un análisis exploratorio para entender mejor las características del dataset:

1. **Distribución de valores faltantes**: Identificamos qué columnas contienen valores nulos o inconsistencias.
2. **Distribución de variables clave**: Analizamos la dispersión de variables como `loan_amnt`, `int_rate` y `dti`.
3. **Relación entre variables**: Exploramos correlaciones entre las características numéricas y categóricas.

#### Análisis de Completitud
Utilizamos pandas para calcular el porcentaje de valores no nulos en cada columna, lo que nos permitió identificar rápidamente características con datos incompletos. La decisión clave fue filtrar y eliminar columnas con menos del 25% de datos presentes, reduciendo el ruido y preparando el terreno para un análisis más preciso.

##### Código Representativo:
```python
attribute_completeness = dataset.notnull().mean() * 100
columns_to_keep = attribute_completeness[attribute_completeness > 25].index
```
### Manejo de datos
![image](https://hackmd.io/_uploads/BJ9PXdro1e.png)
Lo primero que hicimos fue validar la integridad de los datos. Utilizando la biblioteca pandas de Python, analizamos la completitud de cada atributo del conjunto de datos. Este primer paso reveló rápidamente un panorama complejo: múltiples columnas contenían información incompleta o potencialmente irrelevante.

```python
import pandas as pd
dataset = pd.read_csv('loan.csv')
attribute_completeness = dataset.notnull().mean() * 100
```


#### Eliminación de Características Irrelevantes

Se analizaron las descripciones de las características para eliminar aquellas que no aportan información útil al modelo. Las razones de eliminación incluyen:

* **Características Irrelevantes:** Como desc, title, url, policy code, member id, e id, que no tienen valor predictivo.
* **Características con Alta Cardinalidad:** Como emp title y zip code, que tienen demasiados valores únicos.
* **Características con Problemas Temporales:** Como next pymnt d, last pymnt d, last credit pull d, issue d, y earliest cr line, que dependen del momento en que se consulta el dataset.
* **Características Disponibles Solo Después del Crédito:** Como collection recovery fee, recoveries, last pymnt amnt, total rec prncp, total rec int, total rec late fee, out prncp, y out prncp inv, que solo están disponibles después de la aprobación del crédito.
* **Características Prospectivas:** Como int rate, installment, term, purpose, e initial list status, que no están disponibles en el momento de la solicitud.
* **Características Basadas en Historial Crediticio:** Como dti, inq last 6mths, pub rec, revol bal, revol util, acc now delinq, tot coll amt, collections 12 mths ex med, y total rev hi lim, que asumimos no están disponibles para nuevos solicitantes.
* **Características con Baja Variabilidad:** Como pymnt plan, que tiene valores casi constantes.

####  Revisión de Completitud de Características Restantes

Después de eliminar las características irrelevantes, se revisó nuevamente el porcentaje de completitud de las características restantes:

* Se observó que la característica mths since last delinq tenía un alto porcentaje de valores faltantes (48.80 %), por lo que se decidió eliminarla para evitar riesgos de sesgo en el modelo.


#### Revisión de Completitud de Características Restantes

Después de eliminar las características irrelevantes, se revisó nuevamente el porcentaje de completitud de las características restantes:

Se observó que la característica mths since last delinq tenía un alto porcentaje de valores faltantes (48.80 %), por lo que se decidió eliminarla para evitar riesgos de sesgo en el modelo.

#### Transformación de Variables Categóricas

La variable emp length, que representa la cantidad de años que una persona lleva en su trabajo, fue transformada de categórica a numérica. Esto se logró mediante la conversión de valores como <1 year a 0 y 10+ years a 10.

#### Reinterpretación de la Variable Objetivo

La variable objetivo loan status fue reinterpretada para diferenciar entre clientes que incumplen y aquellos que no. Los valores se categorizaron de la siguiente manera:

* Clientes que incumplen (0): Incluye Fully Paid y Does not meet the credit policy. Status: Fully Paid.
* Clientes que no incumplen (1): Incluye Charged Off, Default, y Does not meet the credit policy. Status: Charged Off.
* Casos Indeterminados (NaN): Incluye Current, Late (16-30 days), Late (31-120 days), Issued, e In Grace Period.

#### Eliminación de Filas con Valores Faltantes

Finalmente, se eliminaron todas las filas que contenían al menos un valor faltante (NaN), lo que resultó en un dataset final de 201,934 registros con 7 características.

* **emp length:** Número de años de experiencia laboral del solicitante.
* **home ownership:** Estado de la vivienda del solicitante.
* **annual inc:** Ingresos anuales declarados del solicitante.
* **loan status:** Variable objetivo que indica el estado del préstamo.
* **delinq 2yrs:** Número de veces que el solicitante ha tenido una cuenta vencida en los últimos 2 años.
* **open acc:** Número de cuentas de crédito abiertas actualmente.
* **total acc:** Número total de cuentas de crédito que ha tenido el solicitante.
* **tot cur bal:** Saldo total actual de todas las cuentas de crédito del solicitante.


## 3. Modelo de Redes Neuronales
Antes de proceder con el entrenamiento del modelo de red neuronal, se decidió implementar un modelo de regresión logística como referencia. Este modelo, aunque más simple, permite establecer una línea base de rendimiento que servirá para comparar con el modelo más complejo de red neuronal. La regresión logística ha sido ampliamente utilizada en el ámbito del crédito debido a su interpretabilidad y eficacia en la predicción del riesgo de incumplimiento. Según Abdou y Pointon (2011), los modelos de regresión logística han sido una de las técnicas más empleadas en el scoring crediticio, proporcionando una forma eficiente de evaluar la probabilidad de incumplimiento basándose en características históricas de los prestatarios. Adicionalmente, Glennon y cols. (2008) destacan que, a pesar de su simplicidad, estos modelos pueden ofrecer un rendimiento competitivo en ciertos contextos, lo que justifica su uso como línea base antes de aplicar enfoques más avanzados como redes neuronales.


### Preparación de Datos y Diseño del Modelo

El éxito de cualquier modelo de aprendizaje automático depende en gran medida de la calidad y relevancia de los datos utilizados. En nuestro caso, nos enfocamos en seleccionar un conjunto robusto de características que consideramos cruciales para evaluar la solvencia de un individuo como lo vimos anteriormente. Entre estas variables clave se encuentran la tasa de interés, que representa el costo del préstamo para el solicitante; el monto de la cuota, que indica el pago periódico que el prestatario debe realizar; la subclasificación de crédito, que ofrece una evaluación previa del riesgo crediticio del solicitante; el tiempo de empleo, que refleja la estabilidad laboral del solicitante; la propiedad de vivienda, que puede ser un indicador de estabilidad financiera; los ingresos anuales, que son un factor determinante en la capacidad de pago del solicitante; el ratio de deuda a ingresos, que muestra la proporción de los ingresos destinada al pago de deudas; y los indicadores de historial crediticio, que proporcionan información detallada sobre el historial crediticio del solicitante, incluyendo moras, consultas y detalles de cuentas.

#### Balanceo de Clases

Dado que el conjunto de datos presentaba un desbalance entre las clases (clientes que incumplen vs. clientes que no incumplen), se aplicó la técnica SMOTE (Synthetic Minority Over-sampling Technique) para balancear las clases en el conjunto de entrenamiento. Esta técnica, propuesta por Chawla y cols. (2002), permite generar nuevas instancias sintéticas en lugar de simplemente replicar los datos existentes, lo que contribuye a mejorar el rendimiento de los modelos de clasificación. Esto asegura que el modelo no esté sesgado hacia la clase mayoritaria.

Enlace al artículo de Chawla: [SMOTE: Synthetic Minority Over-sampling Technique](https://doi.org/10.1613/jair.953)

#### Escalado de Características

Las características numéricas fueron escaladas utilizando StandardScaler, que transforma los datos para que tengan una media de 0 y una desviación estándar de 1. Esto es crucial para garantizar que todas las características contribuyan de manera equitativa al modelo.

### Entrenamiento, Resultados y Justificación del Modelo

El entrenamiento del modelo se realizó utilizando los siguientes parámetros: el optimizador Adam, un algoritmo de optimización eficiente; la función de pérdida de entropía cruzada binaria (binary cross-entropy), adecuada para problemas de clasificación binaria; 20 épocas (epochs), que representan el número de veces que el modelo recorre todo el conjunto de entrenamiento; un tamaño de lote (batch size) de 32, que indica la cantidad de muestras procesadas en cada iteración; y una proporción de validación del 20%, donde una parte del conjunto de entrenamiento se utiliza para evaluar el rendimiento del modelo durante el entrenamiento y prevenir el sobreajuste.


```js
Ultima iteracion:
15480/15480 ━━━━━━━━━━━━━━━━━━━━ 54s 4ms/step - accuracy: 0.9840 - loss: 0.0699 - val_accuracy: 0.9841 - val_loss: 0.0687

Evaluación del modelo:
Pérdida: 0.0681
Precisión: 0.9842
```
Los resultados obtenidos fueron altamente satisfactorios, con una precisión (Accuracy) del 98.42% y una pérdida (Loss) de 0.0681. La alta precisión indica que el modelo clasifica correctamente la gran mayoría de las instancias, mientras que la baja pérdida sugiere que el modelo se ajusta bien a los datos de entrenamiento sin sobreajustar. La estabilidad de la precisión de validación alrededor del 98.4% a lo largo de las épocas de entrenamiento confirma la robustez del modelo y su capacidad de generalización.

Elegimos una red neuronal por su capacidad para capturar relaciones no lineales, a diferencia de los modelos lineales, las redes neuronales pueden modelar relaciones complejas entre las variables. También pueden manejar interacciones complejas, aprendiendo interacciones sutiles entre las características, lo que es crucial en datos financieros. Además, proporcionan predicciones probabilísticas, ya que la capa de salida con activación sigmoide proporciona una probabilidad de impago, lo que permite una mejor interpretación y toma de decisiones. El uso de capas de Dropout refuerza la capacidad de generalización del modelo, evitando el sobreajuste.

### Evaluación del Modelo de Red Neuronal

#### Matriz de Confusión

La matriz de confusión del modelo de red neuronal se muestra en la Figura 1. Esta matriz representa la distribución de las predicciones del modelo en comparación con los valores reales. Las filas corresponden a los valores reales, mientras que las columnas corresponden a las predicciones del modelo.

![output-onlinepngtools](https://hackmd.io/_uploads/Bk3EuFrs1g.png)


#### Interpretación de Resultados

El modelo de red neuronal fue evaluado utilizando las siguientes métricas:

- **Accuracy**: 0.5693
- **Precision**: 0.2917
- **Recall**: 0.5797
- **F1-Score**: 0.3882

#### Análisis de las Métricas

- **Accuracy (Exactitud)**: El modelo tiene una exactitud del 56.93%, lo que indica que clasifica correctamente un poco más de la mitad de los casos. Aunque es una mejora respecto al modelo de regresión logística, sigue siendo un valor moderado.
- **Precision (Precisión)**: La precisión del 29.17% sugiere que el modelo tiene dificultades para predecir correctamente los casos de incumplimiento, generando un alto número de falsos positivos. Esto es similar al modelo de regresión logística.
- **Recall (Sensibilidad)**: El recall del 57.97% indica que el modelo es capaz de identificar una proporción significativa de los casos de incumplimiento, aunque a costa de un alto número de falsos positivos. Este valor es ligeramente inferior al del modelo de regresión logística.
- **F1-Score**: El F1-Score de 0.3882 refleja un equilibrio moderado entre precisión y recall, lo que sugiere que el modelo tiene un rendimiento aceptable pero no óptimo. Este valor es prácticamente idéntico al del modelo de regresión logística.

### Resultados del Modelo de Redes Neuronales

#### Distribución de Probabilidades de Incumplimiento

En esta sección, se presenta la distribución de las probabilidades de incumplimiento calculadas por el modelo de redes neuronales para todos los clientes en el dataset. La Figura 2 muestra un histograma que representa la frecuencia de las probabilidades de incumplimiento.

![output-onlinepngtools(1)](https://hackmd.io/_uploads/r1ta_YBjJe.png)

##### Interpretación de la Gráfica

- **Eje X**: Representa la probabilidad de incumplimiento, que varía entre 0 y 1.
- **Eje Y**: Representa la frecuencia (número de clientes) que caen en cada intervalo de probabilidad.
- **Distribución**: La mayoría de los clientes tienen probabilidades de incumplimiento concentradas en el rango de 0.0 a 0.3, lo que sugiere que la mayoría de los clientes tienen un riesgo bajo o moderado de incumplimiento. Sin embargo, también se observa una cola hacia probabilidades más altas, lo que indica que hay un grupo de clientes con un riesgo significativamente mayor.

Esta distribución es útil para identificar patrones en el riesgo de incumplimiento y puede ser utilizada para tomar decisiones estratégicas, como la segmentación de clientes o la asignación de recursos para la gestión de riesgos.

#### Comparación con el Modelo de Regresión Logística

A continuación, se presenta una comparación entre el modelo de red neuronal y el modelo de regresión logística:

| **Métrica**          | **Regresión Logística** | **Red Neuronal** |
|-----------------------|------------------------|------------------|
| **Accuracy**          | 0.5325                 | 0.5693           |
| **Precision**         | 0.2807                 | 0.2917           |
| **Recall**            | 0.6295                 | 0.5797           |
| **F1-Score**          | 0.3883                 | 0.3882           |

##### Discusión de los Resultados

- **Mejora en Accuracy**: El modelo de red neuronal muestra una mejora en la exactitud (accuracy) en comparación con el modelo de regresión logística (56.93% vs. 53.25%). Esto sugiere que el modelo de red neuronal es ligeramente mejor en la clasificación general.
- **Precisión y Recall**: Aunque la precisión es ligeramente superior en el modelo de red neuronal (29.17% vs. 28.07%), el recall es ligeramente inferior (57.97% vs. 62.95%). Esto indica que el modelo de red neuronal es menos efectivo para identificar casos de incumplimiento, pero tiene un rendimiento similar en términos de falsos positivos.
- **F1-Score**: El F1-Score es prácticamente idéntico en ambos modelos (0.3883 vs. 0.3882), lo que sugiere que el equilibrio entre precisión y recall no mejora significativamente con el modelo de red neuronal.
- **Complejidad vs. Rendimiento**: Aunque el modelo de red neuronal es más complejo y tiene la capacidad de capturar relaciones no lineales, en este caso no se tradujo en una mejora significativa en el rendimiento. Esto puede deberse a la naturaleza del conjunto de datos o a la necesidad de ajustar más los hiperparámetros del modelo de red neuronal.

### Conclusión del modelo
El modelo de red neuronal muestra una ligera mejora en la exactitud (accuracy) en comparación con el modelo de regresión logística, pero no se observa una mejora significativa en términos de precisión, recall o F1-Score. Esto sugiere que, en este caso, la complejidad adicional del modelo de red neuronal no aporta una ventaja clara sobre el modelo de regresión logística. Sin embargo, es importante considerar que el modelo de red neuronal podría mejorar con un ajuste más fino de hiperparámetros o con la incorporación de más datos.

El uso de inteligencia artificial en la evaluación del riesgo crediticio ha demostrado ser una herramienta poderosa para mejorar la toma de decisiones en el sector financiero. Como menciona Kirkpatrick, D. (2021, September 27), la aplicación de técnicas avanzadas de redes neuronales artificiales puede optimizar la capacidad de los modelos para identificar patrones complejos en los datos, lo que sugiere que la red neuronal aún tiene potencial de mejora mediante enfoques más sofisticados. Descargado de [Forbes](https://www.forbes.com/sites/forbestechcouncil/2021/09/27/ai-in-credit-scoring-how-artificial-intelligence-is-shaping-the-future-of-lending/).



## 4. Scorecard


Nuestro equipo ha desarrollado un modelo basado en un **scorecard** para evaluar el riesgo crediticio de clientes. Este enfoque combina técnicas estadísticas, como la ponderación de evidencia (Weight of Evidence, WoE) y el valor de información (Information Value, IV), con reglas claras que permiten interpretar los resultados de manera intuitiva. A continuación, explicaremos cómo se estructuró el desarrollo del scorecard, acompañado de fragmentos del código que utilizamos para implementarlo.


### **Transformación de la Variable Objetivo y selección de Características Categóricas**
El primer paso para construir el scorecard fue preparar los datos. En nuestro caso, utilizamos un dataset donde la variable objetivo (`loan_status`) indica si un cliente incumplió o no su préstamo. Esta variable fue transformada en un formato binario: **1** para clientes que incumplieron ("Incumple") y **0** para quienes no lo hicieron.

```python
data['loan_status'] = data['loan_status'].apply(lambda x: 1 if x == "Incumple" else 0)
```

Esta transformación es esencial para realizar cálculos posteriores y para que el modelo pueda diferenciar entre buenos y malos clientes.

Para nuestro análisis, identificamos un conjunto de características categóricas relevantes, tales como el término del préstamo (`term`), el propósito del préstamo (`purpose`) y otros atributos relacionados con el historial del cliente. Estas características se utilizaron para calcular los valores WoE e IV.

```python
categorical_features = ['term', 'sub_grade', 'home_ownership', 'verification_status', 'purpose']
```


### **Cálculo de WoE e IV**
La **ponderación de evidencia (WoE)** mide la diferencia entre la proporción de clientes buenos (0) y malos (1) en cada categoría de una característica, mientras que el **valor de información (IV)** evalúa la relevancia de la característica para predecir el riesgo.

El siguiente fragmento de código calcula ambos valores para cada categoría dentro de una característica:

```python
def calculate_woe_iv(data, feature, target):
    lst = []
    epsilon = 1e-6
    for cat in data[feature].unique():
        count = data[data[feature] == cat].shape[0]
        good = data[(data[feature] == cat) & (data[target] == 0)].shape[0]
        bad = data[(data[feature] == cat) & (data[target] == 1)].shape[0]
        good_perc = good / data[data[target] == 0].shape[0] if data[data[target] == 0].shape[0] > 0 else 0
        bad_perc = bad / data[data[target] == 1].shape[0] if data[data[target] == 1].shape[0] > 0 else 0
        good_perc = max(good_perc, epsilon)
        bad_perc = max(bad_perc, epsilon)
        woe = np.log(good_perc / bad_perc)
        iv = (good_perc - bad_perc) * woe
        lst.append({'Category': cat, 'Count': count, 'WoE': woe, 'IV': iv})
    woe_df = pd.DataFrame(lst)
    iv_sum = woe_df['IV'].sum()
    return woe_df, iv_sum
```

### **Asignación de Puntos en el Scorecard y generación del Scorecard**
Una vez calculados los valores WoE, convertimos estos en puntos que componen el scorecard. Esto se hace utilizando una fórmula basada en un puntaje base (`base_score`) y el doble del puntaje óptimo (`pdo`):

```python
base_score = 600
pdo = 50

def calculate_points(woe, base_score, pdo):
    factor = pdo / np.log(2)
    offset = base_score
    max_woe = 10
    woe = np.clip(woe, -max_woe, max_woe)
    return int(offset + (factor * woe))
```

El parámetro `pdo` determina cuántos puntos deben cambiar en el score por cada duplicación del riesgo. Este enfoque garantiza que los puntajes finales sean fácilmente interpretables.

Para cada característica categórica, calculamos los puntos asociados a cada categoría. Esto nos permitió construir un scorecard, que actúa como una tabla de consulta para traducir los valores categóricos de cada cliente en puntajes.

```python
woe_iv_dict = {}
scorecard = {}

for feature in categorical_features:
    woe_df, iv = calculate_woe_iv(data, feature, 'loan_status')
    woe_df['Points'] = woe_df['WoE'].apply(lambda x: calculate_points(x, base_score, pdo))
    woe_iv_dict[feature] = {'WoE': woe_df, 'IV': iv}
    scorecard[feature] = woe_df[['Category', 'Points']]
```

### **Cálculo del Puntaje Total y interpretación del Scorecard**
Finalmente, para cada cliente en el dataset, sumamos los puntos asignados en el scorecard para calcular el puntaje total. Este puntaje refleja el riesgo crediticio del cliente: un valor más alto indica un menor riesgo.

```python
def calculate_total_score(row, scorecard):
    total_score = base_score
    for feature, score_df in scorecard.items():
        category = row[feature]
        if category in score_df['Category'].values:
            points = score_df[score_df['Category'] == category]['Points'].values[0]
        else:
            points = 0
        total_score += points
    return total_score

data['Score'] = data.apply(lambda row: calculate_total_score(row, scorecard), axis=1)
```

## 5. Direccion de pagina web y video promocional 
Direccion [pagina web http://75.101.241.138:4188](http://75.101.241.138:4188/) (abrir desde PC). En esta pagina se encontrara el video promocional de la aplicacion web.
![image](https://hackmd.io/_uploads/SkfrjYrokg.png)
Figura: Captura de pantalla de la aplicacion web.

https://www.youtube.com/watch?v=HrhpWuHZNfY

## 6. Repositorio de Github y reporte en Latex
Se puede encontrar el repositorio en el siguiente [link](https://github.com/Rypsor/modelo-de-riesgo-de-credito)
Se puede encontrar el reporte de latex en el siguiente [link](https://drive.google.com/file/d/14COtAIzJQu78RagYQ7wksFioYPA2sZ5R/view?usp=sharing)
## 7. Reporte de contribucion individual

- Pablo Andrés Usuga Gómez
	- Elaboración del blog y del reporte de contribución individual.
	- Selección de la bibliografía de soporte.
- Russbell Noreña Mejía
    - Desarrollo del la Aplicacion web.
- Samuel Rivera Botero
    - Desarrollo del Modelo y Scoreboard.
- Felipe Muñoz Echeverri
    - Revisión final del reporte y aseguramiento de la coherencia general del trabajo.

Se puede visualizar el video de contribucion individual en este [link](https://drive.google.com/file/d/1GXDLvGj1gXra38aYqHkig_wAk9o4o-Pm/view?usp=sharing)
## 8. Referencias
- Abdou, H., & Pointon, J. (2011). *Credit scoring, statistical techniques and evaluation criteria: A review*. Journal of Applied Statistics, 38(5), 959-981. doi: [10.1080/02664763.2010.494730](https://doi.org/10.1080/02664763.2010.494730)
- Chawla, N. V., Bowyer, K. W., Hall, L. O., & Kegelmeyer, W. P. (2002). *Smote: Synthetic minority over-sampling technique*. Journal of Artificial Intelligence Research, 16, 321–357. Recuperado de [https://doi.org/10.1613/jair.953](https://doi.org/10.1613/jair.953)
- Glennon, D., Kiefer, N. M., Larson, C. E., & Choi, J. (2008). *Credit scoring models and the incidence of default*. Journal of Risk Model Validation, 2(2), 1-25.
- Kaggle. (s.f.). *Credit risk dataset*. Online. Recuperado de [https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data](https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data)
- Kirkpatrick, D. (2021, September 27). *Ai in credit scoring: How artificial intelligence is shaping the future of lending*. Forbes. Recuperado de [https://www.forbes.com/sites/forbestechcouncil/2021/09/27/ai-in-credit-scoring-how-artificial-intelligence-is-shaping-the-future-of-lending/](https://www.forbes.com/sites/forbestechcouncil/2021/09/27/ai-in-credit-scoring-how-artificial-intelligence-is-shaping-the-future-of-lending/)
- Listendata. (2019, August 21). *Credit risk modelling*. Online. Recuperado de [https://www.listendata.com/2019/08/credit-risk-modelling.html](https://www.listendata.com/2019/08/credit-risk-modelling.html)
- Mumtaz, A. (2020, August 13). *How to develop a credit risk model and scorecard: A walkthrough of statistical credit risk modeling, probability of default prediction, and credit scorecard development with Python*. Towards Data Science. Recuperado de [https://towardsdatascience.com/how-to-develop-a-credit-risk-model-and-scorecard-91335fc01f03](https://towardsdatascience.com/how-to-develop-a-credit-risk-model-and-scorecard-91335fc01f03)
- Bhalla, D. (2019). *A complete guide to credit risk modelling*. ListenData. Recuperado de [https://www.listendata.com/2019](https://www.listendata.com/2019)
- Tina | Kinden Property. (2019, December 6). *Intro to credit scorecard: Step by step guide on how to build a simple credit scorecard*. Towards Data Science. Recuperado de [https://towardsdatascience.com/intro-to-credit-scorecard-9afeaaa3725f](https://towardsdatascience.com/intro-to-credit-scorecard-9afeaaa3725f)
- Dark_Raider. (2019). *Credit risk analysis: Relevant real life scenario for any financial institution*. Kaggle. Recuperado de [https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data?authuser=1](https://www.kaggle.com/datasets/ranadeep/credit-risk-dataset/data?authuser=1)
- ActiveState. (n.d.). *How to create a neural network in Python – With and without Keras: Learn how to build a neural network in Python from scratch or by using the Keras library*. ActiveState. Recuperado de [https://www.activestate.com/resources/quick-reads/how-to-create-a-neural-network-in-python-with-and-without-keras/](https://www.activestate.com/resources/quick-reads/how-to-create-a-neural-network-in-python-with-and-without-keras/)
- Perplexity. (2024). Perplexity AI [Herramienta de búsqueda y consulta]. Perplexity AI. https://www.perplexity.aiAnthropic. (2024). 
- Claude [Modelo Haiku]. Anthropic. https://www.anthropic.comOpenAI. 
- ChatGPT [Modelo GPT 4o]. OpenAI. https://www.openai.com.