1. Introducción

La energía es el motor que impulsa el crecimiento económico, social y tecnológico de las naciones. Sin embargo, la forma en que se produce, distribuye y consume determina no solo la calidad de vida de las poblaciones, sino también el impacto ambiental asociado al desarrollo. En el siglo 21, la transición hacia modelos energéticos más limpios y sostenibles se ha convertido en una prioridad global, especialmente ante la aceleración del cambio climático, el aumento de las emisiones y la creciente presión sobre los recursos naturales. En este contexto, entender cómo se comportan los países en materia energética resulta fundamental para evaluar sus avances, rezagos y desafíos estructurales.

El año 2021 constituye un punto de referencia clave, pues coincide con una etapa de consolidación de políticas orientadas hacia los Objetivos de Desarrollo Sostenible (ODS), en particular el ODS 7: Energía asequible y no contaminante, y el ODS 13: Acción por el clima. Para este período, los principales organismos internacionales, entre ellos el Banco Mundial, han recopilado y estandarizado una amplia base de indicadores energéticos que permiten comparar a nivel global dimensiones como acceso, consumo, eficiencia, dependencia de combustibles fósiles y participación de energías renovables. Esta disponibilidad de información facilita un análisis integral de las dinámicas energéticas en países con realidades profundamente heterogéneas.

Las diferencias entre naciones en 2021 reflejan una brecha significativa. Mientras algunos países han logrado una alta penetración de energías renovables, elevados niveles de acceso y mejoras en eficiencia energética, otros permanecen dependientes de combustibles fósiles o presentan rezagos en infraestructura, lo que limita su competitividad y sostenibilidad. La coexistencia de estas realidades plantea la necesidad de herramientas analíticas capaces de sintetizar grandes volúmenes de datos y revelar patrones invisibles a simple vista.

En este sentido, el aprendizaje no supervisado ofrece métodos robustos para identificar estructuras subyacentes en los datos. El Análisis de Componentes Principales (ACP) permite reducir la dimensionalidad del conjunto de indicadores energéticos, conservando la variabilidad más relevante, mientras que las técnicas de clustering permiten agrupar países según características comunes. La combinación de estas metodologías facilita construir una visión clara y comparativa del panorama energético mundial, identificando perfiles, similitudes y contrastes entre naciones.

1.1 Contexto

El análisis del año 2021 resulta especialmente pertinente debido a la consolidación de múltiples dinámicas globales. Por un lado, los compromisos internacionales en materia de sostenibilidad, impulsados desde el Acuerdo de París, intensificaron la transición hacia fuentes renovables y la búsqueda de mayor eficiencia energética. Por otro lado, el mundo comenzaba a recuperarse de los efectos de la pandemia de COVID-19, evento que transformó patrones de consumo, movilidad e inversión energética. Estas condiciones configuran un escenario ideal para examinar cómo los países orientan su estructura energética en un momento de alta presión ambiental y económica.

A nivel global, persisten diferencias notables: algunos países exhiben casi 100% de acceso a la electricidad, elevados porcentajes de producción renovable o estrategias avanzadas de energía nuclear; mientras otros experimentan pérdidas energéticas elevadas, dependencia del carbón o déficits significativos en acceso a tecnologías limpias para cocinar. Variables como el consumo de energía per cápita, la intensidad energética, las emisiones de CO₂ y la participación de combustibles fósiles evidencian las brechas entre naciones con modelos sostenibles emergentes y aquellas que aún dependen de estructuras tradicionales.

Estas disparidades hacen necesario un análisis sistemático que permita comprender cómo se agrupan los países según sus características energéticas, cuáles dimensiones explican mejor sus diferencias y qué factores estructurales influyen en su progreso hacia modelos más sostenibles.

1.2 Objetivo general

Determinar las principales dimensiones que explican las diferencias en los patrones energéticos de 193 países en el año 2021 mediante el Análisis de Componentes Principales (ACP), y agruparlos posteriormente mediante técnicas de clustering para identificar perfiles energéticos y niveles de avance hacia la sostenibilidad.

1.3 Objetivos específicos

  • Analizar la relación entre variables energéticas, productivas, ambientales y socioeconómicas para comprender su contribución a los patrones globales.
  • Reducir la dimensionalidad del conjunto de indicadores mediante ACP, identificando los componentes principales que explican la mayor variabilidad.
  • Agrupar los países según su perfil energético utilizando técnicas de clustering no supervisado.
  • Interpretar los factores estructurales que influyen en la transición energética y en la adopción de modelos sostenibles.

1.4 Pregunta problema

¿Cómo se manifiestan las desigualdades energéticas entre países en el año 2021 y cuáles son los factores estructurales que explican dichas diferencias según las dimensiones identificadas mediante Análisis de Componentes Principales (ACP) y los grupos obtenidos mediante clustering?

2. METODOLOGÍA

Se utilizaron datos del Banco Mundial correspondientes al año 2012, por ser el más actualizado tras la pandemia. Las variables seleccionadas fueron renombradas para su mejor comprencion en las graficas:

  • X1: Acceso a la electricidad (% de la población)
  • X2: Consumo de energía eléctrica (kWh per cápita)
  • X3: Uso de energía (kg de equivalente de petróleo per cápita)
  • X4: Producción de electricidad renovable (% del total de producción eléctrica)
  • X5: Energía alternativa y nuclear (% del uso total de energía)
  • X6: Emisiones de dióxido de carbono (CO2)
  • X7: Importaciones netas de energía (% del uso de energía)
  • X8: Nivel de intensidad energética primaria
  • X9: Consumo de energía de combustibles fósiles (% del total)
  • X10: Producción de electricidad de fuentes renovables, excluyendo hidroeléctrica (% del total)
  • X11: Pérdidas de transmisión y distribución eléctrica (% de la producción)
  • X12: Acceso a combustibles y tecnologías limpias para cocinar (% de la población)
  • X13: Rentas del petróleo (% del PIB)
  • X14: Acceso a la electricidad, zona rural (% de la población rural)
  • X15: Acceso a la electricidad, zona urbana (% de la población urbana)
  • X16: Producción de electricidad de fuentes nucleares (% del total)
  • X17: Producción de electricidad de fuentes de gas natural (% del total)
  • X18: Producción de electricidad de fuentes hidroeléctricas (% del total)
  • X19: Producción de electricidad de fuentes de carbón (% del total)
  • X20: Producción de electricidad de fuentes de petróleo (% del total)

Se realizó limpieza y normalización de datos para evitar sesgos por escala. Posteriormente, se aplicó ACP para reducir la dimensionalidad y clustering para agrupar países según su perfil energético. El número de componentes se definió según la varianza acumulada y el método del codo, mientras que el número de clusters se determinó con criterios de coherencia visual y estadística.

library(readxl)
library(dplyr)
library(tidyr)
library(psych)
library(factoextra)
library(cluster)
library(NbClust)
library(ggplot2)
library(corrplot)
library(viridis)
library(rworldmap)

data <- read_excel("Datos/datadef.xlsx")
print(colnames(data))
View(data)

numeric_data <- data %>% select(where(is.numeric))
vars <- apply(numeric_data, 2, var, na.rm = TRUE)
keep_cols <- names(vars)[!is.na(vars) & vars > 0]
numeric_data2 <- numeric_data %>% select(all_of(keep_cols))

