Datos de Eurostat con R

Programación y manejo de datos con R (Slides 04-B)

Pedro J. Pérez

¿Qué es Eurostat?

  • Eurostat es la oficina estadística de la Unión Europea. Depende de la Comisión Europea y está en Luxemburgo

  • No hace encuestas: recoge los datos de los institutos de estadística de cada país (en España, el INE) y los armoniza

  • Tiene datos de los 27 países de la UE, y muchas veces también de la EFTA (Noruega, Suiza, Islandia), de los países candidatos y de las regiones (NUTS)


fuente a la que ir cuando queremos comparar países o regiones europeas

  • el paro, el PIB per cápita, inflación, población … medidos de la misma forma

Para datos de España con mucho detalle, el INE.               Para comparar España con otros países, Eurostat.

La base de datos de Eurostat está organizada por temas

  • La base de datos por temas/carpetas:

    • Estadísticas generales y regionales
    • Economía y finanzas
    • Población y condiciones sociales
    • Industria, comercio y servicios
    • Agricultura y pesca
    • Comercio internacional
    • Transporte
    • Medio ambiente y energía
    • Ciencia, tecnología y sociedad digital

  • Dentro de las carpetas están los datasets: hay unos 9.000

Cada dataset tiene un código.

Código Dataset Periodicidad
une_rt_a  Desempleo por sexo y edad anual
une_rt_m  Desempleo por sexo y edad mensual
nama_10_pc  PIB per cápita y sus componentes anual
prc_hicp_manr  Inflación (IPC armonizado, tasa anual) mensual
demo_pjan  Población a 1 de enero, por edad y sexo anual
lfst_r_lfu3rt  Tasa de paro por regiones (NUTS 2) anual

El código no es caprichoso: está hecho de trozos, separados por _, y cada trozo significa algo.
Las primeras letras indican el tema y la última parte suele indicar la periodicidad (_a anual, _q trimestral, _m mensual). Por ejemplo:


  • une_rt_a: une (unemployment, desempleo) + rt (rate, tasa) + a (annual, anual)
  • nama_10_pc: nama (national accounts main aggregates, contabilidad nacional) + 10 (el sistema de cuentas SEC 2010) + pc (per capita)
  • prc_hicp_manr: prc (prices, precios) + hicp (harmonised index of consumer prices, el IPC armonizado) + manr (monthly annual rate, la tasa anual de cada mes)
  • demo_pjan: demo (demography, demografía) + pjan (population on 1 January, población a 1 de enero)
  • lfst_r_lfu3rt: lfst (labour force survey, la “EPA europea”) + r (regional) + lfu3rt (tasa de paro)

en un dataset cada dato se identifica por sus dimensiones. En une_rt_a:

df <- eurostat::get_eurostat("une_rt_a")
freq
<chr>
age
<chr>
unit
<chr>
sex
<chr>
geo
<chr>
TIME_PERIOD
<date>
values
<dbl>
A Y15-24 PC_ACT F AT 2009-01-01 10.5
A Y15-24 PC_ACT F AT 2010-01-01 9.8
A Y15-24 PC_ACT F AT 2011-01-01 9.5
A Y15-24 PC_ACT F AT 2012-01-01 9.6
Primeras 4 filas de 39.909
Dimensión ¿Qué es? Algunos valores
freq  la periodicidad A (anual)
age  el grupo de edad Y15-74, Y15-24, Y25-74, …
unit  la unidad de medida PC_ACT (% de la población activa)
THS_PER (miles de personas) ❗❗
sex  el sexo T (total), M (hombres), F (mujeres)
geo  el país o la región ES, FR, EU27_2020, …
TIME_PERIOD  el periodo 2024-01-01, 2025-01-01, …
values  el dato 10.5, 9.8, …

En los datos solo hay códigos:
ES, PC_ACT, Y15-74.
Su significado (las “etiquetas”) está en unos diccionarios aparte, pero con el paquete eurostat podemos obtenerlos fácilmente

Con la dimensión unit hay que tener cuidado: en el mismo dataset, una variable suele venir en varias unidades.
Cuidado porqué puedes mezclar porcentajes con miles de personas ❗❗

Los códigos de los territorios

  • La dimensión geo tiene países, agregados y regiones:
