Introducción

La presente investigación empezará partiendo del reconocimiento de que la expectativa de vida, más allá de ser un simple indicador estadístico, puede llegar a sintetizar múltiples dimensiones estructurales, pero ¿solo es suficiente saber si la expectativa de vida de un país es alta o baja para ya poder tener idea de que tan buena es la sanidad del país, su actividad económica, su seguridad, entre otras cosas que se tratan de inferir?

Bueno, a partir del conjunto de datos que recoge información diversa de distintos países, se puede conocer y llegar a predecir el valor de aquella peculiar variable, y satisfacer ese objetivo. Sin embargo, si se puede llegar a más interpretaciones, y tratar de inferir más de esos datos simplemente plasmados, ¿Por qué no hacerlo? ¿Por qué no plantearse desafíos a lo largo del trabajo para tratar de aprender y construir más sin dejar de lado el objetivo principal del trabajo?

Este estudio propondrá construir modelos capaces de identificar qué combinaciones de factores son más determinantes a la hora de predecir si un país se encuentra por encima o por debajo de un umbral alto de expectativa de vida teniendo en cuando cuáles variables o factores por mucho que puedan llegar a aparentar ser relevantes y característicos pueden llegar a tener o no, importancia y repercusión. Para ello, se utilizarán herramientas las cuales más allá de estar al alcance de muchos como un computador, es saber cómo utilizarlas y sacarles el provecho a que simplemente tenerlas ahí, simultáneamente haciendo uso también del código proporcionado que incluye, árboles de decisión, KNN, entre otros, que permitiendo no solo la exploración de la precisión del modelo, sino también la interpretación de sus reglas de clasificación.

Dado esto, la etapa exploratoria será fundamental a lo largo de todo este trabajo, porque no solo va a enriquecer el entendimiento del conjunto de datos, sino que también orienta la selección y transformación de variables, técnicas y métodos para optimizar el desempeño del modelo. En definitiva, más allá de los resultados cuantitativos, este trabajo busca demostrar cómo una adecuada integración entre análisis estadístico, preparación de datos, trabajo en equipo, uso de conocimientos y las herramientas en aprendizaje supervisado permite abordar problemas complejos desde una perspectiva robusta, replicable y alineada con los estándares de análisis de datos en contextos reales.

El análisis se centrará en:

  • La recolección y preparación rigurosa de un conjunto de datos de países a partir de fuentes abiertas.

  • Un análisis exploratorio para comprender las características de las variables y sus relaciones con la expectativa de vida.

  • La construcción, entrenamiento y evaluación de los modelos kNN y de Árboles de Decisión.

  • La interpretación de los modelos para identificar las variables más predictivas de una alta expectativa de vida.

  • La comparación del desempeño de ambos algoritmos para seleccionar el más adecuado para este problema.

  • Este estudio busca proporcionar información valiosa sobre los factores que se asocian con una alta expectativa de vida a nivel global, ofreciendo una perspectiva basada en el análisis de datos que pueda contribuir a futuros esfuerzos orientados a mejorar la salud y el bienestar en todo el mundo.

2. Metodología

La construcción del modelo de clasificación se llevó a cabo siguiendo una metodología estructurada que abarcó la recopilación y preparación de datos, su división en conjuntos de entrenamiento y prueba, y la aplicación de los algoritmos de clasificación seleccionados.

2.1 Fuentes y Recopilación de Datos

Los datos utilizados para este análisis provienen de diversas fuentes abiertas y confiables, principalmente de la plataforma Our World in Data y el Banco Mundial. Se recolectaron variables clave para el año 2021, con el objetivo de obtener una instantánea coherente de la situación global en ese período. Las bases de datos específicas consultadas incluyen información sobre Expectativa de Vida, PIB per Cápita, Población, Tasas de Mortalidad, Gasto en Salud, Mortalidad Infantil, Acceso a Saneamiento Básico, Población Urbana vs. Rural, Acceso a Agua Potable, e Índice de Desarrollo Humano (HDI).

2.2 Descripción de Variables

El conjunto de datos integrado utilizado para el modelado comprende las siguientes variables:

  • Expectativa de Vida (Expect): Variable cuantitativa que representa la expectativa de vida al nacer (en años). Esta es nuestra variable de interés principal, la cual transformaremos.
  • Continente (Continent): Variable categórica que indica el continente al que pertenece el país.
  • Índice de Desarrollo Humano (HDI): Variable categórica que clasifica el desarrollo humano del país (originalmente con varias categorías, recodificada para el análisis).
  • Población (Population): Variable cuantitativa que representa el total de habitantes del país.
  • PIB per Cápita (GDP): Variable cuantitativa que mide el Producto Interno Bruto por habitante, ajustado por paridad de poder adquisitivo.
  • Tasa de Mortalidad (Death_rate): Variable cuantitativa que indica el número de muertes por cada 1000 habitantes.
  • Gasto en Salud per Cápita (Care): Variable cuantitativa que representa el gasto total en salud por habitante.
  • Mortalidad Infantil (Infant): Variable cuantitativa que indica la tasa de mortalidad de infantes (generalmente por cada 1000 nacidos vivos).
  • Acceso a Saneamiento (Sanitation): Variable cuantitativa que mide el porcentaje de población con acceso a saneamiento básico.
  • Población Rural (Rural): Variable cuantitativa que indica el porcentaje de población que reside en áreas rurales.
  • Población Urbana (Urban): Variable cuantitativa que indica el porcentaje de población que reside en áreas urbanas.
  • Acceso a Agua Potable (Water): Variable cuantitativa que mide el porcentaje de población con acceso a servicios básicos de agua potable.

2.3 Procesamiento y Preparación de Datos

La etapa de procesamiento de datos involucró varias transformaciones para consolidar la información y adecuarla a los requisitos de los modelos de clasificación.

Primero, se cargaron las distintas bases de datos descargadas y se unieron en un único dataframe utilizando operaciones de left_join basadas en el país y el año. Este proceso permitió integrar toda la información relevante en una sola estructura.

Tras la unión, se procedió a la limpieza de datos, enfocándose en el manejo de valores faltantes (NA). Se optó por eliminar las filas que presentaban valores incompletos en cualquiera de las variables clave para asegurar que los modelos se entrenaran con un conjunto de datos completo y consistente.

Posteriormente, se realizaron transformaciones en algunas variables para simplificar las categorías o prepararlas para el modelado. Las variables categóricas como HDI (Índice de Desarrollo Humano) y Continent fueron recodificadas. En el caso de Continent, se agruparon subcategorías (como fusionar Oceanía con Asia y las Américas en una sola categoría) principalmente debido al bajo número de países en algunas de estas subcategorías, lo que podría afectar el entrenamiento del modelo. Para HDI, se siguió una recomendación del profesor de agrupar las categorías “High” y “Very High” para simplificar el análisis y la interpretación, resultando en tres categorías: High, Medium y Low.

#Cargamos las bases de datos con "readr y las indexamos a su repectiva variable"

