Introducción

2. Metodología

La metodología de este estudio se estructura en varias fases, abordando desde la recopilación y preparación de datos hasta la aplicación de técnicas avanzadas de análisis multivariado como el Análisis de Componentes Principales (ACP) y la Clusterización. El objetivo es identificar patrones y agrupar países con características similares que puedan influir en la expectativa de vida.

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 2020, 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, Índice de Desarrollo Humano (HDI), Emisiones de CO2 per cápita, Prevalencia de Diabetes, Porcentaje de adultos que fuman, Consumo total de Alcohol per cápita, Acceso a Electricidad.

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). Originalmente continua, será utilizada para generar una variable binaria y posteriormente para el análisis de clusterización.
  • PIB per Cápita (GDP): Variable cuantitativa que mide el Producto Interno Bruto por habitante, ajustado por paridad de poder adquisitivo. Refleja el nivel de desarrollo económico.
  • Población (Population): Variable cuantitativa que representa el total de habitantes del país.
  • 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 sin acceso a saneamiento mejorado. Nótese que esta variable indica la falta de acceso.
  • 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.
  • Tasa de Fertilidad (Fertility): Variable cuantitativa que indica el número promedio de hijos por mujer.
  • Índice de Desarrollo Humano (HDI): Variable cuantitativa que mide el nivel de desarrollo humano (largo y saludable de vida, acceso a conocimientos y un nivel de vida decente).
  • Emisiones de CO2 (CO2): Variable cuantitativa que representa las emisiones de dióxido de carbono per cápita.
  • Prevalencia de Diabetes (Diabetes): Variable cuantitativa que indica el porcentaje de la población entre 20 y 79 años con diabetes.
  • Consumo de Tabaco (Smoke): Variable cuantitativa que mide el porcentaje de adultos que fuman o usan tabaco.
  • Consumo de Alcohol (Alcohol): Variable cuantitativa que indica el consumo total de alcohol puro per cápita (litros) por personas de 15 años o más.
  • Acceso a Electricidad (Electricity): Variable cuantitativa que mide el porcentaje de la población con acceso a electricidad.

2.3 Procesamiento y Preparación de Datos

La etapa de procesamiento de datos fue crucial para consolidar la información y adecuarla a los requisitos de los modelos de clasificación y las técnicas de análisis multivariado.

Primero, se cargaron las múltiples bases de datos descargadas, filtrándolas para el año 2020. Posteriormente, se unieron en un único dataframe (bd_final) utilizando operaciones de left_join basadas en el Country y Year. Este proceso permitió integrar toda la información relevante en una sola estructura.

Tras la unión, se procedió a la limpieza de datos. Se optó por eliminar las filas que presentaban valores faltantes (NA) en cualquiera de las variables clave para asegurar que los modelos se entrenaran y los análisis se realizaran con un conjunto de datos completo y consistente. Adicionalmente, se eliminó una fila específica (bd_final[-144,]) que se identificó como un posible outlier o un dato anómalo que podía distorsionar los análisis posteriores (Una de las bases de datos contenia un “País” llamado “World” el cual afectaba nuestros resultados así que decidimos eliminarlo).

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

bd_expec <- read.csv("life-expectancy.csv")
bd_gdp <- read.csv("gdp-per-capita-worldbank.csv")
bd_pop <- read.csv("population.csv")
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")
bd_fert <- read.csv("Fertility-rate.csv")
bd_hdi <- read.csv("human-development-index.csv")
bd_co2 <- read.csv("co-emissions-per-capita.csv")
bd_diab <- read.csv("diabetes-prevalence.csv")
bd_smk <- read.csv("share-of-adults-who-smoke.csv")
bd_alh <- read.csv("total-alcohol-consumption-per-capita-litres-of-pure-alcohol.csv")
bd_elec <- read.csv("share-of-the-population-with-access-to-electricity.csv")

# Filtramos las bases de datos
bd_expec_1 <- bd_expec %>% 
  select(Entity, Year, Period.life.expectancy.at.birth...Sex..total...Age..0) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Expect = Period.life.expectancy.at.birth...Sex..total...Age..0
  )

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

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

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

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

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 == "2020") %>% 
  rename(
    Country = Entity,
    Infant = Observation.value...Indicator..Infant.mortality.rate...Sex..Total...Wealth.quintile..Total...Unit.of.measure..Deaths.per.100.live.births
  )

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

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 == "2020") %>% 
  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.
  )

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

bd_fert_1 <- bd_fert %>% 
  select(Entity, Year, Fertility.rate...Sex..all...Age..all...Variant..estimates) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Fertility = Fertility.rate...Sex..all...Age..all...Variant..estimates
  )

bd_hdi_1 <- bd_hdi %>% 
  select(Entity, Year, Human.Development.Index) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    HDI = Human.Development.Index
  )

bd_co2_1 <- bd_co2 %>% 
  select(Entity, Year, Annual.CO..emissions..per.capita.) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    CO2 = Annual.CO..emissions..per.capita.
  )

bd_diab_1 <- bd_diab %>% 
  select(Entity, Year, Diabetes.prevalence....of.population.ages.20.to.79.) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Diabetes = Diabetes.prevalence....of.population.ages.20.to.79.
  )

bd_smk_1 <- bd_smk %>% 
  select(Entity, Year, Share.of.adults.who.smoke.or.use.tobacco..age.standardized.) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Smoke = Share.of.adults.who.smoke.or.use.tobacco..age.standardized.
  )

bd_alh_1 <- bd_alh %>% 
  select(Entity, Year, Total.alcohol.consumption.per.capita..liters.of.pure.alcohol..projected.estimates..15..years.of.age.) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Alcohol = Total.alcohol.consumption.per.capita..liters.of.pure.alcohol..projected.estimates..15..years.of.age.
  )

bd_elec_1 <- bd_elec %>% 
  select(Entity, Year, Access.to.electricity....of.population.) %>% 
  filter(Year == "2020") %>% 
  rename(
    Country = Entity,
    Electricity = Access.to.electricity....of.population.
  )