Tipo Códigos Ejemplos
países 2 letras ES, FR, DE, IT
Ojo: Grecia es EL
agregados letras y números EU27_2020 (la UE de 27 países)
EA20 (la zona euro de 20 países)
regiones NUTS 1 país + 1 carácter ES5 (Este)
regiones NUTS 2 país + 2 caracteres ES52 (Comunitat Valenciana)
regiones NUTS 3 país + 3 caracteres ES523 (Valencia/València)

NUTS es la clasificación europea de regiones. En España: NUTS 2 son las comunidades autónomas y NUTS 3 las provincias

Por ejemplo:
ES (España, NUTS 0) → ES5 (Este, NUTS 1) → ES52 (Comunitat Valenciana, NUTS 2) → ES523 (la provincia de Valencia, NUTS 3)

Ojo: ES523 es la provincia, no la ciudad. Los municipios no tienen código NUTS: están en otra clasificación, las LAU (Local Administrative Units)


Cuidado con los agregados: si sumas o haces un ranking sin quitarlos, la “UE” aparecerá como un país más

Tres formas de conseguir los datos

  1. Por menús: entras en la web, buscas el dataset, pinchas en Download y guardas el fichero

  2. Con la url del fichero: descargas el fichero desde R, sin pasar por la web

  3. Con el paquete eurostat: buscas y descargas los datos desde R


  • La primera forma no es reproducible; con las otras dos, el script contiene todo el proceso

Veremos primero cómo hacerlo “a mano” (formas 1 y 2) y después con el paquete eurostat

Los datos, a mano

Descargar un fichero de Eurostat y limpiarlo

Cada dataset tiene su página, su código … y varios formatos

  • Queremos la tasa de paro de los países europeos. Navegando por las carpetas (Population and social conditions → Labour market → …) llegamos a la página del dataset, en el Data Browser

  • Su código está debajo del título (Online data code) y al final de la url: une_rt_a. Apúntalo, lo vamos a necesitar!!

  • Con el botón Download podemos bajarnos el dataset en varios formatos. ¿Cuál elegimos?

Formato ¿Cómo es? ¿Sirve para R?
SDMX-CSV una fila por dato sí, es el mejor
TSV separado por tabuladores, con una columna por periodo sí, pero hay que limpiarlo bastante
Excel (.xlsx) la tabla tal como se ve en la web con mucho trabajo
JSON-stat, SDMX-ML formatos para programas mejor con el paquete eurostat

Pero … no hace falta pinchar en Download: la url del fichero siempre tiene la misma forma. Solo cambian el código del dataset y el formato:
https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/une_rt_a?format=SDMX-CSV
Ojo: se descarga el dataset completo, con todos los países, años, sexos, edades y unidades

Descargamos el fichero SDMX-CSV … y vemos qué hay en cada dimensión

my_url <- "https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/une_rt_a?format=SDMX-CSV"
1df_paro <- readr::read_csv(my_url)
1
Es un CSV “normal”: read_csv(), directamente de la url. Ha ido bien: una fila por dato, y el valor (OBS_VALUE) es numérico
DATAFLOW
<chr>
LAST UPDATE
<chr>
freq
<chr>
age
<chr>
unit
<chr>
sex
<chr>
geo
<chr>
TIME_PERIOD
<dbl>
OBS_VALUE
<dbl>
OBS_FLAG
<chr>
CONF_STATUS
<lgl>
ESTAT:UNE_RT_A(1.0) 10/09/26 23:00:00 A Y15-24 PC_ACT F AT 2009 10.5 NA NA
ESTAT:UNE_RT_A(1.0) 10/09/26 23:00:00 A Y15-24 PC_ACT F AT 2010 9.8 NA NA
Primeras 2 filas de 39.909
  • Pero … ¿qué son PC_ACT, Y15-24 y AT? Veamos qué valores toma cada dimensión, con count():
df_paro %>% count(unit)
unit
<chr>
n
<int>
PC_ACT 13303
PC_POP 13303
THS_PER 13303
df_paro %>% count(sex)
sex
<chr>
n
<int>
F 13290
M 13308
T 13311
  • El significado de cada código está en la web del dataset. También se puede descargar: cada dimensión tiene su diccionario (codelist), pero es más cómodo con el paquete eurostat, como veremos

  • OBS_FLAG son los flags: avisos sobre un dato. Los más habituales: b (ruptura en la serie), p (provisional), e (estimado), u (poco fiable)