bd_lif <- read.csv("life-expectancy.csv")
bd_gdp <- read.csv("gdp-per-capita-worldbank.csv")
bd_pop <- read.csv("population.csv")
bd_eng <- read.csv("yearly_full_release_long_format.csv") 
bd_hdi <- read_excel("HDR_Statistical_Annex_HDI_Table.xlsx")
bd_death <- read.csv("death-rate.csv")
bd_care <- read.csv("annual-healthcare-expenditure-per-capita.csv")
bd_inf <- read.csv("infant-mortality.csv")
bd_san <- read.csv("number-without-access-to-improved-sanitation.csv")
bd_uvr <- read.csv("urban-vs-rural-majority.csv")
bd_water <- read.csv("population-using-at-least-basic-drinking-water.csv")

#view(bd_gdp)
#view(bd_pop)
#view(bd_eng)
#view(bd_hdi)
#View(bd_lif)
#View(bd_death)
#view(bd_care)
#view(bd_inf)
#view(bd_san)
#view(bd_uvr)
#view(bd_water)

#Filtramos las bases de datos

bd_death_1 <- bd_death %>% 
  select(Entity, Year, Death.rate...Sex..all...Age..all...Variant..estimates) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Death_rate = Death.rate...Sex..all...Age..all...Variant..estimates
  )

#view(bd_death_1)

bd_hdi_1 <- bd_hdi %>% 
  select(Entity, Year, `HDI rank`) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    HDI = `HDI rank`
  )

#view(bd_hdi_1)

bd_gdp_1 <- bd_gdp %>% 
  select(Entity, Year, GDP.per.capita..PPP..constant.2021.international...) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    GDP = GDP.per.capita..PPP..constant.2021.international...
  )

#view(bd_gdp_1)

bd_pop_1 <- bd_pop %>% 
  select(Entity, Year, Population..historical.) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Population = Population..historical.
  )

#view(bd_pop_1)


bd_eng_1 <- bd_eng %>% 
  select(Area, Continent, Year) %>% 
  filter(Year == "2021") %>% 
  filter(!is.na(Continent))  # Elimina filas donde Continent es NA

#View(bd_eng_1)

bd_lif_1 <- bd_lif %>% 
  select(Entity, Year, Period.life.expectancy.at.birth...Sex..total...Age..0) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Expect = Period.life.expectancy.at.birth...Sex..total...Age..0
  )

#view(bd_lif_1)

bd_care_1 <- bd_care %>% 
  select(Entity, Year, Current.health.expenditure.per.capita..PPP..current.international...) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Care = Current.health.expenditure.per.capita..PPP..current.international...
  )

#view(bd_care_1)

bd_inf_1 <- bd_inf %>% 
  select(Entity, Year, Observation.value...Indicator..Infant.mortality.rate...Sex..Total...Wealth.quintile..Total...Unit.of.measure..Deaths.per.100.live.births) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Infant = Observation.value...Indicator..Infant.mortality.rate...Sex..Total...Wealth.quintile..Total...Unit.of.measure..Deaths.per.100.live.births
  )

#view(bd_inf_1)

bd_san_1 <- bd_san %>% 
  select(Entity, Year, The.totalpopulation.not.using.improved.sanitation.facilities) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Sanitation = The.totalpopulation.not.using.improved.sanitation.facilities
  )

#view(bd_san_1)

bd_uvr_1 <- bd_uvr %>% 
  select(Entity, Year, Share.of.population.residing.in.rural.areas..HYDE.estimates.and.UN.projections., Share.of.population.residing.in.urban.areas..HYDE.estimates.and.UN.projections.) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Rural = Share.of.population.residing.in.rural.areas..HYDE.estimates.and.UN.projections.,
    Urban = Share.of.population.residing.in.urban.areas..HYDE.estimates.and.UN.projections.
  )

#view(bd_uvr_1)

bd_water_1 <- bd_water %>% 
  select(Entity, Year, Share.of.the.population.using.at.least.basic.drinking.water.services) %>% 
  filter(Year == "2021") %>% 
  rename(
    Country = Entity,
    Water = Share.of.the.population.using.at.least.basic.drinking.water.services,
  )

#view(bd_water_1)


# Unimos las bases manteniendo todos los países y años

bd_final <- bd_gdp_1 %>%
  left_join(bd_pop_1, by = c("Country", "Year")) %>%
  left_join(bd_eng_1, by = c("Country" = "Area", "Year")) %>%
  left_join(bd_hdi_1, by = c("Country", "Year")) %>% 
  left_join(bd_lif_1, by = c("Country", "Year")) %>% 
  left_join(bd_death_1, by = c("Country", "Year")) %>%
  left_join(bd_care_1, by = c("Country", "Year")) %>%
  left_join(bd_inf_1, by = c("Country", "Year")) %>%
  left_join(bd_san_1, by = c("Country", "Year")) %>%
  left_join(bd_uvr_1, by = c("Country", "Year")) %>%
  left_join(bd_water_1, by = c("Country", "Year")) %>%
  filter(!is.na(Continent) & !is.na(Water) & !is.na(Urban) & !is.na(Rural) & !is.na(Sanitation) & !is.na(Infant) & !is.na(Care) & !is.na(Population) & !is.na(Death_rate) & !is.na(HDI) & !is.na(GDP) ) %>% 
  distinct(Country, .keep_all = TRUE) 


#view(bd_final)

Además, para las variables cuantitativas utilizadas como predictores, se aplicó un proceso de estandarización.

# Identifica las columnas numéricas en bd_final_1
columnas_numericas <- names(bd_final_1)[sapply(bd_final_1, is.numeric)]

# Excluye 'Expect' 
columnas_a_estandarizar <- columnas_numericas[!columnas_numericas %in% c("Expect")]

# Aplica la función de estandarización a las columnas seleccionadas
bd_final_2 <- bd_final_1 %>%
  mutate(across(.cols = all_of(columnas_a_estandarizar), .fns = scale))

La estandarización se realizó con el objetivo de dar el mismo peso a todas las variables numéricas en los algoritmos sensibles a la escala, como K-Nearest Neighbors (kNN). Como teníamos variables con rangos de valores muy diferentes (por ejemplo, Población comparada con tasas o porcentajes), estandarizarlas evita que las variables con magnitudes más grandes dominen injustamente el cálculo de distancias. Aunque para los Árboles de Decisión la estandarización no es estrictamente necesaria ya que se basan en umbrales y no en distancias, aplicarla de manera consistente a los predictores es una práctica recomendada cuando se comparan modelos de diferentes familias.

Finalmente, la variable continua Expect (Expectativa de Vida) fue transformada en nuestra variable objetivo binaria: Expect_high. Se definió que un país tiene “Alta Expectativa de Vida” si su Expect es mayor a 72 años, y “Baja Expectativa de Vida” en caso contrario.

bd_final_2$Expect_high <- ifelse(test = bd_final_2$Expect > 72, 
                                 yes = "Si", no = "No")

# Conversión de la variable respuesta a tipo factor
bd_final_2$Expect_high <- as.factor(bd_final_2$Expect_high)

# Una vez creada la nueva variable respuesta se descarta la original
bd_final_2$Expect = NULL

La elección de 72 años como punto de corte se basó estratégicamente en la mediana de la expectativa de vida en nuestro conjunto de datos. Este umbral permite dividir el dataset de manera que se obtenga una distribución de clases lo más equitativa posible (“aproximadamente mitad y mitad”), facilitando así el entrenamiento y la evaluación de modelos de clasificación, ya que se mitigan los problemas asociados al desbalance de clases.

