Medición del desarrollo bajo el enfoque ortodoxo

Fernando Ascencio

2025-05-24

Instalar API

#install.packages("wbstats")

Librerias

library(wbstats)
library(dplyr)
library(tidyverse)
library(magrittr)
library(hablar)
library(ggplot2)
library(plotly)
library(TSstudio)
library(readxl)
library(readr)
library(writexl)
library(kableExtra)
library(openxlsx)
library(ineq)
library(purrr)

Ejemplo de calculo de indicador sintetico

Obtención de datos

Indicadores_disponibles<-wb_indicators(lang = "es")
datos_ejemplo<-wb_data(indicator = "NY.GDP.MKTP.KD.ZG", 
                       country = "SLV",
                       start_date = 2010,
                       end_date = 2024,
                       lang = "es")

# Dimensión Económica
D_Economica <- wb_data(indicator = c("NY.GDP.PCAP.CD",
                                     "NY.GNP.PCAP.PP.CD",
                                     "SI.DST.FRST.20",
                                     "9.0.Employer.All",
                                     "NY.GNS.ICTR.CD",
                                     "SL.AGR.EMPL.ZS",
                                     "SL.TLF.TOTL.IN",
                                     "SL.SRV.EMPL.ZS",
                                     "GC.REV.XGRT.CN",
                                     "GC.XPN.INTP.ZS"),
                      country = c("SLV","CAN", "USA", 
                      "MEX", "BLZ", "GTM", 
                      "HND", "NIC", "CRI", 
                      "PAN", "HTI", "CUB", "JAM", 
                      "DOM", "COL", "VEN", "PER", 
                      "CHL", "BOL", "ARG","BRA"),
                      start_date = 2010,
                      end_date = 2023, 
                      lang = "es")

D_Social <- wb_data(indicator = c("SI.POV.GINI",
                                  "SI.POV.NAHC",
                                  "1.0.PSev.1.90usd",
                                  "1.0.PSev.2.5usd",
                                  "SI.POV.DDAY",
                                  "SL.TLF.CACT.ZS",
                                  "SL.UEM.TOTL.ZS",
                                  "SE.XPD.TOTL.GB.ZS",
                                  "SH.XPD.CHEX.GD.ZS"),
                 country = c("SLV","CAN", "USA", 
                      "MEX", "BLZ", "GTM", 
                      "HND", "NIC", "CRI", 
                      "PAN", "HTI", "CUB", "JAM", 
                      "DOM", "COL", "VEN", "PER", 
                      "CHL", "BOL", "ARG","BRA"), 
                 start_date = 2010,
                 end_date = 2023, 
                 lang = "es")

# Batería del indicador sintetico
bateria_indicador_sintetico<- D_Economica %>% merge(D_Social, by.x =  c("country","iso3c","iso2c","date"),by.y =c("country","iso3c","iso2c","date"), all.x = T ) 

Normalización de los datos

# funciones de normalizacion de Carlos Ademir Perez Alas.
norm_directa<-function(x){(x-min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x, na.rm = TRUE))}
norm_inversa<-function(x){(max(x, na.rm = TRUE)-x)/(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))}

# Seleccionando las variables con correlación positiva 
bateria_indicador_sintetico %>% 
  select("NY.GDP.PCAP.CD",      # PIB per cápita
                         "NY.GNP.PCAP.PP.CD",   # Ingreso nacional bruto per cápita
                         "SI.DST.FRST.20",      # % ingreso 20% más pobre
                         "NY.GNS.ICTR.CD",      # Ahorro nacional bruto
                         "SL.SRV.EMPL.ZS",      # Empleo en servicios
                         "SL.TLF.CACT.ZS",      # Participación laboral
                         "SE.XPD.TOTL.GB.ZS",   # Gasto en educación
                         "SH.XPD.CHEX.GD.ZS",
                         "9.0.Employer.All",
                         "SL.TLF.TOTL.IN",
                         "GC.REV.XGRT.CN") %>%    # Gasto en salud 
  apply(MARGIN = 2,FUN = norm_directa) %>% 
  as.data.frame() -> variables_corr_positiva_h