df_paro %>% count(age)
age
<chr>
n
<int>
Y15-24 5715
Y15-29 5643
Y15-74 5715
Y20-64 5715
Y25-54 5715
Y25-74 5715
Y55-74 5691

Limpiamos los datos … y ya podemos usarlos

df_paro <- df_paro %>%
1  janitor::clean_names() %>%
  select(geo, unit, sex, age,
         anyo = time_period,
         tasa_paro = obs_value,
2         flag = obs_flag) %>%
  filter(unit == "PC_ACT", sex == "T",
3         age == "Y15-74") %>%
  mutate(tipo_geo = if_else(str_length(geo) == 2,
4                            "país", "agregado"))
1
Nombres de columnas “cómodos”: en minúsculas y sin espacios
2
Solo las columnas que hacen falta, con nombres que digan qué son
3
Nos quedamos con una sola serie por territorio: la tasa de paro (% de la población activa), de ambos sexos, de 15 a 74 años
4
Los códigos de país tienen 2 letras: así separamos los países de los agregados (EU27_2020, EA20, …)


df_paro %>%
  filter(geo %in% c("ES", "EU27_2020"), anyo >= 2024)
geo
<chr>
unit
<chr>
sex
<chr>
age
<chr>
anyo
<dbl>
tasa_paro
<dbl>
flag
<chr>
tipo_geo
<chr>
ES PC_ACT T Y15-74 2024 11.4 d país
ES PC_ACT T Y15-74 2025 10.5 d país
EU27_2020 PC_ACT T Y15-74 2024 6 NA agregado
EU27_2020 PC_ACT T Y15-74 2025 6 NA agregado
df_paro %>%
  filter(anyo == max(anyo)) %>%
  #- los 27 países de la UE y el total
  filter(geo %in% c(eurostat::eu_countries$code, "EU27_2020")) %>%
  #- España, con su propio color
  mutate(tipo_geo = if_else(geo == "ES", "España", tipo_geo)) %>%
  ggplot(aes(x = tasa_paro, y = fct_reorder(geo, tasa_paro))) +
  geom_col(aes(fill = tipo_geo)) +
  labs(title = paste0("Tasa de paro en la UE (", max(df_paro$anyo), ")"),
       x = "%", y = NULL, fill = NULL, caption = "Fuente: Eurostat (une_rt_a)")

Tarea: la población de los países europeos

  1. Descarga desde R el fichero SDMX-CSV del dataset e impórtalo
  2. Mira qué dimensiones tiene y qué valores toma cada una. ¿Hay algo más que países en geo?
  3. Limpia los datos: quédate con el territorio, el año y la población, con nombres cómodos
  4. ¿Cuáles son los 5 países con más población en el último año?
  5. [🌶] ¿Qué 5 países han ganado más población (en %) entre el primer y el último año que hay en los datos?
  • 1: la url es como la del paro, cambiando el código del dataset
  • 2: count() de cada dimensión. En geo están también los agregados (EU27_2020, EA20, …)
  • 3: janitor::clean_names(), select() y rename()
  • 4: quédate con los países: sus códigos tienen 2 letras (str_length(geo) == 2)
  • 5: group_by(geo) y summarise() con first() y last()
my_url <- "https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/tps00001?format=SDMX-CSV"

df_pob <- read_csv(my_url) %>%
  janitor::clean_names() %>%
  select(geo, anyo = time_period, poblacion = obs_value) %>%
  filter(str_length(geo) == 2)        #- solo los países
df_pob %>%
  filter(geo == "ES") %>%
  gt::gt() %>%
  gt::fmt_number(columns = poblacion,
                 decimals = 0, sep_mark = ".")
geo anyo poblacion
ES 2015 46.425.722
ES 2016 46.418.884
ES 2017 46.497.393
ES 2018 46.645.070
ES 2019 46.918.951
ES 2020 47.318.050
ES 2021 47.400.798
ES 2022 47.486.843
ES 2023 48.085.361
ES 2024 48.619.695
ES 2025 49.128.297
ES 2026 49.590.099
df_top5 <- df_pob %>%
  filter(anyo == max(anyo)) %>%
  slice_max(poblacion, n = 5)
df_top5 %>%
  gt::gt() %>%
  gt::fmt_number(columns = poblacion,
                 decimals = 0, sep_mark = ".")
