Introducción

Eurostat es la oficina estadística de la Unión Europea, responsable de recopilar, armonizar y publicar estadísticas comparables entre los países miembros de la UE y algunos países asociados. La base de datos de Eurostat está muy bien organizada y podemos trabajar directamente con ella desde R usando el paquete eurostat.

Eurostat organiza la información mediante un sistema jerárquico de clasificación territorial que denomina NUTS (Nomenclature of Units for Territorial Statistics) de la siguiente forma:

A continuación se visualizan las zonas geográficas que corresponden a los diferentes NUTS. Si pasamos el ratón por encima de una región veremos el código de la región asociada y su nombre completo. Además de estos códigos de regiones reales que aparecen en estos mapas hay códigos para agrupaciones de países como “EU27_2020”, que representa la agrupación de los 27 países que actualmente forman la unión europea, así como otros códigos de regiones que no están en estos mapas NUTS como las regiones del Reino Unido que ya no está en la Unión Europea o regiones creadas con fines estadísticos que no tienen asociada una región real en un mapa NUTS.

Regiones NUTS 0

Regiones NUTS 1

Regiones NUTS 2

Regiones NUTS 3

Buscar datasets en Eurostat

La función get_eurostat_toc nos suministra, en forma de tabla, todos los datasets de Eurostat con la información básica asociada. Los campos principales de dicha tabla son:

A continuación cargamos en la tabla datasets los datasets disponibles, los ordenamos por volumen de datos y los imprimimos de forma dinámica. Observamos que hay 6554 datasets que podemos explorar y que tenemos un campo de búsqueda para filtrar la tabla donde podemos poner uno o varios strings separados por espacios en blanco.

Refinando la búsqueda para los proyectos de AEDV

Podemos refinar la búsqueda añadiendo filtros manualmente que puedan ser más sofisticados. Por ejemplo, vamos a filtrar, “a priori”, por los datasets con fecha final posterior a 2020 para asegurar que no trabajamos con datasets obsoletos. Además, para asegurar un número de periodos mínimo fijamos que la fecha de inicio de los datos es anterior a 2011 o que los datos se den más de una vez por año (trimestrales, mensuales, semanales). Hay que tener cuidado porque, a veces, los datos no aparecen todos los años, sino cada 3-4 años. Para los proyectos personales de la asignatura AEDV buscaremos, preferentemente, los datasets que verifican estas condiciones que pueden buscarse a partir de la siguiente tabla dinámica:

Hay que tener en cuenta que, con frecuencia, el título del dataset no es muy claro. Simplemente poniendo el título o código del dataset en ChatGPT saldrá una explicación más detallada. Si queremos aún más detalles podemos buscarlo en la página de Eurostat. Hay datasets pequeños, como el del coeficiente Gini de desigualdad (código ilc_di12) que, por si solos no son suficientes para hacer el proyecto personal pero son un excelente complemento para otros proyectos sobre temas relacionados.

Descargar/analizar un dataset

Pongamos que, en el proceso de búsqueda, me interesa ver el contenido del dataset que tiene como título Income of households by NUTS 2 region y de código nama_10r_2hhinc. Vamos a descargarlo usando la función get_eurostat.

# CÓDIGO DATASET
dataset.name <- "nama_10r_2hhinc"
# cargamos la tabla y la ordenamos por fechas y regiones
data <- get_eurostat(dataset.name, time_format = "date") %>%
  as_tibble() %>%
  arrange(TIME_PERIOD,geo) 

data

## # A tibble: 285,294 × 7
##    freq  unit    direct na_item geo   TIME_PERIOD   values
##    <chr> <chr>   <chr>  <chr>   <chr> <date>         <dbl>
##  1 A     MIO_EUR BAL    B2A3N   BE    1995-01-01   24926. 
##  2 A     MIO_EUR BAL    B5N     BE    1995-01-01  168359. 
##  3 A     MIO_EUR BAL    B6N     BE    1995-01-01  135254. 
##  4 A     MIO_EUR PAID   D4      BE    1995-01-01    3783. 
##  5 A     MIO_EUR PAID   D5      BE    1995-01-01   29816. 
##  6 A     MIO_EUR PAID   D61     BE    1995-01-01   43676. 
##  7 A     MIO_EUR PAID   D62     BE    1995-01-01      34.0
##  8 A     MIO_EUR PAID   D7      BE    1995-01-01    5726  
##  9 A     MIO_EUR RECV   D1      BE    1995-01-01  113882. 
## 10 A     MIO_EUR RECV   D4      BE    1995-01-01   33334. 
## # ℹ 285,284 more rows

