ESdata es un paquete de R que permite acceder a información estadística de España estructurada como datos ordenados (tidy data). Si se tiene instalado previamente el paquete devtools, puede instalarse el paquete desde Github haciendo:
devtools::install_github("jmsallan/ESdata")
Una vez instalado el paquete, podemos acceder a los datos haciendo:
library(ESdata)
El paquete permite acceder a un conjunto de datos estructurados en data frames, con la única dependencia de disponer de una versión de R superior a la 3.5.0. Una buena alternativa para explorar estos datos es usar los paquetes del tidyverse:
library(tidyverse)
En su versión actual, el paquete dispone de información relativa a:
En este documento mostraremos la información disponible sobre la Encuesta de Población Activa.
La Encuesta de Población Activa (EPA) es un estudio estadístico destinado a capturar datos sobre el mercado de trabajo, sigiendo los estándares de la Organización Internacional del Trabajo (OIT). Dado que el desempleo es uno de los problemas más relevantes de la economía española, la publicación de los resultados de la EPA cada trimestre es objeto de la atención de los medios de comunicación.
En España, la EPA es realizada por el Instituto Nacional de Estadística (INE). Se recogen datos de manera trimestral, encuestando a 160.000 personas que residen en 65.000 viviendas familiares. La ficha metodológica estandarizada de la encuesta se encuentra en: https://www.ine.es/dyngs/IOE/es/operacion.htm?numinv=30308
Las tablas incorporadas al paquete recogen parte de la información publicada por el Instituto Nacional de Estadística en: https://www.ine.es/dynt3/inebase/es/index.htm?padre=982&capsel=983
Si cree que ESdata no recoge información de la EPA que podría ser de su interés, puede indicarlo en: https://github.com/jmsallan/ESdata
ESdata contiene las siguientes tablas con información sobre la EPA:
| tabla | contenido |
|---|---|
| epa_edad | EPA por grupo de edad. |
| epa_form | EPA por nivel de formación |
| epa_nac | EPA por nacionalidad |
| epa_sector | EPA por sector |
Las variables de cada una de las tablas son:
| tabla | periodo | region | edad | form | nac | sector | dato | valor |
|---|---|---|---|---|---|---|---|---|
| epa_edad | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| epa_form | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| epa_nac | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| epa_sector | ✓ | ✓ | ✓ | ✓ | ✓ |
Para todas las tablas, los datos se encuentran en la columna dato, expresados en miles de personas. La variable periodo indica a qué trimestre y año corresponde el dato, y el resto de variables son categóricas que describen la situación de cada fila.
| variable | significado |
|---|---|
| periodo | ültimo día del trimestre del dato |
| region | código ISO 3166-2 de la región del dato (ver tabla) |
| edad | grupo de edad |
| form | nivel de formación (ver tabla) |
| nac | nacionalidad (ES: española, EX: extranjera, UE: miembro UE, no_UE: no-miembro UE) |
| sector | sector de actividad (agricultura, industria, construcción, servicios) |
| dato | pob: población, act: población activa, ocu: población ocupada, par: población parada, ina: población inactiva |
| valor | en miles de personas |
El nombre oficial de cada una de las regiones (Comunidades y Ciudades Autónomas, y el conjunto del territorio nacional), y su código ISO 3166-2, que es el que aparece en la variable region, se encuentra en la tabla ccaa_iso:
| iso | nombres |
|---|---|
| ES | España |
| ES-AN | Andalucía |
| ES-AR | Aragón |
| ES-AS | Principado de Asturias |
| ES-IB | Illes Balears |
| ES-CN | Canarias |
| ES-CB | Cantabria |
| ES-CL | Castilla y León |
| ES-CM | Castilla - La Mancha |
| ES-CT | Catalunya |
| ES-VC | Comunidad Valenciana |
| ES-EX | Extremadura |
| ES-GA | Galicia |
| ES-MD | Comunidad de Madrid |
| ES-MC | Región de Murcia |
| ES-NC | Comunidad Foral de Navarra |
| ES-PV | País Vasco |
| ES-RI | La Rioja |
| ES-CE | Ceuta |
| ES-ML | Melilla |
Los niveles de formación de la variable form, tal y como los define el INE, son:
| codigo | significado |
|---|---|
| analf | Analfabetos |
| prim_inic | Estudios primarios incompletos |
| prim | Educación primaria |
| sec_1 | Primera etapa de Educación Secundaria y similar |
| sec_2_gen | Segunda etapa de educación secundaria, con orientación general |
| sec_2_voc | Segunda etapa de educación secundaria con orientación profesional (incluye educación postsecundaria no superior) |
| ed_sup | Educación Superior |
Cada una de las tablas puede consultarse de múltiples maneras, así que hay que realizar un filtrado previo de las filas que necesitamos, y posteriormente realizar el análisis que se requiera. En esta sección presentaremos algunos ejemplos de visualizaciones de los datos de la EPA.
Por ejemplo, si queremos obtener la población activa en España para cada período podemos usar la tabla epa_edad haciendo:
epa_edad %>% filter(region=="ES" & edad =="total" & dato=="pob" & edad=="total" & sexo=="total")
## # A tibble: 75 x 6
## periodo region edad sexo dato valor
## <date> <chr> <chr> <chr> <chr> <dbl>
## 1 2020-09-30 ES total total pob 46904.
## 2 2020-06-30 ES total total pob 46896.
## 3 2020-01-31 ES total total pob 46874.
## 4 2019-12-31 ES total total pob 46794.
## 5 2019-09-30 ES total total pob 46702.
## 6 2019-06-30 ES total total pob 46599
## 7 2019-01-31 ES total total pob 46523.
## 8 2018-12-31 ES total total pob 46435.
## 9 2018-09-30 ES total total pob 46326.
## 10 2018-06-30 ES total total pob 46241
## # … with 65 more rows
Entonces podemos usar ggplot para graficar la evolución temporal de la población activa:
epa_edad %>% filter(region=="ES" & edad =="total" & dato=="pob" & edad=="total" & sexo=="total") %>%
ggplot(aes(periodo, valor)) +
geom_line()
En esta gráfica realizamos las operaciones siguientes:
filter.sexocon mutate para mostrar los niveles en el mismo orden que aparecen en el gráfico.ggplot y geom_line().labs. Por ser autoexplicativo, no he puesto nombre en el eje x.scale_color_manual.theme_bw().legend.position = "bottom".epa_edad %>%
filter(region=="ES" & edad =="total" & dato=="pob" & edad=="total" & sexo!="total") %>%
mutate(sexo=factor(sexo, levels = c("mujeres", "hombres"))) %>%
ggplot(aes(periodo, valor, col=sexo)) +
geom_line() +
labs(title="Evolución de la población (España)", x="", y="pob. (miles)") +
scale_color_manual(values = c("#FF0000", "#0000FF")) +
theme_bw() +
theme(legend.position = "bottom")
En scale_color_manual se definen los colores de cada línea en values usando un formato hexadecimal. Puede obtenerse información sobre estos códigos hexadecimales en:
Aquí tenemos dos categorizaciones: una de diferentes tipos de población (total, activa e inactiva) y otra por sexo para un rango de edad específico. Utilizamos facet_grid para obtener un gráfico para cada sexo:
epa_edad %>% filter(region=="ES" & edad == "20-24" & sexo!="total" & dato %in% c("act", "pob", "ina")) %>%
mutate(dato = factor(dato, levels = c("pob", "act", "ina"))) %>%
ggplot(aes(periodo, valor, col=dato)) +
geom_line() +
scale_color_manual(name="Población", values=c("#000000", "#0000FF", "#FF0000"), labels=c("total", "activa", "inactiva")) +
theme_bw() +
labs(title="Evolución actividad personas 20-24 años en España", x = "", y = "pob. (miles)") +
theme(legend.position = "bottom") +
ylim(0, 1700) +
facet_grid(. ~ sexo)
Observamos que las poblaciones activa e inactiva tienen componente estacional, reflejando la población que pasa a ser activa en determinadas estaciones del año. Podemos compensar este efecto reteniendo sólo los datos del tercer trimestre de cada año. Para ello usamos la función month del paquete lubridate en el filtrado.
library(lubridate)
epa_edad %>% filter(region=="ES" & edad == "20-24" & sexo!="total" & dato %in% c("act", "pob", "ina") & month(periodo) == 9) %>%
mutate(dato = factor(dato, levels = c("pob", "act", "ina"))) %>%
ggplot(aes(periodo, valor, col=dato)) +
geom_line() +
scale_color_manual(name="Población", values=c("#000000", "#0000FF", "#FF0000"), labels=c("total", "activa", "inactiva")) +
theme_bw() +
labs(title="Evolución actividad personas 20-24 años en España (tercer trimestre)", x = "", y = "pob. (miles)") +
theme(legend.position = "bottom") +
ylim(0, 1700) +
facet_grid(. ~ sexo)
Los datos que suministra el paquete son en población total, y podemos estar interesados en tener datos de tasas de actividad y tasa de paro. Podemos tener valores de tasa de actividad con epa_edad haciendo:
\[ \text{tasa de actividad} = \frac{\text{act}}{\text{act} + \text{ina}} \]
Podemos evaluar la tasa de paro conepa_edad, epa_form y epa_nac haciendo:
\[ \text{tasa de paro} = \frac{\text{ocu}}{\text{act}}\]
Para calcular las tasas de actividad usamos pivot_wider y pivot_longer de tidyr. Primero usamos pivot_wider para generar una columna para cada uno de los valores de dato y usamos mutate para calcular las tasas:
epa_edad %>% filter(region=="ES" & edad=="total" & sexo=="total") %>%
pivot_wider(names_from = "dato", values_from = "valor") %>%
mutate(t_act=act/(act+ina), t_paro=par/act)
## # A tibble: 75 x 11
## periodo region edad sexo pob act ocu par ina t_act t_paro
## <date> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020-09-30 ES total total 46904. 22900. 19177. 3723. 16696 0.578 0.163
## 2 2020-06-30 ES total total 46896. 21975. 18607. 3368 17589. 0.555 0.153
## 3 2020-01-31 ES total total 46874. 22994. 19681. 3313 16526. 0.582 0.144
## 4 2019-12-31 ES total total 46794. 23159. 19967. 3192. 16268. 0.587 0.138
## 5 2019-09-30 ES total total 46702. 23089. 19874. 3214. 16233. 0.587 0.139
## 6 2019-06-30 ES total total 46599 23036. 19805. 3231. 16178. 0.587 0.140
## 7 2019-01-31 ES total total 46523. 22825. 19471. 3354. 16289. 0.584 0.147
## 8 2018-12-31 ES total total 46435. 22869. 19565. 3304. 16151. 0.586 0.144
## 9 2018-09-30 ES total total 46326. 22854 19528 3326 16058. 0.587 0.146
## 10 2018-06-30 ES total total 46241 22834. 19344. 3490. 16001. 0.588 0.153
## # … with 65 more rows
Si queremos graficar las tasas, volvemos a poner en formato largo los datos, y seleccionamos sólo las tasas de paro:
epa_edad %>% filter(region=="ES" & edad=="total" & sexo=="total") %>%
pivot_wider(names_from = "dato", values_from = "valor") %>%
mutate(t_act=act/(act+ina), t_paro=par/act) %>%
pivot_longer(cols = pob:t_paro, names_to = "dato", values_to = "valor") %>%
filter(dato %in% c("t_paro", "t_act"))
## # A tibble: 150 x 6
## periodo region edad sexo dato valor
## <date> <chr> <chr> <chr> <chr> <dbl>
## 1 2020-09-30 ES total total t_act 0.578
## 2 2020-09-30 ES total total t_paro 0.163
## 3 2020-06-30 ES total total t_act 0.555
## 4 2020-06-30 ES total total t_paro 0.153
## 5 2020-01-31 ES total total t_act 0.582
## 6 2020-01-31 ES total total t_paro 0.144
## 7 2019-12-31 ES total total t_act 0.587
## 8 2019-12-31 ES total total t_paro 0.138
## 9 2019-09-30 ES total total t_act 0.587
## 10 2019-09-30 ES total total t_paro 0.139
## # … with 140 more rows
Y ahora ya podemos graficar los datos. Usamos scale_y_continuous para poner los valores en porcentaje:
epa_edad %>% filter(region=="ES" & edad=="total" & sexo=="total") %>%
pivot_wider(names_from = "dato", values_from = "valor") %>%
mutate(t_act=act/(act+ina), t_paro=par/act) %>%
pivot_longer(cols = pob:t_paro, names_to = "dato", values_to = "valor") %>%
filter(dato %in% c("t_paro", "t_act")) %>%
ggplot(aes(periodo, valor, col=dato)) +
geom_line() +
scale_color_manual(name="tasas", labels=c("actividad", "paro"), values=c("#009900", "#FF0000")) +
labs(title = "Tasas de actividad y paro en España", x="", y="tasa") +
scale_y_continuous(labels = scales::percent, limits=c(0,0.65)) +
theme_bw() +
theme(legend.position = "bottom")
Podemos hacer observaciones en el gráfico usando la función annote, y señalar valores con líneas verticales usando geom_vline:
epa_edad %>% filter(region=="ES" & edad=="total" & sexo=="total") %>%
pivot_wider(names_from = "dato", values_from = "valor") %>%
mutate(t_act=act/(act+ina), t_paro=par/act) %>%
pivot_longer(cols = pob:t_paro, names_to = "dato", values_to = "valor") %>%
filter(dato %in% c("t_paro", "t_act")) %>%
ggplot(aes(periodo, valor, col=dato)) +
geom_line() +
scale_color_manual(name="tasas", labels=c("actividad", "paro"), values=c("#009900", "#FF0000")) +
labs(title = "Tasas de actividad y paro en España", x="", y="tasa") +
geom_vline(xintercept = as.Date("2008-12-31"), linetype="dashed", size=0.25) +
annotate("text", x=as.Date("2010-06-30"), y=0.4, label="crisis del 2008", hjust="left") +
annotate("curve", x=as.Date("2010-06-15"), y =0.4, xend=as.Date("2008-12-31"), yend=0.35, curvature=0.2, arrow = arrow(length = unit(2, "mm"))) +
scale_y_continuous(labels = scales::percent, limits=c(0,0.65)) +
theme_bw() +
theme(legend.position = "bottom")
En este gráfico, mostramos cómo la crisis de 2008 supuso un aumento de la tasa de paro, sin que se viera afectada la tasa de actividad.
Si tiene alguna propuesta o ha detectado algún error, puede ponerse en contacto conmigo desde: https://github.com/jmsallan/ESdata