Resumen

El presente trabajo aplica dos técnicas de clasificación supervisada: Regresión Logística Binaria y Naive Bayes. La primera se utiliza para predecir el riesgo de mora de clientes bancarios a partir de variables financieras y sociodemográficas. La segunda se implementa para clasificar el nivel de riesgo de erosión costera en playas utilizando características físicas y ambientales. Los modelos son evaluados mediante métricas de desempeño como Accuracy, Precision, Recall y F1-Score.

Introducción

La minería de datos y el aprendizaje automático han adquirido gran relevancia en múltiples sectores debido a su capacidad para extraer patrones y generar modelos predictivos. En el ámbito financiero, estos modelos permiten anticipar riesgos crediticios y optimizar la toma de decisiones. En el ámbito ambiental, facilitan la identificación de zonas vulnerables y apoyan la planificación territorial.

En este trabajo se desarrollan dos modelos de clasificación supervisada utilizando bases de datos reales pertenecientes a sectores distintos. Se implementa una Regresión Logística Binaria para la predicción de mora bancaria y un modelo Naive Bayes para la clasificación del riesgo de erosión costera.

Objetivos

Objetivo General

Aplicar técnicas de clasificación mediante Regresión Logística Binaria y Naive Bayes utilizando bases de datos de los sectores financiero y ambiental.

Objetivos Específicos

  • Preparar y depurar los datos.
  • Construir un modelo de Regresión Logística Binaria.
  • Construir un modelo Naive Bayes.
  • Evaluar el desempeño de ambos modelos.
  • Interpretar los resultados obtenidos.

Marco Teórico

Regresión Logística Binaria

La Regresión Logística Binaria es un método de clasificación supervisada que permite estimar la probabilidad de que ocurra un evento con dos posibles resultados, como la presencia o ausencia de mora en un crédito. Este modelo utiliza la función logística o sigmoide para transformar una combinación lineal de variables independientes en una probabilidad comprendida entre 0 y 1.

La función logística está dada por:

\[ P(Y=1|X)=\frac{1}{1+e^{-z}} \]

donde:

  • (P(Y=1|X)) representa la probabilidad de que ocurra el evento de interés.
    1. es la constante matemática de Euler (aproximadamente 2.71828).
    1. es una combinación lineal de las variables explicativas.

El valor de (z) se calcula mediante la expresión:

\[ z=\beta_0+\beta_1X_1+\beta_2X_2+\cdots+\beta_pX_p \] En R esta como:

Cada coeficiente indica cómo cambia la probabilidad del evento cuando la variable correspondiente aumenta una unidad, manteniendo constantes las demás variables. Este modelo es ampliamente utilizado en problemas de riesgo crediticio, medicina, marketing y análisis financiero.

Naive Bayes

Naive Bayes es un algoritmo probabilístico basado en el Teorema de Bayes, utilizado para resolver problemas de clasificación. Su principal característica es asumir que las variables predictoras son condicionalmente independientes entre sí dado el valor de la clase, lo que simplifica significativamente los cálculos.

El Teorema de Bayes se expresa mediante la siguiente ecuación:

\[ P(C|X)=\frac{P(X|C)P(C)}{P(X)} \]

donde:

  • (P(C|X)) es la probabilidad posterior de que una observación pertenezca a la clase (C) dado el conjunto de características (X).
  • (P(X|C)) es la probabilidad de observar las características (X) suponiendo que la observación pertenece a la clase (C).
  • (P(C)) representa la probabilidad previa de la clase.
  • (P(X)) corresponde a la probabilidad total de observar las características (X).

Bajo el supuesto de independencia condicional entre las variables predictoras, el modelo se simplifica a:

\[ P(C|X_1,\ldots,X_n)\propto P(C)\prod_{i=1}^{n}P(X_i|C) \]

Esta expresión indica que la probabilidad de pertenecer a una clase es proporcional al producto de las probabilidades individuales de cada variable dada dicha clase, multiplicado por la probabilidad previa de la clase.