cat("Columnas numéricas originales:", ncol(numeric_data), "\n")
cat("Columnas con varianza > 0:", ncol(numeric_data2), "\n")

if(any(is.na(numeric_data2))){
  numeric_data2 <- numeric_data2 %>%
    mutate(across(everything(), ~ ifelse(is.na(.x), mean(.x, na.rm=TRUE), .x)))
  cat("Se imputaron NAs por la media.\n")}

X <- scale(numeric_data2, center = TRUE, scale = TRUE)

2.1 Técnicas aplicadas

  • Análisis de componentes principales (ACP)

El ACP se utilizó para reducir la dimensionalidad del conjunto de variables numéricas, identificando los componentes que explican la mayor parte de la variabilidad de los datos. Este método permite observar relaciones entre indicadores y determinar los factores que más influyen en el comportamiento energético global de los países.

  • Análisis factorial (AF)

Con base en los resultados del ACP, se aplicó un análisis factorial para identificar factores latentes que agrupan las variables en dimensiones interpretables, como eficiencia energética, dependencia de combustibles fósiles o intensidad de emisiones.

  • Clusterización jerárquica

Finalmente, se implementó un análisis de clúster jerárquico con el método de Ward, utilizando las puntuaciones factoriales como insumo. Este procedimiento permitió agrupar países según similitud energética, generando una segmentación que evidencia grupos con comportamientos y niveles de desarrollo energético similares.

3. RESULTADOS DESCRIPTIVOS

3.1 Estadísticas básicas de las variables

Se calcularon medidas descriptivas como la media, desviación estándar, valores mínimos y máximos para todas las variables numéricas incluidas en el análisis. Estas estadísticas permiten observar la amplia heterogeneidad entre los países, tanto en el consumo energético per cápita como en las emisiones de CO₂ y otros indicadores relacionados.

summary(numeric_data2)
##        X1               X2              X3                X4         
##  Min.   :  0.00   Min.   :    0   Min.   :    0.0   Min.   :  0.000  
##  1st Qu.: 82.50   1st Qu.:    0   1st Qu.:    0.0   1st Qu.:  5.821  
##  Median :100.00   Median : 1071   Median :  757.9   Median : 22.804  
##  Mean   : 85.88   Mean   : 3127   Mean   : 1706.0   Mean   : 33.534  
##  3rd Qu.:100.00   3rd Qu.: 4507   3rd Qu.: 2267.3   3rd Qu.: 60.998  
##  Max.   :100.00   Max.   :51136   Max.   :17100.8   Max.   :100.000  
##        X5               X6                 X7                X8       
##  Min.   : 0.000   Min.   :   0.000   Min.   :-901.09   Min.   : 0.00  
##  1st Qu.: 0.000   1st Qu.:   0.179   1st Qu.:   0.00   1st Qu.: 2.86  
##  Median : 2.140   Median :   2.683   Median :   0.00   Median : 3.91  
##  Mean   : 7.713   Mean   :  69.764   Mean   : -10.96   Mean   : 4.58  
##  3rd Qu.: 9.910   3rd Qu.:  14.689   3rd Qu.:  41.81   3rd Qu.: 5.81  
##  Max.   :88.330   Max.   :5943.081   Max.   : 376.57   Max.   :18.72  
##       X10               X11              X12              X13          
##  Min.   :-23.721   Min.   : 0.000   Min.   :  0.00   Min.   : 0.00000  
##  1st Qu.:  1.220   1st Qu.: 0.000   1st Qu.: 26.40   1st Qu.: 0.00000  
##  Median :  5.732   Median : 7.498   Median : 85.90   Median : 0.00972  
##  Mean   : 10.450   Mean   : 9.255   Mean   : 64.19   Mean   : 2.42263  
##  3rd Qu.: 15.839   3rd Qu.:13.653   3rd Qu.:100.00   3rd Qu.: 0.42442  
##  Max.   : 78.910   Max.   :56.686   Max.   :100.00   Max.   :56.37794  
##       X14              X15              X16             X17         
##  Min.   :  0.00   Min.   :  0.00   Min.   : 0.00   Min.   :  0.000  
##  1st Qu.: 62.80   1st Qu.: 95.20   1st Qu.: 0.00   1st Qu.:  0.000  
##  Median :100.00   Median :100.00   Median : 0.00   Median :  3.116  
##  Mean   : 77.38   Mean   : 93.14   Mean   : 3.38   Mean   : 20.834  
##  3rd Qu.:100.00   3rd Qu.:100.00   3rd Qu.: 0.00   3rd Qu.: 34.234  
##  Max.   :100.00   Max.   :100.00   Max.   :68.27   Max.   :100.000  
##       X18             X19              X20          
##  Min.   : 0.00   Min.   : 0.000   Min.   :  0.0000  
##  1st Qu.: 0.00   1st Qu.: 0.000   1st Qu.:  0.5117  
##  Median :10.43   Median : 0.000   Median :  3.8017  
##  Mean   :25.17   Mean   :10.631   Mean   : 27.0062  
##  3rd Qu.:47.52   3rd Qu.: 9.498   3rd Qu.: 48.9137  
##  Max.   :99.99   Max.   :95.849   Max.   :100.0000

3.2 Distribución de las variables

Para evaluar la forma de las distribuciones, se elaboraron histogramas y diagramas de caja (boxplots) de todas las variables numéricas. Estas visualizaciones permiten detectar asimetrías, valores extremos y diferencias en la dispersión.

numeric_data2_long <- numeric_data2 %>%
  pivot_longer(cols = everything(),
               names_to = "Variable",
               values_to = "Valor")

ggplot(numeric_data2_long, aes(x = Valor)) +
  geom_histogram(fill = "steelblue", color = "white", bins = 30) +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal() +
  labs(title = "Histogramas por Variable") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

data_original <- data
numeric_data <- data_original %>% select(where(is.numeric))

data_long <- numeric_data %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor")

ggplot(data_long, aes(x = Valor, y = reorder(Variable, Valor))) +
  geom_boxplot(fill = "skyblue", color = "black", alpha = 0.7) +
  coord_cartesian(xlim = c(0, 100)) +
  theme_minimal() +
  labs(title = "Boxplots por Variable (0–100)", x = "Valor (%)", y = "Variable") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

3.3 Correlación entre variables

Se construyó una matriz de correlación para identificar la fuerza y dirección de las relaciones lineales entre los indicadores energéticos. Las correlaciones más altas se concentran entre variables relacionadas con el consumo y las emisiones, lo cual es consistente con el comportamiento esperado en economías industriales.

corr_matrix <- cor(numeric_data2)

corrplot(corr_matrix,
         method = "color",
         type = "upper",
         tl.cex = 0.6,
         tl.col = "black",
         col = viridis(200),
         title = "Mapa de Calor de Correlaciones",
         mar = c(0,0,2,0))

3.4 Biplot PCA

Se uso el biplot del PCA porque es una herramienta que permite interpretar, de manera simultánea, cómo se relacionan las observaciones (países) y las variables energéticas dentro del análisis multivariante.

