U.S. Energy Information Administration (EIA) es una organización que se encarga de recopilar, analizar y difundir información energética de manera independiente e imparcial para promover la formulación de políticas sólidas, mercados eficientes y la comprensión pública de la energía y su interacción con la economía y el medio ambiente.
Los datos que trabajaremos a continuación corresponden a la extracción de diferentes variables relacionadas con energías renovables y combustibles fósiles, las UE son 111 países de todos los continentes del mundo, seleccionados para fines académicos por ser aquellos países que presentan mayor cantidad de información de análisis.
El objetivo de este análisis es encontrar diferentes relaciones entre los países que se están estudiando, de tal forma que podamos caracterizar en términos de importación, exportación, consumo, producción, etc. a los países de estudio.
Determine el tipo de variables que se encuentran en la base de datos, y determine, a primera vista, que metodologías estadísticas podría utilizar para empezar a abordar la base de datos.
pais <- read.csv2("datos_taller_02.csv")
Datos<-as.data.frame(pais)
columnas_a_convertir <- names(Datos)[-1]
Datos[columnas_a_convertir] <- lapply(Datos[columnas_a_convertir], as.numeric)
str(Datos)
## 'data.frame': 111 obs. of 58 variables:
## $ Country : chr "Albania" "Algeria" "Angola" "Argentina" ...
## $ Bunker_fuel_consumption_TBPD : num 0.6 14 12 48 14 0 9.1 9.9 8.8 2.4 ...
## $ Bunker_residual_fuel_oil_consumption_TBPD : num 0 3.8 6.8 26 13 0 0 1.5 1.8 0 ...
## $ Crude_oil_including_lease_condensate_exports_TBPD : num 19 581 1632 49 224 ...
## $ Crude_oil_including_lease_condensate_imports_TBPD : num 0.9 6.4 0 9.5 441 152 0 211 27 450 ...
## $ Crude_oil_including_lease_condensate_production_TBPD : num 21 1420 1742 532 353 ...
## $ Crude_oil_including_lease_condensate_reserves_BB : num 0.2 12 9.1 2.8 1.4 0 7 0.1 0 0.2 ...
## $ Distillate_fuel_oil_consumption_TBPD : num 16 205 83 232 433 152 27 6 66 64 ...
## $ Distillate_fuel_oil_production_TBPD : num 1.8 184 11 173 213 81 60 81 7.4 169 ...
## $ Jet_fuel_consumption_TBPD : num 0.2 12 10 33 139 14 11 9 7 2.9 ...
## $ Jet_fuel_production_TBPD : num 0 43 8.5 29 82 13 15 63 0 7.3 ...
## $ Kerosene_consumption_TBPD : num 0 0 0.8 0.5 0.6 0 0.1 1 6.1 0 ...
## $ Kerosene_production_TBPD : num 0 0 1.5 0.3 0.1 0.4 0 0.5 4.9 0.3 ...
## $ Liquefied_petroleum_gases_.LPG._consumption_TBPD : num 3.9 63 7.2 56 61 3.4 5 2 0.6 6 ...
## $ Liquefied_petroleum_gases_.LPG._production_TBPD : num 0 26 1 39 16 2.2 6 1.9 0.4 19 ...
## $ Motor_gasoline_consumption_TBPD : num 2.8 97 25 122 320 38 32 17 3.9 27 ...
## $ Motor_gasoline_production_TBPD : num 0 70 0.6 123 241 43 29 18 1.4 92 ...
## $ Natural_gas_plant_liquids_production_TBPD : num 0 300 15 104 58 1 1 11 0.2 0 ...
## $ Other_liquids_production_TBPD : num 0 0 0 65 7 8.9 0 0 0 0.6 ...
## $ Other_refined_products_consumption_TBPD : num 5.4 35 9.8 221 148 41 22 21 2.9 54 ...
## $ Other_refined_products_production_TBPD : num 4.7 213 6.7 204 42 39 26 69 5.8 57 ...
## $ Petroleum_and_other_liquids_CO2_emissions_MMTCD : num 3.7 53 21 101 150 35 13 8.1 17 21 ...
## $ Petroleum_and_other_liquids_consumption_TBPD : num 28 416 159 764 1126 ...
## $ Petroleum_and_other_liquids_production_TBPD : num 21 1722 1756 713 442 ...
## $ Refined_petroleum_products_consumption_TBPD : num 28 416 159 764 1126 ...
## $ Refined_petroleum_products_production_TBPD : num 6.6 658 47 661 607 196 142 272 26 457 ...
## $ Refinery_processing_gain_TBPD : num 0 1.8 -0.7 12 23 3.7 5 2.9 0 2.1 ...
## $ Residual_fuel_oil_consumption_TBPD : num 0.1 4 23 99 23 9.4 2.2 2 24 15 ...
## $ Residual_fuel_oil_production_TBPD : num 0.1 120 17 93 12 17 5.6 39 5.8 113 ...
## $ Biomass_and_waste_electricity_installed_capacity_MK : num 0 0 0 0.2 0.8 2.1 0 0 0 0 ...
## $ Biomass_and_waste_electricity_net_generation_BKWH : num 0 0 0 1 3.5 5.1 0.2 0 0 0.2 ...
## $ Electricity_distribution_losses_BKWH : num 2.8 11 1.1 18 12 3.4 3.4 1.1 6.8 3.2 ...
## $ Electricity_exports_BKWH : num 0.2 0.9 0 0.2 0 17 0.5 0.2 0 4.5 ...
## $ Electricity_imports_BKWH : num 3.3 0.7 0 10 0 27 0.1 0.2 2.3 7.8 ...
## $ Electricity_installed_capacity_MK : num 1.8 16 1.8 38 68 24 7.4 7 9.4 10 ...
## $ Electricity_net_consumption_BKWH : num 5 49 8.1 123 229 64 20 25 48 33 ...
## $ Electricity_net_generation_BKWH : num 4.7 60 9.2 131 242 58 23 26 53 33 ...
## $ Electricity_net_imports_BKWH : num 3.1 -0.2 0 9.9 0 9.3 -0.4 0 2.3 3.3 ...
## $ Fossil_fuels_electricity_installed_capacity_MK : num 0.1 16 0.8 25 50 5.8 6.3 7 9.1 10 ...
## $ Fossil_fuels_electricity_net_generation_BKWH : num 0 60 4.2 92 205 11 22 26 52 32 ...
## $ Geothermal_electricity_installed_capacity_MK : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Geothermal_electricity_net_generation_BKWH : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Hydroelectric_pumped_storage_electricity_installed_capacity_MK: num 0 0 0 1 2.6 5.2 0 0 0 0 ...
## $ Hydroelectric_pumped_storage_electricity_net_generation_BKWH : num 0 0 0 -0.2 0 -1.7 0 0 0 0 ...
## $ Hydroelectricity_installed_capacity_MK : num 1.7 0.3 1 10 5.7 8.3 1.1 0 0.2 0 ...
## $ Hydroelectricity_net_generation_BKWH : num 4.7 0.3 5 32 18 39 1.3 0 0.6 0.1 ...
## $ Non.hydro_renewable_electricity_installed_capacity_MK : num 0 0 0 0.5 9.9 5 0 0 0.1 0 ...
## $ Non.hydro_renewable_electricity_net_generation_BKWH : num 0 0 0 1.6 18 9.5 0.2 0 0.2 0.2 ...
## $ Nuclear_electricity_installed_capacity_MK : num 0 0 0 1.6 0 0 0 0 0 0 ...
## $ Nuclear_electricity_net_generation_BKWH : num 0 0 0 5.3 0 0 0 0 0 0 ...
## $ Renewable_electricity_installed_capacity_MK : num 1.7 0.3 1 11 16 13 1.1 0 0.4 0 ...
## $ Renewable_electricity_net_generation_BKWH : num 4.7 0.3 5 34 36 49 1.5 0 0.8 0.3 ...
## $ Solar_electricity_installed_capacity_MK : num 0 0 0 0 5.3 0.8 0 0 0.1 0 ...
## $ Solar_electricity_net_generation_BKWH : num 0 0 0 0 4 0.7 0 0 0.2 0 ...
## $ Tide_and_wave_electricity_installed_capacity_MK : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Tide_and_wave_electricity_net_generation_BKWH : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Wind_electricity_installed_capacity_MK : num 0 0 0 0.2 3.8 2.1 0 0 0 0 ...
## $ Wind_electricity_net_generation_BKWH : num 0 0 0 0.6 10 3.7 0 0 0 0 ...
En la base se encuentran 58 variables de las cuales solo una es nominal cualitativa que corresponde a las 111 UE, paises. Del resto hacen referencia a las variables cuantitativas relacionadas con energías renovables y combustibles fósiles. Por tal se deben implementar medidas de tendencia central, de dispersión, de forma para comprender la información contenida en ellas y así poder realizar un analisis descriptivo.
Realice un análisis descriptivo univariado y/o bivariado de la base de datos. Seleccione solamente 5 variables de su interés para este punto y justifique su selección
Se escogen las 5 variables:
-Refined_petroleum_products_consumption_TBPD (Ref24)
-Refined_petroleum_products_production_TBPD (Ref25)
-Exportaciones_electricidad_BKWH (Ele32)
-Importaciones_electricidad_BKWH (Ele33)
-Electricity_installed_capacity_MK (Ele34)
Genera interes conocer a partir de las 111 UE, como es la relación del consumo de productos de petroleo vs su exportación de los mismos. Por otra parte, la exportación e importancion de electricidad en KW. Esto nos permitira dar a una simple vista como es la relación en dichos rubro para su economia.
# Crear un dataframe con las variables seleccionadas
data_descriptivo <- Datos[, c("Ref24", "Ref25", "Ele32", "Ele33", "Ele34")]
summary(data_descriptivo)
## Ref24 Ref25 Ele32 Ele33
## Min. : 15.0 Min. : 0.0 Min. : 0.000 Min. : 0.000
## 1st Qu.: 71.5 1st Qu.: 39.5 1st Qu.: 0.000 1st Qu.: 0.000
## Median : 202.0 Median : 172.0 Median : 0.600 Median : 0.700
## Mean : 811.4 Mean : 777.3 Mean : 5.158 Mean : 5.671
## 3rd Qu.: 750.0 3rd Qu.: 555.0 3rd Qu.: 5.550 3rd Qu.: 7.550
## Max. :19100.0 Max. :19653.0 Max. :75.000 Max. :67.000
## Ele34
## Min. : 0.40
## 1st Qu.: 3.50
## Median : 11.00
## Mean : 51.63
## 3rd Qu.: 33.00
## Max. :1380.00
El promedio del indice de consumo de productos refinados del petroleo es de 202, mientras que el minimo es 15. De igual forma el promedio de producción es de 172 con un minimo de 0. Por otra parte, el indice promedio de exportación de electricidad en KWH es de 0,6 mientra que el promedio de importaciones es de 0.7
scatter_plots <- list(
ggplot(data_descriptivo, aes(x = Ref24, y = Ref25)) +
geom_point() +
labs(title = "Scatter Plot de Ref24 vs Ref25") +
theme_minimal(),
ggplot(data_descriptivo, aes(x = Ele32, y = Ele33)) +
geom_point() +
labs(title = "Scatter Plot de Ele32 vs Ele33") +
theme_minimal()
)
# Imprimir los scatter plots
print(scatter_plots)
## [[1]]
##
## [[2]]
Existe una relación positiva entre el consumo y producción de productos refinados del petroleo. Mientras que no se puede garantizar una correlación entre el la exportación e importación de electricidad de acuerdo a los datos.
El conjunto de datos incluye 57 variables, analizarlas de forma individual podría representar un gasto computacional y de tiempo bastante agotador; por lo cuál una técnica de reduccion de dimensionalidad sería ideal. Ejecute un ACP sobre estos datos, compare la contribución de las variables sobre el primer plano factorial de un ACP normalizado (escalado) y uno sin normalizar (sin escalar).
# Obtener las columnas numéricas utilizando los nombres cortos
columnas_numericas <- names(Datos)[-1]
# Realizar el PCA en datos normalizados (escalados)
pca_normalizado <- prcomp(Datos[, columnas_numericas], center = TRUE, scale = TRUE)
# Realizar el PCA en datos sin normalizar (sin escalar)
pca_sin_normalizar <- prcomp(Datos[, columnas_numericas], center = FALSE, scale = FALSE)
# Comparar la contribución de las variables al primer plano factorial
contribucion_normalizado <- pca_normalizado$sdev^2
contribucion_sin_normalizar <- pca_sin_normalizar$sdev^2
# Crear un dataframe para comparar las contribuciones con los nombres cortos
contribuciones_df <- data.frame(
Variable = nombres_cortos, # Utilizamos los nombres cortos aquí
Contribucion_Normalizado = contribucion_normalizado,
Contribucion_Sin_Normalizar = contribucion_sin_normalizar
)
# Mostrar las primeras filas del dataframe de contribuciones
head(contribuciones_df)
## Variable Contribucion_Normalizado Contribucion_Sin_Normalizar
## 1 Bun1 35.315879 27524045.47
## 2 Bun2 4.409987 4204746.77
## 3 Cru3 3.998471 470085.02
## 4 Cru4 2.705600 134152.35
## 5 Cru5 2.454886 109320.33
## 6 Cru6 1.867872 42942.13
Las variables que tienen contribuciones más cercanas a cero en el primer plano factorial normalizado tienden a tener una influencia menor en la estructura de la varianza en los datos después de la normalización. Esto puede significar que estas variables no aportan tanta información en el primer componente principal cuando los datos están escalados o normalizados. Mientras que las contribuciones en el primer plano factorial sin normalizar son mucho más grandes en comparación con las contribuciones normalizadas. Esto puede deberse al rango de valores de las variables sin normalizar, lo que hace que las diferencias absolutas sean mayores. Como se desea reducir la dimensionalidad de los datos, inicialmente se considera eliminar algunas de las variables con contribuciones muy bajas en ambos casos.
Una vez calculado el PCA normado, ¿qué número de componentes principales deberíamos seleccionar? ¿Bajo que criterio seleccionó este número de componentes?
Uno de los criterios más utilizados es examinar la varianza explicada por cada componente principal. Por tal mediante un gráfico de la varianza acumulada explicada por los CP y seleccionando un número que capture una cantidad suficientemente alta de la varianza. En este caso se decide retener suficientes CP para explicar, el 95% de la varianza total.
# Calcular la varianza explicada por cada componente
varianza_explicada <- pca_normalizado$sdev^2
# Calcular la varianza acumulada explicada
varianza_acumulada <- cumsum(varianza_explicada) / sum(varianza_explicada)
# Porcentaje de varianza explicada deseado
porcentaje_deseado <- 0.95
# Encontrar el número de componentes necesarios para alcanzar el porcentaje deseado
num_componentes <- which(varianza_acumulada >= porcentaje_deseado)[1]
# Resultado
cat("Número de componentes necesarios para alcanzar", porcentaje_deseado * 100, "% de varianza explicada:", num_componentes, "\n")
## Número de componentes necesarios para alcanzar 95 % de varianza explicada: 10
# Opcional: Graficar la varianza acumulada explicada con nombres cortos
library(ggplot2)
data <- data.frame(Numero_Componente = 1:length(varianza_acumulada), Varianza_Acumulada = varianza_acumulada)
ggplot(data, aes(x = Numero_Componente, y = Varianza_Acumulada)) +
geom_line() +
geom_hline(yintercept = porcentaje_deseado, linetype = "dashed", color = "red") +
labs(x = "Número de Componentes", y = "Varianza Acumulada Explicada") +
theme_minimal() +
ggtitle("Varianza Acumulada Explicada por Componentes Principales")
Analice la representación de las variables originales sobre las dos primeras componentes en el primer plano factorial (recuerde el último gráfico realizado en el cuaderno de ACP, dónde las flechas indican las variables sobre el primer plano). ¿Que conclusiones podemos sacar de este análisis?
# Visualizar las variables en el plano factorial de las dos primeras componentes
pca_var_plot <- fviz_pca_var(pca_normalizado, axes = c(1, 2),
repel = TRUE, col.var = "contrib",
gradient.cols = c("blue", "red"))+ ggtitle("Variables en el Primer Plano Factorial")
# Mostrar el gráfico
print(pca_var_plot)
Las flechas en el gráfico indican la dirección y el grado de influencia de cada variable en las dos primeras componentes principales. La longitud de una flecha indica cuánto contribuye esa variable a las componentes principales. Cuanto más larga sea la flecha, mayor será la contribución de la variable a esas componentes, como sucede con la variable renombrada “Hyd43” es decir “Hydroelectric_pumped_storage_electricity_net_generation_BKWH” o generación neta de electricidad de bombeo hitroeléctrico en KWH; como tiene flecha color rojo tiene mayor contribución, algo que se permite concluir con la distancia, las variables con valores más grandes en las componentes principales estarán más lejos del origen.
En este ejercicio tenemos una cantidad mayor de componentes
relevantes para el análisis, por lo cual, ahora realice el mismo
análisis anterior pero ahora sobre el plano factorial conformado por los
componentes 2 y 3. ¿Qué conclusiones podemos sacar de este gráfico
fviz_pca_var()?
# Visualizar las variables en el plano factorial de las dos primeras componentes
pca_var_plot <- fviz_pca_var(pca_normalizado, axes = c(2, 3),
repel = TRUE, col.var = "contrib",
gradient.cols = c("blue", "red"))+ ggtitle("Variables en el Primer Plano Factorial")
# Mostrar el gráfico
print(pca_var_plot)
Tal como se concluyo en el apartado anterio, en este caso con la variable renombrada “Cru3” es decir, “Crude_oil_including_lease_condensate_exports_TBPD” tiene una mayor distancia entre el punto por tanto una mayor contribución dado su color; tiene mayor influencia a los componentes principales 2 y 3.
Ahora examine con detenimiento el mapa de individuos sobre los planos factoriales que conforman las componentes (1,2) y (2,3). ¿Qué conclusiones puede sacar según la cercanía de algunas UE?
# Visualizar los individuos en el plano factorial de las componentes 1 y 2
pca_ind_plot_1_2 <- fviz_pca_ind(pca_normalizado, axes = c(1, 2),
geom.ind = "point", col.ind = "cos2",
gradient.cols = c("blue", "red")) +
ggtitle("Individuos en el Primer Plano Factorial (1, 2)")
# Visualizar los individuos en el plano factorial de las componentes 2 y 3
pca_ind_plot_2_3 <- fviz_pca_ind(pca_normalizado, axes = c(2, 3),
geom.ind = "point", col.ind = "cos2",
gradient.cols = c("blue", "red")) +
ggtitle("Individuos en el Segundo Plano Factorial (2, 3)")
# Mostrar los gráficos uno al lado del otro
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
grid.arrange(pca_ind_plot_1_2, pca_ind_plot_2_3, ncol = 2)
Al observar la distribución general de los puntos en el plano 1, las UE estan agrupados alrededor del cero con muy pocos datos atipicos, mientras que en el plano 2, las UE estan más dispersas en funciones de las variables originales y presentan mayor cantidad de datos atipicos.
Como hemos observado en clase, el ACP es una técnica bastante sensible a datos atípicos, corra nuevamente el ACP retirando del conjunto de datos a Estados Unidos, China, Arabia Saudi y Rusia. ¿En que cambia el ACP al excluir estos países?. ¿Se perciben clusters de países con mayor claridad?
# Filtrar el dataframe Datos para excluir los países específicos
paises_excluidos <- c("UnitedStates", "China", "SaudiArabia", "Russia")
Datos_filtrados <- Datos[!Datos$Country %in% paises_excluidos, ]
# Obtener las columnas numéricas utilizando los nombres cortos
columnas_numericas <- names(Datos_filtrados)[-1]
# Realizar el PCA en datos normalizados (escalados)
pca_normalizado <- prcomp(Datos_filtrados[, columnas_numericas], center = TRUE, scale = TRUE)
# Realizar el PCA en datos sin normalizar (sin escalar)
pca_sin_normalizar <- prcomp(Datos_filtrados[, columnas_numericas], center = FALSE, scale = FALSE)
# Comparar la contribución de las variables al primer plano factorial
contribucion_normalizado <- pca_normalizado$sdev^2
contribucion_sin_normalizar <- pca_sin_normalizar$sdev^2
# Crear un dataframe para comparar las contribuciones con los nombres cortos
contribuciones_df <- data.frame(
Variable = nombres_cortos, # Utilizamos los nombres cortos aquí
Contribucion_Normalizado = contribucion_normalizado,
Contribucion_Sin_Normalizar = contribucion_sin_normalizar
)
# Calcular la varianza explicada por cada componente
varianza_explicada <- pca_normalizado$sdev^2
# Calcular la varianza acumulada explicada
varianza_acumulada <- cumsum(varianza_explicada) / sum(varianza_explicada)
# Porcentaje de varianza explicada deseado
porcentaje_deseado <- 0.95
# Encontrar el número de componentes necesarios para alcanzar el porcentaje deseado
num_componentes <- which(varianza_acumulada >= porcentaje_deseado)[1]
# Resultado
cat("Número de componentes necesarios para alcanzar", porcentaje_deseado * 100, "% de varianza explicada:", num_componentes, "\n")
## Número de componentes necesarios para alcanzar 95 % de varianza explicada: 12
# Opcional: Graficar la varianza acumulada explicada con nombres cortos
library(ggplot2)
data <- data.frame(Numero_Componente = 1:length(varianza_acumulada), Varianza_Acumulada = varianza_acumulada)
ggplot(data, aes(x = Numero_Componente, y = Varianza_Acumulada)) +
geom_line() +
geom_hline(yintercept = porcentaje_deseado, linetype = "dashed", color = "red") +
labs(x = "Número de Componentes", y = "Varianza Acumulada Explicada") +
theme_minimal() +
ggtitle("Varianza Acumulada Explicada por Componentes Principales")
Tal como observamos, luego de excluir los paises con datos atipicos, Estados Unidos, China, Arabia Saudi y Rusia, al correr el ACP normalizado, el número de componentes principales aumenta hasta 12 manteniendo el mismo porcentaje de varianza explicada. Por tal, al examinar con detenimiento el mapa de individuos sobre los planos factoriales que conforman las componentes (1,2) y (2,3).
# Visualizar los individuos en el plano factorial de las componentes 1 y 2
pca_ind_plot_1_2 <- fviz_pca_ind(pca_normalizado, axes = c(1, 2),
geom.ind = "point", col.ind = "cos2",
gradient.cols = c("blue", "red")) +
ggtitle("Individuos en el Primer Plano Factorial (1, 2)")
# Visualizar los individuos en el plano factorial de las componentes 2 y 3
pca_ind_plot_2_3 <- fviz_pca_ind(pca_normalizado, axes = c(2, 3),
geom.ind = "point", col.ind = "cos2",
gradient.cols = c("blue", "red")) +
ggtitle("Individuos en el Segundo Plano Factorial (2, 3)")
# Mostrar los gráficos uno al lado del otro
library(gridExtra)
grid.arrange(pca_ind_plot_1_2, pca_ind_plot_2_3, ncol = 2)
En este caso al observar la distribución general de los puntos en el plano 1, las UE presentan mayor dispersión alrededor del cero, se mantienen datos atipicos, mientras que en el plano 2, se mantiene la dispersión de las UE en funciones de las variables originales y presentan mayor cantidad de datos atipicos. No existe una clara evidencia de cluster entre las UE.
Los puntos 8 a 11 se realizarán excluyendo de la base de datos los países atípicos mencionados en el punto 7 (es decir, retirando ‘UnitedStates’,‘China’,‘SaudiArabia’,‘Russia’).
De acuerdo a lo aprendido en la clase de agrupamiento, utilice el primer plano factorial para determinar de manera aproximada el número de grupos en el análisis. ¿Cuántos clusters espera que existan en el conjunto de datos?
# Obtener los valores de las componentes principales (individuos) en el primer plano factorial
ind_values <- pca_normalizado$x[, c(1, 2)]
# Calcular la inercia para diferentes números de clusters (k)
inertia_values <- c()
for (k in 1:10) {
kmeans_model <- kmeans(ind_values, centers = k)
inertia_values <- c(inertia_values, kmeans_model$tot.withinss)
}
# Graficar la inercia frente al número de clusters
plot(1:10, inertia_values, type = "b", pch = 19, frame = FALSE,
xlab = "Número de Clusters", ylab = "Inercia (Within-Cluster Sum of Squares)",
main = "Método del Codo")
El número optimo de cluster de acuerdo al metodo del codo es 2.
Mediante el método de reducción de varianza explicada, determine un número fijo de clusters para su análisis. No tiene que ser el mismo número que el elegido por su compañero, recuerde que ninguno conoce las etiquetas reales de los grupos de los países.
El metodo de varianza explicada ya se habia calculado en puntos anteriores, ahora determinaremos el numero fijo de 4 clusters.
# Filtrar el dataframe Datos para excluir los países específicos
paises_excluidos <- c("UnitedStates", "China", "SaudiArabia", "Russia")
Datos_filtrados <- Datos[!Datos$Country %in% paises_excluidos, ]
# Obtener las columnas numéricas utilizando los nombres cortos
columnas_numericas <- names(Datos_filtrados)[-1]
# Realizar el PCA en datos normalizados (escalados)
pca_normalizado <- prcomp(Datos_filtrados[, columnas_numericas], center = TRUE, scale = TRUE)
# Calcular la varianza explicada por cada componente
varianza_explicada <- pca_normalizado$sdev^2
# Calcular la varianza acumulada explicada
varianza_acumulada <- cumsum(varianza_explicada) / sum(varianza_explicada)
# Porcentaje de varianza explicada deseado
porcentaje_deseado <- 0.95
# Encontrar el número de componentes necesarios para alcanzar el porcentaje deseado
num_componentes <- which(varianza_acumulada >= porcentaje_deseado)[1]
# Realizar el clustering utilizando el número de componentes determinado
library(cluster)
kmeans_model <- kmeans(pca_normalizado$x[, 1:num_componentes], centers = 4)
# Resultado del clustering
clusters <- kmeans_model$cluster
# Crear un dataframe con los valores de las componentes principales y la asignación de cluster
ind_values_with_clusters <- data.frame(PC1 = pca_normalizado$x[, 1],
PC2 = pca_normalizado$x[, 2],
Cluster = factor(clusters))
# Graficar los individuos en el plano factorial de las componentes 1 y 2 con colores por cluster
library(ggplot2)
ggplot(ind_values_with_clusters, aes(x = PC1, y = PC2, color = Cluster)) +
geom_point() +
scale_color_manual(values = c("red", "blue", "green", "purple")) + # Colores para los 4 clusters
labs(x = "Componente Principal 1", y = "Componente Principal 2") +
ggtitle("Individuos en el Primer Plano Factorial (1, 2) con 4 Clusters Fijos") +
theme_minimal()
Determine mediante k means y aglomeración jerárquica (usando enlace promedio) la clasificación en grupos para los paises de estudio. Considere todas las variables de estudio ¿son diferentes los resultados de los dos análisis cluster?
# Realizar clustering K-means con 4 clusters
kmeans_model <- kmeans(pca_normalizado$x, centers = 4)
# Asignación de clusters
clusters_kmeans <- kmeans_model$cluster
# Resultado del clustering K-means
table(clusters_kmeans)
## clusters_kmeans
## 1 2 3 4
## 3 73 22 9
# Realizar aglomeración jerárquica con enlace promedio
aglomerativo <- hclust(dist(pca_normalizado$x), method = "average")
# Corte el dendrograma para obtener 4 clusters
clusters_aglomerativos <- cutree(aglomerativo, k = 4)
# Resultado de la aglomeración jerárquica
table(clusters_aglomerativos)
## clusters_aglomerativos
## 1 2 3 4
## 101 2 2 2
Como se puede obsvervar al fijar 4 cluster, en K means, se presenta mayor dispersión de las UE versus en Aglomeración Jerarquica, puesto para este ultimo en el cluster 1, se concentra el 99% de las UE.
Grafique mediante boxplot la distribución de las 5 variables seleccionadas en el punto 2 diferenciando por los grupos encontrados mediante k-means (es decir, obtenga un boxplot por variable y por grupo: si por ejemplo k-means indica un total de 3 grupos, realice 3 boxplots, uno por grupo, para cada una de las 5 variables). ¿Observa diferencias importantes entre las distribuciones por grupos de la misma variable?
# Instala y carga la librería ggplot2 si aún no lo has hecho
# Crea un dataframe con los datos filtrados y la asignación de clusters
data_con_clusters <- data.frame(Datos_filtrados, Cluster = as.factor(clusters_kmeans))
# Variables que deseas graficar
variables <- c("Ref24", "Ref25", "Ele32", "Ele33", "Ele34")
# Crear los boxplots para cada variable por grupo
for (variable in variables) {
p<- ggplot(data_con_clusters, aes(x = Cluster, y = .data[[variable]])) +
geom_boxplot() +
labs(x = "Grupo", y = variable) +
ggtitle(paste("Boxplot de", variable, "por Grupo"))
print(p)
}
Efectivamente se evidencian diferencias marcadas e importantes entre las distribuciones por grupos de la misma variabledentro del grupo de variables seleccionadas.A excepción de la variable “Exportaciones_electricidad_BKWH” (estan presenten algunos datos atipicos para el grupo 2 y 3) podemos decir a simple vista que el 75% de los datos para cada grupo no supera un indice de 20.