geo anyo poblacion
DE 2026 83.467.117
UK 2026 69.554.275
FR 2026 69.112.309
IT 2026 58.942.828
ES 2026 49.590.099
df_crec <- df_pob %>%
  filter(!is.na(poblacion)) %>%
  group_by(geo) %>%
  summarise(anyo_ini = min(anyo), anyo_fin = max(anyo),
            pob_ini  = first(poblacion, order_by = anyo),
            pob_fin  = last(poblacion, order_by = anyo)) %>%
  mutate(crec = pob_fin / pob_ini - 1) %>%
  arrange(desc(crec))
df_crec %>%
  filter(geo %in% c("DE", "UK", "FR", "IT", "ES") |
1         crec %in% range(crec)) %>%
  gt::gt() %>%
  gt::fmt_number(columns = c(pob_ini, pob_fin),
                 decimals = 0, sep_mark = ".") %>%
  gt::fmt_percent(columns = crec, decimals = 1)
1
range(crec) devuelve el mínimo y el máximo de crec: así nos quedamos también con el país que más crece y con el que menos
geo anyo_ini anyo_fin pob_ini pob_fin crec
MT 2015 2026 438.805 588.254 34.1%
UK 2015 2026 64.852.826 69.554.275 7.2%
ES 2015 2026 46.425.722 49.590.099 6.8%
FR 2015 2026 66.458.153 69.112.309 4.0%
DE 2015 2026 81.197.537 83.467.117 2.8%
IT 2015 2026 60.295.497 58.942.828 −2.2%
MD 2015 2026 3.555.159 2.365.645 −33.5%

eurostat es un paquete de rOpenGov para descargar datos de Eurostat

  • Ventajas frente a descargar ficheros:

    • puedes buscar datasets desde R
    • los datos llegan ya limpios: una fila por dato, con fechas de verdad
    • puedes pedir solo una parte del dataset
    • tiene los diccionarios: convierte los códigos en etiquetas con una función
    • guarda una copia (caché) de lo que descargas: la segunda vez es inmediato
  • Tiene una cheatsheet y unos tutoriales muy buenos

Para … función
buscar datasets search_eurostat()
ver el índice de toda la base de datos get_eurostat_toc()
descargar un dataset get_eurostat()
cambiar los códigos por sus etiquetas label_eurostat()
ver el diccionario de una dimensión get_eurostat_dic()
descargar los mapas de países y regiones get_eurostat_geospatial()

El recorrido habitual: buscar → descargar → (elegir unidades y categorías) → etiquetar

Si ya conoces el código del dataset, puedes ir directamente a get_eurostat()

Paso 1: buscar un dataset

1aa <- search_eurostat("unemployment")

2aa %>% select(title, code, data.start, data.end) %>% slice(1:3)
1
Busca en los títulos de los datasets. Hay que buscar en inglés (o en francés o alemán, con lang)
2
Salen 55 datasets: lo mejor es guardar el resultado y mirarlo con calma (View(aa))
title
<chr>
code
<chr>
data.start
<chr>
data.end
<chr>
Persons in long-term unemployment (12 months or more) by educational attainment level and NUTS 2 region lfst_r_lfu2ltu 1999 2025
Regional disparities in unemployment rates (NUTS level 2, NUTS level 3) lfst_r_lmdur 1999 2025
Regional disparities in long-term unemployment rates (NUTS level 2) lfst_r_lmdltu 1999 2025
  • Se puede afinar con filter():
aa %>% filter(str_detect(title, "annual data")) %>% select(title, code, data.start, data.end)
title
<chr>
code
<chr>
data.start
<chr>
data.end
<chr>
Long-term unemployment by sex - annual data (1996–2020) une_ltu_a_h 1996 2020
Supplementary indicators to unemployment - annual data (1992–2020) lfsi_sup_a_h 1992 2020
Long-term unemployment by sex - annual data une_ltu_a 2003 2025
Supplementary indicators to unemployment - annual data lfsi_sup_a 2003 2025
Long-term unemployment by sex - annual data une_ltu_a 2003 2025
Long-term unemployment by sex - annual data une_ltu_a 2003 2025

Paso 2: descargar el dataset

df <- get_eurostat("une_rt_a")

