Descripción del procesamiento de datos del Banco Mundial (años 2022 y 2018)
Este bloque de código tiene como objetivo preparar dos bases de datos limpias y comparables a partir de indicadores socioeconómicos del Banco Mundial, para los años 2022 y 2018. El propósito es filtrar y estructurar los datos de manera que ambas bases compartan:
Los mismos países
Las mismas variables
Archivos utilizados:
datosbancomundial.csv: base original con múltiples indicadores del año 2022.
bmact.csv: contiene la versión filtrada y limpia de la base 2022, con solo los países y variables relevantes. Se utiliza como referencia para filtrar la base de 2018.
bmop.csv: base original con múltiples indicadores del año 2018.
Procesamiento de la base 2022 (datosbancomundial.csv)
Carga y limpieza inicial Se cargan los datos y se reemplazan los valores “..” por NA. Luego, se conservan solo las columnas necesarias: código del país, nombre del indicador y el valor para el año 2022.
Transformación de formato Se usa pivot_wider() para convertir los datos a formato ancho:
Filas = países
Columnas = variables (indicadores)
Celdas = valores del año 2022
Filtrado por valores faltantes (NA) Se calcula el porcentaje de NA por fila y por columna.
Se eliminan filas y columnas con más del 20% de datos faltantes
Se generan reportes de porcentaje de NA en:
na_percentage_filas.xlsx (por fila)
porcentaje_na_por_columna.xlsx (por columna)
Exportación de la base filtrada (2022) Se guarda como datos_filtrados_finales.csv, y se reutiliza luego como bmact.csv para filtrar la base 2018.
Procesamiento de la base 2018 (bmop.csv)
Carga y limpieza inicial Se cargan los datos y se reemplazan los valores “..” por NA. Se conservan únicamente: código del país, nombre de la serie y valor del año 2018.
Filtrado por países Se filtra la base 2018 para conservar solo los países presentes en bmact.csv (es decir, en la base 2022 filtrada).
Limpieza y estandarización de nombres de variables Se limpian los nombres de las variables en ambas bases para facilitar el cruce:
Se eliminan puntos, comas, paréntesis, símbolos y espacios redundantes.
Se convierten a minúsculas.
Se unifican términos (por ejemplo, “post secondary” → “postsecondary”, “working age” → “workingage”).
Cruce y filtrado de variables Se identifican las variables que coinciden entre bmact (2022) y bmop (2018), y se filtran solo esas.
Se transforma la base 2018 a formato ancho (con pivot_wider()) para tener un dataset comparable con la base 2022.
Exportación de la base final (2018) Se guarda como datos_filtrados_finales2018.csv.
bmact = read.csv("datos_filtrados_finales.csv")
datos2= read.csv("bmop.csv")
datos2$X2018..YR2018.[datos2$X2018..YR2018.==".."] = NA
length(unique(datos2$Series.Name))
## [1] 1510
datos2 = datos2[,c(2,3,5)]
datos2 = datos2 %>% rename(Valor = X2018..YR2018.)
# Nombres de las variables en bmact (asumiendo que son los nombres de columnas)
#variables_referencia <- names(bmact)[-1]
# Países en bmact (asumiendo que la primera columna son países)
paises_referencia <- bmact$Country.Code
datos2 <- datos2 %>%
filter(Country.Code %in% paises_referencia)
# Eliminar puntos de los nombres de bmact
variables_bmact <- gsub("\\.", " ", names(bmact)[-1]) # quita los puntos y reemplaza por espacios
# También podés limpiar espacios duplicados
variables_bmact <- trimws(gsub("\\s+", " ", variables_bmact))
# Crear una versión limpia de los nombres en datos2
datos2$Serie_Limpia <- gsub("[()]", "", datos2$Series.Name)
datos2$Serie_Limpia <- gsub(",", "", datos2$Serie_Limpia)
unique(datos2$Serie_Limpia)[1:5]
## [1] "Access to clean fuels and technologies for cooking % of population"
## [2] "Access to clean fuels and technologies for cooking rural % of rural population"
## [3] "Access to clean fuels and technologies for cooking urban % of urban population"
## [4] "Access to electricity % of population"
## [5] "Access to electricity rural % of rural population"
# Comparar: ver coincidencias
intersect(variables_bmact, datos2$Serie_Limpia)
## [1] "Compulsory education duration years" "Fixed broadband subscriptions"
## [3] "Mobile cellular subscriptions" "Secure Internet servers"
## [5] "Population ages 65 and above total" "Population total"
## [7] "Preprimary education duration years"
limpiar_texto <- function(x) {
x %>%
tolower() %>% # minúsculas
gsub("(?<=\\w)\\s+s\\b", "s", ., perl = TRUE) %>% # arreglar 's sueltos
gsub("[$+'%(),-]", "", .) %>% # quitar $, +, ', %, (, ), , y -
gsub("(?<=\\d)\\s(?=\\d)", "", ., perl = TRUE) %>%# quitar espacios entre dígitos
gsub("\\s+", " ", .) %>% # colapsar múltiples espacios
trimws() %>% # quitar espacios extremos
gsub("post secondary", "postsecondary", .) %>% # unir post secondary
gsub("working age", "workingage", .) # unir working age
}
datos2$Serie_Limpia <- limpiar_texto(datos2$Serie_Limpia)
variables_bmact <- limpiar_texto(variables_bmact)
var = intersect(variables_bmact, datos2$Serie_Limpia)
setdiff(variables_bmact, var)
## character(0)
datos_filtrados <- datos2 %>%
filter(Serie_Limpia %in% variables_bmact)
View(datos_filtrados)
datos_finales <- datos_filtrados %>%
select(Country.Code, Serie_Limpia, Valor) %>% # Solo las necesarias
pivot_wider(names_from = Serie_Limpia, values_from = Valor)
write.csv(datos_filtrado, "datos_filtrados_finales2018.csv", row.names = FALSE)