# Unimos las bases manteniendo todos los países y años
bd_final <- bd_gdp_1 %>%
  left_join(bd_expec_1, by = c("Country", "Year")) %>%
  left_join(bd_pop_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")) %>%
  left_join(bd_fert_1, by = c("Country", "Year")) %>%
  left_join(bd_hdi_1, by = c("Country", "Year")) %>%
  left_join(bd_co2_1, by = c("Country", "Year")) %>%
  left_join(bd_diab_1, by = c("Country", "Year")) %>%
  left_join(bd_smk_1, by = c("Country", "Year")) %>%
  left_join(bd_alh_1, by = c("Country", "Year")) %>%
  left_join(bd_elec_1, by = c("Country", "Year")) %>%
  filter(!is.na(Fertility) & !is.na(Electricity) & !is.na(Alcohol) & !is.na(Smoke) & !is.na(Diabetes) & !is.na(CO2) & !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) 

bd_final_1 <- bd_final[-144, ]

#view(bd_final_1)

Posteriormente, la variable Expect (Expectativa de Vida) fue transformada en una variable objetivo binaria: Expect_high. Se definió que un país tiene “Alta Expectativa de Vida” (Expect_high = "Si") si su expectativa de vida original (Expect) es mayor a 72 años, y “Baja Expectativa de Vida” (Expect_high = "No") si es menor o igual a 72 años. Esta dicotomización se basó en la mediana de la expectativa de vida para el año 2020 en el conjunto de datos, con el fin de obtener una distribución balanceada de las clases.

# Creación de la variable objetivo binaria (Esperanza de Vida Alta)

bd_final_2 <- bd_final_1 %>%
  mutate(Expect_high = ifelse(Expect > 72, "Si", "No"))

bd_final_2$Expect_high <- factor(bd_final_2$Expect_high, levels = c("No", "Si"))

Para el Análisis de Componentes Principales y la Clusterización, se seleccionaron las variables cuantitativas de interés. Se estableció la columna Country como nombres de las filas en el dataframe data_for_analysis y luego se eliminó como una columna regular para que los análisis se centraran en los valores numéricos. Las variables seleccionadas (GDP, Population, Death_rate, Care, Infant, Sanitation, Rural, Urban, Water, Fertility, HDI, CO2, Diabetes, Smoke, Alcohol, Electricity) se escalaron para asegurar que todas tuvieran el mismo peso en el cálculo de distancias y en la varianza explicada por los componentes principales. El escalado (centrado en media 0 y desviación estándar 1) es crucial en ACP para evitar que las variables con rangos de valores más grandes dominen los componentes.

# Preparación de datos para PCA y Clustering
data_for_analysis <- bd_final_2 

# Establecer la columna 'Country' como nombres de las filas y luego eliminarla
# Asumimos que 'Country' existe y es única después del 'distinct' anterior.
rownames(data_for_analysis) <- data_for_analysis$Country
data_for_analysis$Country <- NULL 

# Definir explícitamente las variables explicativas para PCA.
vars_for_pca <- c("GDP", "Population", "Death_rate", "Care", "Infant", "Sanitation",
                  "Rural", "Urban", "Water", "Fertility", "HDI", "CO2", "Diabetes",
                  "Smoke", "Alcohol", "Electricity")

# Seleccionar solo estas variables del dataframe y la variable Expect (para evitar errores con scale)
numerical_data_for_pca_clustering <- data_for_analysis %>%
  select(all_of(vars_for_pca))

# Escalar los datos numéricos.
bd_scaled_for_pca_clustering <- scale(numerical_data_for_pca_clustering)

# Convertir el resultado de scale() de vuelta a un dataframe y preservar los nombres de las filas.
bd_scaled_for_pca_clustering <- as.data.frame(bd_scaled_for_pca_clustering)
rownames(bd_scaled_for_pca_clustering) <- rownames(numerical_data_for_pca_clustering)

Al final de este proceso, contamos con el dataframe bd_scaled_for_pca_clustering, que contiene las variables numéricas estandarizadas y listas para el análisis de componentes principales y la clusterización, y bd_final_2, que mantiene la variable objetivo binaria para futuras referencias en la interpretación de los clusters.

2.4 Técnicas de Análisis Multivariado

Análisis de Componentes Principales (ACP)

El Análisis de Componentes Principales (ACP) es una técnica de reducción de dimensionalidad que transforma un conjunto de variables posiblemente correlacionadas en un nuevo conjunto de variables no correlacionadas llamadas componentes principales. Estas componentes son combinaciones lineales de las variables originales y se construyen de manera que la primera componente principal explica la mayor cantidad posible de varianza en los datos, la segunda componente explica la mayor varianza restante y así sucesivamente.

El objetivo del ACP en este estudio es:

  • Reducir la complejidad: Simplificar un conjunto grande de variables en un número menor de componentes que capturen la información esencial.
  • Identificar patrones subyacentes: Revelar las dimensiones principales de variabilidad entre los países, que pueden interpretarse como “factores” que influyen en las características de las naciones.
  • Facilitar la visualización: Proyectar los países y las variables en un espacio de baja dimensión (usualmente 2 o 3 componentes principales) para visualizar sus relaciones y agrupaciones.

La aplicación del ACP se realizó utilizando la función prcomp() en los datos escalados, lo que asegura que todas las variables contribuyan equitativamente al análisis.

Clusterización (Agrupamiento)

La clusterización es una técnica de aprendizaje no supervisado cuyo objetivo es agrupar un conjunto de objetos de tal manera que los objetos en el mismo grupo (llamado cluster) sean más similares entre sí que a los de otros grupos. En este estudio, la clusterización se aplica sobre las componentes principales obtenidas del ACP, lo que permite agrupar países basándose en sus características multivariadas subyacentes.

Para determinar el número óptimo de clusters, se utilizaron métodos como el de la suma de cuadrados intra-cluster (método del codo o WSS) y el coeficiente de silueta. Estos métodos gráficos ayudan a identificar un número de clusters que equilibre la compacidad dentro de los grupos y la separación entre ellos.

La implementación de la clusterización se realizó utilizando la función FactoClass del paquete FactoClass, que integra el ACP (mediante dudi.pca de ade4) con métodos de clusterización jerárquica. Esto permite que la agrupación se realice directamente sobre las componentes principales, lo que es ventajoso porque las componentes ya han reducido el ruido y la redundancia de los datos originales. La interpretación de los clusters se centrará en analizar las medias de las variables originales para cada grupo, lo que permite caracterizar el perfil de los países dentro de cada cluster.

3. Resultados Descriptivos y Análisis de Componentes Principales (ACP)

En esta sección, se presentan los resultados del análisis descriptivo de las variables originales y los hallazgos del Análisis de Componentes Principales (ACP), que busca reducir la dimensionalidad de los datos y extraer los factores subyacentes que describen las similitudes entre países.

3.1 Estadísticas Descriptivas del Conjunto de Datos

Primero, se visualizan las estadísticas descriptivas de las variables originales en el dataframe bd_final_1. Esto nos permite entender la distribución original, rangos, medias, medianas y la dispersión de cada variable antes de cualquier transformación.

View(bd_final_1)
summary(bd_final_1)
##    Country               Year           GDP               Expect     
##  Length:145         Min.   :2020   Min.   :   833.9   Min.   :53.07  
##  Class :character   1st Qu.:2020   1st Qu.:  5963.2   1st Qu.:66.92  
##  Mode  :character   Median :2020   Median : 14801.3   Median :72.38  
##                     Mean   :2020   Mean   : 25004.5   Mean   :72.26  
##                     3rd Qu.:2020   3rd Qu.: 41372.8   3rd Qu.:78.25  
##                     Max.   :2020   Max.   :130689.5   Max.   :84.67  
##    Population          Death_rate          Care              Infant      
##  Min.   :7.740e+04   Min.   : 1.053   Min.   :   44.61   Min.   :0.1653  
##  1st Qu.:3.796e+06   1st Qu.: 6.341   1st Qu.:  246.00   1st Qu.:0.4769  
##  Median :1.087e+07   Median : 7.519   Median :  873.72   Median :1.2497  
##  Mean   :5.138e+07   Mean   : 8.156   Mean   : 1865.47   Mean   :1.9307  
##  3rd Qu.:3.817e+07   3rd Qu.: 9.502   3rd Qu.: 2907.32   3rd Qu.:3.1770  
##  Max.   :1.426e+09   Max.   :17.899   Max.   :11758.42   Max.   :8.0342  
##    Sanitation            Rural           Urban            Water       
##  Min.   :        0   Min.   : 0.00   Min.   : 10.64   Min.   : 35.50  
##  1st Qu.:     2510   1st Qu.:24.21   1st Qu.: 41.97   1st Qu.: 83.97  
##  Median :   250809   Median :35.51   Median : 64.49   Median : 96.00  
##  Mean   :  7008926   Mean   :40.35   Mean   : 59.65   Mean   : 89.06  
##  3rd Qu.:  3890492   3rd Qu.:58.03   3rd Qu.: 75.79   3rd Qu.: 99.81  
##  Max.   :233385900   Max.   :89.36   Max.   :100.00   Max.   :100.00  
##    Fertility          HDI              CO2              Diabetes     
##  Min.   :0.812   Min.   :0.3910   Min.   : 0.04481   Min.   : 1.100  
##  1st Qu.:1.575   1st Qu.:0.6090   1st Qu.: 0.94005   1st Qu.: 5.500  
##  Median :2.051   Median :0.7420   Median : 2.37934   Median : 6.800  
##  Mean   :2.522   Mean   :0.7308   Mean   : 4.47544   Mean   : 8.161  
##  3rd Qu.:3.234   3rd Qu.:0.8610   3rd Qu.: 6.11448   3rd Qu.:10.400  
##  Max.   :6.369   Max.   :0.9630   Max.   :36.56411   Max.   :30.800  
##      Smoke          Alcohol        Electricity    
##  Min.   : 3.60   Min.   : 0.000   Min.   :  9.10  
##  1st Qu.:11.60   1st Qu.: 1.930   1st Qu.: 85.40  
##  Median :19.70   Median : 4.580   Median : 99.90  
##  Mean   :19.67   Mean   : 5.433   Mean   : 85.71  
##  3rd Qu.:26.10   3rd Qu.: 9.160   3rd Qu.:100.00  
##  Max.   :45.90   Max.   :16.800   Max.   :100.00

El summary(bd_final_1) proporciona una visión detallada de las 17 variables cuantitativas utilizadas en el análisis, junto con la variable Expect_high que es de tipo factor. La Expectativa de Vida (Expect) original muestra una media de aproximadamente 72.26 años y una mediana de 72.38 años, con un rango que va desde 53.0 hasta 84.0 años. La variable dicotomizada Expect_high revela una distribución relativamente equilibrada, con 67 países clasificados como “No” (esperanza de vida \(\leq\) 72 años) y 77 países como “Si” (esperanza de vida \(>\) 72 años).

Variables como GDP (PIB per cápita), Population, Care (gasto en salud) y CO2 (emisiones de CO2) muestran una gran variabilidad y asimetría positiva, indicando la presencia de algunos países con valores excepcionalmente altos que elevan la media. Por ejemplo, el GDP tiene una media de 25,004 USD y una mediana de 14,801 USD, y Population una media de 51.3 millones con una mediana de 10.8 millones, lo que subraya las vastas diferencias económicas y demográficas entre las naciones.

Por otro lado, variables como Death_rate (tasa de mortalidad), Infant (mortalidad infantil), Fertility (tasa de fertilidad), Diabetes, Smoke, y Alcohol exhiben rangos considerables, reflejando las diversas condiciones de salud y hábitos de vida a nivel global. Las variables relacionadas con servicios básicos como Water (acceso a agua) y Electricity (acceso a electricidad) tienden a tener medias más altas, sugiriendo un mayor nivel de acceso global, aunque Sanitation (población sin saneamiento) muestra que aún hay una parte significativa de la población sin este servicio. Finalmente, el HDI (Índice de Desarrollo Humano) presenta un rango de 0.391 a 0.963, lo que reafirma las brechas en el desarrollo humano entre los países. Estas estadísticas descriptivas iniciales son cruciales para entender la naturaleza de los datos antes de aplicar técnicas de reducción de dimensionalidad y clusterización.

3.2 Análisis de Componentes Principales (ACP)

El ACP se realizó sobre las variables cuantitativas escaladas (bd_scaled_for_pca_clustering). Este proceso permite identificar las dimensiones principales de variabilidad en los datos.

Eigenvalores y Varianza Explicada

El primer paso en el ACP es examinar los eigenvalores (o valores propios), que representan la cantidad de varianza explicada por cada componente principal. Un gráfico de eigenvalores (scree plot) es útil para determinar el número óptimo de componentes a retener.

# --- Análisis de Componentes Principales (ACP) ---
res.pca <- prcomp(bd_scaled_for_pca_clustering, scale. = FALSE)

print(res.pca)
## Standard deviations (1, .., p=16):
##  [1] 2.702513e+00 1.454028e+00 1.340058e+00 1.177942e+00 9.703681e-01
##  [6] 8.055535e-01 6.573272e-01 6.107524e-01 5.291845e-01 4.501027e-01
## [11] 4.224194e-01 3.814411e-01 2.866463e-01 2.683603e-01 2.062803e-01
## [16] 1.439498e-07
## 
## Rotation (n x k) = (16 x 16):
##                     PC1          PC2         PC3          PC4         PC5
## GDP          0.29996509  0.003269210 -0.09824050 -0.292396755 -0.37179302
## Population  -0.01750718  0.216486332  0.62202781 -0.281916144  0.07568461
## Death_rate   0.05091832 -0.525502593  0.28501769  0.176469345 -0.01811076
## Care         0.29102315 -0.133337087 -0.03557921 -0.290127116 -0.28533864
## Infant      -0.32736959 -0.068974489 -0.04196973 -0.149886167  0.02060852
## Sanitation  -0.11720507  0.163070694  0.56939195 -0.348915781  0.02020923
## Rural       -0.29666182  0.074532245  0.08826836  0.206733341 -0.41904706
## Urban        0.29666182 -0.074532264 -0.08826835 -0.206733356  0.41904705
## Water        0.31929007  0.129099182  0.05983112  0.174144129  0.22346908
## Fertility   -0.32428236 -0.046819470 -0.13414833 -0.163801511 -0.06417640
## HDI          0.35907069  0.007065494  0.02490481 -0.003084529 -0.08351136
## CO2          0.22051795  0.263108387 -0.15370687 -0.254169857 -0.39710999
## Diabetes     0.05718356  0.524530027  0.01072630  0.247622564 -0.13507968
## Smoke        0.13157775 -0.059588455  0.30364138  0.498882593 -0.32485409
## Alcohol      0.17085189 -0.471077410  0.16720859 -0.062467416 -0.18413413
## Electricity  0.30176944  0.167333546  0.11525864  0.232712088  0.21413093
##                     PC6          PC7           PC8         PC9        PC10
## GDP         -0.04977622 -0.144851576 -0.0282573159 -0.23014706 -0.10146724
## Population   0.03058685 -0.065694365  0.0598521072  0.07244036  0.48496966
## Death_rate  -0.20431927  0.402574862  0.3132922844 -0.44450042  0.18662517
## Care        -0.07627910 -0.256814557 -0.3192450090 -0.39900202  0.09672363
## Infant      -0.26364864  0.077332894  0.1321260800 -0.27518723 -0.20138278
## Sanitation  -0.02457644  0.018047622 -0.0531164917 -0.03899968 -0.49727420
## Rural        0.39188298 -0.008327168  0.0011002802 -0.15750554  0.02246124
## Urban       -0.39188299  0.008327125 -0.0011002766  0.15750552 -0.02246121
## Water        0.20780617  0.030497372  0.1415143731 -0.28416903 -0.13563264
## Fertility   -0.20515643  0.014318425 -0.0007093787 -0.07776939 -0.36607004
## HDI          0.10510000 -0.034764089 -0.0617629123 -0.03868929  0.01397385
## CO2         -0.03842500  0.329696160  0.6282709455  0.24822711 -0.02101180
## Diabetes    -0.37918363  0.519417664 -0.4500418840 -0.13764035  0.07512236
## Smoke       -0.47086005 -0.428426737  0.1194681726  0.25931693 -0.16575182
## Alcohol      0.20398723  0.418301961 -0.3572402476  0.43466602 -0.21168561
## Electricity  0.25858749  0.029552369  0.1107787831 -0.18192900 -0.43647527
##                     PC11         PC12         PC13         PC14         PC15
## GDP         -0.101554602 -0.161696289 -0.574918088 -0.471260536  0.005951974
## Population   0.413640313  0.082904718 -0.042313224 -0.217332266 -0.066571113
## Death_rate  -0.199414533  0.171373779 -0.019058266 -0.062118571  0.028605268
## Care         0.169680813  0.084217079  0.453574026  0.261757777  0.279804734
## Infant       0.362931273 -0.638112983  0.172679808 -0.023066758 -0.291428631
## Sanitation  -0.445210729 -0.023576976 -0.003475275  0.243638807  0.051176144
## Rural        0.013960636 -0.006510961  0.003938517  0.022921160 -0.023932924
## Urban       -0.013960579  0.006510950 -0.003938466 -0.022921175  0.023932828
## Water        0.368824323 -0.065414734 -0.453634330  0.532694991  0.066304547
## Fertility    0.378515734  0.691237875 -0.144037884 -0.037122206 -0.134701921
## HDI         -0.123709250  0.130918372  0.141232587  0.108660099 -0.883999894
## CO2          0.051761394  0.031260715  0.188202993  0.143331955  0.098192912
## Diabetes     0.001640399  0.005329352 -0.023267385 -0.024556711  0.006589290
## Smoke        0.115340296 -0.044836206 -0.009531761  0.052393951  0.011158596
## Alcohol      0.292941592 -0.127265634 -0.047088064 -0.002371292  0.030691337
## Electricity  0.152641759  0.065190664  0.383376071 -0.525846728  0.113930896
##                      PC16
## GDP         -7.380115e-09
## Population   3.591416e-08
## Death_rate  -2.050252e-09
## Care         2.332889e-08
## Infant       4.932616e-08
## Sanitation  -2.825998e-08
## Rural       -7.071068e-01
## Urban       -7.071068e-01
## Water       -1.822208e-08
## Fertility    1.151657e-08
## HDI          5.869170e-08
## CO2         -1.036826e-08
## Diabetes    -1.799469e-08
## Smoke        1.532356e-08
## Alcohol     -8.050902e-09
## Electricity  1.076529e-09

El print(res.pca) muestra la desviación estándar de cada componente principal y la matriz de rotación (loadings), que indica cómo las variables originales contribuyen a cada componente.

En este apartado analizamos los componentes principales, estos están ordenados de mayor a menor desviación estándar, es decir, de mayor a menor varianza explicada. Por ejemplo, PC1 tiene la desviación estándar más alta, lo que significa que explica la mayor cantidad de variabilidad en los datos. Para la Rotación (n x k) analizaremos los dos primeros componentes principales.

Para el PC1, observamos que las variables con cargas positivas altas son HDI (0.359), Electricity (0.302), GDP (0.300), Water (0.319) y Care (0.291); mientras que las variables con cargas negativas altas son Infant (-0.327), Fertility (-0.324) y Rural (-0.297). Esto agrupa estas variables en cada extremo del PC1, más adelante Dim 1, sugiriendo un nombre o etiqueta para este como puede ser “Desarrollo”, “Prosperidad” o “Modernización”.

Para el PC2, observamos que las variables con cargas positivas altas son Diabetes (0.525), Population (0.216), Sanitation (0.163) y CO2 (0.263); mientras que las variables con cargas negativas altas son Death_rate (-0.525) y Alcohol (-0.471). Esto agrupa estas variables en cada extremo del PC2, más adelante Dim 2, sugiriendo un nombre o etiqueta para este como puede ser “Problemas de Salud Pública”, “Sobrepoblación” o “Enfermedades de la modernización”.

# Gráfico interactivo de los eigenvalores
eig_plot <- fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))
ggplotly(eig_plot)