df
freq
<chr>
age
<chr>
unit
<chr>
sex
<chr>
geo
<chr>
TIME_PERIOD
<date>
values
<dbl>
A Y15-24 PC_ACT F AT 2009-01-01 10.5
A Y15-24 PC_ACT F AT 2010-01-01 9.8
A Y15-24 PC_ACT F AT 2011-01-01 9.5
A Y15-24 PC_ACT F AT 2012-01-01 9.6
A Y15-24 PC_ACT F AT 2013-01-01 10.4
A Y15-24 PC_ACT F AT 2014-01-01 10.4
Primeras 6 filas de 39.909
  • Llega ya limpio: una fila por dato, y los valores (values) son numéricos

  • TIME_PERIOD es una fecha de verdad: el primer día del periodo. Si lo prefieres como número (2024), get_eurostat("une_rt_a", time_format = "num")

  • Por defecto no trae los flags. Para tenerlos: get_eurostat("une_rt_a", keepFlags = TRUE). Los que más importan son b (break in time series: ese año cambió la forma de medir, y el dato no es comparable con los anteriores) y d (definition differs: la definición no es exactamente la estándar)

  • Pero siguen siendo códigos …

Paso 3: de códigos a etiquetas

df_l <- label_eurostat(df)

df_l %>% slice(1:3)
freq
<chr>
age
<chr>
unit
<chr>
sex
<chr>
geo
<chr>
TIME_PERIOD
<date>
values
<dbl>
Annual From 15 to 24 years Percentage of population in the labour force Females Austria 2009-01-01 10.5
Annual From 15 to 24 years Percentage of population in the labour force Females Austria 2010-01-01 9.8
Annual From 15 to 24 years Percentage of population in the labour force Females Austria 2011-01-01 9.5
  • Ahora se entiende, pero para filtrar es más cómodo (y más seguro) usar los códigos. Lo mejor es tener las dos cosas: con code se indica de qué dimensiones conservar el código
df_l <- label_eurostat(df, code = c("geo", "unit", "sex", "age"))

df_l %>%
  select(geo_code, geo, unit_code, unit, sex_code, sex, age_code, age, TIME_PERIOD, values) %>%
  slice(1:3)
geo_code
<chr>
geo
<chr>
unit_code
<chr>
unit
<chr>
sex_code
<chr>
sex
<chr>
age_code
<chr>
age
<chr>
TIME_PERIOD
<date>
values
<dbl>
AT Austria PC_ACT Percentage of population in the labour force F Females Y15-24 From 15 to 24 years 2009-01-01 10.5
AT Austria PC_ACT Percentage of population in the labour force F Females Y15-24 From 15 to 24 years 2010-01-01 9.8
AT Austria PC_ACT Percentage of population in the labour force F Females Y15-24 From 15 to 24 years 2011-01-01 9.5

Los diccionarios

  • ¿Qué significa un código? ¿Qué códigos hay? get_eurostat_dic() devuelve el diccionario de una dimensión:
aa <- get_eurostat_dic("geo")
aa <- get_eurostat_dic("unit")
aa <- get_eurostat_dic("age")
aa <- get_eurostat_dic("sex")
aa <- get_eurostat_dic("freq")
dimensión filas
geo 4.292
unit 773
age 686
sex 8
freq 12
  • Los diccionarios son de todo Eurostat, no solo de nuestro dataset: por eso el de sex tiene 8 filas, aunque en une_rt_a solo salen 3
  • Si ya tienes df_l (con los códigos y las etiquetas), con distinct() ves las parejas código-etiqueta de cada dimensión:
df_l %>% distinct(unit_code, unit)
unit_code
<chr>
unit
<chr>
PC_ACT Percentage of population in the labour force
PC_POP Percentage of total population
THS_PER Thousand persons
df_l %>% distinct(sex_code, sex)
sex_code
<chr>
sex
<chr>
F Females
M Males
T Total
  • Y el paquete trae listas de países ya preparadas: eu_countries, ea_countries, efta_countries, …

filters: descargar solo una parte … y el paro en España y en Europa

  • Con filters se descarga solo lo que se necesita: una lista con los códigos de cada dimensión
df_5 <- get_eurostat("une_rt_a",
          filters = list(
            geo  = c("ES", "FR", "IT", "DE",
1                     "EU27_2020"),
            sex  = "T",
            age  = "Y15-74",
            unit = "PC_ACT"))