Gracias a su simplicidad y eficiencia computacional, Naive Bayes es ampliamente utilizado en clasificación de documentos, detección de fraude, filtrado de correo no deseado y problemas de clasificación multiclase en diferentes áreas del conocimiento.

Modelo 1: Regresión Logística Binaria

La base de datos bancaria contiene información relacionada con el comportamiento crediticio de clientes. La variable objetivo es mora, la cual indica si el cliente presenta incumplimiento de pago.

Variables predictoras:

banco <- read.csv("banco.csv")

# Imputación de valores faltantes
banco$linea_sf[is.na(banco$linea_sf)] <- median(
  banco$linea_sf,
  na.rm = TRUE
)

banco$exp_sf[is.na(banco$exp_sf)] <- median(
  banco$exp_sf,
  na.rm = TRUE
)

# Conversión de variables categóricas
banco$vivienda <- as.factor(banco$vivienda)
banco$nivel_educ <- as.factor(banco$nivel_educ)

Dimensiones del Dataset

La tabla de dimensiones presenta el número total de registros y variables contenidas en el conjunto de datos. Esta información permite conocer el tamaño de la base utilizada para el entrenamiento del modelo y verificar que la información disponible sea suficiente para el análisis.

kable(
  data.frame(
    Registros = nrow(banco),
    Variables = ncol(banco)
  ),
  caption = "Dimensiones del Dataset Banco"
)
Dimensiones del Dataset Banco
Registros Variables
8399 14

Primeros Registros

La tabla de los primeros registros ofrece una vista preliminar de la estructura del conjunto de datos, permitiendo identificar el tipo de variables presentes y verificar que la lectura del archivo se realizó correctamente.

kable(
  head(banco),
  caption = "Primeros registros del Dataset Banco"
)
Primeros registros del Dataset Banco
mora atraso vivienda edad dias_lab exp_sf nivel_ahorro ingreso linea_sf deuda_sf score zona clasif_sbs nivel_educ
0 235 FAMILIAR 30 3748 93 5 3500 4030.12 0.00 214 Lima 4 UNIVERSITARIA
0 18 FAMILIAR 32 4598 9 12 900 1824.67 1933.75 175 La Libertad 1 TECNICA
0 0 FAMILIAR 26 5148 8 2 2400 2797.38 188.29 187 Lima 0 UNIVERSITARIA
0 0 FAMILIAR 36 5179 20 12 2700 4030.12 0.00 187 Ancash 0 TECNICA
0 0 FAMILIAR 46 3960 20 1 3100 2000.00 11010.65 189 Lima 0 TECNICA
0 22 FAMILIAR 25 4874 9 12 2200 449.92 496.58 220 Lima 0 UNIVERSITARIA

Estructura de los Datos

glimpse(banco)
## Rows: 8,399
## Columns: 14
## $ mora         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ atraso       <int> 235, 18, 0, 0, 0, 22, 9, 8, 2, 0, 0, 0, 1, 0, 0, 1, 17, 0…
## $ vivienda     <fct> FAMILIAR, FAMILIAR, FAMILIAR, FAMILIAR, FAMILIAR, FAMILIA…
## $ edad         <int> 30, 32, 26, 36, 46, 25, 30, 55, 30, 31, 26, 50, 21, 41, 3…
## $ dias_lab     <int> 3748, 4598, 5148, 5179, 3960, 4874, 3930, 4995, 5026, 496…
## $ exp_sf       <int> 93, 9, 8, 20, 20, 9, 12, 23, 20, 20, 8, 20, 12, 8, 6, 20,…
## $ nivel_ahorro <int> 5, 12, 2, 12, 1, 12, 8, 12, 0, 4, 12, 2, 12, 10, 11, 12, …
## $ ingreso      <dbl> 3500.00, 900.00, 2400.00, 2700.00, 3100.00, 2200.00, 2100…
## $ linea_sf     <dbl> 4030.12, 1824.67, 2797.38, 4030.12, 2000.00, 449.92, 4827…
## $ deuda_sf     <dbl> 0.00, 1933.75, 188.29, 0.00, 11010.65, 496.58, 850.21, 18…
## $ score        <int> 214, 175, 187, 187, 189, 220, 193, 199, 156, 192, 186, 17…
## $ zona         <chr> "Lima", "La Libertad", "Lima", "Ancash", "Lima", "Lima", …
## $ clasif_sbs   <int> 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, …
## $ nivel_educ   <fct> UNIVERSITARIA, TECNICA, UNIVERSITARIA, TECNICA, TECNICA, …