Al final de este proceso, contamos con el dataframe bd_final_2, limpio, con variables transformadas y con nuestra variable objetivo binaria lista para el modelado.

2.4 División de Datos en Conjuntos de Entrenamiento y Prueba

Para evaluar el desempeño de los modelos de manera imparcial y evitar el sobreajuste, el conjunto de datos final (bd_final_2) fue dividido en dos subconjuntos: uno de entrenamiento (BD_entrena) y uno de prueba (BD_test).

Se utilizó la función createDataPartition del paquete caret para realizar esta división. Este método garantiza un muestreo estratificado, lo que significa que la proporción de países en cada categoría de nuestra variable objetivo (Expect_high - “Si” o “No”) es aproximadamente la misma en ambos conjuntos. Esto es particularmente importante en problemas de clasificación para asegurar que ambos conjuntos sean representativos de la distribución de clases en los datos originales.

La división se realizó utilizando el 75% de los datos para entrenamiento y el restante 25% para prueba.

set.seed(272014)
indEntrena <- createDataPartition(y = bd_final_2$Expect_high, p = 0.75, list = FALSE)

BD_entrena <- bd_final_2[indEntrena,]
BD_test <- bd_final_2[-indEntrena,]

# Verificar dimensiones de los conjuntos
dim(BD_entrena)
## [1] 101  12
dim(BD_test)
## [1] 33 12

2.5 Modelos de Clasificación Implementados

Para abordar el problema de clasificación binaria, se implementaron y evaluaron dos algoritmos de aprendizaje supervisado con características distintas: K-Nearest Neighbors (kNN) y Árboles de Decisión. Se eligieron estos métodos por su amplia aplicación y por representar enfoques diferentes (basado en distancia vs. basado en reglas) para la clasificación.

K-Nearest Neighbors (kNN): Este es un método no paramétrico que clasifica una observación basándose en la clase mayoritaria de sus ‘k’ vecinos más cercanos en el espacio de características. Su desempeño depende críticamente de la elección de ‘k’ y de la métrica de distancia utilizada. Empleamos la función train de caret para entrenar el modelo y optimizar el valor de ‘k’ mediante validación cruzada.

Árboles de Decisión: Son modelos intuitivos que dividen el conjunto de datos en subconjuntos basados en reglas de decisión simples inferidas de las variables predictoras. La estructura resultante es un árbol donde cada nodo representa una decisión basada en una variable y cada hoja es una predicción de clase. Exploramos la implementación de árboles utilizando los paquetes tree y rpart, que ofrecen diferentes enfoques para la construcción y poda del árbol.

La descripción detallada del entrenamiento de cada modelo y la evaluación de su rendimiento se presentan en la sección de Resultados del Modelo.

set.seed(272014)

BD_knnEntrenado <- train(Expect_high ~ .,
                         data = BD_entrena,
                         method = "knn",
                         tuneLength = 50, # Tunel
                        
)


#print(BD_knnEntrenado) # Muestra los resultados del entrenamiento, incluyendo el mejor k
plot(BD_knnEntrenado) # Visualiza la precisión vs k

3. Resultados Descriptivos

Antes de proceder con el modelado, realizamos un análisis descriptivo exhaustivo del conjunto de datos preparado. Esta etapa es fundamental para comprender la distribución y las características de las variables, identificar posibles patrones y relaciones iniciales entre las variables predictoras y nuestra variable objetivo (Expect_high), y formular hipótesis que puedan ser exploradas por los modelos de clasificación.

3.1 Estadísticas Resumen

Comenzamos examinando las estadísticas resumen de las variables en nuestro conjunto de datos final.

sum_bd_final_2
##   Continent             HDI        Population.V1          GDP.V1       
##  Length:134         High  :85   Min.   :-0.272037   Min.   :-0.929179  
##  Class :character   Medium:27   1st Qu.:-0.255572   1st Qu.:-0.749544  
##  Mode  :character   Low   :22   Median :-0.213757   Median :-0.383287  
##                                 Mean   : 0.000000   Mean   : 0.000000  
##                                 3rd Qu.:-0.088785   3rd Qu.: 0.537480  
##                                 Max.   : 7.839400   Max.   : 4.071953  
##     Death_rate.V1          Care.V1             Infant.V1     
##  Min.   :-2.300182   Min.   :-0.8423504   Min.   :-0.956153  
##  1st Qu.:-0.627906   1st Qu.:-0.7552749   1st Qu.:-0.790071  
##  Median :-0.141790   Median :-0.4428631   Median :-0.372067  
##  Mean   : 0.000000   Mean   : 0.0000000   Mean   : 0.000000  
##  3rd Qu.: 0.334478   3rd Qu.: 0.4211709   3rd Qu.: 0.598434  
##  Max.   : 3.876273   Max.   : 3.0745439   Max.   : 3.312044  
##     Sanitation.V1          Rural.V1             Urban.V1      
##  Min.   :-0.289285   Min.   :-1.8378085   Min.   :-2.2156981  
##  1st Qu.:-0.289174   1st Qu.:-0.7466334   1st Qu.:-0.7743306  
##  Median :-0.283975   Median :-0.2152796   Median : 0.2152797  
##  Mean   : 0.000000   Mean   : 0.0000000   Mean   : 0.0000000  
##  3rd Qu.:-0.116097   3rd Qu.: 0.7743307   3rd Qu.: 0.7466333  
##  Max.   : 8.988396   Max.   : 2.2156981   Max.   : 1.8378085  
##        Water.V1       Expect_high
##  Min.   :-2.8540032   No:72      
##  1st Qu.:-0.4362919   Si:62      
##  Median : 0.5074904              
##  Mean   : 0.0000000              
##  3rd Qu.: 0.7179351              
##  Max.   : 0.7332844
table_expect_high
## 
## No Si 
## 72 62
prop_table_expect_high
## 
##        No        Si 
## 0.5373134 0.4626866
ggplotly(barplot_hdi)

Al revisar el summary de las variables numéricas predictoras, observamos que, como se esperaba tras el proceso de estandarización, la mayoría presentan una media cercana a 0 y una desviación estándar cercana a 1. Esto confirma que la estandarización se aplicó correctamente, asegurando que estas variables tengan escalas comparables para los modelos sensibles a la distancia como kNN.

En cuanto a nuestra variable objetivo, Expect_high, las tablas de frecuencia y proporción muestran la distribución de países en cada categoría. Observamos que el 53.73% de los países en nuestro dataset final tienen “Baja Expectativa de Vida” (“No”) y el 46.26% restante tienen “Alta Expectativa de Vida” (“Si”). Esta división, que está notablemente balanceada (cercana a 50/50), es un resultado favorable de haber utilizado la mediana de la expectativa de vida (72 años) como punto de corte y haber empleado muestreo estratificado durante la división de datos. Un conjunto de datos de entrenamiento balanceado es crucial para desarrollar modelos de clasificación robustos, ya que evita que el algoritmo se sesgue hacia la predicción de la clase mayoritaria.