Los datasets de Eurostat son multidimensionales, es decir, hay varias columnas (dimensiones) con variables categóricas cuyos valores combinados identifican por completo el valor de la observación y, por otro lado, son tablas ordenadas (tidy), es decir, en cada fila hay una sola observación (normalmente un valor numérico en las tablas que nosotros manejamos). Todos los campos usan abreviaturas porque así la tabla ocupa menos y es más fácil/rápido de gestionar. Todas los datasets tienen una columna llamada geo, con el código de la región en función del NUTS. Los códigos de los países enteros (NUTS 0) tienen dos caracteres. Las regiones de NUTS 1 tres caracteres, las NUTS 2 cuatro caracteres y las NUTS 3 cinco caracteres.

Aunque para trabajar con las tablas no es aconsejable, podemos convertir todas las abreviaturas a nombres extendidos de la siguiente forma:

label_eurostat(data,fix_duplicated = TRUE)
## # A tibble: 285,294 × 7
##    freq   unit         direct   na_item                 geo   TIME_PERIOD values
##    <chr>  <chr>        <chr>    <chr>                   <chr> <date>       <dbl>
##  1 Annual Million euro Balance  Operating surplus and … Belg… 1995-01-01  2.49e4
##  2 Annual Million euro Balance  Balance of primary inc… Belg… 1995-01-01  1.68e5
##  3 Annual Million euro Balance  Disposable income, net  Belg… 1995-01-01  1.35e5
##  4 Annual Million euro Paid     Property income         Belg… 1995-01-01  3.78e3
##  5 Annual Million euro Paid     Current taxes on incom… Belg… 1995-01-01  2.98e4
##  6 Annual Million euro Paid     Net social contributio… Belg… 1995-01-01  4.37e4
##  7 Annual Million euro Paid     Social benefits other … Belg… 1995-01-01  3.40e1
##  8 Annual Million euro Paid     Other current transfers Belg… 1995-01-01  5.73e3
##  9 Annual Million euro Received Compensation of employ… Belg… 1995-01-01  1.14e5
## 10 Annual Million euro Received Property income         Belg… 1995-01-01  3.33e4
## # ℹ 285,284 more rows

Obtener información sobre las columnas de la tabla descargada

Para entender el dataset, más abajo se imprime diversa información útil, que se ha obtenido automáticamente mediante código, sobre las variables categóricas. De esta información deducimos lo siguiente para cada una de ellas:

  • freq: es la frecuencia de las observaciones. Tiene un único valor “A” que nos indica que la información es anual, es decir, un dato por año.

  • unit: determina lo que se mide en la observación (dato numérico values). Vemos que hay 5 opciones, pero 3 de ellas aparecen pocas veces en términos relativos.

  • direct: tiene 3 opciones pero la más que aparece es BAL

  • na_item: tiene 13 opciones, aunque algunas de ellas, como D63, con muy pocas observaciones en términos relativos. Las opciones que más aparecen son B5Ny B6N.

  • geo: esta variable representa el código NUTS de la región asociada a la observación. Vemos que en el dataset aparecen 29 regiones de NUTS 0 (países), 94 de NUTS 1 (grandes regiones), 251 de NUTS 2 (comunidades autónomas), EU27_2020 que sería la observación para el total de los países de la Unión Europea. Además aparecen 15 códigos con NUTS “OTHERS” que significa que son códigos que no tienen asociada una región real en alguno de los mapas físicos NUTS, pueden ser regiones del Reino Unido que ya no está en la Unión Europea o regiones creadas con fines estadísticos que no tienen asociada una región real en un mapa NUTS.
    IMPORTANTE: en general, para que un dataset sea válido, como dataset principal del proyecto personal de AEDV, debe tener datos referidos a un número mínimo de regiones de algún NUTS, apróximadamente 25 para NUTS 0, 90 para NUTS 1, 200 para NUTS 2 y 500 para NUTS 3. Desde ese punto de vista este dataset cumple ese criterio por triplicado al tener datos mínimos en 3 NUTS.

  • TIME_PERIOD: las fechas de las observaciones. Vemos que los datos empiezan en 1995 pero con pocas observaciones relativas. A partir del 2000 aumentan mucho las observaciones y en el último año, 2023, bajan mucho las observaciones registradas.