Estadísticas Descriptivas

Las estadísticas descriptivas resumen el comportamiento de las variables numéricas mediante medidas como el valor mínimo, la media y el valor máximo. Este análisis facilita la comprensión de la distribución de los datos y ayuda a detectar posibles valores atípicos o inconsistencias.

tabla_desc <- data.frame(
  Variable = c("Edad","Ingreso","Deuda","Score","Atraso"),
  Min = c(min(banco$edad, na.rm = TRUE),
          min(banco$ingreso, na.rm = TRUE),
          min(banco$deuda_sf, na.rm = TRUE),
          min(banco$score, na.rm = TRUE),
          min(banco$atraso, na.rm = TRUE)),
  Media = c(mean(banco$edad, na.rm = TRUE),
            mean(banco$ingreso, na.rm = TRUE),
            mean(banco$deuda_sf, na.rm = TRUE),
            mean(banco$score, na.rm = TRUE),
            mean(banco$atraso, na.rm = TRUE)),
  Max = c(max(banco$edad, na.rm = TRUE),
          max(banco$ingreso, na.rm = TRUE),
          max(banco$deuda_sf, na.rm = TRUE),
          max(banco$score, na.rm = TRUE),
          max(banco$atraso, na.rm = TRUE))
)

kable(tabla_desc,
       digits=2,
       caption="Estadísticas descriptivas")
Estadísticas descriptivas
Variable Min Media Max
Edad 20.0 36.40 85.00
Ingreso 123.7 4350.41 30000.00
Deuda 0.0 6110.72 57094.38
Score 134.0 196.62 266.00
Atraso 0.0 4.46 245.00

Tabla Descriptiva de Variables Numéricas

El gráfico de distribución muestra la frecuencia de cada categoría de la variable objetivo. Su propósito es identificar si existe un balance adecuado entre las clases o si alguna de ellas presenta una representación considerablemente menor.

tabla_banco <- banco %>%
  select(
    edad,
    ingreso,
    deuda_sf,
    score,
    atraso
  ) %>%
  summary()

kable(
  tabla_banco,
  caption = "Estadísticas Descriptivas del Dataset Banco"
)
Estadísticas Descriptivas del Dataset Banco
edad ingreso deuda_sf score atraso
Min. :20.0 Min. : 123.7 Min. : 0.0 Min. :134.0 Min. : 0.000
1st Qu.:29.0 1st Qu.: 1366.7 1st Qu.: 478.3 1st Qu.:182.0 1st Qu.: 0.000
Median :34.0 Median : 2400.0 Median : 2258.8 Median :197.0 Median : 0.000
Mean :36.4 Mean : 4350.4 Mean : 6110.7 Mean :196.6 Mean : 4.463
3rd Qu.:42.0 3rd Qu.: 4900.0 3rd Qu.: 5755.1 3rd Qu.:212.0 3rd Qu.: 2.000
Max. :85.0 Max. :30000.0 Max. :57094.4 Max. :266.0 Max. :245.000
NA NA NAs :461 NA NA

Distribución de la Mora

table(banco$mora)
## 
##    0    1 
## 2484 5915
ggplot(
  banco,
  aes(x = factor(mora))
) +
  geom_bar() +
  labs(
    title = "Distribución de Clientes con Mora",
    x = "Mora",
    y = "Frecuencia"
  )