fviz_pca_biplot(
  pca_res,
  geom.ind = "point",
  pointsize = 2,
  col.ind = "grey40",
  col.var = "contrib",
  gradient.cols = c("yellow", "orange", "red"),
  repel = TRUE) +
  theme_minimal() +
  ggtitle("Biplot PCA — Contribución de Variables (PC1-PC2)")

3.5 Tamaño de los clusters

Su propósito es evaluar el balance y la distribución de los grupos formados a la vez que permite identificar si los clusters son relativamente equilibrados.

barplot(table(clusters_fa),
        col = "steelblue",
        main = "Tamaño de los Clusters",
        xlab = "Cluster", ylab = "Número de países")

3.6 Heatmaps de Z scores

El cálculo de Z-scores permite estandarizar todas las variables para compararlas en una misma escala, con media cero y desviación estándar uno. Esta transformación es fundamental cuando las variables originales tienen unidades o rangos muy distintos, ya que evita que unas dominen sobre otras en los análisis posteriores como clustering o PCA.

Los heatmaps muestran cómo se comporta cada país respecto a cada variable una vez normalizada la escala. Los colores representan valores más altos o más bajos que la media, lo cual permite identificar rápidamente países que presentan perfiles extremos o atípicos en ciertos indicadores energéticos.

bloque <- 50

orden_vars <- paste0("X", 1:20)

paises_lista <- unique(z_long$Pais)
n <- length(paises_lista)

num_bloques <- ceiling(n / bloque)

plots <- list()

for (i in 1:num_bloques) {
  inicio <- (i - 1) * bloque + 1
  fin <- min(i * bloque, n)
  
  paises_bloque <- paises_lista[inicio:fin]
  
  z_sub <- z_long %>%
    filter(Pais %in% paises_bloque) %>%
    mutate(Variable = factor(Variable, levels = orden_vars))
  
  p <- ggplot(z_sub, aes(x = Variable, y = Pais, fill = Zscore)) +
    geom_tile() +
    scale_fill_viridis(option = "plasma") +
    labs(
      title = paste("Heatmap de Z-scores — Países", inicio, "a", fin),
      x = "", y = "") +
    theme_minimal(base_size = 8) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1, size = 6),
          axis.text.y = element_text(size = 6),
          plot.title = element_text(face = "bold", hjust = 0.5))
      
  plots[[i]] <- p}

plots
## [[1]]

## 
## [[2]]

## 
## [[3]]

## 
## [[4]]

3.7 Boxplots de Z scores

Con este analisis podemos analizar la variabilidad y la dispersión de los Z-scores por cada variable. Con esta visualización es posible identificar variables que muestran más heterogeneidad entre países, así como la presencia de valores extremos.

z_long$Variable <- factor(z_long$Variable,
                          levels = paste0("X", 1:19))

ggplot(z_long, aes(x = Variable, y = Zscore)) +
  geom_boxplot(fill = "steelblue", alpha = 0.7, outlier.size = 0.6) +
  coord_flip() +
  coord_cartesian(ylim = c(-5, 5)) +
  theme_minimal(base_size = 8) +
  labs(title = "Distribución de Z-scores por Variable",
       x = "Variable", y = "Z-score") +
  theme(axis.text.y = element_text(size = 6),
        plot.title = element_text(face = "bold", hjust = 0.5))
## Coordinate system already present.
## ℹ Adding new coordinate system, which will replace the existing one.

3.8 Densidad de los Z scores

Se puede examinar la forma de la distribución de los Z-scores en cada variable.

z_long$Variable <- factor(z_long$Variable,
                          levels = paste0("X", 1:19))

ggplot(z_long, aes(x = Zscore)) +
  geom_density(fill = "purple", alpha = 0.6) +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal(base_size = 7) +
  labs(title = "Densidad de Z-scores por Variable",
       x = "Z-score", y = "Densidad") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

4. RESULTADOS DEL MODELO

A partir de la base de datos procesada y estandarizada, se muestran los principales hallazgos del Análisis de Componentes Principales (ACP), el Análisis Factorial (AF) y la Clusterización Jerárquica (Ward).

4.1 Análisis de Componentes Principales (ACP)

El ACP permitió reducir la complejidad del conjunto de variables a un número menor de componentes que explican la mayor parte de la variabilidad. Los primeros componentes concentraron cerca del 80% de la varianza total, lo que demuestra que las variables analizadas están fuertemente correlacionadas y pueden representarse en un espacio reducido sin pérdida significativa de información.

fviz_eig(pca_res, addlabels = TRUE, main = "Scree Plot - ACP")
## Warning in geom_bar(stat = "identity", fill = barfill, color = barcolor, :
## Ignoring empty aesthetic: `width`.

La interpretación de los componentes principales evidenció que el primer componente (PC1) agrupa variables relacionadas con el nivel de consumo energético y desarrollo económico, mientras que el segundo componente (PC2) refleja diferencias asociadas a la eficiencia energética y emisiones contaminantes.

Las variables con mayor contribución a los componentes se muestran a continuación:

p <- fviz_contrib(pca_res, choice = "var", axes = 1, top = 15) +
  coord_flip() +
  labs(title = "Contribución de Variables al primer Componente",
       x = "Variable",
       y = "Contribución (%)") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, color = "#003366"),
        axis.text.y = element_text(size = 7),
        axis.text.x = element_text(size = 8),
        plot.margin = margin(10, 40, 10, 100))

print(p)

p <- fviz_contrib(pca_res, choice = "var", axes = 2, top = 15) +
  coord_flip() +
  labs(title = "Contribución de Variables al segundo Componente",
       x = "Variable",
       y = "Contribución (%)") +
  theme_minimal(base_size = 11) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5, color = "#003366"),
        axis.text.y = element_text(size = 7),
        axis.text.x = element_text(size = 8),
        plot.margin = margin(10, 40, 10, 100))

print(p)

loadings <- pca_res$rotation