Al examinar la tabla de proporciones y el gráfico de barras apiladas que comparan el Índice de Desarrollo Humano (HDI) con la Expectativa de Vida Alta (Expect_high), se observa una relación extremadamente fuerte y clara. Para los países categorizados con HDI ‘High’, una abrumadora mayoría, específicamente el 71.76%, tiene Alta Expectativa de Vida. En marcado contraste, para los países con HDI ‘Medium’, solo un pequeño porcentaje, el 3.70%, logra alcanzar una Alta Expectativa de Vida. La diferencia es aún más drástica en los países con HDI ‘Low’, donde ninguno (0.00%) tiene Alta Expectativa de Vida en nuestro dataset. Este patrón demuestra que el nivel de desarrollo humano de un país es un predictor excepcionalmente potente de si tendrá o no una Alta Expectativa de Vida, con una progresión casi lineal en la proporción de países con alta longevidad a medida que aumenta el HDI.

Análisis e Interpretación de las Estadísticas:

3.2 Relación entre Variables Predictoras y la Variable Objetivo

Para visualizar la relación entre las variables predictoras y la variable objetivo binaria (Expect_high), examinamos cómo se distribuyen los valores de las predictoras para cada grupo de Expect_high.

3.2.1 Variables Cuantitativas vs. Expectativa de Vida Alta

Los diagramas de caja (boxplots) nos permiten comparar visualmente la distribución de cada variable cuantitativa entre los países con Baja (“No”) y Alta (“Si”) Expectativa de Vida. Hacemos estos gráficos dinámicos usando ggplotly.

ggplotly(boxplot_gdp)

Boxplot de GDP

Al observar el boxplot que compara el GDP (estandarizado) con la Expectativa de Vida Alta (Expect_high), se evidencia una clara y notable diferencia entre los países con Baja Expectativa de Vida (“No”) y Alta Expectativa de Vida (“Si”). Los países en la categoría de Baja Expectativa de Vida presentan valores de GDP considerablemente más bajos, con la mediana ubicada en aproximadamente -0.74 y la mayoría de sus datos (el 50% central, representado por la caja) entre -0.91 y -0.46. En contraste, los países con Alta Expectativa de Vida muestran valores de GDP notablemente más altos, con su mediana en aproximadamente 0.67 y la caja entre -0.08 y 1.13. Esta gran diferencia en las medianas y la casi total separación de las cajas (el cuartil superior del grupo “No” está en -0.46, mientras que el cuartil inferior del grupo “Si” está en -0.08) sugiere que un mayor Producto Interno Bruto per Cápita está fuertemente asociado con una mayor probabilidad de que un país tenga Alta Expectativa de Vida, lo que lo posiciona como un predictor muy importante para nuestro modelo de clasificación.

ggplotly(boxplot_care)

Boxplot de Care

El boxplot que muestra la distribución del Gasto en Salud per Cápita (estandarizado) en relación con la Expectativa de Vida Alta (Expect_high) también revela una diferencia sustancial entre los dos grupos de países. Para los países con Baja Expectativa de Vida (“No”), la distribución del Gasto en Salud se concentra en valores bajos y negativos en la escala estandarizada, con una mediana de aproximadamente -0.74. En contraste, los países con Alta Expectativa de Vida (“Si”) exhiben un Gasto en Salud considerablemente mayor, con una mediana de alrededor de 0.50 y la mayoría de sus valores (la caja) cayendo entre -0.16 y 1.63. Aunque hay cierta superposición en los rangos intercuartílicos entre los dos grupos, la diferencia en las medianas y la posición general de las cajas indican claramente que los países con Alta Expectativa de Vida tienden a tener un gasto en salud per cápita significativamente superior. Este patrón sugiere que una mayor inversión en salud está asociada con una mayor probabilidad de que un país alcance una Alta Expectativa de Vida, posicionando a esta variable como otro predictor relevante para nuestro modelo.

ggplotly(boxplot_infant)

Boxplot de infant

El boxplot que compara la Mortalidad Infantil (estandarizada) con la Expectativa de Vida Alta (Expect_high) muestra una diferencia extremadamente pronunciada entre los países con Baja Expectativa de Vida (“No”) y aquellos con Alta Expectativa de Vida (“Si”). Los países con Baja Expectativa de Vida presentan tasas de Mortalidad Infantil significativamente elevadas, con una mediana de aproximadamente 0.54 y el 50% central de sus datos (la caja) ubicado entre -0.18 y 1.42. En marcado contraste, los países con Alta Expectativa de Vida muestran tasas de Mortalidad Infantil drásticamente menores, con una mediana de alrededor de -0.81 y la mayoría de sus valores cayendo entre -0.96 y -0.64. La total separación de las cajas y la gran distancia entre las medianas de ambos grupos indican de manera contundente que una baja tasa de Mortalidad Infantil está fuertemente asociada con una Alta Expectativa de Vida. Esta variable emerge visualmente como uno de los predictores más potentes en nuestro análisis descriptivo.

ggplotly(boxplot_water)

Boxplot de water

El boxplot que compara el Acceso a Agua (estandarizado) con la Expectativa de Vida Alta (Expect_high) también muestra una diferencia notable entre los países con Baja Expectativa de Vida (“No”) y Alta Expectativa de Vida (“Si”). Para los países con Baja Expectativa de Vida (“No”), la distribución del acceso a agua se concentra en valores estandarizados más bajos, con una mediana de aproximadamente -0.24. El 50% central de sus datos (la caja) se ubica entre -1.49 y 0.73. En contraste, los países con Alta Expectativa de Vida (“Si”) presentan un acceso a agua consistentemente más alto, con una mediana de alrededor de 0.72 y la mayoría de sus valores (la caja) cayendo entre 0.59 y 0.73. La diferencia en las medianas es clara y las cajas muestran poca superposición, sugiriendo que un mayor acceso a servicios básicos de agua potable está fuertemente asociado con una Alta Expectativa de Vida. Esta variable parece ser un predictor importante en nuestro análisis descriptivo.

ggplotly(boxplot_sanitation)

Boxplot de sanitation

El boxplot que compara el Acceso a Saneamiento (estandarizado) con la Expectativa de Vida Alta (Expect_high) también sugiere una diferencia entre los grupos, aunque quizás menos pronunciada que en variables como Mortalidad Infantil o GDP. Para los países con Baja Expectativa de Vida (“No”), la distribución del acceso a saneamiento se concentra en valores estandarizados más bajos, con una mediana de aproximadamente -0.21. El 50% central de sus datos (la caja) se ubica entre -0.29 y 0.08. En contraste, los países con Alta Expectativa de Vida (“Si”) presentan un acceso a saneamiento generalmente más alto, con una mediana de alrededor de -0.20 y la mayoría de sus valores (la caja) cayendo entre -0.29 y -0.20.

Aunque la mediana del grupo “Si” (-0.20) es ligeramente superior a la del grupo “No” (-0.21), y la distribución general del grupo “Si” se extiende hacia valores más altos (con valores atípicos por encima de 2.5), la superposición de las cajas sugiere que el Acceso a Saneamiento, si bien relacionado, podría no tener un poder discriminatorio tan directo como otras variables observadas previamente. Sin embargo, la presencia de valores atípicos más altos en el grupo “Si” y la diferencia en la dispersión podrían ser indicativos de su relevancia. Este análisis sugiere que un mejor acceso a saneamiento está asociado con una Alta Expectativa de Vida, pero su relación podría ser menos lineal o directa que la de variables como Mortalidad Infantil o GDP.