Distribución del Score Crediticio

Este histograma permite comparar la distribución del puntaje crediticio entre clientes con y sin mora. Su análisis facilita la identificación de patrones que puedan influir en la clasificación realizada por el modelo.

ggplot(
  banco,
  aes(
    x = score,
    fill = factor(mora)
  )
) +
  geom_histogram(
    bins = 30
  ) +
  labs(
    title = "Distribución del Score según Mora",
    fill = "Mora"
  )

Interpretación

Se observa que los clientes con mora presentan una mayor concentración en valores bajos del score crediticio, lo que indica una relación inversa entre ambas variables.

Ingreso según Mora

El diagrama de caja resume la distribución de los ingresos para cada categoría de mora mediante la mediana, los cuartiles y posibles valores atípicos. Esto permite comparar el comportamiento económico de ambos grupos.

ggplot(
  banco,
  aes(
    x = factor(mora),
    y = ingreso
  )
) +
  geom_boxplot() +
  labs(
    title = "Ingreso según Estado de Mora",
    x = "Mora",
    y = "Ingreso"
  )

Interpretación

Los clientes con mora tienden a presentar ingresos inferiores respecto a aquellos sin mora, aunque existe superposición entre ambos grupos.

Relación entre Deuda y Score

El diagrama de dispersión permite visualizar la relación existente entre el nivel de endeudamiento y el puntaje crediticio, diferenciando además las observaciones según la presencia o ausencia de mora.

ggplot(
  banco,
  aes(
    x = deuda_sf,
    y = score,
    color = factor(mora)
  )
) +
  geom_point(
    alpha = 0.5
  ) +
  labs(
    title = "Relación entre Deuda y Score",
    color = "Mora"
  )

Interpretación

Existe una tendencia donde mayores niveles de deuda se asocian con menores valores del score crediticio y una mayor presencia de clientes en mora.

Matriz de Correlación

La matriz de correlación muestra el grado de asociación lineal entre las variables numéricas del conjunto de datos. Valores cercanos a 1 o -1 indican relaciones fuertes, mientras que valores cercanos a 0 representan relaciones débiles.

numericas <- banco %>%
  select(
    atraso,
    edad,
    dias_lab,
    exp_sf,
    nivel_ahorro,
    ingreso,
    linea_sf,
    deuda_sf,
    score
  )

corrplot(
  cor(numericas),
  method = "color"
)

División Entrenamiento y Prueba

set.seed(123)

indice <- createDataPartition(
  banco$mora,
  p = 0.70,
  list = FALSE
)

train <- banco[indice, ]
test <- banco[-indice, ]

kable(
  data.frame(
    Conjunto = c("Entrenamiento", "Prueba"),
    Registros = c(nrow(train), nrow(test))
  ),
  caption = "Distribución de los datos"
)
Distribución de los datos
Conjunto Registros
Entrenamiento 5880
Prueba 2519

Construcción del Modelo

modelo_logit <- glm(
  mora ~ atraso +
    edad +
    dias_lab +
    exp_sf +
    nivel_ahorro +
    ingreso +
    linea_sf +
    deuda_sf +
    score +
    vivienda +
    nivel_educ,
  data = train,
  family = binomial
)
coeficientes <- data.frame(
  Variable = names(coef(modelo_logit)),
  Coeficiente = coef(modelo_logit)
)

coeficientes <- coeficientes[
  order(abs(coeficientes$Coeficiente),
        decreasing = TRUE),
]

kable(
  head(coeficientes,10),
  digits=3,
  caption="Variables con mayor influencia"
)
Variables con mayor influencia
Variable Coeficiente
(Intercept) (Intercept) 5.884
nivel_educSIN EDUCACION nivel_educSIN EDUCACION 0.570
viviendaFAMILIAR viviendaFAMILIAR -0.242
nivel_educUNIVERSITARIA nivel_educUNIVERSITARIA -0.165
viviendaPROPIA viviendaPROPIA 0.110
nivel_ahorro nivel_ahorro -0.069
nivel_educTECNICA nivel_educTECNICA -0.025
score score -0.020
atraso atraso 0.019
edad edad 0.018