El gráfico interactivo de los eigenvalores (eig_plot) permite observar visualmente la “regla del codo”, donde la pendiente de la curva disminuye bruscamente. En este caso, el codo parece situarse después del segundo o tercer componente, sugiriendo que retener los dos o tres primeros componentes sería razonable para capturar la mayor parte de la información relevante con una reducción significativa de la dimensionalidad.

Visualización de Individuos (Países)

El gráfico de individuos proyecta los países en el plano formado por las dos primeras componentes principales. La coloración por cos2 (calidad de representación) permite identificar qué países están mejor representados por este plano.

# Gráfico interactivo de los individuos (países)
ind_plot <- fviz_pca_ind(res.pca,
                         col.ind = "cos2", 
                         gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                         label = "ind", # Asegura que los nombres de los países se usen como etiquetas
                         geom = "point", # Solo puntos, el nombre se verá al pasar el mouse
                         pointsize = 2 # Tamaño de los puntos
)
# Para incluir el nombre del país en el tooltip, podemos mapear el nombre a un `text` aesthetic
# fviz_pca_ind genera un ggplot. Podemos modificarlo antes de pasar a ggplotly.
ind_plot_interactive <- ind_plot +
  geom_text(aes(label = rownames(res.pca$x)), size = 3, vjust = -1, hjust = 0, check_overlap = TRUE) + # Añadir etiquetas de texto, con check_overlap
  labs(title = "Individuos (Países) en el plano principal - Interactivo")

