jueves, 18 de junio de 2015

R + SDMX + EUROSTAT = DESCARGA DIRECTA DE DATOS

R + SDMX + Eurostat
El código que les presento a continuación utiliza el estándar de presentación de datos estadísticos y metadatos (SDMX, por sus siglas en inglés) que pone a disposición Eurostat para acceder a sus datos de forma interactiva y automatizada. También lo utiliza la OCDE y el BCE, entre otros, por lo que vale la pena saber como utilizarlo, algo parecido también utiliza COMTRADE pero en formato JSON, más info en http://ec.europa.eu/eurostat/data/sdmx-data-metadata-exchange.
Más referencias y ejemplos pueden encontrar en:
Los datos se obtienen en un formato “largo” (más conocido en inglés como long database), es decir, que cada fila corresponde a un país y un año determinado, así tendríamos en una fila España - año 2010 y en otra fila España - año 2011. En general, para la tarea que tenía que realizar me convenía que el formato de la base sea “extensiva” (más conocido en inglés como wide database), es decir, en cada fila el pais y en columnas los años colocando en la intersección de ambos el valor de la variable analizada. Todo este ejercicio lo he realizado en el código, por lo que también tiene un aporte en la implementación del “tratamiento de datos”.
En resumen, el código hace lo siguiente: 1. Unas líneas de código para verificar si las librerías necesarias están instaladas, caso contrario, las descaga e instala.
  1. Descarga los datos desde Eurostat utilizando el formato SDMX al introducir los indicadores, países y periodos deseados.
  2. Filtra la base descargada, seleccionando sólo unos indicadores (esto es a modo de ejemplo, porque podría haber descargado sólo los indicadores que realmente necesito).
  3. Recodifico una variable tipo texto en una variable nueva, agrupando categorías distintas en una sola. En la base tenía grupos de edad desagregadas pero yo necesitaba las edades de 15 a 64 años, así que las agrupé.
  4. Luego de recodificar la variable grupo de edad ya puedo crear una nueva base que tenga los grupos de edad que yo necesito. Sumando para el grupo de edad creado la variable de interés.
  5. El penúltimo paso es convertir esta base tipo long en wide. Es decir, que los años que estaban dentro de una columna, pasarlos a que cada año sea una columna distinta en donde la intersección tiene el valor de la variable a analizar.
  6. Por último, creo un excel con los datos en el formato necesario.
NOTA: El código no funciona bajo PROXY, incluso colocando los datos del proxy antes de ejecutar R, así que si no les funciona esa puede ser la causa. Quizás la solución esté aquí https://support.rstudio.com/hc/en-us/articles/205002917-SSL-certificate-problem-when-publishing-to-RPubs pero aún no la he probado…
#====================================
# Author: Diego Jose Torres Torres
# Purpose: Using the rsdmx package to
# read Eurostat sdmx service (Could also work for OECD)
# References: 
# https://github.com/opensdmx/rsdmx
# http://ec.europa.eu/eurostat/web/sdmx-web-services/example-queries
# Examples: 
# http://stats.oecd.org/restsdmx/sdmx.ashx/GetData/MIG/TOT../OECD?startTime=2000&endTime=2011
# http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/nama_gdp_c/..../?startperiod=2013&endPeriod=2013
#====================================
rm(list = ls(all = TRUE)) #borra todo los objetos de la memoria

if (!require("rsdmx")) {install.packages("rsdmx")}
if (!require("dplyr")) {install.packages("dplyr")}
if (!require("reshape2")) {install.packages("reshape2")}
if (!require("xlsx")) {install.packages("xlsx")}

# Parameters
setwd("d:/Mis Documentos/Europa/R/data") # Definir el directorio de trabajo

data_code <- "demo_pjanind"
geo <- "FR"  # País
startperiod <- "1960"
endperiod <- "2014"
indic_na <- paste("PC_Y0_4",
                  "PC_Y0_14",
                  "PC_Y0_19",
                  "PC_Y5_9",
                  "PC_Y10_14",
                  "PC_Y15_19",
                  "PC_Y15_24",
                  "PC_Y20_24",
                  "PC_Y20_39",
                  "PC_Y25_44",
                  "PC_Y25_29",
                  "PC_Y25_49",
                  "PC_Y30_34",
                  "PC_Y35_39",
                  "PC_Y40_44",
                  "PC_Y40_59",
                  "PC_Y45_49",
                  "PC_Y45_64",
                  "PC_Y50_54",
                  "PC_Y50_64",
                  "PC_Y55_59",
                  "PC_Y60_64",
                  "PC_Y60_79",
                  "PC_Y60_MAX",
                  "PC_Y65_69",
                  "PC_Y65_79",
                  "PC_Y65_MAX",
                  "PC_Y70_74",
                  "PC_Y75_79",
                  "PC_Y80_84",
                  "PC_Y80_MAX",
                  "PC_Y85_MAX",
                  sep="+")

# Importing data
dataURL <- paste("http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/",
                 data_code,
                 "/.",
                 indic_na, 
                 ".",
                 geo,
                 "/?startperiod=",
                 startperiod ,
                 "&endPeriod=",
                 endperiod, 
                 sep=""
 )
sdmx <- readSDMX(dataURL)
stats <- as.data.frame(sdmx)
head(stats)

poblacion_filtrada <- filter(stats, INDIC_DE == "PC_Y0_14" | 
                                    INDIC_DE == "PC_Y15_24" |
                              INDIC_DE == "PC_Y25_44" | 
                              INDIC_DE == "PC_Y45_64" |
                              INDIC_DE == "PC_Y65_MAX")

rm(stats) # borro la base completa

#======================================
# Recodificar una variable tipo texto
#======================================
# Paso 1 creo una variable nueva sobra la cual voy a recodificar
poblacion_filtrada$gruposedad <- poblacion_filtrada$INDIC_DE
poblacion_filtrada$gruposedad[poblacion_filtrada$gruposedad=="PC_Y15_24"|
 poblacion_filtrada$gruposedad=="PC_Y25_44"| 
 poblacion_filtrada$gruposedad=="PC_Y45_64"] <- "PC_Y15_64"

poblacion_filtrada <- group_by(poblacion_filtrada,gruposedad , obsTime,  GEO) #agrupado para calculos
# Sumando segun la nueva recodificación
poblacion_agrupada <- as.data.frame(summarize(poblacion_filtrada, porc=sum(obsValue)))

#======================================
# DE Long to Wide (años en columnas)
#======================================
names(poblacion_agrupada)
poblacion_agrupada_wide <- dcast(poblacion_agrupada, GEO + gruposedad ~ obsTime, value.var ="porc" )

#======================================
# Exportar a un excel
#======================================
write.xlsx(poblacion_agrupada_wide,
paste(geo,"Europop_historico.xlsx", sep=""), 
sheetName="Datos",col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE) 
Espero que les sea útil. Cualquier cosa, contactar conmigo:
https://twitter.com/diego_torres Mi twitter
https://es.linkedin.com/in/diegotorrestorres Mi perfil en el LinkedIn
http://tweetrelevante.blogspot.com.es/ Identificando los tuits más relevantes de Twitter
http://vacanlab.blogspot.com.es/ Un buscador de empleo
https://www.linkedin.com/grp/home?gid=5185072 Grupo Nowcasting en Economía

No hay comentarios:

Publicar un comentario