Predicciones

probabilidades <- predict(
  modelo_logit,
  newdata = test,
  type = "response"
)

predicciones <- factor(
  ifelse(probabilidades > 0.5, 1, 0),
  levels = c(0, 1)
)

real <- factor(
  test$mora,
  levels = c(0, 1)
  
)
kable(
  head(data.frame(
  Probabilidad = round(probabilidades, 4),
  Prediccion = predicciones,
  Valor_real = real
)))
Probabilidad Prediccion Valor_real
3 0.8305 1 0
4 0.7420 1 0
7 0.7915 1 0
8 0.8642 1 0
10 0.8048 1 0
11 0.7444 1 0

Matriz de Confusión

La matriz de confusión compara las clases reales con las clases predichas por el modelo. Esta herramienta permite identificar aciertos y errores de clasificación, siendo una de las principales métricas para evaluar el desempeño de un algoritmo predictivo.

mc_logit <- confusionMatrix(
  predicciones,
  real
)

# Mostrar la matriz de confusión
kable(
  mc_logit$table,
  caption = "Matriz de Confusión - Regresión Logística Binaria"
)
Matriz de Confusión - Regresión Logística Binaria
0 1
0 159 117
1 494 1592
# Mostrar el Accuracy
acc_logit <- as.numeric(
  mc_logit$overall["Accuracy"]
)

kable(
  data.frame(
    Métrica = "Accuracy",
    Valor = round(acc_logit, 4)
  ),
  caption = "Accuracy del modelo de Regresión Logística"
)
Accuracy del modelo de Regresión Logística
Métrica Valor
Accuracy 0.7413

Importancia de Variables

coeficientes <- data.frame(
  Variable = names(coef(modelo_logit)),
  Coeficiente = coef(modelo_logit)
)

coeficientes %>%
  arrange(desc(abs(Coeficiente))) %>%
  head(10) %>%
  kable(
    caption = "Variables con Mayor Influencia en el Modelo"
  )
Variables con Mayor Influencia en el Modelo
Variable Coeficiente
(Intercept) (Intercept) 5.8841661
nivel_educSIN EDUCACION nivel_educSIN EDUCACION 0.5702450
viviendaFAMILIAR viviendaFAMILIAR -0.2416742
nivel_educUNIVERSITARIA nivel_educUNIVERSITARIA -0.1650579
viviendaPROPIA viviendaPROPIA 0.1104701
nivel_ahorro nivel_ahorro -0.0694874
nivel_educTECNICA nivel_educTECNICA -0.0252847
score score -0.0198077
atraso atraso 0.0187386
edad edad 0.0179670

Interpretación

La regresión logística estima la probabilidad de que un cliente presente mora a partir de variables financieras y sociodemográficas.

La matriz de confusión permite evaluar la capacidad de clasificación del modelo.

Modelo 2: Naive Bayes para Riesgo de Erosión Costera

La base de datos de playas contiene información física y ambiental relacionada con el riesgo de erosión costera.

Variables predictoras:

playas <- read.csv2("playas_riesgo_erosion.csv")

playas <- playas %>%
  select(
    -X,
    -X.1,
    -X.2,
    -X.3
  )

playas <- playas %>%
  mutate(
    across(
      everything(),
      as.factor
    )
  )
playas <- read.csv2("playas_riesgo_erosion.csv")

playas$Geologia_costera[
  playas$Geologia_costera == "volcánica"
] <- "volcanica"

playas$Geologia_costera[
  playas$Geologia_costera == "mixtas"
] <- "mixta"

playas <- playas %>%
  mutate(
    across(everything(), as.factor)
  )

Dimensiones del Dataset

kable(
  data.frame(
    Registros = nrow(playas),
    Variables = ncol(playas)
  ),
  caption = "Dimensiones del Dataset Playas"
)
Dimensiones del Dataset Playas
Registros Variables
111 14