# Seleccionando las variables con correlación negativa 
bateria_indicador_sintetico %>% 
  select("SI.POV.GINI",         # Gini
                         "SI.POV.NAHC",         # Pobreza nacional
                         "1.0.PSev.1.90usd",     # Pobreza severa ($1.90)
                         "1.0.PSev.2.5usd",      # Pobreza severa ($2.5)
                         "SI.POV.DDAY",          # Pobreza diaria
                         "SL.UEM.TOTL.ZS",       # Desempleo
                         "SL.AGR.EMPL.ZS",       # Empleo agrícola
                         "GC.XPN.INTP.ZS") %>%        # Pago de intereses 
  
  apply(MARGIN = 2,FUN = norm_inversa) %>% 
  as.data.frame() -> variables_corr_negativa_h

# Union de datos normalizados
bateria_normalizada<-bind_cols(variables_corr_positiva_h,variables_corr_negativa_h)

Imputación de datos

# Imputación de datos por la media
bateria_normalizada <-bateria_normalizada%>%
  mutate(across(everything(), ~ ifelse(is.na(.), round(mean(., na.rm = TRUE), 2), .)))

Calculo de las ponderaciones

Función

### Método CRITIC Funcion creada por Carlos Ademir Perez Alas, obtenida de https://rpubs.com/ca_ademir/critic_entropia
# Método CRITIC 
ponderadores_critic <- function(matriz_datos) {
  # Desviaciones de las variables
  sigma <- apply(X = matriz_datos, MARGIN = 2, sd)
  # Correlaciones entre las variables
  rho <- cor(matriz_datos)
  # Suma de las correlaciones excedentes
  cj <- apply(X = 1 - rho, MARGIN = 2, sum)
  # Cálculos de ponderadores
  pesos_brutos <- sigma * cj
  pesos_normalizados <- prop.table(pesos_brutos)
  # Salida de resultados
  resultados <- list(pesos_brutos = pesos_brutos,
                     pesos_normalizados = pesos_normalizados)
  return(resultados) 
}

Ponderaciones Variables

#Dimensión Económica
w_D_economica <- bateria_normalizada %>%
  select("NY.GDP.PCAP.CD",
                                     "NY.GNP.PCAP.PP.CD",
                                     "SI.DST.FRST.20",
                                     "9.0.Employer.All",
                                     "NY.GNS.ICTR.CD",
                                     "SL.AGR.EMPL.ZS",
                                     "SL.TLF.TOTL.IN",
                                     "SL.SRV.EMPL.ZS",
                                     "GC.REV.XGRT.CN",
                                     "GC.XPN.INTP.ZS")

Pesos_economicos <- ponderadores_critic(matriz_datos = w_D_economica)
Pesos_economicos$pesos_normalizados
##    NY.GDP.PCAP.CD NY.GNP.PCAP.PP.CD    SI.DST.FRST.20  9.0.Employer.All 
##        0.07688171        0.07463735        0.10701575        0.08600576 
##    NY.GNS.ICTR.CD    SL.AGR.EMPL.ZS    SL.TLF.TOTL.IN    SL.SRV.EMPL.ZS 
##        0.07909822        0.12059667        0.12161783        0.12826417 
##    GC.REV.XGRT.CN    GC.XPN.INTP.ZS 
##        0.09526723        0.11061531
#Dimensión Social
w_D_social <- bateria_normalizada %>%
  select("SI.POV.GINI",
                                  "SI.POV.NAHC",
                                  "1.0.PSev.1.90usd",
                                  "1.0.PSev.2.5usd",
                                  "SI.POV.DDAY",
                                  "SL.TLF.CACT.ZS",
                                  "SL.UEM.TOTL.ZS",
                                  "SE.XPD.TOTL.GB.ZS",
                                  "SH.XPD.CHEX.GD.ZS")

Pesos_sociales <- ponderadores_critic(matriz_datos = w_D_social)
Pesos_sociales$pesos_normalizados
##       SI.POV.GINI       SI.POV.NAHC  1.0.PSev.1.90usd   1.0.PSev.2.5usd 
##        0.12291196        0.08882917        0.06405932        0.06259196 
##       SI.POV.DDAY    SL.TLF.CACT.ZS    SL.UEM.TOTL.ZS SE.XPD.TOTL.GB.ZS 
##        0.06898877        0.15604613        0.18835642        0.10231428 
## SH.XPD.CHEX.GD.ZS 
##        0.14590198