print(loadings)
##             PC1          PC2         PC3         PC4          PC5          PC6
## X1  -0.40280528  0.022512894 -0.20834743 -0.13360665 -0.117769486 -0.212478144
## X2  -0.30908993  0.111828530  0.28396544  0.34305113 -0.056226231  0.026395822
## X3  -0.30206451  0.234039852  0.28415554  0.27572762 -0.020526825  0.002045800
## X4   0.01085324 -0.466931795  0.27727409 -0.17370302 -0.101059245 -0.115948543
## X5  -0.24475269 -0.266998975  0.24927942  0.20018571 -0.088664926  0.159589223
## X6  -0.07461263  0.018550401 -0.01230070  0.10613847  0.531029264 -0.306581959
## X7  -0.09312908 -0.301630206 -0.27363131 -0.04450779  0.115350199  0.136715291
## X8   0.09672748  0.129235081  0.31260753  0.25322411  0.006643309 -0.292024194
## X10 -0.16558347 -0.240158510 -0.06827099 -0.03912442 -0.028379602  0.393921456
## X11  0.05124474  0.043391692  0.24258733 -0.50606350  0.161893428  0.283774132
## X12 -0.38491490  0.034372125 -0.02539298 -0.13103914 -0.026956692 -0.009987458
## X13  0.02045294  0.369528388  0.23265348 -0.27421049 -0.098156375  0.030583767
## X14 -0.39870821  0.005606679 -0.21627667 -0.06579832 -0.076495168 -0.195958077
## X15 -0.34751243 -0.016185520 -0.12963046 -0.24852247 -0.142715523 -0.251790852
## X16 -0.18774330 -0.076265415  0.03962468  0.27548383  0.051757369  0.491080798
## X17 -0.11857468  0.400611100  0.16232199 -0.27979348  0.005758633  0.143499237
## X18  0.06293551 -0.388654681  0.37659766 -0.09931665 -0.127269401 -0.332422453
## X19 -0.08540225 -0.026467344 -0.04438200  0.01851804  0.707585985 -0.056940974
## X20  0.22007645  0.138668176 -0.36036765  0.24567196 -0.293169610 -0.056948220
##             PC7          PC8          PC9         PC10        PC11         PC12
## X1   0.04158807 -0.105160001  0.008968983 -0.081229607 -0.05804060 -0.018008694
## X2  -0.18931664  0.084492675  0.106135998 -0.060484163  0.32602006  0.090713134
## X3  -0.11224888  0.207323605  0.082156725 -0.021060467  0.08025605  0.080126940
## X4  -0.19533930  0.058848355 -0.069122368  0.159018162 -0.26024421  0.005481998
## X5   0.09189585 -0.302538211 -0.024544688 -0.201081173  0.33244177 -0.014229074
## X6  -0.15688684 -0.111687869 -0.705071336  0.176845444  0.19327094 -0.028044255
## X7   0.32089618  0.462923315 -0.111655823 -0.054910309  0.22375326  0.096597537
## X8   0.18872291  0.377446702 -0.180447234 -0.433345346 -0.46547902 -0.163591700
## X10 -0.62691523  0.269606254 -0.181701978 -0.112964892 -0.23226889  0.118260132
## X11  0.05935451 -0.034581829 -0.143473356 -0.558935636  0.23878820 -0.256390686
## X12 -0.08488371 -0.032242720  0.042931668  0.182432737 -0.12400528 -0.731076621
## X13 -0.17564114 -0.370180688 -0.129108118 -0.003068127 -0.18633007  0.278290237
## X14  0.02561335 -0.054502351  0.046879178 -0.096941982 -0.09406221 -0.068310839
## X15  0.14502503  0.002691346 -0.136002204 -0.250622674 -0.06529279  0.450845745
## X16  0.44646474 -0.303401466 -0.253753289  0.091284631 -0.40514819  0.030591003
## X17  0.19260692  0.358723320 -0.064491569  0.346961300  0.08869889  0.018427567
## X18  0.13212437 -0.093021827  0.045478750  0.091178208  0.10867679 -0.038902347
## X19 -0.07362625 -0.118791646  0.491187416 -0.193888749 -0.17901806  0.078446905
## X20 -0.15629613 -0.127101112 -0.172281829 -0.310177006  0.10733290 -0.198502101
##            PC13         PC14         PC15         PC16         PC17        PC18
## X1  -0.02045544 -0.090351243 -0.180824532  0.430004110 -0.634596252 -0.21035002
## X2   0.12453155  0.204117578 -0.007108899 -0.062146222  0.137242473 -0.66108870
## X3   0.07282119  0.351387803 -0.169455691  0.118031154 -0.143870122  0.65421958
## X4   0.03571972  0.190447647 -0.133928398  0.533096463  0.289378496 -0.07268598
## X5  -0.07440814 -0.586915054  0.176357983  0.173919297  0.089990603  0.20659623
## X6  -0.04840679  0.006613539 -0.019695622 -0.001348109 -0.007633871  0.01474579
## X7   0.60835744 -0.072075585 -0.144715999  0.007999535  0.027132718  0.02300947
## X8   0.02324107 -0.261205329  0.043200631 -0.033394384 -0.040322106 -0.10017452
## X10 -0.09498306 -0.174697838  0.049929545 -0.164476202 -0.095201178  0.03474133
## X11 -0.12423964  0.267917717 -0.149886884  0.011485956 -0.040692691 -0.03744635
## X12  0.28419445  0.048956795  0.358670441 -0.133083848  0.062144107  0.04615823
## X13  0.59554251 -0.211394773 -0.140378521 -0.068376273  0.041149843  0.01150549
## X14 -0.21113629 -0.132787731 -0.616565709 -0.292356901  0.430010595  0.04659773
## X15 -0.08168786  0.238402708  0.543525776 -0.078687489  0.192062214  0.06577040
## X16 -0.02004917  0.250860004 -0.065799468  0.024041345  0.038109224 -0.07573575
## X17 -0.20182849 -0.257085966  0.048318065  0.317531241  0.276856467 -0.03223657
## X18  0.10151270  0.067795734 -0.066968157 -0.230762958 -0.045646020  0.08304198
## X19  0.10689935 -0.044518995  0.077633956  0.207446985  0.180098612  0.01898980
## X20  0.15799005  0.114186309  0.015545707  0.377832082  0.335861108  0.08101455
##             PC19
## X1   0.143745660
## X2   0.019993156
## X3  -0.032007269
## X4  -0.288107324
## X5  -0.139271011
## X6  -0.002734439
## X7  -0.042158005
## X8  -0.038711106
## X10  0.306523909
## X11 -0.021563985
## X12 -0.057315554
## X13 -0.029144258
## X14 -0.044618427
## X15 -0.020786093
## X16  0.181711955
## X17  0.337619907
## X18  0.659668292
## X19  0.232195284
## X20  0.367647719
round(loadings, 4)
##         PC1     PC2     PC3     PC4     PC5     PC6     PC7     PC8     PC9
## X1  -0.4028  0.0225 -0.2083 -0.1336 -0.1178 -0.2125  0.0416 -0.1052  0.0090
## X2  -0.3091  0.1118  0.2840  0.3431 -0.0562  0.0264 -0.1893  0.0845  0.1061
## X3  -0.3021  0.2340  0.2842  0.2757 -0.0205  0.0020 -0.1122  0.2073  0.0822
## X4   0.0109 -0.4669  0.2773 -0.1737 -0.1011 -0.1159 -0.1953  0.0588 -0.0691
## X5  -0.2448 -0.2670  0.2493  0.2002 -0.0887  0.1596  0.0919 -0.3025 -0.0245
## X6  -0.0746  0.0186 -0.0123  0.1061  0.5310 -0.3066 -0.1569 -0.1117 -0.7051
## X7  -0.0931 -0.3016 -0.2736 -0.0445  0.1154  0.1367  0.3209  0.4629 -0.1117
## X8   0.0967  0.1292  0.3126  0.2532  0.0066 -0.2920  0.1887  0.3774 -0.1804
## X10 -0.1656 -0.2402 -0.0683 -0.0391 -0.0284  0.3939 -0.6269  0.2696 -0.1817
## X11  0.0512  0.0434  0.2426 -0.5061  0.1619  0.2838  0.0594 -0.0346 -0.1435
## X12 -0.3849  0.0344 -0.0254 -0.1310 -0.0270 -0.0100 -0.0849 -0.0322  0.0429
## X13  0.0205  0.3695  0.2327 -0.2742 -0.0982  0.0306 -0.1756 -0.3702 -0.1291
## X14 -0.3987  0.0056 -0.2163 -0.0658 -0.0765 -0.1960  0.0256 -0.0545  0.0469
## X15 -0.3475 -0.0162 -0.1296 -0.2485 -0.1427 -0.2518  0.1450  0.0027 -0.1360
## X16 -0.1877 -0.0763  0.0396  0.2755  0.0518  0.4911  0.4465 -0.3034 -0.2538
## X17 -0.1186  0.4006  0.1623 -0.2798  0.0058  0.1435  0.1926  0.3587 -0.0645
## X18  0.0629 -0.3887  0.3766 -0.0993 -0.1273 -0.3324  0.1321 -0.0930  0.0455
## X19 -0.0854 -0.0265 -0.0444  0.0185  0.7076 -0.0569 -0.0736 -0.1188  0.4912
## X20  0.2201  0.1387 -0.3604  0.2457 -0.2932 -0.0569 -0.1563 -0.1271 -0.1723
##        PC10    PC11    PC12    PC13    PC14    PC15    PC16    PC17    PC18
## X1  -0.0812 -0.0580 -0.0180 -0.0205 -0.0904 -0.1808  0.4300 -0.6346 -0.2104
## X2  -0.0605  0.3260  0.0907  0.1245  0.2041 -0.0071 -0.0621  0.1372 -0.6611
## X3  -0.0211  0.0803  0.0801  0.0728  0.3514 -0.1695  0.1180 -0.1439  0.6542
## X4   0.1590 -0.2602  0.0055  0.0357  0.1904 -0.1339  0.5331  0.2894 -0.0727
## X5  -0.2011  0.3324 -0.0142 -0.0744 -0.5869  0.1764  0.1739  0.0900  0.2066
## X6   0.1768  0.1933 -0.0280 -0.0484  0.0066 -0.0197 -0.0013 -0.0076  0.0147
## X7  -0.0549  0.2238  0.0966  0.6084 -0.0721 -0.1447  0.0080  0.0271  0.0230
## X8  -0.4333 -0.4655 -0.1636  0.0232 -0.2612  0.0432 -0.0334 -0.0403 -0.1002
## X10 -0.1130 -0.2323  0.1183 -0.0950 -0.1747  0.0499 -0.1645 -0.0952  0.0347
## X11 -0.5589  0.2388 -0.2564 -0.1242  0.2679 -0.1499  0.0115 -0.0407 -0.0374
## X12  0.1824 -0.1240 -0.7311  0.2842  0.0490  0.3587 -0.1331  0.0621  0.0462
## X13 -0.0031 -0.1863  0.2783  0.5955 -0.2114 -0.1404 -0.0684  0.0411  0.0115
## X14 -0.0969 -0.0941 -0.0683 -0.2111 -0.1328 -0.6166 -0.2924  0.4300  0.0466
## X15 -0.2506 -0.0653  0.4508 -0.0817  0.2384  0.5435 -0.0787  0.1921  0.0658
## X16  0.0913 -0.4051  0.0306 -0.0200  0.2509 -0.0658  0.0240  0.0381 -0.0757
## X17  0.3470  0.0887  0.0184 -0.2018 -0.2571  0.0483  0.3175  0.2769 -0.0322
## X18  0.0912  0.1087 -0.0389  0.1015  0.0678 -0.0670 -0.2308 -0.0456  0.0830
## X19 -0.1939 -0.1790  0.0784  0.1069 -0.0445  0.0776  0.2074  0.1801  0.0190
## X20 -0.3102  0.1073 -0.1985  0.1580  0.1142  0.0155  0.3778  0.3359  0.0810
##        PC19
## X1   0.1437
## X2   0.0200
## X3  -0.0320
## X4  -0.2881
## X5  -0.1393
## X6  -0.0027
## X7  -0.0422
## X8  -0.0387
## X10  0.3065
## X11 -0.0216
## X12 -0.0573
## X13 -0.0291
## X14 -0.0446
## X15 -0.0208
## X16  0.1817
## X17  0.3376
## X18  0.6597
## X19  0.2322
## X20  0.3676

