##      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

Realizar la PCA

# === 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)))

Ejecutar la PCA

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")