df_5 %>% filter(geo == "ES", time >= "2024-01-01")
1
Las dimensiones que no se mencionan se descargan enteras
freq
<chr>
age
<chr>
unit
<chr>
sex
<chr>
geo
<chr>
time
<date>
values
<dbl>
A Y15-74 PC_ACT T ES 2024-01-01 11.4
A Y15-74 PC_ACT T ES 2025-01-01 10.5
  • ¡Atención! Con filters la columna del tiempo se llama time (sin filters, TIME_PERIOD): los datos se piden a otra API de Eurostat

  • Para el tiempo: time = 2024 (un año), sinceTimePeriod = 2015 (desde un año) o lastTimePeriod = 5 (los últimos periodos)

df_5 %>%
  label_eurostat(code = "geo") %>%
  mutate(geo = if_else(geo_code == "EU27_2020",
                       "UE-27", geo)) %>%
  ggplot(aes(x = time, y = values, color = geo)) +
  geom_line(linewidth = 1) +
  labs(title = "Tasa de paro (15-74 años)", color = NULL,
       x = NULL, y = "% de la población activa",
       caption = "Fuente: Eurostat (une_rt_a)")

Trampas y cosas a tener en cuenta

Trampa Ejemplo Solución
en los datos solo hay códigos PC_ACT, Y15-74, B1GQ mirar su significado (o label_eurostat())
la misma variable en varias unidades PC_ACT, PC_POP, THS_PER filter(unit == ...): así que cuidado!!
los totales están mezclados con las categorías sex == "T", age == "TOTAL" filter(): cuidado al sumar
países y agregados juntos ES, EU27_2020, EA20 separarlos por la longitud del código
los códigos de algunos países no son los habituales Grecia es EL (no GR) eurostat::eu_countries
datos con avisos flags b, p, e, u mirar la columna de flags
el dataset completo puede ser enorme millones de filas descargar solo una parte (con el paquete)


Después de importar, haz un count() de cada dimensión. Siempre

  • La caché: get_eurostat() guarda lo que descarga, y la próxima vez lo lee del disco. Si quieres los datos actualizados: get_eurostat(..., update_cache = TRUE)

  • Los códigos cambian: la UE era EU28 y ahora es EU27_2020; la zona euro pasó de EA19 a EA20 al entrar Croacia. Y hay datasets que se dejan de actualizar y se sustituyen por otros

  • Las regiones también: la clasificación NUTS se revisa cada pocos años. Si al unir datos y mapas se pierden regiones, mira qué versión usa cada uno

  • Datos anuales, trimestrales y mensuales suelen están en datasets distintos (une_rt_a, une_rt_q, une_rt_m)

  • Todo está en inglés: los títulos y las etiquetas (también en francés y alemán, con lang)


Guarda en disco los datos que uses en un trabajo (rio::export()): Eurostat revisa los datos, y mañana pueden ser otros

Tarea: ¿qué países son más ricos?

  • El dataset nama_10_pc tiene el PIB per cápita de los países europeos
  1. Descarga el dataset y mira qué dimensiones tiene. ¿Cuántas unidades de medida (unit) hay? ¿Y cuántas magnitudes (na_item)?
  2. Quédate con el PIB (na_item: B1GQ) en paridad de poder de compra (unit: CP_PPS_EU27_2020_HAB) del año 2024
  3. Quédate solo con los países de la UE y añade su nombre
  4. Ordena los países de mayor a menor PIB per cápita. ¿En qué puesto está España?
  5. [🌶] Haz un gráfico de barras, destacando a España
  • 1: count(unit) y count(na_item). Para saber qué significan: get_eurostat_dic("na_item")
  • 2: filter(); o, mejor, descargar solo eso con filters
  • 3: filter(geo %in% eu_countries$code) y label_eurostat(code = "geo")
  • 4: arrange(desc(values)) y mutate(ranking = row_number())
  • 5: geom_col(aes(fill = geo_code == "ES"))
df_pib <- get_eurostat("nama_10_pc")

df_pib %>%
  label_eurostat(code = "na_item") %>%
  distinct(na_item_code, na_item)
na_item_code
<chr>
na_item
<chr>
B1GQ Gross domestic product at market prices
P3 Final consumption expenditure
P31_S13 Individual consumption expenditure of general government
P31_S14 Final consumption expenditure of household
P31_S14_S15 Household and NPISH final consumption expenditure
P31_S15 Final consumption expenditure of NPISH
P32_S13 Collective consumption expenditure of general government
P3_S13 Final consumption expenditure of general government
P41 Actual individual consumption
df_pib %>%
  label_eurostat(code = "unit") %>%
  distinct(unit_code, unit)