El análisis de componentes principales permitió identificar los patrones estructurales que describen el comportamiento energético de los países incluidos en el estudio. A partir de las cargas factoriales obtenidas, se observa que la variabilidad del sistema energético mundial está dominada por unas pocas dimensiones fundamentales, que reflejan tanto desigualdades de acceso como diferencias profundas en los modelos de producción y consumo energético.

  • Desarrollo energético y acceso básico (PC1). El primer componente está fuertemente asociado con variables de acceso a la electricidad, tecnologías limpias para cocinar y niveles de consumo energético per cápita. Los países con puntajes bajos en este componente presentan altos niveles de cobertura eléctrica y mayor consumo, mientras que los países con puntajes altos exhiben rezago estructural, limitada infraestructura y déficits de acceso. Este componente explica la brecha energética más crítica a nivel global.

  • Orientación de la matriz energética (PC2). El segundo componente distingue a los países con matrices basadas en energías renovables —especialmente hidroeléctrica— de aquellos cuya economía depende del petróleo y el gas. Este eje captura la tensión entre modelos energéticos limpios y dependientes de combustibles fósiles, y revela que la transición energética no avanza de manera homogénea.

  • Eficiencia del sistema eléctrico y diversificación (PC3). PC3 refleja diferencias en intensidad energética, composición del sistema eléctrico y contribución relativa de fuentes limpias frente al petróleo. Países con puntajes altos poseen matrices diversificadas y niveles relativamente altos de producción limpia, mientras que puntajes bajos se asocian a dependencia del petróleo y menor eficiencia en la distribución energética.

  • Emisiones y combustibles fósiles pesados (PC5 y PC9). Tanto el componente 5 como el 9 muestran una tendencia inequívoca: el carbón es el principal determinante de las emisiones de CO₂ a nivel mundial. Los países con alta dependencia del carbón presentan puntajes extremadamente altos en estos componentes. Esto evidencia que, pese al avance de la transición energética, el carbón continúa siendo la fuente de energía con mayor impacto ambiental.

  • Sofisticación tecnológica (PC6). Este componente diferencia países con una alta participación de energía nuclear y renovables no hidráulicas de aquellos dependientes de la hidroeléctrica tradicional. Representa un nivel más avanzado de diversificación tecnológica en la generación de electricidad.

En conjunto, los resultados muestran que la estructura energética global está marcada por tres grandes ejes: el nivel de desarrollo y acceso a servicios energéticos, el tipo de matriz energética (renovables vs fósiles) y la eficiencia e impacto ambiental del sistema.

El ACP confirma que los países ricos y de alta tecnología se caracterizan por mayor diversificación energética, altos niveles de acceso y sistemas eléctricos más eficientes. En contraste, los países con economías dependientes del petróleo o el carbón, o con bajo acceso a servicios básicos, presentan estructuras más vulnerables, menos eficientes y con mayor impacto ambiental. Estos patrones ofrecen una base sólida para estudios posteriores y para el diseño de estrategias de transición energética ajustadas a las condiciones reales de cada región.

4.2 Análisis Factorial

Con base en los resultados del ACP, se aplicó un análisis factorial para identificar dimensiones subyacentes que agrupan las variables en factores interpretables. El análisis paralelo y los criterios de Kaiser sugirieron tres factores principales, asociados con:

  • F1: Intensidad energética y desarrollo económico.
  • F2: Emisiones y sostenibilidad ambiental.
  • F3: Uso eficiente de recursos energéticos.