Esta información se calcula automáticamente, es muy útil, y nos da una primera idea de la organización del dataset. Si a partir de estos queremos profundizar más, tendríamos que estudiar en detalle el significado de las variables categóricas y sus opciones, especialmente, aquellas opciones que más salen en términos relativos.

## COLUMNA: freq 
##      freq N.Observ full_name
## [1,] A    285294   Annual
## COLUMNA: unit 
##      unit              N.Observ full_name                                 
## [1,] MIO_EUR           115674   Million euro                              
## [2,] MIO_NAC           115674   Million units of national currency        
## [3,] MIO_PPS_EU27_2020  18176   Million purchasing power standards (PPS,..
## [4,] EUR_HAB            17885   Euro per inhabitant                       
## [5,] PPS_EU27_2020_HAB  17885   Purchasing power standard (PPS, EU27 fro..
## COLUMNA: direct 
##      direct N.Observ full_name
## [1,] BAL    110856   Balance  
## [2,] PAID    89588   Paid     
## [3,] RECV    84850   Received
## COLUMNA: na_item 
##       na_item N.Observ full_name                                 
##  [1,] B5N     44072    Balance of primary incomes/national inco..
##  [2,] B6N     44072    Disposable income, net                    
##  [3,] D4      36100    Property income                           
##  [4,] D7      36100    Other current transfers                   
##  [5,] D61     28370    Net social contributions                  
##  [6,] D62     28106    Social benefits other than social transf..
##  [7,] D1      18242    Compensation of employees                 
##  [8,] B2A3N   18162    Operating surplus and mixed income, net   
##  [9,] D5      18050    Current taxes on income, wealth, etc.     
## [10,] P51C     4986    Consumption of fixed capital              
## [11,] B7N      4550    Adjusted disposable income, net           
## [12,] P3       2346    Final consumption expenditure             
## [13,] D63      2138    Social transfers in kind                  
## 
## CONTABILIZACIÓN Nº REGIONES NUTS A PARTIR DE LA COLUMNA geo
##      NUTS      Number of Regions
## [1,] 0          29              
## [2,] 1          94              
## [3,] 2         251              
## [4,] EU27_2020   1              
## [5,] OTHERS     15              
## 
## COLUMNA: TIME_PERIOD 
##       TIME_PERIOD N.observ
##  [1,] 1995-01-01   2230   
##  [2,] 1996-01-01   2230   
##  [3,] 1997-01-01   2230   
##  [4,] 1998-01-01   2230   
##  [5,] 1999-01-01   2230   
##  [6,] 2000-01-01  11590   
##  [7,] 2001-01-01  11590   
##  [8,] 2002-01-01  11590   
##  [9,] 2003-01-01  11590   
## [10,] 2004-01-01  11590   
## [11,] 2005-01-01  11590   
## [12,] 2006-01-01  11596   
## [13,] 2007-01-01  11596   
## [14,] 2008-01-01  11632   
## [15,] 2009-01-01  11632   
## [16,] 2010-01-01  11688   
## [17,] 2011-01-01  11928   
## [18,] 2012-01-01  11928   
## [19,] 2013-01-01  11928   
## [20,] 2014-01-01  11932   
## [21,] 2015-01-01  11884   
## [22,] 2016-01-01  11942   
## [23,] 2017-01-01  11942   
## [24,] 2018-01-01  11942   
## [25,] 2019-01-01  11942   
## [26,] 2020-01-01  12168   
## [27,] 2021-01-01  12154   
## [28,] 2022-01-01  11724   
## [29,] 2023-01-01   3046

Tamaño de las series temporales