ggplotly(boxplot_population)

Boxplot de population

Al examinar el boxplot que compara la Población (estandarizada) con la Expectativa de Vida Alta (Expect_high), observamos que no parece haber una diferencia marcada entre los países con Baja Expectativa de Vida (“No”) y aquellos con Alta Expectativa de Vida (“Si”). Para los países con Baja Expectativa de Vida (“No”), la mediana de la Población estandarizada es aproximadamente -0.20, con la caja (el 50% central) ubicada entre -0.26 y -0.09. De manera similar, los países con Alta Expectativa de Vida (“Si”) tienen una mediana de alrededor de -0.22, y su caja se encuentra entre -0.25 y -0.09. La proximidad de las medianas y la gran superposición de las cajas de ambos grupos sugieren que el tamaño de la población de un país, por sí solo, no parece ser un predictor fuerte de si tendrá Alta o Baja Expectativa de Vida en este análisis descriptivo. Aunque hay valores atípicos de población muy alta en ambos grupos, la distribución típica de la población no distingue claramente entre los países con alta y baja longevidad.

ggplotly(boxplot_urban)

Boxplot de urban

Al observar el boxplot que compara la Distribución Urbana (estandarizada) con la Expectativa de Vida Alta (Expect_high), notamos que, similar a la Población total, no hay una diferencia marcadamente clara entre los países con Baja Expectativa de Vida (“No”) y aquellos con Alta Expectativa de Vida (“Si”). Para el grupo “No”, la mediana de la Población Urbana estandarizada es aproximadamente -0.67, con la caja entre -1.20 y 0.17. Para el grupo “Si”, la mediana es alrededor de 0.60, con la caja entre 0.32 y 1.26. Si bien hay una diferencia en las medianas y las cajas están algo separadas, la dispersión de los datos en ambos grupos es considerable, y los bigotes se superponen ampliamente. Esto sugiere que, aunque podría existir una ligera tendencia de los países con Alta Expectativa de Vida a tener una distribución urbana mayor (o viceversa, ya que Rural y Urban suelen ser inversamente proporcionales), la variable Población Urbana por sí sola puede no ser un predictor tan fuerte o consistente de la Alta Expectativa de Vida en comparación con otras variables como Mortalidad Infantil o GDP.

ggplotly(boxplot_rural)

Boxplot de rural

Al observar el boxplot que compara la Distribución Rural (estandarizada) con la Expectativa de Vida Alta (Expect_high), notamos un patrón que parece ser inverso al observado con la distribución urbana, lo cual es esperado ya que estas variables suelen ser complementarias. Para los países con Baja Expectativa de Vida (“No”), la mediana de la Población Rural estandarizada es aproximadamente 0.67, con la caja entre *-0.17 y 1.20**. Para el grupo “Si” (Alta Expectativa de Vida), la mediana es alrededor de *-0.60, con la caja entre -1.26 y -0.32**. La diferencia en las medianas es clara, y las cajas muestran separación, sugiriendo que los países con mayor proporción de población rural tienden a tener Baja Expectativa de Vida, y viceversa. Aunque al igual que en la población urbana, la dispersión es considerable, esta variable sí parece tener un poder predictivo visual más claro que la población total, indicando que la distribución entre áreas rurales y urbanas puede ser relevante.

ggplotly(boxplot_deathrate)

Boxplot de deathrate

Finalmente, al examinar el boxplot que compara la Tasa de Muerte (estandarizada) con la Expectativa de Vida Alta (Expect_high), observamos que la diferencia entre los grupos de países es mínima. Para los países con Baja Expectativa de Vida (“No”), la mediana de la Tasa de Muerte estandarizada es aproximadamente -0.16, con la caja ubicada entre -0.63 y 0.19. De manera muy similar, los países con Alta Expectativa de Vida (“Si”) tienen una mediana de alrededor de -0.13, y su caja se encuentra entre -0.63 y 0.76. La gran superposición de las cajas y la cercanía de las medianas de ambos grupos indican que la Tasa de Muerte general, tal como se define en esta variable, no muestra una capacidad clara para distinguir entre países con Alta y Baja Expectativa de Vida en este análisis descriptivo. Esto sugiere que, a pesar de su relevancia general para la longevidad, esta métrica específica de tasa de muerte no es un predictor visualmente fuerte para nuestra clasificación binaria en comparación con otras variables.

set.seed(272014)

# Entrenamiento del modelo de árbol de clasificación
tree_clasificacion <- tree(
  formula = Expect_high ~ .,
  data    = BD_entrena, # Usar el conjunto de entrenamiento
  minsize = 5 # minsize es el número mínimo de observaciones en un nodo para considerar dividirlo. 0.1 no es un valor válido.
  # Ajusta minsize según tus necesidades. Un valor pequeño genera árboles más grandes.
)

summary(tree_clasificacion)
## 
## Classification tree:
## tree(formula = Expect_high ~ ., data = BD_entrena, minsize = 5)
## Variables actually used in tree construction:
## [1] "Infant"     "GDP"        "Rural"      "Water"      "Death_rate"
## [6] "Population"
## Number of terminal nodes:  9 
## Residual mean deviance:  0.06027 = 5.545 / 92 
## Misclassification error rate: 0.0198 = 2 / 101
# Visualización del árbol de clasificación
#plot(x = tree_clasificacion, type = "uniform") # type = "uniform" o "proportional"
#text(x = tree_clasificacion, splits = TRUE, pretty = 0, cex = 0.7, col = "firebrick")
set.seed(272014)

modelo_rpart <- rpart(
  formula = Expect_high ~ ., 
  data = bd_train,
  method = "class",
  control = rpart.control(cp = 0.0001)  # puedes ajustar cp según necesidad
)

# Visualizar el árbol
#rpart.plot(modelo_rpart, type = 3, extra = 104, under = TRUE, fallen.leaves = TRUE)
#summary(modelo_rpart)

La sección de importancia de variables indica que Infant (Mortalidad Infantil) es la variable más relevante (con una importancia de 22), y la inspección del nodo raíz (Node number 1) confirma que la primera y única división primaria se realizó utilizando esta variable, específicamente con un umbral de -0.251393 (valor estandarizado). Esto sugiere que, para este modelo y conjunto de datos, la Mortalidad Infantil es el predictor más potente y suficiente para la clasificación según el modelo rpart

4. Resultados del Modelo

En esta sección, presentamos los resultados obtenidos del entrenamiento y la evaluación de los modelos de clasificación K-Nearest Neighbors (kNN), Árbol de Decisión con el paquete tree, y Árbol de Decisión con el paquete rpart. El objetivo es evaluar su capacidad predictiva en el conjunto de prueba e interpretar qué variables resultan ser las más relevantes según cada algoritmo para clasificar países en categorías de Alta o Baja Expectativa de Vida.

4.1 K-Nearest Neighbors (kNN)

Entrenamos un modelo kNN utilizando la función train del paquete caret, optimizando el número de vecinos ‘k’ mediante validación cruzada en el conjunto de entrenamiento.

