## Pais ISO_code year
## Length:626 Length:626 Length:626
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## Geographical Particularity ECONOMIC FREEDOM access_sea_bin
## Length:626 Min. :3.320 Min. :0.0000
## Class :character 1st Qu.:6.505 1st Qu.:1.0000
## Mode :character Median :7.235 Median :1.0000
## Mean :7.029 Mean :0.9042
## 3rd Qu.:7.600 3rd Qu.:1.0000
## Max. :8.960 Max. :1.0000
## trade_usd
## Min. :1.208e+10
## 1st Qu.:6.751e+10
## Median :1.527e+11
## Mean :3.155e+11
## 3rd Qu.:3.755e+11
## Max. :3.203e+12
# === 1. CARGAR BASE ===
df <- read_excel("libertad_economica.xlsx", col_types = "text")
# Lista de paĆses seleccionados
paises_deseados <- c("Algeria", "Angola", "Argentina", "Australia", "Austria", "Azerbaijan", "Bangladesh",
"Belarus", "Belgium", "Brazil", "Bulgaria", "Canada", "Chile", "China", "Colombia",
"Czechia", "Denmark", "Egypt", "Finland", "France", "Germany", "Greece", "Hungary",
"India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Japan", "Kazakhstan",
"South Korea", "Kuwait", "Libya", "Lithuania", "Malaysia", "Mexico", "Morocco",
"Netherlands", "New Zealand", "Nigeria", "Norway", "Oman", "Pakistan", "Peru",
"Philippines", "Poland", "Portugal", "Qatar", "Romania", "Russia", "Saudi Arabia",
"Singapore", "South Africa", "Spain", "Sweden", "Switzerland", "Thailand", "Turkey",
"Ukraine", "United Kingdom", "United States of America", "Venezuela", "Vietnam")
# Filtrar por paĆses deseados
df_filtrado <- df %>%
filter(Pais %in% paises_deseados)
# Convertir todas las columnas EXCEPTO 'Pais' a numƩrico (incluso si vienen como texto)
df_filtrado <- df_filtrado %>%
mutate(across(-Pais, ~ as.numeric(as.character(.))))
# Guardar el Ćndice ECONOMIC FREEDOM para compararlo con la PCA
freedom <- df_filtrado %>%
group_by(Pais) %>%
summarise(ECONOMIC_FREEDOM = mean(`ECONOMIC FREEDOM`, na.rm = TRUE)) %>%
arrange(Pais)
# Crear base final para PCA
df_media <- df_filtrado %>%
group_by(Pais) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE)) %>%
select(-any_of(c("year", "rank", "quartile", "ECONOMIC FREEDOM"))) %>%
arrange(Pais)
# Preparar para PCA
df_pca <- df_media %>%
select(-any_of(c("Pais", "ISO_code"))) %>%
as.data.frame()
rownames(df_pca) <- df_media$Pais
# Imputar los valores faltantes con la media de cada variable:
for (col in names(df_pca)) {
df_pca[[col]][is.na(df_pca[[col]]) | is.nan(df_pca[[col]])] <- mean(df_pca[[col]], na.rm = TRUE)
}
# Verificación final
stopifnot(is.data.frame(df_pca))
stopifnot(all(sapply(df_pca, is.numeric)))
pca_res <- PCA(df_pca, scale.unit = TRUE, graph = FALSE)
*** Visualizaciones
fviz_eig(pca_res, addlabels = TRUE, ylim = c(0, 50)) # Scree plot
fviz_pca_biplot(pca_res, repel = TRUE, col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) # Biplot
# GrÔfico de variables sin etiquetas, solo flechas con color por contribución
fviz_pca_var(pca_res,
col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
)
library(factoextra)
# Contribución de variables al PC1
fviz_contrib(pca_res, choice = "var", axes = 1, top = 10) +
ggtitle("Contribución de variables al PC1")
# Contribución variables al PC2
fviz_contrib(pca_res, choice = "var", axes = 2, top = 10) +
ggtitle("Contribución de variables al PC2")