Del análisis anterior sale que los datos empiezan en 1995, pero es a partir del 2000 cuando empieza a haber más observaciones y que en el año 2023 hay pocas observaciones, es decir hay muchos datos faltantes. Cada combinación posible de variables categóricas (excluyendo las fechas) genera una serie temporal dada por los valores observados para las diferentes fechas. Lo ideal es que todas las series temporales que salen de esta manera tengan el tamaño máximo posible. Pero esto rara vez ocurre. De hecho, en este caso sabemos que no va a pasar porque para ello, todas las fechas tendrían que tener asociadas el número máximo de observaciones posibles. Para analizar esto estudiaremos algunos percentiles de los tamaños (nº de fechas) que tienen estas series temporales. Observamos que el máximo tamaño de la serie temporal registrada es 29 (el total de fechas del dataset), que más del 10% de las series temporales observadas tienen ese valor máximo de 29 y más del 90% tienen al menos 23 fechas. IMPORTANTE: en general, para que un dataset sea válido, como dataset principal del proyecto personal de AEDV, la mayor parte de las series temporales deben tener un tamaño superior a 10 (p50>10) y cuanto mayor sea ese tamaño, mejor.. En ese sentido, este dataset verifica ese criterio.

Percentiles de la distribución de tamaños de las series temporales observadas

## # A tibble: 1 × 7
##     min   p10   p25   p50   p75   p90   max
##   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1     2    23    23    23    24    29    29

Distribución del nº de observaciones por regiones

Para valorar si las regiones tienen asociadas un número similar de observaciones o hay muchos datos faltantes, vamos a estudiar los percentiles de la distribución del nº de observaciones por regiones que se presentan debajo. Observamos que hay bastante variabilidad, lo cual es normal porque la cantidad de información disponible puede variar mucho de una región a otra. En ese contexto es importante analizar si España y/o Canarias están bien representados. En ese sentido, vemos debajo que las regiones de España y Canarias están bien representadas con 934 observaciones situadas en el p90 de la distribución. IMPORTANTE: en general, para que un dataset sea válido, como dataset principal del proyecto personal de AEDV, debe cumplir que para alguna región vinculada a España y/o Canarias, el nº de observaciones supere el percentil p75 de la distribución. Por tanto, este dataset cumple la condición tanto para España como para Canarias. Hay que tener en cuenta que Canarias aparece dos veces con códigos distintos: ES7 para NUTS 1 y ES70 para NUTS 2.

Percentiles de la distribución del nº de observaciones por regiones

## # A tibble: 1 × 7
##     min   p10   p25   p50   p75   p90   max
##   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1    34   644   644   736   796   934  1188

Nº de observaciones en España/Canarias

## # A tibble: 3 × 3
##   geo   full_name N.Observ
##   <chr> <chr>        <int>
## 1 ES    Spain          934
## 2 ES7   Canarias       934
## 3 ES70  Canarias       934

Análisis de las combinaciones existentes de las variables categóricas

En las tablas multidimensionales, normalmente, solo unas pocas de entre todas las combinaciones posibles de las variables categóricas aparecen realmente en la tabla. Por tanto, es importante estudiar que combinaciones de las variables categóricas aparecen con datos en la tabla. Por ejemplo, en el análisis anterior vimos que, separadamente, MIO_EUR, BAL y B6N aparecían con bastante frecuencia, ahora vamos a ver la frecuencia con la que aparece la combinación de las 3 opciones. Ello se muestra en la siguiente tabla. Observamos que la referida combinación tiene 9088 observaciones. Aquí el número de observaciones representa, para una combinación, en cuantas fechas, regiones, edad y sexo (si los hubiera) aparecen esta combinación. Cada combinación de variables categóricas que aparece puede considerarse un atributo combinado de la región correspondiente para una cierta fecha (y edad/sexo si lo hubiera), IMPORTANTE: en general, para que un dataset sea válido, como dataset principal del proyecto personal de AEDV, debe tener, al menos 5 atributos combinados, todos con un número relativamente alto de observaciones, teniendo en cuenta además, que si el dataset contiene información de sexo y grupos de edad, estos pueden también combinarse con el resto de atributos para formar atributos combinados. Por ejemplo, contando con 2 sexos y 3 grupos de edad, el nº de atributos combinados se multiplicaría por 6. Este dataset verifica ese criterio pues genera 42 atributos muchos de ellos con un nº de observaciones cercano al máximo (9121). Hay que tener en cuenta que puede haber atributos que generen información poco relevante o muy parecida a otros atributos; pero eso solo podrá valorar con un análisis posterior más detallado sobre el significado de los atributos. Si nos interesa mucho el tema y no cumple esta condición, siempre podemos combinar este dataset con otros que nos permitan aumentar el nº de atributos.

