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.
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.
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.
¿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?
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:
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)
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.
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.
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.
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
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))
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))
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)")
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")
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]]
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.
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))
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).
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.
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:
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.
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:
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")
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
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)))
)
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)
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.
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)
Banco Mundial (2024). World Development Indicators – Energy and Environment. Disponible en: https://data.worldbank.org/
Manual de R – https://fhernanb.github.io/Manual-de-R
Pacto Mundial. (s. f.). ODS 7: Energía asequible y no contaminante. https://www.pactomundial.org/ods/7-energia-asequible-y-no-contaminante
Joaquín Barandica. https://www.joaquibarandica.com/post/ansupervised/