print(BD_knnEntrenado)
## k-Nearest Neighbors 
## 
## 101 samples
##  11 predictor
##   2 classes: 'No', 'Si' 
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 101, 101, 101, 101, 101, 101, ... 
## Resampling results across tuning parameters:
## 
##   k    Accuracy   Kappa     
##     5  0.8400497  0.67933343
##     7  0.8422955  0.68137903
##     9  0.8670976  0.73113306
##    11  0.8645009  0.72558487
##    13  0.8695777  0.73495868
##    15  0.8684257  0.73311454
##    17  0.8659354  0.72864177
##    19  0.8648519  0.72630132
##    21  0.8668356  0.73073668
##    23  0.8750439  0.74812178
##    25  0.8779975  0.75357041
##    27  0.8801042  0.75829233
##    29  0.8855078  0.77003809
##    31  0.8842869  0.76728134
##    33  0.8864821  0.77145090
##    35  0.8871466  0.77367424
##    37  0.8860694  0.77131283
##    39  0.8894308  0.77841170
##    41  0.8872298  0.77388041
##    43  0.8883372  0.77581575
##    45  0.8863126  0.77170171
##    47  0.8879937  0.77515661
##    49  0.8800040  0.76058694
##    51  0.8735828  0.74955096
##    53  0.8710419  0.74525233
##    55  0.8621606  0.73130368
##    57  0.8638392  0.73362688
##    59  0.8612530  0.72963671
##    61  0.8626476  0.73276136
##    63  0.8594925  0.73002704
##    65  0.8528039  0.71719467
##    67  0.8499480  0.71229692
##    69  0.8494785  0.71115804
##    71  0.8412180  0.69668337
##    73  0.8283530  0.67260248
##    75  0.8320426  0.68078985
##    77  0.8197725  0.65721151
##    79  0.8214615  0.66050555
##    81  0.8203124  0.65761498
##    83  0.8102863  0.63710149
##    85  0.7974517  0.61357377
##    87  0.7578633  0.54332489
##    89  0.7566161  0.54097255
##    91  0.7438052  0.51368618
##    93  0.6978513  0.41234166
##    95  0.6159293  0.22893555
##    97  0.5975089  0.19076746
##    99  0.5154192  0.02136505
##   101  0.5052566  0.00000000
##   103  0.5052566  0.00000000
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 39.
plot(BD_knnEntrenado)

Análisis e Interpretación del Entrenamiento kNN

El proceso de tuning del modelo kNN utilizando caret evaluó el rendimiento del modelo para un rango de valores de ‘k’ mediante validación cruzada. La salida del entrenamiento y el gráfico asociado (plot(BD_knnEntrenado)) muestran que el valor de ‘k’ óptimo seleccionado fue 39. En este punto, el modelo alcanzó un Accuracy (en validación cruzada) de 0.8182. Observando el gráfico, se aprecia que el Accuracy tiende a aumentar a medida que ‘k’ se incrementa desde valores bajos, estabilizándose alrededor de los valores de ‘k’ intermedios, y alcanzando su pico en k=39. Posteriormente, para valores de ‘k’ mayores, el Accuracy comienza a disminuir gradualmente. Alrededor del punto óptimo (k=39), el rendimiento se mantiene relativamente estable, indicando que la elección de k=39 es robusta y no se ve afectada drásticamente por pequeñas variaciones en el número de vecinos en esa región.

Ahora, evaluamos el rendimiento del modelo kNN entrenado (con el ‘k’ óptimo de 39) en el conjunto de prueba (BD_test) utilizando una matriz de confusión.

confusionMatrix(BD_knnPrediccion, BD_test$Expect_high)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 16  4
##         Si  2 11
##                                           
##                Accuracy : 0.8182          
##                  95% CI : (0.6454, 0.9302)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.001007        
##                                           
##                   Kappa : 0.6292          
##                                           
##  Mcnemar's Test P-Value : 0.683091        
##                                           
##             Sensitivity : 0.8889          
##             Specificity : 0.7333          
##          Pos Pred Value : 0.8000          
##          Neg Pred Value : 0.8462          
##              Prevalence : 0.5455          
##          Detection Rate : 0.4848          
##    Detection Prevalence : 0.6061          
##       Balanced Accuracy : 0.8111          
##                                           
##        'Positive' Class : No              
## 

Análisis e Interpretación de la Matriz de Confusión kNN

La evaluación del modelo kNN en el conjunto de prueba, reflejada en la matriz de confusión, muestra un rendimiento general con un Accuracy de 0.8182. Esto significa que el modelo clasificó correctamente aproximadamente al 81.82% de los países en el conjunto de prueba.

Analizando la matriz con más detalle:

  • Clasificó correctamente a 16 países con Baja Expectativa de Vida (“No”) (Verdaderos Negativos).
  • Clasificó correctamente a 11 países con Alta Expectativa de Vida (“Si”) (Verdaderos Positivos).
  • Clasificó erróneamente a 4 países con Alta Expectativa (“Si”) como de Baja Expectativa (“No”) (Falsos Negativos).
  • Clasificó erróneamente a 2 países con Baja Expectativa (“No”) como de Alta Expectativa (“Si”) (Falsos Positivos).

En términos de métricas clave :

  • La Sensibilidad fue de 0.8889, indicando que el modelo fue bueno identificando países que realmente tenían Baja Expectativa de Vida.
  • La Especificidad fue de 0.7333, mostrando una capacidad razonable para identificar países que realmente tenían Alta Expectativa de Vida.
  • El valor de Kappa fue de 0.6292, sugiriendo un acuerdo moderado entre las predicciones del modelo y los valores reales, mejor que el esperado por azar. En resumen, el modelo kNN demuestra una precisión aceptable, siendo más efectivo para identificar países con Baja Expectativa de Vida (mayor sensibilidad) que con Alta Expectativa de Vida (menor especificidad).

4.2 Árbol de Decisión (Paquete tree)

Entrenamos un árbol de decisión utilizando el paquete tree con un minsize de 5.

summary(tree_clasificacion)
## 
## Classification tree:
## tree(formula = Expect_high ~ ., data = BD_entrena, minsize = 5)
## Variables actually used in tree construction:
## [1] "Infant"     "GDP"        "Rural"      "Water"      "Death_rate"
## [6] "Population"
## Number of terminal nodes:  9 
## Residual mean deviance:  0.06027 = 5.545 / 92 
## Misclassification error rate: 0.0198 = 2 / 101
plot(x = tree_clasificacion, type = "uniform")
text(x = tree_clasificacion, splits = TRUE, pretty = 0, cex = 0.7, col = "firebrick")

Análisis e Interpretación del Árbol tree

La salida del summary(tree_clasificacion) revela que el árbol de decisión construido con el paquete tree tiene 9 nodos terminales. Las variables utilizadas en las divisiones iniciales, y por ende consideradas importantes por este algoritmo, incluyen Infant, GDP, Rural, Water, Death_rate y Population. El árbol no es extremadamente profundo, pero utiliza varias variables en sus reglas de decisión. El error de clasificación en el conjunto de entrenamiento reportado por el summary es 0.0198 (2 errores de 101 observaciones). Es importante recordar que este es el error en los datos de entrenamiento utilizados para construir el árbol y no necesariamente un indicador fiable de cómo se desempeñará en datos nuevos. La estructura del árbol, visualizada con plot(tree_clasificacion), muestra las ramificaciones y las reglas de división específicas basadas en los umbrales de las variables estandarizadas. Aunque utiliza varias variables, el árbol parece relativamente interpretable.