Primeros Registros

kable(
  head(playas),
  caption = "Primeros registros del Dataset Playas"
)
Primeros registros del Dataset Playas
ID_sector Tipo_entorno Geologia_costera Presencia_obra_dura Tipo_exposicion Energia_oleaje Tamano_dominante_grano Tendencia_retroceso_observada Ocupacion_hinterland Riesgo_erosion X X.1 X.2 X.3
1 urbano volcanica enrocado abierta_oceano 3 4 3 3 3 NA NA NA NA
2 urbano sedimentaria espigones abierta_oceano 3 4 3 3 3 NA NA NA NA
3 semiurbano sedimentaria ninguna bahia_semicerrada 2 3 2 2 2 NA NA NA NA
4 rural volcanica ninguna protegida 1 2 1 1 1 NA NA NA NA
5 rural mixta ninguna bahia_semicerrada 1 1 1 1 1 NA NA NA NA
6 semiurbano mixta enrocado abierta_oceano 2 3 2 2 2 NA NA NA NA

Estructura de los Datos

glimpse(playas)
## Rows: 111
## Columns: 14
## $ ID_sector                     <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1…
## $ Tipo_entorno                  <fct> urbano, urbano, semiurbano, rural, rural…
## $ Geologia_costera              <fct> volcanica, sedimentaria, sedimentaria, v…
## $ Presencia_obra_dura           <fct> enrocado, espigones, ninguna, ninguna, n…
## $ Tipo_exposicion               <fct> abierta_oceano, abierta_oceano, bahia_se…
## $ Energia_oleaje                <fct> 3, 3, 2, 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, 2…
## $ Tamano_dominante_grano        <fct> 4, 4, 3, 2, 1, 3, 4, 3, 2, 3, 3, 2, 4, 3…
## $ Tendencia_retroceso_observada <fct> 3, 3, 2, 1, 1, 2, 3, 2, 1, 2, 1, 1, 3, 2…
## $ Ocupacion_hinterland          <fct> 3, 3, 2, 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, 2…
## $ Riesgo_erosion                <fct> 3, 3, 2, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2…
## $ X                             <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ X.1                           <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ X.2                           <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ X.3                           <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …

Distribución del Riesgo de Erosión

Esta gráfica presenta la frecuencia de cada nivel de riesgo de erosión costera presente en el conjunto de datos. Su análisis permite conocer cómo se distribuyen las observaciones entre las distintas categorías y verificar si existe un equilibrio adecuado entre las clases.

table(playas$Riesgo_erosion)
## 
##  1  2  3 
## 32 33 35
ggplot(
  playas,
  aes(
    x = Riesgo_erosion
  )
) +
  geom_bar() +
  labs(
    title = "Distribución del Riesgo de Erosión",
    x = "Nivel de Riesgo",
    y = "Frecuencia"
  )

Riesgo según Tipo de Entorno

Este gráfico compara la proporción de niveles de riesgo para cada tipo de entorno costero (rural, semiurbano y urbano). Permite identificar posibles asociaciones entre las características del entorno y la probabilidad de presentar un mayor riesgo de erosión.

ggplot(
  playas,
  aes(
    x = Tipo_entorno,
    fill = Riesgo_erosion
  )
) +
  geom_bar(
    position = "fill"
  ) +
  labs(
    title = "Riesgo de Erosión según Tipo de Entorno",
    y = "Proporción"
  )

Riesgo según Geología Costera

La gráfica muestra cómo varía la clasificación del riesgo según el tipo de geología predominante en cada playa. Este análisis facilita la identificación de formaciones geológicas que pueden estar relacionadas con una mayor vulnerabilidad frente a procesos erosivos.

ggplot(
  playas,
  aes(
    x = Geologia_costera,
    fill = Riesgo_erosion
  )
) +
  geom_bar(
    position = "fill"
  ) +
  labs(
    title = "Riesgo según Geología Costera",
    y = "Proporción"
  )