## # A tibble: 42 × 7
## # Groups:   freq, unit, direct [9]
##    freq  unit              direct na_item N.observ init.date  end.date  
##    <chr> <chr>             <chr>  <chr>      <int> <date>     <date>    
##  1 A     MIO_EUR           RECV   D1          9121 1995-01-01 2023-01-01
##  2 A     MIO_NAC           RECV   D1          9121 1995-01-01 2023-01-01
##  3 A     MIO_EUR           BAL    B5N         9088 1995-01-01 2023-01-01
##  4 A     MIO_EUR           BAL    B6N         9088 1995-01-01 2023-01-01
##  5 A     MIO_NAC           BAL    B5N         9088 1995-01-01 2023-01-01
##  6 A     MIO_NAC           BAL    B6N         9088 1995-01-01 2023-01-01
##  7 A     MIO_PPS_EU27_2020 BAL    B5N         9088 1995-01-01 2023-01-01
##  8 A     MIO_PPS_EU27_2020 BAL    B6N         9088 1995-01-01 2023-01-01
##  9 A     MIO_EUR           BAL    B2A3N       9081 1995-01-01 2023-01-01
## 10 A     MIO_NAC           BAL    B2A3N       9081 1995-01-01 2023-01-01
## 11 A     MIO_EUR           PAID   D61         9065 1995-01-01 2023-01-01
## 12 A     MIO_EUR           RECV   D62         9065 1995-01-01 2023-01-01
## 13 A     MIO_NAC           PAID   D61         9065 1995-01-01 2023-01-01
## 14 A     MIO_NAC           RECV   D62         9065 1995-01-01 2023-01-01
## 15 A     MIO_EUR           PAID   D4          9025 1995-01-01 2023-01-01
## 16 A     MIO_EUR           PAID   D5          9025 1995-01-01 2023-01-01
## 17 A     MIO_EUR           PAID   D7          9025 1995-01-01 2023-01-01
## 18 A     MIO_EUR           RECV   D4          9025 1995-01-01 2023-01-01
## 19 A     MIO_EUR           RECV   D7          9025 1995-01-01 2023-01-01
## 20 A     MIO_NAC           PAID   D4          9025 1995-01-01 2023-01-01
## 21 A     MIO_NAC           PAID   D5          9025 1995-01-01 2023-01-01
## 22 A     MIO_NAC           PAID   D7          9025 1995-01-01 2023-01-01
## 23 A     MIO_NAC           RECV   D4          9025 1995-01-01 2023-01-01
## 24 A     MIO_NAC           RECV   D7          9025 1995-01-01 2023-01-01
## 25 A     EUR_HAB           BAL    B5N         8404 2000-01-01 2023-01-01
## 26 A     EUR_HAB           BAL    B6N         8404 2000-01-01 2023-01-01
## 27 A     PPS_EU27_2020_HAB BAL    B5N         8404 2000-01-01 2023-01-01
## 28 A     PPS_EU27_2020_HAB BAL    B6N         8404 2000-01-01 2023-01-01
## 29 A     MIO_EUR           RECV   D61         5120 1995-01-01 2023-01-01
## 30 A     MIO_NAC           RECV   D61         5120 1995-01-01 2023-01-01
## 31 A     MIO_EUR           PAID   D62         4988 1995-01-01 2023-01-01
## 32 A     MIO_NAC           PAID   D62         4988 1995-01-01 2023-01-01
## 33 A     MIO_EUR           PAID   P51C        2493 1995-01-01 2023-01-01
## 34 A     MIO_NAC           PAID   P51C        2493 1995-01-01 2023-01-01
## 35 A     MIO_EUR           BAL    B7N         1198 1995-01-01 2023-01-01
## 36 A     MIO_NAC           BAL    B7N         1198 1995-01-01 2023-01-01
## 37 A     MIO_EUR           PAID   P3          1173 1995-01-01 2023-01-01
## 38 A     MIO_NAC           PAID   P3          1173 1995-01-01 2023-01-01
## 39 A     EUR_HAB           BAL    B7N         1077 2000-01-01 2023-01-01
## 40 A     PPS_EU27_2020_HAB BAL    B7N         1077 2000-01-01 2023-01-01
## 41 A     MIO_EUR           RECV   D63         1069 1995-01-01 2023-01-01
## 42 A     MIO_NAC           RECV   D63         1069 1995-01-01 2023-01-01