Ahora, evaluamos el rendimiento del árbol tree en el conjunto de prueba.

confusionMatrix(tree_prediccion, BD_test$Expect_high)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 16  4
##         Si  2 11
##                                           
##                Accuracy : 0.8182          
##                  95% CI : (0.6454, 0.9302)
##     No Information Rate : 0.5455          
##     P-Value [Acc > NIR] : 0.001007        
##                                           
##                   Kappa : 0.6292          
##                                           
##  Mcnemar's Test P-Value : 0.683091        
##                                           
##             Sensitivity : 0.8889          
##             Specificity : 0.7333          
##          Pos Pred Value : 0.8000          
##          Neg Pred Value : 0.8462          
##              Prevalence : 0.5455          
##          Detection Rate : 0.4848          
##    Detection Prevalence : 0.6061          
##       Balanced Accuracy : 0.8111          
##                                           
##        'Positive' Class : No              
## 

Análisis e Interpretación de la Matriz de Confusión tree

Al evaluar el árbol tree en el conjunto de prueba, la matriz de confusión muestra resultados idénticos a los del modelo kNN. El Accuracy General fue de 0.8182, con una Sensibilidad de 0.8889 y una Especificidad de 0.7333, y un Kappa de 0.6292. Las predicciones correctas e incorrectas también son las mismas . Este resultado idéntico en las métricas de test entre kNN y el árbol tree es inesperado y curioso, como ya se mencionó en el análisis proporcionado en el documento adjunto. Podría sugerir alguna característica particular en los datos o en la forma en que ambos modelos tomaron decisiones en este conjunto de prueba específico.

4.3 Árbol de Decisión (Paquete rpart)

Entrenamos un árbol de decisión utilizando el paquete rpart con un parámetro de complejidad (cp) de 0.0001. Este algoritmo realiza poda interna basada en validación cruzada para seleccionar el árbol óptimo.

summary(modelo_rpart)
## Call:
## rpart(formula = Expect_high ~ ., data = bd_train, method = "class", 
##     control = rpart.control(cp = 1e-04))
##   n= 67 
## 
##          CP nsplit rel error    xerror      xstd
## 1 0.7575758      0 1.0000000 1.1515152 0.1228965
## 2 0.0001000      1 0.2424242 0.5757576 0.1118011
## 
## Variable importance
##     Infant       Care        GDP Sanitation        HDI      Rural 
##         22         17         16         16         15         15 
## 
## Node number 1: 67 observations,    complexity param=0.7575758
##   predicted class=No  expected loss=0.4925373  P(node) =1
##     class counts:    34    33
##    probabilities: 0.507 0.493 
##   left son=2 (28 obs) right son=3 (39 obs)
##   Primary splits:
##       Infant < -0.251393  to the right, improve=20.07679, (0 missing)
##       Care   < -0.6391001 to the left,  improve=19.34968, (0 missing)
##       Water  < 0.3397394  to the left,  improve=17.52068, (0 missing)
##       GDP    < -0.6639296 to the left,  improve=16.99254, (0 missing)
##       HDI    splits as  RLL, improve=14.84036, (0 missing)
##   Surrogate splits:
##       Care       < -0.5581816 to the left,  agree=0.910, adj=0.786, (0 split)
##       GDP        < -0.7108913 to the left,  agree=0.881, adj=0.714, (0 split)
##       Sanitation < -0.2613159 to the right, agree=0.881, adj=0.714, (0 split)
##       HDI        splits as  RLL, agree=0.866, adj=0.679, (0 split)
##       Rural      < 0.04085876 to the right, agree=0.866, adj=0.679, (0 split)
## 
## Node number 2: 28 observations
##   predicted class=No  expected loss=0.03571429  P(node) =0.4179104
##     class counts:    27     1
##    probabilities: 0.964 0.036 
## 
## Node number 3: 39 observations
##   predicted class=Si  expected loss=0.1794872  P(node) =0.5820896
##     class counts:     7    32
##    probabilities: 0.179 0.821
rpart.plot(modelo_rpart, type = 3, extra = 104, under = TRUE, fallen.leaves = TRUE)

Análisis e Interpretación del Árbol rpart

El summary(modelo_rpart) proporciona información detallada sobre la construcción y poda del árbol. La tabla de poda (“Pruning tree”) revela que, a pesar de permitir un crecimiento potencialmente mayor con un cp bajo (0.0001), el algoritmo de poda basado en validación cruzada seleccionó un modelo con una sola división (nsplit=1) como el óptimo. Esto se debe a que esta primera división logró la mayor reducción en el error de validación cruzada (xerror), y las divisiones subsiguientes no ofrecieron suficiente mejora generalizable. La sección de “Variable importance” confirma la fuerte relevancia de Mortalidad Infantil (Infant), asignándole la mayor importancia (22), lo cual se ve reflejado en los detalles del Nodo 1 donde Infant < -0.251393 (aproximadamente < 2.32 al desestandarizar, [Source 6]) es la división primaria con la mayor mejora. El gráfico del árbol (rpart.plot) visualiza claramente esta estructura simple: un solo nodo de decisión basado en el umbral de Mortalidad Infantil. Los países con Mortalidad Infantil estandarizada mayor o igual a -0.25 se clasifican predominantemente como “No” (Baja Expectativa), mientras que aquellos con valores menores a -0.25 se clasifican predominantemente como “Si” (Alta Expectativa), con las proporciones y porcentajes de países en cada nodo terminal indicados en el gráfico.

Ahora, evaluamos el rendimiento del árbol rpart en el conjunto de prueba.

confusionMatrix(pred_rpart, bd_test$Expect_high)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction No Si
##         No 32  1
##         Si  6 28
##                                          
##                Accuracy : 0.8955         
##                  95% CI : (0.7965, 0.957)
##     No Information Rate : 0.5672         
##     P-Value [Acc > NIR] : 4.841e-09      
##                                          
##                   Kappa : 0.7915         
##                                          
##  Mcnemar's Test P-Value : 0.1306         
##                                          
##             Sensitivity : 0.8421         
##             Specificity : 0.9655         
##          Pos Pred Value : 0.9697         
##          Neg Pred Value : 0.8235         
##              Prevalence : 0.5672         
##          Detection Rate : 0.4776         
##    Detection Prevalence : 0.4925         
##       Balanced Accuracy : 0.9038         
##                                          
##        'Positive' Class : No             
## 

Análisis e Interpretación de la Matriz de Confusión rpart

La evaluación del modelo rpart en el conjunto de prueba muestra el mejor rendimiento entre los tres modelos implementados. Logró un Accuracy General de 0.8955, significativamente superior al de kNN y el árbol tree.