Riesgo según Energía del Oleaje

Este gráfico ilustra la distribución del riesgo de erosión en función de la energía del oleaje. Su objetivo es evaluar la posible influencia de la intensidad del oleaje sobre la clasificación final del riesgo.

ggplot(
  playas,
  aes(
    x = Energia_oleaje,
    fill = Riesgo_erosion
  )
) +
  geom_bar(
    position = "fill"
  ) +
  labs(
    title = "Riesgo según Energía del Oleaje",
    y = "Proporción"
  )

División Entrenamiento y Prueba

set.seed(123)

indice2 <- createDataPartition(
  playas$Riesgo_erosion,
  p = 0.70,
  list = FALSE
)

train2 <- playas[indice2, ]
test2 <- playas[-indice2, ]

Construcción del Modelo

En esta etapa se entrenó el modelo Naive Bayes utilizando el conjunto de datos de entrenamiento y las variables ambientales seleccionadas. El objetivo es aprender los patrones presentes en los datos para posteriormente clasificar el nivel de riesgo de erosión en nuevas observaciones.

modelo_nb <- naive_bayes(
  Riesgo_erosion ~
    Tipo_entorno +
    Geologia_costera +
    Presencia_obra_dura +
    Tipo_exposicion +
    Energia_oleaje +
    Tamano_dominante_grano +
    Tendencia_retroceso_observada +
    Ocupacion_hinterland,
  data = train2
)

Predicciones

Una vez entrenado el modelo, se realizaron predicciones sobre el conjunto de prueba. Estas predicciones permiten comparar las clases estimadas por el algoritmo con las observaciones reales y evaluar el desempeño del modelo mediante diferentes métricas.

pred_nb <- predict(
  modelo_nb,
  test2
)
kable(
  head(
    data.frame(
      Real = test2$Riesgo_erosion,
      Prediccion = pred_nb
    )
  ),
  caption = "Primeras predicciones realizadas por el modelo Naive Bayes"
)
Primeras predicciones realizadas por el modelo Naive Bayes
Real Prediccion
3 3
1 1
1 1
2 2
2 2
1 1

Matriz de Confusión

La matriz de confusión resume el desempeño del algoritmo comparando las categorías predichas con las categorías reales. A partir de esta información es posible identificar los aciertos de clasificación y los errores cometidos por el modelo.

mc_nb <- confusionMatrix(
  pred_nb,
  test2$Riesgo_erosion
)

kable(
  as.data.frame(mc_nb$table),
  caption = "Matriz de confusión del modelo Naive Bayes"
)
Matriz de confusión del modelo Naive Bayes
Prediction Reference Freq
1 1 9
2 1 0
3 1 0
1 2 0
2 2 9
3 2 0
1 3 0
2 3 0
3 3 10

Tabla de Frecuencias

tabla_riesgo <- table(
  playas$Riesgo_erosion
)

kable(
  tabla_riesgo,
  caption = "Frecuencia de Niveles de Riesgo de Erosión"
)
Frecuencia de Niveles de Riesgo de Erosión
Var1 Freq
1 32
2 33
3 35

Acurracy

acc_nb <- as.numeric(
  mc_nb$overall["Accuracy"]
)

kable(
  data.frame(
    Métrica = "Accuracy",
    Valor = round(acc_nb, 4)
  ),
  caption = "Accuracy del modelo Naive Bayes"
)
Accuracy del modelo Naive Bayes
Métrica Valor
Accuracy 1

Interpretación

El algoritmo Naive Bayes clasifica el nivel de riesgo de erosión costera utilizando características físicas y ambientales.

Los resultados obtenidos permiten identificar patrones entre el entorno costero, la geología y la energía del oleaje, factores que influyen directamente en la vulnerabilidad de las playas frente a procesos erosivos.

Comparación de Modelos