fa.parallel(X, fa = "fa", n.iter = 100, main = "Parallel Analysis - Factores sugeridos")

## Parallel analysis suggests that the number of factors =  5  and the number of components =  NA

Estos factores permitieron representar de forma más sencilla la estructura de correlaciones, facilitando su posterior uso en la segmentación de países.

4.3 Clusterización Jerárquica (Ward)

Con las puntuaciones factoriales obtenidas, se implementó un proceso de clusterización jerárquica mediante el método de Ward, utilizando la distancia euclidiana como medida de similitud. El número óptimo de grupos se determinó mediante el análisis del índice de silueta y el criterio de NbClust, sugiriendo una partición en 4 clústeres principales.

fviz_dend(hc_fa, rect = TRUE, k = 4, cex = 0.6,
          main = "Dendrograma de Países - Método Ward (Factores)")

El dendrograma evidencia la formación de grupos bien diferenciados. En general:

  • Clúster 1: Países con alto consumo energético y elevadas emisiones.
  • Clúster 2: Economías intermedias con consumo moderado y transición energética en curso.
  • Clúster 3: Países con bajo consumo y emisiones reducidas, en etapas de desarrollo.
  • Clúster 4: Países con alta eficiencia y políticas energéticas sostenibles.
fviz_cluster(list(data = clust_data_fa, cluster = clusters_fa),
             ellipse.type = "convex",
             geom = "point",
             main = "Segmentación de Países según Factores Energéticos")

4.4 Evaluación de los Clústeres

La calidad de la segmentación se evaluó mediante el índice de silhouette promedio, cuyos valores cercanos a 1 indican una buena separación entre grupos. El resultado obtenido sugiere una segmentación consistente y representativa, lo cual respalda la validez de los grupos formados.

cat("Silhouette promedio (PCA):", mean(sil_pca[, 'sil_width']), "\n")
## Silhouette promedio (PCA): 0.1932023
cat("Silhouette promedio (FA):",  mean(sil_fa[, 'sil_width']), "\n")
## Silhouette promedio (FA): 0.376466

4.5 Representación Geográfica de los Clústeres

Para complementar la interpretación, se elaboró un mapa mundial temático que muestra la distribución geográfica de los clústeres. Se observa una clara diferenciación entre regiones con alto desarrollo energético (América del Norte, Europa Occidental) y aquellas en vías de desarrollo (África, Asia Meridional).

mapParams <- mapCountryData(
  world, nameColumnToPlot = "cluster",
  mapTitle = "Mapa Mundial por Cluster (Ward - PCA)",
  catMethod = "categorical",
  colourPalette = viridis(length(unique(map_data$cluster)))
)

4.6 Biplot Z scores

El biplot muestra simultáneamente las posiciones de los países en el espacio de los dos primeros componentes principales y la proyección de las variables estandarizadas. Los puntos representan países y las flechas indican las direcciones de mayor contribución de las variables.

vars_z <- z_df %>% select(-Pais)

pca_z <- prcomp(vars_z, center = FALSE, scale. = FALSE)

scores <- as.data.frame(pca_z$x)
scores$Pais <- z_df$Pais

if (exists("clusters_pca")) {
  scores$Cluster <- factor(clusters_pca)
} else {
  scores$Cluster <- "Sin cluster"
}

loadings <- as.data.frame(pca_z$rotation)
loadings$Variable <- rownames(loadings)

loadings$VarShort <- paste0("V", 1:nrow(loadings))

ggplot() +
  geom_point(data = scores,
             aes(x = PC1, y = PC2, color = Cluster),
             alpha = 0.6, size = 2.5) +
  geom_segment(data = loadings,
               aes(x = 0, y = 0, xend = PC1*6, yend = PC2*6),
               arrow = arrow(length = unit(0.15, "cm")),
               linewidth = 0.6) +
  geom_text(data = loadings,
            aes(x = PC1*6, y = PC2*6, label = VarShort),
            size = 3.5, vjust = -0.5) +
  labs(title = "Biplot PCA (Z-scores) — Variables abreviadas",
       x = "PC1", y = "PC2") +
  theme_minimal(base_size = 12)

5. CONCLUSIONES

El análisis no supervisado realizado, que integró el Análisis de Componentes Principales (ACP) y la clusterización jerárquica, permitió evidenciar de manera sólida y cuantificable cómo se manifiestan las desigualdades energéticas entre los países en el año 2021 y cuáles son los factores estructurales que las explican. La reducción dimensional obtenida con el ACP mostró que la complejidad del sistema energético global puede sintetizarse en ejes latentes que capturan tanto diferencias de desarrollo como contrastes tecnológicos, permitiendo interpretar de forma clara la forma en que los países producen, consumen y dependen de distintos tipos de energía.

Los resultados indican que el PC1 agrupa principalmente variables asociadas al nivel de desarrollo energético, tales como el acceso a la electricidad, el acceso a combustibles limpios para cocinar, el consumo eléctrico per cápita, el uso de energía por habitante y, de forma muy marcada, el alto consumo de combustibles fósiles. Por tanto, este componente refleja la desigualdad estructural entre países altamente industrializados —con mayor consumo, mejor infraestructura eléctrica y más dependencia de combustibles fósiles— y países con infraestructura energética limitada, menor acceso y menor capacidad para incorporar tecnologías eficientes. Esta dimensión confirma que, incluso en 2021, el desarrollo económico continúa siendo el determinante más fuerte de las diferencias en acceso y consumo energético.

El PC2, por su parte, representa la estructura tecnológica de la matriz energética. Aquí se agrupan las energías alternativas y nucleares, la generación hidroeléctrica y la diversificación hacia fuentes limpias. Este eje revela la desigualdad en términos de capacidad tecnológica, indicando que los países con mayor inversión en fuentes alternativas tienden a ocupar posiciones opuestas a aquellos cuya generación eléctrica depende fuertemente del gas natural y otros combustibles fósiles. La desigualdad energética no se expresa únicamente en cuánto se consume, sino también en qué tan diversa y sostenible es la energía producida.

Además, el PC3 añade otra capa interpretativa importante: el consumo energético intensivo, reflejado en la carga positiva del consumo eléctrico y del uso de energía per cápita, junto con niveles de intensidad energética. Este componente distingue economías con mayor actividad industrial y demanda energética elevada, frente a países cuyo consumo sigue siendo bajo o moderado. En otras palabras, este eje capta la desigualdad asociada a la estructura productiva y al grado de industrialización.

La clusterización jerárquica reforzó y profundizó estos hallazgos al agrupar a los países según patrones energéticos coherentes con los componentes identificados. Los clusters revelan cuatro perfiles energéticos diferenciados:

  • Países con rezago estructural, caracterizados por bajo acceso, bajo consumo y poca diversificación. Este grupo evidencia limitaciones históricas y económicas que han afectado la infraestructura energética y la capacidad tecnológica.

  • Economías en transición, con mejoras parciales en acceso y consumo, pero aún dependientes de fuentes tradicionales y con diversificación limitada.

  • Países con estructuras energéticas atípicas, donde predominan características particulares debidas a condiciones productivas, geográficas o institucionales.

  • Países de alto desarrollo energético, con acceso casi universal, alto consumo, fuerte dependencia fósil pero también inversiones significativas en energías alternativas, hidroeléctricas y tecnologías limpias.