Analizando la matriz con más detalle:

  • Clasificó correctamente a 32 países con Baja Expectativa de Vida (“No”) (Verdaderos Negativos).
  • Clasificó correctamente a 28 países con Alta Expectativa de Vida (“Si”) (Verdaderos Positivos).
  • Clasificó erróneamente a 1 país con Alta Expectativa (“Si”) como de Baja Expectativa (“No”) (Falso Negativo).
  • Clasificó erróneamente a 6 países con Baja Expectativa (“No”) como de Alta Expectativa (“Si”) (Falsos Positivos).

Las métricas clave:

  • La Sensibilidad fue de 0.8421.
  • La Especificidad fue de 0.9655, indicando una excelente capacidad para identificar correctamente países con Alta Expectativa de Vida.
  • El valor predictivo positivo fue de 0.9697, mostrando que cuando predice “No”, es correcto casi el 97% de las veces.
  • El valor predictivo negativo fue de 0.8235.
  • El Kappa fue de 0.7915, mostrando un fuerte acuerdo y rendimiento del modelo.

En resumen, el modelo rpart destaca por su alta precisión y, particularmente, por su alta especificidad, siendo muy efectivo identificando países con Alta Expectativa de Vida, a pesar de su simplicidad.

4.4 Comparación de Modelos y Elección del Mejor

Basado en la comparativa de métricas en el conjunto de prueba, el modelo rpart generalmente presenta el mejor rendimiento global para este problema de clasificación.

  • Accuracy: El modelo rpart alcanzó el Accuracy más alto (0.8955), lo que significa que clasificó correctamente un mayor porcentaje total de países en comparación con kNN y el árbol tree (ambos con 0.8182).

  • Sensibilidad y Especificidad: kNN y el árbol tree mostraron una mayor Sensibilidad (0.8889), siendo mejores para identificar países con Baja Expectativa de Vida (“No” - nuestra clase positiva en las matrices de confusión). Sin embargo, el modelo rpart demostró una Especificidad significativamente superior (0.9655), destacándose por su excelente capacidad para identificar correctamente países con Alta Expectativa de Vida (“Si”).

  • Valores Predictivos: rpart tuvo un Valor Predictivo Positivo (VPP) muy alto (0.9697), indicando que cuando predice Baja Expectativa (“No”), es muy probable que sea correcto ([Source 68]). kNN y tree tuvieron VPPs más bajos (0.8000). Por otro lado, kNN y tree tuvieron un Valor Predictivo Negativo (VPN) ligeramente mejor (0.8462) que rpart (0.8235) para predecir correctamente la clase “Si” cuando predicen “Si” ([Source 69]). Kappa: El estadístico Kappa, que mide el acuerdo más allá del azar, también fue más alto para rpart (0.7915) comparado con kNN y tree (ambos con 0.6292), sugiriendo una mejor concordancia general entre las predicciones y los valores reales para rpart.

Considerando el rendimiento general, la mayor precisión, una especificidad notablemente alta (importante si queremos ser muy certeros al identificar países con Alta Expectativa de Vida), un alto VPP y un mejor Kappa, el modelo rpart se considera la mejor opción para este problema de clasificación, a pesar de que kNN y el árbol tree fueron marginalmente mejores en sensibilidad y VPN. Su robusto rendimiento en la identificación de la clase “Si” (Alta Expectativa de Vida) lo convierte en el modelo preferido para este análisis.

4.5 Importancia de Variables según los Modelos

La interpretabilidad de los árboles de decisión nos permite identificar las variables que resultaron más relevantes para la clasificación.

  • En el árbol tree, el summary y la visualización muestran que variables como Infant, GDP, Rural, Water, Death_rate y Population fueron utilizadas en las divisiones, contribuyendo a las reglas de decisión. Las primeras divisiones, que son generalmente las más importantes, se basaron en Infant, GDP y Death_rate.

  • De manera más explícita, el summary del modelo rpart proporciona una medida de “Variable importance”. Aquí, Mortalidad Infantil (Infant) destaca claramente como la variable más importante para la clasificación (con un valor de importancia de 22). Otras variables con importancia significativa fueron Care (17), GDP (16), Sanitation (16), HDI (15) y Rural (15).

Estos hallazgos del modelo son consistentes con los patrones fuertes que observamos durante el análisis descriptivo (Sección 3). Las variables que mostraron las diferencias más marcadas en los boxplots cuantitativos (como Infant, Care, GDP, Water) y en las tablas categóricas (HDI) son precisamente las que los modelos de árboles identificaron como las más importantes para la clasificación.

5. Conclusiones

A lo largo del desarrollo de este trabajo, se permitió demostrar la utilidad de los modelos de clasificación supervisada cuando se hace buen uso de esta herramienta y se logra hacer buen uso de unos simples datos accesibles, para poder así haber realizado el riguroso análisis de uno de los fenómenos sociales más complejos como es la expectativa de vida ya que se supone que todos somos iguales y que merecemos tener una expectativa de vida alta para lograr poder lograr llegar a vivir mucho. Lo cual, no es así, y sí se ve afectado por diversos factores mencionados a lo largo del trabajo, que hacen que dependiendo de donde estes, dependa en gran medida, tu longevidad en esta tierra. Con esto, a través de la construcción de una variable binaria y el uso de múltiples variables explicativas, fue posible implementar algoritmos como KNN, árboles de decisión y Naive Bayes, alcanzando niveles de precisión superiores al 80% en varios casos. Este rendimiento, respaldado por matrices de confusión con bajo número de falsos positivos y negativos, evidencia la capacidad de los modelos para capturar patrones reales en los datos y medir con eficacia entre países que no conocemos y seguramente ni siquiera vayamos a tocar, si cuentan con alta y baja esperanza de vida.

Más allá de los resultados numéricos, el proceso de modelado nos permitió fortalecer habilidades analíticas clave: desde la selección e interpretación de variables relevantes, hasta la lectura crítica de los resultados para plasmarla en el trabajo con una riqueza textual. No se trató únicamente de ejecutar algoritmos, sino de comprender cómo se relacionan los factores sociales, económicos y sanitarios con lo mucho o poco que pueden llegar a vivir las personas, y cómo esto se traduce en decisiones del modelo. Fue precisamente en ese ejercicio interpretativo donde radicó el valor del trabajo.

Durante la comparación de modelos, se evidenció un comportamiento curioso: KNN y el árbol de decisión arrojaron predicciones prácticamente idénticas. Esto, aunque positivo desde el punto de vista del rendimiento hipotético que debería tener, abre una idea para poder indagar e investigar más para pulir, con respecto a la estructura interna de los datos y la posible repeticiones o “redundancias” de variables o patrones demasiado marcados. Ya que, reconocer y cuestionar este tipo de comportamientos es parte del pensamiento analítico que buscamos aplicar para mejorar.

Finalmente, todo esto, nos reafirma la importancia de combinar herramientas computacionales con criterio analítico incluso para tratar de predecir un objetivo. Un buen modelo no es solo aquel que predice con exactitud lo que se busca, sino el que también permite aprender de los datos, cuestionar las tendencias y generar apartir de cuestionamiento el conocimiento para que trascienda la técnica. En ese sentido, el trabajo no solo cumplió con los objetivos planteados, sino que nos retó a pensar más allá de las métricas, a interpretar la lógica de los modelos y a reflexionar críticamente sobre los datos y sus implicaciones.