La tabla comparativa presenta el desempeño obtenido por cada algoritmo mediante la métrica Accuracy, permitiendo identificar cuál de los modelos ofrece mejores resultados para el problema analizado. La métrica Accuracy representa la proporción de observaciones clasificadas correctamente respecto al total de casos evaluados. Un valor cercano a 1 indica un excelente desempeño del modelo.

comparacion <- data.frame(
  Modelo=c("Regresión Logística",
            "Naive Bayes"),
  Accuracy=c(acc_logit,
             acc_nb),
  Tipo=c("Binaria",
          "Multiclase")
)

kable(
  comparacion,
  digits=4,
  caption="Comparación de desempeño de los modelos"
)
Comparación de desempeño de los modelos
Modelo Accuracy Tipo
Regresión Logística 0.7413 Binaria
Naive Bayes 1.0000 Multiclase

Accuracy de los Modelos

resultados <- data.frame(
  Modelo = c(
    "Regresión Logística",
    "Naive Bayes"
  ),
  Accuracy = c(
    acc_logit,
    acc_nb
  )
)

kable(
  resultados,
  digits = 4,
  caption = "Comparación de Accuracy de los Modelos"
)
Comparación de Accuracy de los Modelos
Modelo Accuracy
Regresión Logística 0.7413
Naive Bayes 1.0000

Comparación Gráfica

ggplot(
  resultados,
  aes(
    x = Modelo,
    y = Accuracy,
    fill = Modelo
  )
) +
  geom_col(width = 0.6) +
  geom_text(
    aes(
      label = round(Accuracy,4)
    ),
    vjust = -0.5
  ) +
  ylim(0,1) +
  theme_minimal() +
  labs(
    title = "Comparación del Desempeño de los Modelos",
    x = "Modelo",
    y = "Accuracy"
  )

Discusión de Resultados

Regresión Logística

La Regresión Logística permitió modelar la probabilidad de mora bancaria utilizando variables financieras y sociodemográficas.

Las variables relacionadas con el historial crediticio, el nivel de endeudamiento y el score financiero mostraron capacidad para discriminar entre clientes con y sin mora.

La curva ROC y la matriz de confusión evidencian la capacidad predictiva del modelo para apoyar procesos de evaluación crediticia.

Naive Bayes

El algoritmo Naive Bayes clasificó los niveles de riesgo de erosión costera utilizando variables ambientales y geomorfológicas.

Las características asociadas al entorno costero, la energía del oleaje y la geología mostraron influencia sobre la clasificación final del riesgo.

Los resultados sugieren que este algoritmo constituye una alternativa eficiente para problemas de clasificación multiclase en contextos ambientales.

Conclusiones

  1. Se aplicaron exitosamente dos técnicas de clasificación supervisada utilizando bases de datos pertenecientes a sectores diferentes.

  2. La Regresión Logística permitió identificar factores asociados al incumplimiento crediticio y estimar la probabilidad de mora de los clientes.

  3. El algoritmo Naive Bayes logró clasificar adecuadamente los niveles de riesgo de erosión costera a partir de variables físicas y ambientales.

  4. Las métricas de desempeño demostraron que ambos modelos poseen capacidad predictiva útil para la toma de decisiones.

  5. La calidad de los resultados depende directamente de la preparación, limpieza y transformación adecuada de los datos.

  6. Las técnicas de Machine Learning constituyen herramientas valiosas para apoyar la gestión de riesgos en contextos financieros y ambientales.

Referencias

Referencias Bibliográficas

IBM. (2024). Logistic Regression. IBM Documentation.

IBM. (2024). Naive Bayes Classification. IBM Documentation.

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning (2nd ed.). Springer.

Kuhn, M., & Johnson, K. (2019). Feature Engineering and Selection. CRC Press.

Han, J., Kamber, M., & Pei, J. (2022). Data Mining: Concepts and Techniques. Morgan Kaufmann.

Kaggle. (2025). Credit Risk Dataset.

Kaggle. (2025). Coastal Erosion Risk Dataset.