Multiplicación de Ponderaciones por datos normalizados para obtener Dimensión

# Matriz pesos económicos
Pesos_E <- Pesos_economicos$pesos_normalizados %>% as.vector.data.frame()
n <- 324
W_E <- map2(Pesos_E,n,.f = rep) %>% as.data.frame()

## Multiplicación y obtención de la dimensión
Multi_E <- w_D_economica * W_E 
Multi_E <- Multi_E %>% 
  mutate(Dimension_Economica= round(rowSums (Multi_E[ , 1:10]),2))
Multi_E <- Multi_E %>% select(Dimension_Economica)


# Matriz pesos sociales
Pesos_S <- Pesos_sociales$pesos_normalizados %>% as.vector.data.frame()
n <- 324
W_S <- map2(Pesos_S,n,.f = rep) %>% as.data.frame()

## Multiplicación y obtención de la dimensión
Multi_S <- w_D_social * W_S 
Multi_S <- Multi_S %>% 
  mutate(Dimension_Social= round(rowSums (Multi_S[ , 1:9]),2))
Multi_S <- Multi_S %>% select(Dimension_Social)


#Union de dimensiones
Bateria_dimensiones <- cbind(Multi_E,Multi_S)

Ponderaciones de dimensiones

Pesos_dimensiones <- ponderadores_critic(matriz_datos = Bateria_dimensiones)
Pesos_dimensiones$pesos_normalizados
## Dimension_Economica    Dimension_Social 
##           0.6244428           0.3755572
# Matriz pesos sociales
Pesos_D <- Pesos_dimensiones$pesos_normalizados %>% as.vector.data.frame()
n <- 324
W_D <- map2(Pesos_D,n,.f = rep) %>% as.data.frame()

## Multiplicación y obtención de la dimensión
Indicador_Sintetico <- Bateria_dimensiones * W_D
Indicador_Sintetico <- Indicador_Sintetico %>% 
  mutate(Indicador_Sintetico_Calculado= round(rowSums (Indicador_Sintetico[ , 1:2]),2))
Indicador_Sintetico <-Indicador_Sintetico %>% select(Indicador_Sintetico_Calculado)


Tabla_completa <- D_Economica %>% select(date,country)
Tabla_completa<-bind_cols(Tabla_completa,Bateria_dimensiones,Indicador_Sintetico)

Exportar Tabla a Excel

write.csv(Tabla_completa, "base_de_datos_procesados.csv", row.names = FALSE)

#write_xlsx(Tabla_completa,"Tabla de Indicador Sintetico1.xlsx")

Agrupar Paises por región

library(dplyr)
library(readxl)
Tabla_de_Indicador_Sintetico1 <- read_excel("Tabla de Indicador Sintetico1.xlsx")
norteamerica <- Tabla_de_Indicador_Sintetico1 %>% 
  filter(country %in% c("Canadá", "Estados Unidos", "México")) %>% 
  select(country, Indicador_Sintetico_Calculado,date)
df_na <- norteamerica %>%
  mutate(id = row_number()) %>%   # Crea un identificador único para cada fila
  pivot_wider(names_from = country, values_from = Indicador_Sintetico_Calculado, date)

centroamerica <- Tabla_de_Indicador_Sintetico1 %>% 
  filter(country %in% c("Belice", "Guatemala", "Honduras","El Salvador", "Nicaragua", "Costa Rica", "Panamá")) %>% 
  select(country, Indicador_Sintetico_Calculado,date)
df_ca <- centroamerica %>%
  mutate(id = row_number()) %>%   # Crea un identificador único para cada fila
  pivot_wider(names_from = country, values_from = Indicador_Sintetico_Calculado, date)

caribe <- Tabla_de_Indicador_Sintetico1 %>% 
  filter(country %in% c("Haití", "Cuba", "Jamaica", "República Dominicana")) %>% 
  select(country, Indicador_Sintetico_Calculado,date)