Poner las fechas por columnas

El formato tidy (una sola observación por fila) es idóneo para gestionar la tabla con R pero no es adecuado par un análisis/edición visual. Para facilitar esta tarea vamos a poner las fechas por columnas en una nueva tabla. Además, como nos interesa especialmente verificar si España y/o Canarias se encuentran bien representadas en los datos, vamos a visualizar, en dicha tabla, los registros asociados (con un máximo de 60 columnas y los primeros 1000 registros de España o Canarias. Observamos que, para la gran mayoría de atributos combinados en España y Canarias, la serie temporal está completa entre el 2000 y 2022, lo cual es un rango razonable de años.

Visualización España/Canarias (máximo 60 columnas y 1000 filas por región)

Salvar el dataset en ficheros CSV

Una buena idea después de descargar el dataset del servidor de Eurostat es guardar localmente una copia para poder trabajar con ella localmente, que siempre será más rápido y además no dependemos del servidor de Eurostat, o de si se producen cambios en la versión del dataset en Eurostat. Además, para ahorrar espacio, podemos eliminar previamente las variables con valores constantes, como en este caso freq, que siempre vale A, y, por tanto, no vale la pena repetirla en cada fila. Para escribir/leer ficheros CSV podemos usar las funciones read_csv, write_csv o read_csv2, write_csv2. Añadir el 2 al final del nombre de la función hace que se escriba con codificación española, es decir, usa como separador de columnas “;” y como separarador de decimales “,”. Hay que tener cuidado porque existen otras funciones de lectura/escritura como write.csv, read.csv que aunque se escriben casi igual funcionan distinto y son más lentas.

Leer/escribir el dataset en el fichero nama_10r_2hhinc.csv se haría del siguiente modo:

# ESCRITURA DEL DATASET EN FORMATO CSV
data %>%
  select(-freq) %>%
  write_csv2(paste0(dataset.name,".csv"))
# LECTURA DEL DATASET EN FORMATO CSV
data  <- read_csv2(paste0(dataset.name,".csv")) %>%
  as_tibble() %>%
  mutate(TIME_PERIOD=as.Date(TIME_PERIOD))
data

Para hacer lo mismo con el dataset con las fechas por columnas en el archivo nama_10r_2hhinc.fechas.csv haríamos:

# ESCRITURA DEL DATASET EN FORMATO CSV CON LAS FECHAS POR COLUMNAS E INFORMACIÓN ADICIONAL  
data.fechas %>% 
  write_csv2(paste0(dataset.name,".fechas.csv"))
# LECTURA DEL DATASET EN FORMATO CSV CON LAS FECHAS POR COLUMNAS E INFORMACIÓN ADICIONAL
data.fechas <- read_csv2(paste0(dataset.name,".fechas.csv")) %>%
  as_tibble() 

Este fichero con las fechas por columnas podríamos abrirlo con excel (si no es muy grande) y tendríamos una buena apreciación visual del dataset con la evolución temporal. Incluso podríamos editar manualmente el CSV o el excel, guardarlo y después leerlo.

Si queremos pasarlo a formato tidy, podemos hacer:

data <- data.fechas %>%
  pivot_longer(cols = (which(colnames(data.fechas) == "region")+1):ncol(data.fechas),
               names_to = "TIME_PERIOD",
               values_to = "values"
  ) %>%
  mutate(TIME_PERIOD=as.Date(TIME_PERIOD)) %>% 
  relocate(TIME_PERIOD,.before=values) %>%
  na.omit() %>% 
  arrange(TIME_PERIOD,geo)

data

Nótese que para tener la misma organización que el dataset inicial, tendríamos que quitar las variables NUTS, country, y region, que las hemos añadido nosotros al poner las fechas por columnas.