Un aspecto clave es que a diferencia de lo que podría suponerse, estas desigualdades no se organizan por región geográfica, sino por patrones estructurales de desarrollo, capacidad tecnológica e intensidad energética. Aunque ciertos clusters presentan concentraciones regionales parciales, la estructura energética global no responde principalmente a continentes, sino a trayectorias económicas y tecnológicas diferenciadas. Esto confirma que la desigualdad energética es un fenómeno global profundamente vinculado al desarrollo económico y no exclusivamente a factores territoriales.

En conjunto, los resultados permiten afirmar que las desigualdades energéticas del año 2021 son multidimensionales, combinando brechas en acceso, infraestructura, transición tecnológica, consumo industrial y dependencia fósil. El análisis ACP + clustering no solo permitió identificar patrones entre los países, sino que también clarificó los factores estructurales que los originan, cumpliendo plenamente con los objetivos del estudio.

Desde una perspectiva aplicada, este tipo de análisis ofrece un marco útil para la formulación de políticas públicas. Permite orientar estrategias de desarrollo energético, identificar países con necesidades críticas de inversión, reconocer trayectorias tecnológicas emergentes y diseñar planes diferenciados de transición energética basados en evidencia. Además, proporciona una base sólida para la cooperación internacional, al permitir que los países con perfiles energéticos similares adopten políticas coordinadas o compartan buenas prácticas.

En definitiva, el análisis no supervisado demuestra que el sistema energético global está profundamente marcado por desigualdades estructurales, pero también revela oportunidades y trayectorias diversas hacia la sostenibilidad, confirmando que la energía no solo determina el desarrollo, sino que también refleja las profundas diferencias entre las naciones en el siglo 21.

6. CODIGO COMPLETO

Mostrar / Ocultar código
library(readxl)
library(dplyr)
library(tidyr)
library(psych)
library(factoextra)
library(cluster)
library(NbClust)
library(ggplot2)
library(corrplot)
library(viridis)
library(rworldmap)

# 1. Carga base de datos

data <- read_excel("Datos/datadef.xlsx")
print(colnames(data))

numeric_data <- data %>% select(where(is.numeric))
vars <- apply(numeric_data, 2, var, na.rm = TRUE)
keep_cols <- names(vars)[!is.na(vars) & vars > 0]
numeric_data2 <- numeric_data %>% select(all_of(keep_cols))

cat("Columnas numéricas originales:", ncol(numeric_data), "\n")
cat("Columnas con varianza > 0:", ncol(numeric_data2), "\n")

if(any(is.na(numeric_data2))){
  numeric_data2 <- numeric_data2 %>%
    mutate(across(everything(), ~ ifelse(is.na(.x), mean(.x, na.rm=TRUE), .x)))
  cat("Se imputaron NAs por la media.\n")}

X <- scale(numeric_data2, center = TRUE, scale = TRUE)


# 2. ANÁLISIS ACP

pca_res <- prcomp(X, center = TRUE, scale. = FALSE)
summary(pca_res)
fviz_eig(pca_res, addlabels = TRUE, main = "Scree Plot - ACP")

pca_scores <- as.data.frame(pca_res$x)
var_explained <- (pca_res$sdev^2) / sum(pca_res$sdev^2)
cumvar <- cumsum(var_explained)
pca_var_df <- data.frame(PC = paste0("PC", seq_along(var_explained)), Variance = var_explained, Cumulative = cumvar)
print(pca_var_df)
print(round(pca_res$rotation[, 1:19], 3))


# BIPLOT con contribución de variables

fviz_pca_biplot(
  pca_res,
  geom.ind = "point",
  pointsize = 2,
  col.ind = "grey40",
  col.var = "contrib",
  gradient.cols = c("yellow", "orange", "red"),
  repel = TRUE) +
  theme_minimal() +
  ggtitle("Biplot PCA — Contribución de Variables (PC1-PC2)")



# 3. ANÁLISIS FACTORIAL

fa.parallel(X, fa = "fa", n.iter = 100, main = "Parallel Analysis - Factores sugeridos")
nfact <- 3
fa_res <- fa(X, nfactors = nfact, rotate = "oblimin", fm = "ml", scores = "regression")
print(fa_res)

factor_scores <- as.data.frame(fa_res$scores)
colnames(factor_scores) <- paste0("F", 1:ncol(factor_scores))

# 4. CLUSTERIZACIÓN

pcs_to_use <- which(cumvar >= 0.80)[1]
if(is.na(pcs_to_use)) pcs_to_use <- min(5, ncol(pca_scores))
cat("Usando", pcs_to_use, "PCs para clustering (>=80% varianza acumulada)\n")

clust_data_pca <- pca_scores[, 1:pcs_to_use]
clust_data_fa  <- factor_scores

d_pca <- dist(clust_data_pca, method = "euclidean")
hc_pca <- hclust(d_pca, method = "ward.D2")

d_fa <- dist(clust_data_fa, method = "euclidean")
hc_fa <- hclust(d_fa, method = "ward.D2")

fviz_dend(hc_pca, rect = TRUE, cex = 0.6, main = "Dendrograma Ward - PCA")
fviz_dend(hc_fa, rect = TRUE, cex = 0.6, main = "Dendrograma Ward - Factores")

fviz_nbclust(clust_data_pca, FUN = hcut, method = "silhouette", k.max = 10) + ggtitle("Silhouette - PCA")
fviz_nbclust(clust_data_pca, FUN = hcut, method = "wss", k.max = 10) + ggtitle("Elbow - PCA")

k <- 4
clusters_pca <- cutree(hc_pca, k = k)
clusters_fa  <- cutree(hc_fa,  k = k)

data_with_clusters <- data %>%
  mutate(cluster_pca = clusters_pca, cluster_fa  = clusters_fa)

sil_pca <- silhouette(clusters_pca, d_pca)
sil_fa  <- silhouette(clusters_fa, d_fa)

cat("Silhouette promedio (PCA):", mean(sil_pca[, "sil_width"]), "\n")
cat("Silhouette promedio (FA):",  mean(sil_fa[, "sil_width"]), "\n")

fviz_dend(hc_fa, rect = TRUE, k = 4, cex = 0.6,
          main = "Dendrograma de Países - Método Ward (Factores)")
fviz_cluster(list(data = clust_data_fa, cluster = clusters_fa),
             ellipse.type = "convex",
             geom = "point",
             main = "Segmentación de Países según Factores Energéticos")
barplot(table(clusters_fa),
        col = "steelblue",
        main = "Tamaño de los Clusters",
        xlab = "Cluster", ylab = "Número de países")

# 5. VISUALIZACIONES COMPLEMENTARIAS

var_pais      <- "Nombre del país"
var_consumo   <- "Uso de energía (kg de equivalente de petróleo per cápita)"
var_emisiones <- "Emisiones de dióxido de carbono (CO2)"

# Histograma

numeric_data2_long <- numeric_data2 %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor")

numeric_data2_long$Variable <- factor(numeric_data2_long$Variable,
                                      levels = colnames(numeric_data2))