unit_code
<chr>
unit
<chr>
CLV10_EUR_HAB Chain linked volumes (2010), euro per capita
CLV15_EUR_HAB Chain linked volumes (2015), euro per capita
CLV20_EUR_HAB Chain linked volumes (2020), euro per capita
Primeras 3 filas de 12
  • Hay 12 unidades de medida y 9 magnitudes. ¡No se puede usar sin filtrar!
df_pib <- get_eurostat("nama_10_pc",
1                       filters = list(na_item = "B1GQ", unit = "CP_PPS_EU27_2020_HAB",
                                      time = 2024)) %>%
2  filter(geo %in% eu_countries$code) %>%
3  label_eurostat(code = "geo") %>%
  select(geo_code, pais = geo, pib_pc = values) %>%
4  arrange(desc(pib_pc)) %>%
  mutate(ranking = row_number())
1
Descargamos solo el PIB (B1GQ), por habitante y en paridad de poder de compra (CP_PPS_EU27_2020_HAB), del año 2024
2
Nos quedamos con los 27 países de la UE
3
Añadimos el nombre de cada país (y mantenemos su código en geo_code)
4
Ordenamos de mayor a menor PIB per cápita y numeramos el puesto de cada país
df_pib %>%
  filter(ranking <= 3 | geo_code == "ES") %>%
  gt::gt() %>%
  gt::fmt_number(columns = pib_pc,
                 decimals = 0, sep_mark = ".")
geo_code pais pib_pc ranking
LU Luxembourg 98.982 1
IE Ireland 88.343 2
NL Netherlands 53.149 3
ES Spain 36.497 14
df_pib %>%
  ggplot(aes(x = pib_pc, y = fct_reorder(pais, pib_pc))) +
  geom_col(aes(fill = geo_code == "ES"), show.legend = FALSE) +
  labs(title = "PIB per cápita en paridad de poder de compra, 2024", x = "PPS por habitante", y = NULL)

Tarea: el paro en las comunidades autónomas

  • Con el dataset lfst_r_lfu3rt (tasa de paro por regiones NUTS 2):
  1. Descarga la tasa de paro total (sex: T; age: Y15-74; isced11: TOTAL) desde 2015
  2. Quédate con las regiones NUTS 2 de España (las comunidades autónomas) y añade su nombre
  3. ¿Qué 3 comunidades tenían la tasa de paro más alta en el último año? ¿Y la más baja?
  4. [🌶] Dibuja la evolución de la tasa de paro en la Comunitat Valenciana, en España y en la UE
  • 1: filters = list(..., sinceTimePeriod = 2015)
  • 2: las CCAA tienen códigos de 4 caracteres que empiezan por ES: str_detect(geo, "^ES") y str_length(geo) == 4
  • 3: filter(time == max(time)), slice_max() y slice_min()
  • 4: los códigos son ES52, ES y EU27_2020
df_reg <- get_eurostat("lfst_r_lfu3rt",
1                       filters = list(sex = "T", age = "Y15-74", isced11 = "TOTAL",
                                      sinceTimePeriod = 2015))

df_ccaa <- df_reg %>%
2  filter(str_detect(geo, "^ES"), str_length(geo) == 4) %>%
3  label_eurostat(code = "geo", fix_duplicated = TRUE) %>%
  select(geo_code, ccaa = geo, time, tasa_paro = values)
1
Descargamos solo la tasa de paro total: ambos sexos, de 15 a 74 años y todos los niveles de estudios, desde 2015
2
Las comunidades autónomas: los códigos que empiezan por ES y tienen 4 caracteres (NUTS 2)
3
Añadimos el nombre de cada comunidad. fix_duplicated = TRUE evita problemas si dos regiones se llaman igual
df_ccaa %>% slice(1:3)
geo_code
<chr>
ccaa
<chr>
time
<date>
tasa_paro
<dbl>
ES11 Galicia 2015-01-01 19.3
ES11 Galicia 2016-01-01 17.2
ES11 Galicia 2017-01-01 15.7
df_ccaa %>%
  filter(time == max(time)) %>%
  slice_max(tasa_paro, n = 3)
