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.
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.
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.
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:
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 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:
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.
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)
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"
)
| Registros | Variables |
|---|---|
| 8399 | 14 |
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"
)
| 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 |
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, …
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")
| 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 |
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"
)
| 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 |
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"
)
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.
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.
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.
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"
)
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"
)
| Conjunto | Registros |
|---|---|
| Entrenamiento | 5880 |
| Prueba | 2519 |
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"
)
| 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 |
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 |
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"
)
| 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"
)
| Métrica | Valor |
|---|---|
| Accuracy | 0.7413 |
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"
)
| 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 |
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.
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)
)
kable(
data.frame(
Registros = nrow(playas),
Variables = ncol(playas)
),
caption = "Dimensiones del Dataset Playas"
)
| Registros | Variables |
|---|---|
| 111 | 14 |
kable(
head(playas),
caption = "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 |
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, …
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"
)
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"
)
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"
)
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"
)
set.seed(123)
indice2 <- createDataPartition(
playas$Riesgo_erosion,
p = 0.70,
list = FALSE
)
train2 <- playas[indice2, ]
test2 <- playas[-indice2, ]
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
)
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"
)
| Real | Prediccion |
|---|---|
| 3 | 3 |
| 1 | 1 |
| 1 | 1 |
| 2 | 2 |
| 2 | 2 |
| 1 | 1 |
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"
)
| 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_riesgo <- table(
playas$Riesgo_erosion
)
kable(
tabla_riesgo,
caption = "Frecuencia de Niveles de Riesgo de Erosión"
)
| Var1 | Freq |
|---|---|
| 1 | 32 |
| 2 | 33 |
| 3 | 35 |
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"
)
| Métrica | Valor |
|---|---|
| Accuracy | 1 |
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.
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"
)
| Modelo | Accuracy | Tipo |
|---|---|---|
| Regresión Logística | 0.7413 | Binaria |
| Naive Bayes | 1.0000 | Multiclase |
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"
)
| Modelo | Accuracy |
|---|---|
| Regresión Logística | 0.7413 |
| Naive Bayes | 1.0000 |
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"
)
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.
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.
Se aplicaron exitosamente dos técnicas de clasificación supervisada utilizando bases de datos pertenecientes a sectores diferentes.
La Regresión Logística permitió identificar factores asociados al incumplimiento crediticio y estimar la probabilidad de mora de los clientes.
El algoritmo Naive Bayes logró clasificar adecuadamente los niveles de riesgo de erosión costera a partir de variables físicas y ambientales.
Las métricas de desempeño demostraron que ambos modelos poseen capacidad predictiva útil para la toma de decisiones.
La calidad de los resultados depende directamente de la preparación, limpieza y transformación adecuada de los datos.
Las técnicas de Machine Learning constituyen herramientas valiosas para apoyar la gestión de riesgos en contextos financieros y ambientales.
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.