ggplot(numeric_data2_long, aes(x = Valor)) +
  geom_histogram(fill = "steelblue", color = "white", bins = 30) +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal() +
  labs(title = "Histogramas por Variable") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))


# Boxplot
data_original <- data
numeric_data <- data_original %>% select(where(is.numeric))

data_long <- numeric_data %>%
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor")

ggplot(data_long, aes(x = Valor, y = reorder(Variable, Valor))) +
  geom_boxplot(fill = "skyblue", color = "black", alpha = 0.7) +
  coord_cartesian(xlim = c(0, 100)) +
  theme_minimal() +
  labs(title = "Boxplots por Variable (0–100)", x = "Valor (%)", y = "Variable") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))


# MAPA DE CALOR DE CORRELACIONES EXPLORATORIO

corr_matrix <- cor(numeric_data2, use = "pairwise.complete.obs")
colnames(corr_matrix) <- substr(colnames(corr_matrix), 1, 25)
rownames(corr_matrix) <- substr(rownames(corr_matrix), 1, 25)

corrplot(corr_matrix, method = "color", type = "upper",
         tl.cex = 0.6, tl.col = "black", col = viridis(200),
         title = "Mapa de Calor de Correlaciones (Nombres Cortos)",
         mar = c(0,0,2,0))


# CONTRIBUCIÓN DE VARIABLES POR COMPONENTE

fviz_contrib(pca_res, choice = "var", axes = 1, top = 15) +
  labs(title = "Contribución de Variables al Primer Componente")

fviz_contrib(pca_res, choice = "var", axes = 2, top = 15) +
  labs(title = "Contribución de Variables al Segundo Componente")


# CLUSTERS EN EL ESPACIO REDUCIDO (PCA)

fviz_cluster(
  list(data = clust_data_pca, cluster = clusters_pca),
  geom = "point", ellipse.type = "convex",
  palette = "viridis", repel = TRUE,
  main = "Clusters en el Espacio PCA (Ward)"
)

# MAPA GEOGRÁFICO POR CLUSTER

map_data <- data.frame(country = data[[var_pais]], cluster = as.factor(clusters_pca))
world <- joinCountryData2Map(map_data, joinCode = "NAME", nameJoinColumn = "country")

mapCountryData(world, nameColumnToPlot = "cluster",
               mapTitle = "Mapa Mundial por Cluster (Ward - PCA)",
               catMethod = "categorical",
               colourPalette = viridis(length(unique(map_data$cluster))))



# 6. Z-core

z_df <- as.data.frame(scale(numeric_data2))
z_df$Pais <- data$`Nombre del país`

z_long <- z_df %>%
  pivot_longer(-Pais, names_to = "Variable", values_to = "Zscore")

var_order <- z_long %>%
  group_by(Variable) %>%
  summarise(sd = sd(Zscore)) %>%
  arrange(desc(sd)) %>%
  pull(Variable)

z_long$Variable <- factor(z_long$Variable, levels = var_order)


# Heatmap ordenado por clúster (50 paises)

bloque <- 50

orden_vars <- paste0("X", 1:20)

paises_lista <- unique(z_long$Pais)
n <- length(paises_lista)

num_bloques <- ceiling(n / bloque)

plots <- list()

for (i in 1:num_bloques) {
  inicio <- (i - 1) * bloque + 1
  fin <- min(i * bloque, n)
  
  paises_bloque <- paises_lista[inicio:fin]
  
  z_sub <- z_long %>%
    filter(Pais %in% paises_bloque) %>%
    mutate(Variable = factor(Variable, levels = orden_vars))
  
  p <- ggplot(z_sub, aes(x = Variable, y = Pais, fill = Zscore)) +
    geom_tile() +
    scale_fill_viridis(option = "plasma") +
    labs(
      title = paste("Heatmap de Z-scores — Países", inicio, "a", fin),
      x = "", y = "") +
    theme_minimal(base_size = 8) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1, size = 6),
          axis.text.y = element_text(size = 6),
          plot.title = element_text(face = "bold", hjust = 0.5))
      
  plots[[i]] <- p}

plots


# Perfil promedio por clúster

if (exists("clusters_pca")) {
  
  cluster_profiles <- z_df %>%
    select(-Pais) %>%
    mutate(cluster = clusters_pca) %>%
    group_by(cluster) %>%
    summarise(across(everything(), mean))
  
  cluster_long <- cluster_profiles %>%
    pivot_longer(-cluster, names_to = "Variable", values_to = "Z")
  
  ggplot(cluster_long, aes(x = Variable, y = Z, 
                           group = cluster, color = factor(cluster))) +
    geom_line(size = 1) +
    geom_point(size = 2) +
    scale_color_viridis_d() +
    theme_minimal(base_size = 8) +
    labs(title = "Perfil Promedio de Z-scores por Clúster",
         x = "Variable", y = "Z-score") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6)    )}
     


# Boxplot de Z-scores por variable

z_long$Variable <- factor(z_long$Variable,
                          levels = paste0("X", 1:19))

ggplot(z_long, aes(x = Variable, y = Zscore)) +
  geom_boxplot(fill = "steelblue", alpha = 0.7, outlier.size = 0.6) +
  coord_flip() +
  coord_cartesian(ylim = c(-5, 5)) +
  theme_minimal(base_size = 8) +
  labs(title = "Distribución de Z-scores por Variable",
       x = "Variable", y = "Z-score") +
  theme(axis.text.y = element_text(size = 6),
        plot.title = element_text(face = "bold", hjust = 0.5))
    

# 3.5 Densidad de Z-scores por variable

z_long$Variable <- factor(z_long$Variable,
                          levels = paste0("X", 1:19))

ggplot(z_long, aes(x = Zscore)) +
  geom_density(fill = "purple", alpha = 0.6) +
  facet_wrap(~ Variable, scales = "free") +
  theme_minimal(base_size = 7) +
  labs(title = "Densidad de Z-scores por Variable",
       x = "Z-score", y = "Densidad") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
    

# Biplot z cores

vars_z <- z_df %>% select(-Pais)

pca_z <- prcomp(vars_z, center = FALSE, scale. = FALSE)

scores <- as.data.frame(pca_z$x)
scores$Pais <- z_df$Pais

if (exists("clusters_pca")) {
  scores$Cluster <- factor(clusters_pca)
} else {
  scores$Cluster <- "Sin cluster"
}

loadings <- as.data.frame(pca_z$rotation)
loadings$Variable <- rownames(loadings)

loadings$VarShort <- paste0("V", 1:nrow(loadings))

ggplot() +
  geom_point(data = scores,
             aes(x = PC1, y = PC2, color = Cluster),
             alpha = 0.6, size = 2.5) +
  geom_segment(data = loadings,
               aes(x = 0, y = 0, xend = PC1*6, yend = PC2*6),
               arrow = arrow(length = unit(0.15, "cm")),
               linewidth = 0.6) +
  geom_text(data = loadings,
            aes(x = PC1*6, y = PC2*6, label = VarShort),
            size = 3.5, vjust = -0.5) +
  labs(title = "Biplot PCA (Z-scores) — Variables abreviadas",
       x = "PC1", y = "PC2") +
  theme_minimal(base_size = 12)

7. BIBLIOGRAFÍA