df_caribe <- caribe %>%
  mutate(id = row_number()) %>%   # Crea un identificador único para cada fila
  pivot_wider(names_from = country, values_from = Indicador_Sintetico_Calculado, date)

suramerica <- Tabla_de_Indicador_Sintetico1 %>% 
  filter(country %in% c("Colombia", "Venezuela", "Perú", "Chile", "Bolivia", "Argentina", "Brasil")) %>% 
  select(country, Indicador_Sintetico_Calculado, date)
df_sa <- suramerica %>%
  mutate(id = row_number()) %>%   # Crea un identificador único para cada fila
  pivot_wider(names_from = country, values_from = Indicador_Sintetico_Calculado, date)

bloques_geograficos <- df_ca %>%
  left_join(df_caribe, by = "date") %>%
  left_join(df_na,     by = "date") %>%
  left_join(df_sa,     by = "date")

Creacion de graficos

# Crear columna de región en la tabla completa
Tabla_completa <- Tabla_completa %>%
  mutate(region = case_when(
    country %in% c("Canadá", "Estados Unidos", "México") ~ "Norteamérica",
    country %in% c("Belice", "Guatemala", "Honduras", "El Salvador", "Nicaragua", "Costa Rica", "Panamá") ~ "Centroamérica",
    country %in% c("Haití", "Cuba", "Jamaica", "República Dominicana") ~ "Caribe",
    country %in% c("Colombia", "Venezuela", "Perú", "Chile", "Bolivia", "Argentina", "Brasil") ~ "Suramérica",
     TRUE ~ NA_character_
  )) %>%
  filter(!is.na(region))  # Elimina los NA (antes llamados "Otro")

# Calcular promedio por región y año
region_avg <- Tabla_completa %>%
  group_by(region, date) %>%
  summarise(promedio_indice = mean(Indicador_Sintetico_Calculado, na.rm = TRUE), .groups = "drop")

# Graficar evolución temporal
ggplot(region_avg, aes(x = date, y = promedio_indice, color = region, group = region)) +
  geom_line(size = 1.2) +
  geom_point() +
  theme_minimal() +
  labs(title = "Evolución del Indicador Sintético por Región",
       x = "Año", y = "Índice Promedio",
       color = "Región")

Tabla_completa %>%
  filter(date == 2023) %>%
  ggplot(aes(x = region, y = Indicador_Sintetico_Calculado, fill = region)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Distribución del Indicador Sintético por Región (2023)",
       x = "Región", y = "Índice")

library(ggplot2)

Tabla_completa %>%
  ggplot(aes(x = date, y = reorder(country, Indicador_Sintetico_Calculado), fill = Indicador_Sintetico_Calculado)) +
  geom_tile(color = "white") +
  scale_fill_viridis_c(option = "plasma") +
  labs(title = "Mapa de Calor del Indicador Sintético por País y Año",
       x = "Año", y = "País", fill = "Índice") +
  theme_minimal()

library(plotly)

plot_ly(region_avg, x = ~date, y = ~promedio_indice, color = ~region, type = 'scatter', mode = 'lines+markers') %>%
  layout(title = "Evolución Interactiva del Indicador Sintético por Región",
         xaxis = list(title = "Año"),
         yaxis = list(title = "Índice Promedio"))
# Países a comparar
paises_comparar <- c("El Salvador", "Estados Unidos", "México", "Guatemala", "Argentina", "Brasil")

# Filtrar datos
comparacion <- Tabla_completa %>%
  filter(country %in% paises_comparar)

# Gráfico
ggplot(comparacion, aes(x = date, y = Indicador_Sintetico_Calculado, color = country)) +
  geom_line(size = 1.2) +
  geom_point() +
  labs(title = "Comparación del Indicador Sintético: El Salvador vs Otros Países",
       x = "Año", y = "Indicador Sintético", color = "País") +
  theme_minimal()

# Último año disponible
ultimo_anio <- max(Tabla_completa$date)

# Filtrar ese año
datos_ultimo <- Tabla_completa %>%
  filter(date == ultimo_anio)