geo_code
<chr>
ccaa
<chr>
time
<date>
tasa_paro
<dbl>
ES64 Ciudad de Melilla 2025-01-01 24.9
ES63 Ciudad de Ceuta 2025-01-01 24.3
ES61 Andalucía 2025-01-01 15.2
df_ccaa %>%
  filter(time == max(time)) %>%
  slice_min(tasa_paro, n = 3)
geo_code
<chr>
ccaa
<chr>
time
<date>
tasa_paro
<dbl>
ES13 Cantabria 2025-01-01 7.3
ES21 País Vasco 2025-01-01 7.3
ES22 Comunidad Foral de Navarra 2025-01-01 7.7
df_reg %>%
  filter(geo %in% c("ES52", "ES", "EU27_2020")) %>%
  label_eurostat(code = "geo") %>%
  mutate(geo = if_else(geo_code == "EU27_2020", "UE-27", geo)) %>%
  ggplot(aes(x = time, y = values, color = geo)) +
  geom_line(linewidth = 1) +
  labs(title = "Tasa de paro (15-74 años)", x = NULL, y = "%", color = NULL)

Ejemplo: un mapa de las regiones europeas

  • Para un mapa hacen falta dos cosas: los datos y las “formas” (geometrías) de las regiones. El paquete eurostat consigue las dos
df_reg <- get_eurostat("lfst_r_lfu3rt",
            filters = list(sex = "T", age = "Y15-74",
                           isced11 = "TOTAL",
1                           time = 2024))

geo_nuts2 <- get_eurostat_geospatial(
               resolution = "20", nuts_level = "2",
2               year = 2024)

df_mapa <- geo_nuts2 %>%
3  left_join(df_reg, by = "geo")
1
Los datos: la tasa de paro por regiones (NUTS 2), de 2024
2
Las geometrías de las regiones NUTS 2, en su versión de 2024 (la que usan los datos). Necesita los paquetes sf y giscoR
3
Se unen por el código de la región, que en los dos sitios se llama geo
  • df_mapa es un data.frame “con geometría” (un objeto sf): tiene 299 filas, una por región, y se dibuja con geom_sf(). Lo vemos con más calma en las slides de mapas
ggplot(df_mapa) +
  geom_sf(aes(fill = values), color = "white",
          linewidth = 0.05) +
  #- "zoom" a Europa:
  coord_sf(xlim = c(-11, 33), ylim = c(35, 70)) +
  scale_fill_viridis_c(option = "magma", direction = -1) +
  labs(title = "Tasa de paro por regiones (NUTS 2), 2024",
       fill = "%") +
  theme_void()

… y cómo ha cambiado: un mapa por año

  • Pedimos varios años en filters y hacemos un mapa por año con facet_wrap()
df_reg4 <- get_eurostat("lfst_r_lfu3rt",
  filters = list(sex = "T", age = "Y15-74",
                 isced11 = "TOTAL",
                 time = c(2012, 2016, 2020, 2024)))

df_mapa4 <- geo_nuts2 %>%
  inner_join(df_reg4, by = "geo") %>%
  mutate(anyo = year(time))
ggplot(df_mapa4) +
  geom_sf(aes(fill = values), color = "white",
          linewidth = 0.03) +
  coord_sf(xlim = c(-11, 33), ylim = c(35, 70)) +
  scale_fill_viridis_c(option = "magma", direction = -1) +
  facet_wrap(vars(anyo), nrow = 1) +
  labs(fill = "%") +
  theme_void()
  • En gris, las regiones sin dato ese año: las geometrías son las de 2024, y algunas regiones han cambiado de código desde entonces

Para saber más

Resumen

Para … usamos …
encontrar un dataset la base de datos de Eurostat, o search_eurostat()
descargar su fichero a mano https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/código?format=SDMX-CSV
importarlo read_csv(url)
saber qué contiene count() de cada dimensión
descargarlo con el paquete get_eurostat("código")
… solo una parte get_eurostat("código", filters = list(...))
… con los flags keepFlags = TRUE
cambiar códigos por etiquetas label_eurostat(df, code = "geo")
ver un diccionario get_eurostat_dic("unit")
quedarse con los países de la UE filter(geo %in% eu_countries$code)
hacer un mapa get_eurostat_geospatial() + left_join() + geom_sf()