ggplotly(ind_plot_interactive, tooltip = c("label", "x", "y", "col.ind")) # Asegurarse de que el tooltip muestre el país, CP1 y CP2

Al momento de analizar el gráfico Individuos (Países) en el Plano Principal, podemos corregir y etiquetar correctamente cada dimensión pues podemos agrupar las características de cada país en el contexto histórico, geográfico y geopolítico.

Si analizamos solo teniendo en cuenta la Dim1 obtenemos la confirmación de que “Modernización” es un buen nombre para esta dimensión ya que en el extremo derecho (Altos PC1) Qatar, Kuwait, Arabia Saudita, EAU, Singapur, Australia, Estados Unidos, Canadá, Europa Occidental, Japón, Corea del Sur, Luxemburgo. Son claramente los países más desarrollados y prósperos. Mientras que en el extremo izquierdo (Bajos PC1): Níger, Burkina Faso, Chad, Etiopía, Burundi, R.D. del Congo, Madagascar, Afganistán, Somalia, Yemen, Sierra Leona, Lesoto (África mayormente). Son los países con menor desarrollo, alta mortalidad infantil, alta natalidad y ruralidad.

Por otra parte tenemos la Dim2 en la cual encontramos algo muy interesante, en la parte superior tenemos a países como India, Pakistán, China, Bangladesh, Indonesia, Egipto, Bahréin, Malasia. Los cuales son grandes países, muchos de ellos en desarrollo acelerado, que enfrentan la presión de grandes poblaciones sobre sus infraestructuras de saneamiento y, en algunos casos, el aumento de enfermedades relacionadas con la dieta moderna como la diabetes. Son estas economías emergentes que se modernizan rápidamente. En la parte inferior encontramos a países como Rusia, Bielorrusia, Ucrania, Moldavia, Georgia, Armenia. Estos países, muchos de ellos ex-repúblicas soviéticas, muestran un patrón distinto de salud pública con tasas de mortalidad más altas y prevalencia de consumo de alcohol, mostrando cierta inseguridad, que no está directamente ligado a su nivel de desarrollo en el eje 1.

Ahora analizando esto como grupo proponemos un nombre más adecuado para la Dim2: “Crecimiento acelerado”, en el extremo positivo tenemos a Diabetes, la cual está fuertemente asociada con cambios en la dieta y estilos de vida sedentarismo que acompañan al desarrollo económico y la urbanización en países que experimentan un rápido crecimiento, también está Population pues países con muy alta población como India, China e Indonesia son a menudo los que están experimentando un crecimiento económico y demográfico masivo; además, está Sanitation pues si un país está creciendo rápidamente en población y urbanización, incluso si está invirtiendo en infraestructura, el número absoluto de personas sin acceso a saneamiento adecuado puede seguir siendo alto debido al rápido crecimiento. Esto apunta a los desafíos de infraestructura que acompañan al crecimiento acelerado si no se mantienen al ritmo de la población.

Por otro lado, en el extremo negativo tenemos a Death_rate, una alta tasa de mortalidad por cualquier causa puede indicar problemas de salud sistémicos, acceso limitado a atención médica básica, o crisis de salud pública que no se resuelven fácilmente y Alcohol pues está ligada a problemas de salud pública y sociales que pueden ser persistentes en regiones con economías estancadas o en transición difícil.