# Gráfico de barras
ggplot(datos_ultimo, aes(x = reorder(country, Indicador_Sintetico_Calculado), y = Indicador_Sintetico_Calculado, fill = country == "El Salvador")) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = c("TRUE" = "darkred", "FALSE" = "gray")) +
  labs(title = paste("Indicador sintético en", ultimo_anio, "- El Salvador en contexto"),
       x = "País", y = "Indicador Sintético") +
  coord_flip() +
  theme_minimal() +
  theme(legend.position = "none")

elsalvador <- Tabla_completa %>% filter(country == "El Salvador")

ggplot(elsalvador, aes(x = date, y = Indicador_Sintetico_Calculado)) +
  geom_line(color = "darkblue", size = 1.5) +
  geom_point(color = "darkblue") +
  labs(title = "Evolución del Indicador Sintético de El Salvador",
       x = "Año", y = "Indicador Sintético") +
  theme_minimal()

# Preparar datos
scatter_data <- bateria_indicador_sintetico %>%
  select(country, date, NY.GDP.PCAP.CD, 
         SL.AGR.EMPL.ZS, SL.SRV.EMPL.ZS) %>%
  filter(date == max(date))  # año más reciente

# Convertir a formato largo (sin industria)
scatter_long <- scatter_data %>%
  pivot_longer(cols = c(SL.AGR.EMPL.ZS, SL.SRV.EMPL.ZS),
               names_to = "sector",
               values_to = "empleo") %>%
  mutate(sector = recode(sector,
                         "SL.AGR.EMPL.ZS" = "Agricultura",
                         "SL.SRV.EMPL.ZS" = "Servicios"))

# Crear gráfico sin industria
ggplot(scatter_long, aes(x = NY.GDP.PCAP.CD, y = empleo, label = country)) +
  geom_point(color = "steelblue", size = 3, alpha = 0.7) +
  geom_text(size = 3, vjust = -1) +
  facet_wrap(~ sector, scales = "free_y") +
  labs(title = "Relación entre PIB per cápita y Empleo por Sector (sin Industria)",
       x = "PIB per cápita (USD)",
       y = "% Empleo") +
  theme_minimal()

#indice de Gini
library(WDI)
gini_data <- WDI(
  indicator = "SI.POV.GINI",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)

