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.
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.
El conjunto de datos integrado utilizado para el modelado comprende las siguientes variables:
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.GDP): Variable
cuantitativa que mide el Producto Interno Bruto por habitante, ajustado
por paridad de poder adquisitivo. Refleja el nivel de desarrollo
económico.Population): Variable
cuantitativa que representa el total de habitantes del país.Death_rate):
Variable cuantitativa que indica el número de muertes por cada 1000
habitantes.Care):
Variable cuantitativa que representa el gasto total en salud por
habitante.Infant): Variable
cuantitativa que indica la tasa de mortalidad de infantes (generalmente
por cada 1000 nacidos vivos).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.Rural): Variable
cuantitativa que indica el porcentaje de población que reside en áreas
rurales.Urban): Variable
cuantitativa que indica el porcentaje de población que reside en áreas
urbanas.Water):
Variable cuantitativa que mide el porcentaje de población con acceso a
servicios básicos de agua potable.Fertility):
Variable cuantitativa que indica el número promedio de hijos por
mujer.HDI):
Variable cuantitativa que mide el nivel de desarrollo humano (largo y
saludable de vida, acceso a conocimientos y un nivel de vida
decente).CO2): Variable
cuantitativa que representa las emisiones de dióxido de carbono per
cápita.Diabetes):
Variable cuantitativa que indica el porcentaje de la población entre 20
y 79 años con diabetes.Smoke): Variable
cuantitativa que mide el porcentaje de adultos que fuman o usan
tabaco.Alcohol): Variable
cuantitativa que indica el consumo total de alcohol puro per cápita
(litros) por personas de 15 años o más.Electricity):
Variable cuantitativa que mide el porcentaje de la población con acceso
a electricidad.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.
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:
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.
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.
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.
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:
GDP,
Care, HDI, Water,
Electricity, y también muestran una mayor prevalencia en
Smoke, Alcohol, y Diabetes.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.”
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.
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.
FactoClassEl 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.
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:
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”.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.
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.
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.
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.