Entonces el gráfico tendría las siguientes etiquetas:

# Gráfico interactivo de los individuos (países)
ind_plot <- fviz_pca_ind(res.pca,
                         col.ind = "cos2", 
                         gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                         label = "ind", # Asegura que los nombres de los países se usen como etiquetas
                         geom = "point", # Solo puntos, el nombre se verá al pasar el mouse
                         pointsize = 2 # Tamaño de los puntos
)
# Para incluir el nombre del país en el tooltip, podemos mapear el nombre a un `text` aesthetic
# fviz_pca_ind genera un ggplot. Podemos modificarlo antes de pasar a ggplotly.
ind_plot_interactive <- ind_plot +
  geom_text(aes(label = rownames(res.pca$x)), size = 3, vjust = -1, hjust = 0, check_overlap = TRUE) +
  xlab("Modernización (45.6%)") + # Cambia la etiqueta del eje X
  ylab("Crecimiento Acelerado (13.2%)") +
  labs(title = "Individuos (Países) en el plano principal - Interactivo")

ggplotly(ind_plot_interactive, tooltip = c("label", "x", "y", "col.ind")) # Asegurarse de que el tooltip muestre el país, CP1 y CP2

La ubicación de los países en el plano refuerza los nombres y apoya a las ideas propuestas:

En el primer cuadrante (alto PC1 y PC2): Países como China, Bahrein, Arabia Saudí, Qatar, Kuwait o Emiratos Árabes Unidos son ejemplos de países que están lo suficientemente desarrollados y tienen un gran crecimiento económico pues su influencia geopolítica, desarrollo tecnológico o recursos naturales les han permitido posicionar se en estos lugares.

En el segundo cuadrante (bajo PC1 y alto PC2): Países como India, Pakistán, Bangladesh y Egipto son ejemplos de países que no están muy desarrollados en el presente pero que experimentan un crecimiento acelerado en su economía, población y desarrollo con los desafíos y características asociadas (diabetes, emisiones, y quizás la brecha en saneamiento para una población en expansión).

En el tercer cuadrante (Bajo PC1 y bajo PC2): Países como Chad, Burkina, Faso, Benin y gran parte de África, junto a Haití, son ejemplos de países con un bajo crecimiento actual y un desarrollo precario debido a diferentes factores como lo es el bajo desarrollo de áfrica en general, guerras civiles y corrupción.

En el cuarto cuadrante (Alto PC1 y bajo PC2): Países como Rusia, Bielorrusia, Ucrania, Moldavia, Georgia, Armenia e, increíblemente, Estados Unidos y Europa en general. Son países que según este orden de ideas son desarrollados que están estancados o tienen un crecimiento menor que otros; países que a menudo son referidos como la “antigua Unión Soviética” o la “Europa del Este” se han enfrentado (o aún enfrentan) períodos de estancamiento económico, transición política compleja, y arrastran problemas de salud pública (como altas tasas de alcoholismo y mortalidad) que se vieron agravados o no resueltos tras la disolución de la URSS. Mientras que países como Estados Unidos y Europa en general se ve este crecimiento constante pero más lento que China o Qatar por ejemplo, por ende, se posicionan en estos lugares y buscan no quedarse atrás o verse superados por las potencias emergentes, por algo en las elecciones Estados Unidos ganó el eslogan “Make America great again”.

# Gráfico interactivo de las variables
var_plot <- fviz_pca_var(res.pca,
                         col.var = "contrib", 
                         gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
                         repel = FALSE, # Desactivar repel para evitar conflictos con plotly
                         axes = c(1,2),
                         labelsize = 4 # Asegurar un tamaño de etiqueta base para que fviz_pca_var las dibuje
)
# Eliminamos la capa geom_text adicional. fviz_pca_var ya genera las etiquetas.
var_plot_interactive <- var_plot +
  xlab("Modernización (45.6%)") + # Cambia la etiqueta del eje X
  ylab("Crecimiento acelerado (13.2%)") +
  labs(title = "Círculo de Correlación de Variables - Interactivo")

# Indicar a ggplotly que el tooltip debe mostrar el "label" (nombre de la variable)
ggplotly(var_plot_interactive, tooltip = c("label", "x", "y", "col.var"))
# 2. Círculo de correlación de variables (equivalente a s.corcircle(dudi_resultado$co))
var_plot_factoextra <- fviz_pca_var(dudi_resultado, # Para fviz_pca_var, se pasa directamente el objeto dudi
                                    col.var = "contrib", # Colorea por contribución a las componentes
                                    gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), # Paleta de colores
                                    repel = TRUE, # ¡Esto es clave para evitar la superposición!
                                    axes = c(1,2), # Asegura que se usen las componentes 1 y 2
                                    labelsize = 4 # Tamaño de la fuente de las etiquetas
) +
  xlab("Modernización (45.6%)") + # Cambia la etiqueta del eje X
  ylab("Crecimiento Acelerado (13.2%)") +
  labs(title = "Círculo de Correlación de Variables") +
  theme_minimal()

print(var_plot_factoextra)

Ahora analizaremos el Círculo de Correlación de Variables, en el eje horizontal tenemos la Dim1 que corresponde a “Modernización” (descartamos desarrollo pues es igual que HDI que ya es una variable). Observamos como las variables que están más cercanas al eje y están en colores más rojizos corresponden a aquellas variables que más aportaron en Rotation (n x k). Observamos flechas apuntando a la derecha: HDI, GDP, Electricity, Water, Care, Urban, CO2, Smoke, que indican claramente esa “Mayor modernización” a pesar de que el gráfico no distingue los extremos de mayor o menor “modernización”; También observamos flechas apuntando a la izquierda: Infant, Fertility, Rural, indicando esa “Menor modernización”. Algo curioso que observamos es que Urban y Rural están casi en línea recta opuestas, confirmando la relación inversa esperada pues son mutuamente excluyentes.

En el eje vertical tenemos la Dim2 que corresponde a “Crecimiento acelerado” . Tenemos flechas apuntando hacia arriba: Diabetes, Population, Sanitation, CO2. Países con alta prevalencia de diabetes, grandes poblaciones y desafíos de saneamiento para esas poblaciones y flechas apuntando hacia abajo: Death_rate, Alcohol. Países con alta tasa de muerte y alto consumo de alcohol. Pero no encontramos una clara tendencia de mayor o menor “Crecimiento” dentro de la dim2.

Las variables con flechas más largas y cercanas al círculo exterior son aquellas mejor representadas por el plano PC1-PC2 y, por lo tanto, tienen una mayor contribución a la varianza explicada.

Biplot de Individuos y Variables

El biplot combina el gráfico de individuos y el círculo de correlación, permitiendo visualizar la relación de los países con las variables de forma simultánea.

# Biplot interactivo de individuos y variables
biplot_interactive_base <- fviz_pca_biplot(res.pca, 
                                           repel = FALSE, # Desactivar repel para plotly
                                           col.var = "#2E9FDF", 
                                           col.ind = "#696969",  
                                           labelsize.var = 5,  # Asegurar un tamaño de etiqueta para variables
                                           labelsize.ind = 4 # Asegurar un tamaño de etiqueta para individuos
)
# Eliminamos las capas geom_text adicionales. fviz_pca_biplot ya genera las etiquetas
# para individuos y variables si labelsize.ind y labelsize.var están definidos.
biplot_interactive <- biplot_interactive_base +
  xlab("Modernización (45.6%)") + # Cambia la etiqueta del eje X
  ylab("Crecimiento Acelerado (13.2%)") +
  labs(title = "Biplot Interactivo de Individuos y Variables")

# Indicar a ggplotly que el tooltip debe mostrar "label" (etiquetas de individuos y variables)
# y las coordenadas.
ggplotly(biplot_interactive, tooltip = c("label", "x", "y"))