gini_data_1 <- gini_data %>%
  mutate(custom_region = case_when(
    country %in% c("Canada", "United States", "Mexico") ~ "Norteamérica",
    country %in% c("Belize", "Guatemala", "Honduras", "El Salvador", "Nicaragua", "Costa Rica", "Panama") ~ "Centroamérica",
    country %in% c("Haiti", "Cuba", "Jamaica", "Dominican Republic") ~ "Caribe",
    country %in% c("Colombia", "Venezuela, RB", "Peru", "Chile", "Bolivia", "Argentina", "Brazil") ~ "Suramérica",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(custom_region))


gini_clean <- gini_data_1 %>%
  filter(!is.na(SI.POV.GINI), !is.na(custom_region)) %>%
  select(country, iso2c, year, gini = SI.POV.GINI, custom_region)


ggplot(gini_clean, aes(x = year, y = gini, group = custom_region, color = custom_region)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  labs(
    title = "Índice de Gini por región (2010–2023)",
    x = "Año",
    y = "Índice de Gini (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()

#pib per capita por regiones
pibpc_data <- WDI(
  indicator = "NY.GDP.PCAP.CD",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)

pibpc_data <- pibpc_data %>%
  mutate(custom_region = case_when(
    country %in% c("Canada", "United States", "Mexico") ~ "Norteamérica",
    country %in% c("Belize", "Guatemala", "Honduras", "El Salvador", "Nicaragua", "Costa Rica", "Panama") ~ "Centroamérica",
    country %in% c("Haiti", "Cuba", "Jamaica", "Dominican Republic") ~ "Caribe",
    country %in% c("Colombia", "Venezuela, RB", "Peru", "Chile", "Bolivia", "Argentina", "Brazil") ~ "Suramérica",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(custom_region))


pibpc_clean <- pibpc_data %>%
  filter(!is.na(NY.GDP.PCAP.CD), !is.na(custom_region)) %>%
  select(country, iso2c, year, pibpc = NY.GDP.PCAP.CD, custom_region)


ggplot(pibpc_clean, aes(x = year, y = pibpc, group = custom_region, color = custom_region)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  labs(
    title = "PIB per capita por región (2010–2023)",
    x = "Año",
    y = "PIB (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()

#pib per capita comparación entre cinco países 
pibpc_data_paises <- WDI(
  indicator = "NY.GDP.PCAP.CD",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)
pibpc_data_paises <- pibpc_data_paises %>% 
  filter(country %in% c("United States", "El Salvador", "Cuba", "Argentina"))

pibpc_paises_clean <- pibpc_data_paises %>%
  filter(!is.na(NY.GDP.PCAP.CD), !is.na(country)) %>%
  select(country, iso2c, year, pibpc_paises = NY.GDP.PCAP.CD, country)

ggplot(pibpc_paises_clean, aes(x = year, y = pibpc_paises, group = country, color = country)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  labs(
    title = "PIB per capita por país (2010–2023)",
    x = "Año",
    y = "PIB (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()

tdesempleo_data <- WDI(
  indicator = "SL.UEM.TOTL.ZS",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)

tdesempleo_data <- tdesempleo_data %>%
  mutate(custom_region = case_when(
    country %in% c("Canada", "United States", "Mexico") ~ "Norteamérica",
    country %in% c("Belize", "Guatemala", "Honduras", "El Salvador", "Nicaragua", "Costa Rica", "Panama") ~ "Centroamérica",
    country %in% c("Haiti", "Cuba", "Jamaica", "Dominican Republic") ~ "Caribe",
    country %in% c("Colombia", "Venezuela, RB", "Peru", "Chile", "Bolivia", "Argentina", "Brazil") ~ "Suramérica",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(custom_region))


tdesempleo_clean <- tdesempleo_data %>%
  filter(!is.na(SL.UEM.TOTL.ZS), !is.na(custom_region)) %>%
  select(country, iso2c, year, tasa_desempleo = SL.UEM.TOTL.ZS, custom_region)


ggplot(tdesempleo_clean, aes(x = year, y = tasa_desempleo, group = custom_region, color = custom_region)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  labs(
    title = "Tasa de desempleo (% de la población total) (2010–2023)",
    x = "Año",
    y = "Desempleo (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()

#pib per capita comparación entre cinco países 
gini_data_paises <- WDI(
  indicator = "SI.POV.GINI",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)
gini_data_paises <- gini_data_paises %>% 
  filter(country %in% c("United States", "El Salvador", "Costa Rica", "Argentina"))

gini_paises_clean <- gini_data_paises %>%
  filter(!is.na(SI.POV.GINI), !is.na(country)) %>%
  select(country, iso2c, year, gini_paises = SI.POV.GINI, country)

ggplot(gini_paises_clean, aes(x = year, y = gini_paises, group = country, color = country)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  geom_text(aes(label = round(gini_paises, 1)), vjust = -0.5, size = 3, check_overlap = TRUE) +
  labs(
    title = "Indice de gini por paises (2010–2023)",
    x = "Año",
    y = "Indice de gini (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()

#pib per capita comparación entre cinco países 
tdesempleo_data_paises <- WDI(
  indicator = "SL.UEM.TOTL.ZS",
  start = 2010,
  end = 2023,
  extra = TRUE,
  cache = NULL
)
tdesempleo_data_paises <- tdesempleo_data_paises %>% 
  filter(country %in% c("United States", "El Salvador", "Costa Rica", "Argentina"))

tdesempleo_paises_clean <- tdesempleo_data_paises %>%
  filter(!is.na(SL.UEM.TOTL.ZS), !is.na(country)) %>%
  select(country, iso2c, year, tdesempleo_paises = SL.UEM.TOTL.ZS, country)

ggplot(tdesempleo_paises_clean, aes(x = year, y = tdesempleo_paises, group = country, color = country)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  geom_text(aes(label = round(tdesempleo_paises, 1)), vjust = -0.5, size = 3, check_overlap = TRUE) +
  labs(
    title = "Tasa de desempleo (% de la población total) por paises (2010–2023)",
    x = "Año",
    y = "tasa de desempleo (promedio regional)",
    color = "Región"
  ) +
  theme_minimal()