El biplot corrobora las interpretaciones del gráfico de individuos y del círculo de correlación. Permite ver cómo los países se relacionan con las variables:

  • Países en el cuadrante superior derecho (altos en PC1 y PC2 positiva) tienden a tener altos valores en GDP, Care, HDI, Water, Electricity, y también muestran una mayor prevalencia en Smoke, Alcohol, y Diabetes.
  • Países en el cuadrante inferior izquierdo (bajos en PC1 y PC2 negativa) se caracterizan por valores altos en Infant, Death_rate, Fertility y Sanitation (alto porcentaje sin saneamiento), y bajo acceso a los servicios básicos.

Estos gráficos interactivos son de gran utilidad para una exploración profunda de las relaciones multivariadas en el conjunto de datos.

Contribución de Variables e Individuos a las Componentes

Es crucial analizar la contribución de cada variable e individuo a la construcción de las componentes principales, ya que esto indica su importancia en la definición de cada dimensión.

# --- Acceder e interpretar los resultados del ACP ---
eig.val <- get_eigenvalue(res.pca)
print(eig.val)
##          eigenvalue variance.percent cumulative.variance.percent
## Dim.1  7.303574e+00     4.564734e+01                    45.64734
## Dim.2  2.114196e+00     1.321373e+01                    58.86107
## Dim.3  1.795756e+00     1.122347e+01                    70.08454
## Dim.4  1.387547e+00     8.672167e+00                    78.75670
## Dim.5  9.416142e-01     5.885089e+00                    84.64179
## Dim.6  6.489165e-01     4.055728e+00                    88.69752
## Dim.7  4.320790e-01     2.700494e+00                    91.39802
## Dim.8  3.730185e-01     2.331365e+00                    93.72938
## Dim.9  2.800363e-01     1.750227e+00                    95.47961
## Dim.10 2.025925e-01     1.266203e+00                    96.74581
## Dim.11 1.784381e-01     1.115238e+00                    97.86105
## Dim.12 1.454973e-01     9.093584e-01                    98.77041
## Dim.13 8.216609e-02     5.135381e-01                    99.28394
## Dim.14 7.201727e-02     4.501079e-01                    99.73405
## Dim.15 4.255157e-02     2.659473e-01                   100.00000
## Dim.16 2.072153e-14     1.295096e-13                   100.00000

Ahora analizaremos esta tabla, el eigenvalue o valor propio representa la cantidad de variabilidad o información en cada dimensión. Están acomodados de mayor a menor por ende la Dim1 explica la mayor cantidad de varianza, la Dim2 la segunda mayor y así sucesivamente. Ahora por criterio de Kaiser consideramos significativas aquellas dimensiones en el que su eigenvalue es mayor a 1, pues explican más varianza que una variable misma, observamos que Dim1, Dim2, Dim3, y Dim4 cumplen este criterio, por lo tanto reducimos el número de dimensiones a analizar de 16 a 4.

res.var <- get_pca_var(res.pca)

View(res.var$contrib[,1:4]) 
colSums( res.var$contrib[,1:4] )
## Dim.1 Dim.2 Dim.3 Dim.4 
##   100   100   100   100
res.ind <- get_pca_ind(res.pca)

View(res.ind$contrib[,1:4])

Ahora analizamos el porcentaje de varianza de cada dimensión, están ordenadas de mayor a menor. Observamos que Dim1 tiene el mayor porcentaje (45.65%), Dim2 (13.21%), Dim3 (11.22%) y Dim4 (8.67%) le siguen de cerca, en la siguiente columna tenemos el acumulado de esto, útil si se busca un porcentaje de explicación determinado como 60%, 70% u 80%. Para nuestro caso con 1 componente (Dim.1), explicamos el 45.65% de la varianza, con 2 componentes (Dim.1 + Dim.2), explicamos el 58.86% de la varianza, con 3 componentes (Dim.1 + Dim.2 + Dim.3), explicamos el 70.08% de la varianza y con 4 componentes (Dim.1 + Dim.2 + Dim.3 + Dim.4), explicamos el 78.76% de la varianza. Esto se relaciona directamente con los gráficos siguientes en los que observamos una figura de codo.

Es importante resaltar que por el momento tenemos esta “Hipótesis” de la cantidad de componentes relevantes gracias al Criterio de Kaiser, pero lo que nos confirmará si estamos en lo correcto o no va a ser la Determinación del Número Óptimo de Clusters y la posterior Clusterización.”

4. Determinación del Número Óptimo de Clusters y Clusterización

Una vez realizado el Análisis de Componentes Principales y comprendidas las dimensiones subyacentes de los datos, el siguiente paso es agrupar los países en clusters homogéneos. La determinación del número óptimo de clusters es un paso crítico en el análisis de agrupamiento.

4.1 Determinación del Número Óptimo de Clusters (para K-Means)

Aunque se utilizará una aproximación integrada con FactoClass que puede sugerir el número de componentes y clusters, es una buena práctica visualizar métodos comunes para determinar el k óptimo en K-Means, como el método del codo (WSS) y el coeficiente de silueta.

# --- Determinar el número óptimo de clusters (para K-Means) ---
# Se mantiene estático, pero se podría hacer interactivo con una librería específica
fviz_nbclust(bd_scaled_for_pca_clustering, FUN = kmeans, method = "wss", k.max = 10) 

Ahora al analizar la tabla anterior junto a estos gráficos observamos la forma de codo y el peso de cada dimensión para analizar los datos, como grupo de trabajo tenemos la idea o tendencia de agrupar los países en dos grupos “desarrollados y subdesarrollados” o “Primer mundo y tercer mundo”, y observamos la clara tendencia del modelo a ello.

Los gráficos generados por fviz_nbclust utilizando el método de la suma de cuadrados intra-cluster (WSS) y el coeficiente de silueta proporcionan una guía para la elección del número de clusters (k). El método del codo (WSS) busca un punto de inflexión en la curva donde la adición de más clusters ya no produce una reducción significativa en la variabilidad dentro de los clusters. Por su parte, el coeficiente de silueta mide la similitud de un objeto con su propio cluster en comparación con otros clusters, donde valores más altos indican una mejor agrupación. En general, un pico en el gráfico de silueta sugiere un k óptimo.

fviz_nbclust(bd_scaled_for_pca_clustering, FUN = kmeans, method = "silhouette", k.max = 10)

Al analizar este gráfico obtenemos la confirmación de que escoger 2 dimensiones es óptimo, apoyando nuestra idea de que los países se agrupan en dos grandes grupos, por ello se decide utilizar 2 clusters para el análisis y el resto del modelo.

En resumen, usaremos 2 componentes o dimensiones: la Dimensión 1 (ahora llamada “Modernización” y la Dimensión 2 (ahora llamada “Crecimiento Acelerado”, con los cuales explicamos el 58.86% de la varianza. La mayor “ganancia” en reducción de la suma de cuadrados intra-cluster se observa al pasar de 1 a 2 clusters, lo cual, sumado a la confirmación del “Optimal number of clusters” (método de la silueta y WSS), valida esta elección. Aunque las Dim3 y Dim4 suman información importante, es más práctico y revelador para nuestro objetivo de clusterización basar el análisis en estas dos primeras dimensiones.

4.2 Clusterización Integrada con ACP usando FactoClass

El paquete FactoClass permite realizar un análisis integrado donde se combinan el Análisis de Componentes Principales (utilizando dudi.pca del paquete ade4) y la clusterización jerárquica. Esto es ventajoso porque la clusterización se realiza sobre un espacio de menor dimensionalidad (los componentes principales) que ya ha capturado la mayor parte de la varianza, reduciendo el ruido y la redundancia. En la ejecución del código, se ingresó 3 como el número de componentes principales a retener y 2 como el número de clusters a formar.

# --- Clustering integrado con ACP usando FactoClass ---
# FactoClass usará dudi.pca internamente. 
# Si quieres evitar las preguntas interactivas, puedes añadir ncp y ncl como argumentos:
# resultado_FactoClass <- FactoClass(bd_scaled_for_pca_clustering, dudi.pca, ncp = X, ncl = Y)
# Donde X es el número de componentes principales y Y es el número de clusters.
# Usaste 2 y 3 en la ejecución previa, si son los óptimos, puedes ponerlos aquí:
resultado_FactoClass <- FactoClass(bd_scaled_for_pca_clustering, dudi.pca, nf = 3, nfcl = 3, k.clust = 2, scanFC = FALSE)
## The number of retained axes for factorial analysis is  3 
## 
## The number of axes for clustering is  3
## Look the histogram of 25 indexes 
## Partition in  2  clusters
# Obtener las asignaciones de cluster
cluster_asignado <- resultado_FactoClass$cluster

# --- Análisis de los Clusters ---
# Crea un dataframe temporal con los países clusterizados y sus asignaciones de cluster
cluster_df_for_join <- data.frame(
  Country = names(cluster_asignado),
  Cluster = factor(cluster_asignado)
)

# Une las asignaciones de cluster a tu dataframe original (bd_final_2) usando left_join
bd_final_con_clusters <- bd_final_2 %>%
  left_join(cluster_df_for_join, by = "Country")

# Visualiza los primeros países con su asignación de cluster
view(bd_final_con_clusters)

El resultado de FactoClass es un objeto que contiene, entre otras cosas, las asignaciones de cluster para cada país. Estas asignaciones se unieron al dataframe original (bd_final_2) para crear bd_final_con_clusters, lo que permite asociar cada país con su cluster y sus variables originales. La visualización de bd_final_con_clusters permite inspeccionar las asignaciones de forma tabular.

4.3 Caracterización de los Clusters

Para entender las diferencias entre los clusters, se calculan las estadísticas descriptivas (medias) de todas las variables originales para cada cluster. Esto ayuda a perfilar las características distintivas de los países dentro de cada grupo.

# Estadísticas descriptivas por cluster
desc_por_cluster <- bd_final_con_clusters %>%
  filter(!is.na(Cluster)) %>% # FILTRO AÑADIDO: Para asegurar que solo se analicen los países clusterizados
  group_by(Cluster) %>%
  summarise(
    Cantidad_Paises = n(),
    Media_Expectativa_Vida = mean(Expect, na.rm = TRUE),
    Media_PIB = mean(GDP, na.rm = TRUE),
    Media_Poblacion = mean(Population, na.rm = TRUE),
    Media_Tasa_Muerte = mean(Death_rate, na.rm = TRUE),
    Media_Gasto_Salud = mean(Care, na.rm = TRUE),
    Media_Mortalidad_Infantil = mean(Infant, na.rm = TRUE),
    Media_Saneamiento = mean(Sanitation, na.rm = TRUE),
    Media_Rural = mean(Rural, na.rm = TRUE),
    Media_Urbana = mean(Urban, na.rm = TRUE),
    Media_Agua = mean(Water, na.rm = TRUE),
    Media_Fertilidad = mean(Fertility, na.rm = TRUE),
    Media_IDH = mean(HDI, na.rm = TRUE),
    Media_CO2 = mean(CO2, na.rm = TRUE),
    Media_Diabetes = mean(Diabetes, na.rm = TRUE),
    Media_Fumar = mean(Smoke, na.rm = TRUE),
    Media_Alcohol = mean(Alcohol, na.rm = TRUE),
    Media_Electricidad = mean(Electricity, na.rm = TRUE)
  )


# Visualiza las estadísticas descriptivas por cluster
View(desc_por_cluster)

La tabla desc_por_cluster es fundamental para la interpretación de los grupos. Al examinar las medias de las variables para cada uno de los tres clusters, se pueden identificar sus perfiles distintivos:

  • Cluster 1: Este grupo de países se caracteriza por tener las medias más bajas en GDP, Care, HDI, Water, y Electricity. Simultáneamente, presentan las medias más altas en Death_rate, Infant, Sanitation (alto porcentaje sin saneamiento), y Fertility. Estos países generalmente tienen una Expectativa de Vida baja. Este cluster podría representar a naciones en etapas tempranas de desarrollo, con infraestructuras limitadas y desafíos significativos en salud pública, por lo que decidimos nombrarlo “Subdesarrollados”.
  • Cluster 2: Los países en este cluster exhiben las medias más altas en GDP, Care, HDI, Water, y Electricity. Paralelamente, tienen las medias más bajas en Death_rate, Infant, y Fertility. Sin embargo, también muestran medias relativamente altas en CO2, Diabetes, Smoke, y Alcohol. Su Expectativa de Vida es la más alta entre los clusters. Este grupo podría representar a naciones altamente desarrolladas, con excelentes indicadores de salud y calidad de vida, pero también con patrones de consumo y estilos de vida asociados a problemas de salud modernos y mayores emisiones, por lo que decidimos nombrarlo “Desarrollados”.

Esta caracterización es esencial para comprender las diferentes realidades globales que emergen de los datos y cómo estas se relacionan con la expectativa de vida.

4.4 Visualización de Clusters

Los boxplots por variable y cluster, y el gráfico de individuos coloreados por cluster en el plano principal, permiten una visualización intuitiva de las diferencias entre los grupos.

# Gráfico de boxplot por variable y cluster - Interactivo
# --- PASO CLAVE: Renombrar los niveles del factor Cluster ---
bd_final_con_clusters_renamed <- bd_final_con_clusters %>%
  mutate(
    Cluster = recode_factor(Cluster, 
                            "1" = "Países Desarrollados", # Asumiendo que Cluster 1 es el de "Desarrollados"
                            "2" = "Países Subdesarrollados") # Asumiendo que Cluster 2 es el de "Subdesarrollados"
  )
# Selecciona solo las variables cuantitativas y el cluster para el gráfico.
bd_long_clusters <- bd_final_con_clusters_renamed %>%
  filter(!is.na(Cluster)) %>% # FILTRO AÑADIDO: Para graficar solo los países clusterizados
  select(-Country, -Year, -Expect_high) %>% # Excluye Country, Year y la variable objetivo
  melt(id.vars = "Cluster")

plot_boxplots <- ggplot(bd_long_clusters, aes(y = value, x = variable, fill = Cluster)) +
  geom_boxplot() +
  facet_wrap(~variable, scales = "free_y") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
  labs(title = "Distribución de Variables por Cluster",
       x = "Variable",
       y = "Valor")

ggplotly(plot_boxplots)

Los boxplots interactivos por variable y cluster son particularmente útiles para visualizar cómo la distribución de cada variable difiere entre los clusters. Por ejemplo, se observará que el Cluster 1 tendrá boxplots con valores más bajos para GDP y HDI, y más altos para Infant y Death_rate, mientras que el Cluster 2 mostrará el patrón opuesto. El gráfico de individuos coloreados por cluster en el plano principal (cluster_ind_plot) permite ver la separación de los clusters en el espacio de componentes principales. Idealmente, los puntos de diferentes colores (clusters) deberían formar grupos distintos, lo que indicaría una buena separación. Estos gráficos confirman visualmente las caracterizaciones obtenidas de las estadísticas descriptivas por cluster, ofreciendo una comprensión más profunda de la estructura de los datos y las agrupaciones de países.

# Gráfico de individuos coloreados por cluster - Interactivo (ya existente y usando ggplotly)
# Obtener las coordenadas de los individuos y los clusters
cluster_df_for_join <- cluster_df_for_join %>%
     mutate(
       Cluster = recode_factor(Cluster,
                               "1" = "Países Desarrollados",
                               "2" = "Países Subdesarrollados")
     )
  
ind_coords <- as.data.frame(res.pca$x) %>%
  select(PC1, PC2) %>% 
  mutate(Country = rownames(.)) %>%
  left_join(cluster_df_for_join, by = "Country")

cluster_ind_plot <- ggplot(ind_coords, aes(x = PC1, y = PC2, color = Cluster, text = Country)) + 
  geom_point(size = 3, alpha = 0.8) +
  labs(
    title = "Individuos (Países) en el plano principal coloreados por Cluster",
    x = paste0("Modernización (", round(eig.val$variance.percent[1], 1), "%)"),
    y = paste0("Crecimiento Acelerado (", round(eig.val$variance.percent[2], 1), "%)")
  ) +
  theme_minimal()

ggplotly(cluster_ind_plot, tooltip = "text")
# --- Conversión de gráficos ade4 a ggplotly ---

# Necesitas el objeto dudi del resultado de FactoClass
dudi_resultado <- resultado_FactoClass$dudi

# 4. Gráfico de conjuntos (individuos y variables) - similar al biplot
# Ya tenemos el biplot interactivo res.pca que es más robusto y se genera con fviz_pca_biplot.
# No se necesita una nueva implementación específica de 'scatter(dudi_resultado)' ya que 'fviz_pca_biplot'
# lo cubre de manera interactiva y es más recomendado.

s.class(dudi_resultado$li, factor(resultado_FactoClass$cluster),
        sub = "Modernización y Crecimiento Acelerado con Clusters", possub = "bottomright",
        xax = 1, yax = 2,
        col = rainbow(nlevels(factor(resultado_FactoClass$cluster)))) 

Análisis Detallado (Biplot de Individuos Coloreados por Cluster con Elipses)

Este gráfico, un biplot de individuos coloreados por cluster, es crucial para visualizar la efectividad de nuestra segmentación y para comprender las características distintivas de cada grupo de países en el espacio de las componentes principales. En este biplot, el eje horizontal (PC1) representa la “Modernización”, mientras que el eje vertical (PC2) representa el “Crecimiento Acelerado”. Cada punto simboliza un país y su color indica la pertenencia a uno de los dos clusters identificados: “Países Desarrollados” (azul) o “Países Subdesarrollados” (rojo). Las elipses de confianza al 95% alrededor de cada cluster ofrecen una representación visual de la dispersión y la separación entre los grupos.

Al observar la cantidad y distribución de los puntos, es inmediatamente perceptible que existe una mayor concentración de puntos rojos (“Países Subdesarrollados”) en comparación con los puntos azules (“Países Desarrollados”). Esta distribución sugiere que, dentro de nuestro conjunto de datos, una proporción más grande de países se clasifica en la categoría de “Subdesarrollados” según las variables consideradas. Los puntos azules se agrupan de manera compacta en el lado derecho del biplot (valores altos de PC1), mientras que los puntos rojos se congregan en el lado izquierdo (valores bajos de PC1). Esta división horizontal es extremadamente clara, y la ausencia de solapamiento significativo entre las elipses de confianza de ambos clusters confirma que nuestro algoritmo de clusterización ha logrado una separación robusta y efectiva entre los grupos.

Las flechas rojas en el biplot representan las variables originales y su relación con las componentes principales. Es crucial entender que estas flechas no “se salen de círculos” en el sentido de límites, sino que se proyectan desde el origen del gráfico, indicando la dirección y fuerza de la correlación de cada variable con las nuevas dimensiones. Por ejemplo, en relación con la PC1 (Modernización):

  • Las flechas que apuntan fuertemente hacia la derecha (valores positivos de PC1), como las de GDP, HDI, Care, Water y Electricity, muestran una alta correlación positiva con esta dimensión. Esto significa que los países que se agrupan en el lado derecho del biplot (el cluster azul de “Países Desarrollados”) son aquellos que exhiben altos valores en estas características, es decir, un elevado nivel de modernización y desarrollo.

  • Por el contrario, las flechas que se extienden hacia la izquierda (valores negativos de PC1), como Death_rate, Infant y Fertility, indican una fuerte correlación negativa. Los países con altos valores en estas variables (altas tasas de mortalidad y fertilidad) se sitúan en el lado izquierdo del biplot, caracterizando al cluster rojo de “Países Subdesarrollados” por un menor grado de modernización.

Respecto a la PC2 (Crecimiento Acelerado):

  • Las flechas que se dirigen hacia arriba (valores positivos de PC2), como Smoke, Alcohol y Diabetes, señalan una correlación positiva. Los países ubicados en la parte superior del biplot tienden a tener mayor prevalencia de estas características, vinculadas a estilos de vida urbanos o a un “Crecimiento Acelerado” que conlleva ciertos desafíos de salud pública.

  • Las flechas que apuntan hacia abajo (valores negativos de PC2), como Sanitation y Rural, indican una correlación negativa. Los países en la parte inferior del biplot podrían tener un menor impacto de los problemas de estilo de vida o enfrentar desafíos relacionados con infraestructura básica y una población más rural.

5. Interpretación de los Factores y Descripción de los Clusters

A partir del Análisis de Componentes Principales (ACP) y la clusterización, podemos interpretar los factores latentes que estructuran la variabilidad de nuestros datos y describir los perfiles de los clusters de países.

5.1 Interpretación de los Factores (Componentes Principales)

El ACP ha revelado dos componentes principales que capturan una parte sustancial de la varianza total. La interpretación de estos factores se basa en la contribución de las variables originales a cada componente, observada en la matriz de rotación y el círculo de correlación.

  • Primera Componente Principal (PC1): Factor de Desarrollo Socioeconómico y Salud: Esta componente es fuertemente definida por variables como el PIB per cápita (GDP), el Gasto en salud per cápita (Care), el Índice de Desarrollo Humano (HDI), el Acceso a agua potable (Water) y el Acceso a electricidad (Electricity), todas con altas cargas positivas. En contraste, variables como la Mortalidad Infantil (Infant), la Tasa de Mortalidad (Death_rate) y la Tasa de Fertilidad (Fertility) tienen cargas negativas importantes en esta componente. Esto sugiere que PC1 representa una escala de desarrollo y bienestar. Países con puntuaciones altas en PC1 son aquellos con economías robustas, fuertes inversiones en salud, alto desarrollo humano y buen acceso a servicios básicos, lo que correlaciona con bajas tasas de mortalidad y natalidad controlada. Por otro lado, países con puntuaciones bajas en PC1 son aquellos con economías débiles, sistemas de salud deficientes, bajo desarrollo humano y altas tasas de mortalidad y fertilidad.

  • Segunda Componente Principal (PC2): Factor de Estilo de Vida y Salud Pública: La segunda componente principal se caracteriza por la contribución positiva de variables como el Consumo de Tabaco (Smoke), el Consumo de Alcohol (Alcohol) y la Prevalencia de Diabetes (Diabetes). Aunque en menor medida, la Población (Population) y las Emisiones de CO2 (CO2) también contribuyen. Las variables de Sanitation (población sin saneamiento) y Rural se oponen a estas variables. Esto indica que PC2 podría estar relacionada con los desafíos de salud pública y los patrones de estilo de vida en poblaciones urbanizadas y potencialmente industrializadas. Países con puntuaciones altas en PC2 podrían ser aquellos con una mayor prevalencia de enfermedades relacionadas con el estilo de vida, mientras que aquellos con puntuaciones bajas podrían tener un menor impacto de estas problemáticas o un perfil más rural con desafíos de saneamiento.

Estos dos factores combinados (PC1 y PC2) explican la mayor parte de la varianza en las características de los países, ofreciendo una base sólida para la segmentación.

6. Conclusiones