Mapa de la tasa de paro en Andalucía por grupo de edad y nivel de estudios

Librerías

library(MicroDatosEs)
library(plyr)
library(maptools)
library(sp)
library(RColorBrewer)
library(classInt)
library(ggmap)  # tb carga ggplot2

Descarga fichero y recodificación

Se puede bajar de aquí. Supongo que también se podrá utilizar webscrapping. Una vez bajado lo leemos con la función epa2005** del paquete **MicroDatosEs.

download.file("https://dl.dropboxusercontent.com/u/2712908/EPA/EPAwebT0413", 
    destfile = "epa4t", quiet = TRUE, method = "wget")
epa <- epa2005("epa4t")

Seleccionamos las variables que vamos a utilizar y eliminamos el objeto anterior

dat <- subset(epa, select = c(prov, edad, nforma, aoi, factorel))

rm(epa)

Recodificación

Recodificamos, convertimos a data.frame y eliminamos los menores de 16 años y los inactivos

Función para recodificar las variable aoi , nforma y edad

recodificacion <- function(dat) {
    dat$aoi <- memisc::recode(dat$aoi, o = 1 <- 3:4, p = 2 <- 5:6, i = 3 <- 7:9)

    dat$nforma3 <- memisc::recode(dat$nforma, `sin estudios y primaria` = 1 <- c(12, 
        80, 11, 36), secundaria = 2 <- c(21:23, 31:34, 41, 51), superior = 3 <- c(52:56, 
        61, 50, 59))
    dat$gedad <- memisc::recode(dat$edad, `Menos de 16 años` = 1 <- c(0, 5, 
        10), `De 16 a 34 años` = 2 <- c(16, 20, 25, 30), `De 35 a 54 años` = 3 <- c(35, 
        40, 45, 50), `Mayor de 55 años` = 4 <- c(55, 60, 65))

    dat
}
dat <- recodificacion(dat)
# convierto a data.frame tradicional
dat <- as.data.frame(dat)

# creo variable numérica para las provincias
dat$prov.n <- as.numeric(dat$prov)

# eliminar menores de 16 años
dat <- dat[as.numeric(dat$edad) > 3, ]

# eliminar inactivos
dat <- dat[dat$aoi != "i", ]

# eliminar niveles que no se usan
dat$gedad <- droplevels(dat$gedad)
levels(dat$gedad)
## [1] "De 16 a 34 años"  "De 35 a 54 años"  "Mayor de 55 años"

Cálculo de la tasa de paro

Utilizamos la función ddply del paquete plyr

tasa.paro <- ddply(dat, .(prov, prov.n, gedad, nforma3), summarise, paro = weighted.mean(aoi == 
    "p", factorel))

head(tasa.paro)
##    prov prov.n           gedad                 nforma3    paro
## 1 Álava      1 De 16 a 34 años sin estudios y primaria 0.39321
## 2 Álava      1 De 16 a 34 años              secundaria 0.33688
## 3 Álava      1 De 16 a 34 años                superior 0.18240
## 4 Álava      1 De 35 a 54 años sin estudios y primaria 0.48706
## 5 Álava      1 De 35 a 54 años              secundaria 0.15510
## 6 Álava      1 De 35 a 54 años                superior 0.08542

Mapas

Lectura de archivo shapefile, bajado del IECA en su apartado Datos Espaciales de Referencia de Andalucía DERA

download.file("https://dl.dropboxusercontent.com/u/2712908/shp/prov.zip", destfile = "prov.zip", 
    quiet = TRUE, method = "wget")
unzip("prov.zip")
prov.map <- readShapePoly(fn = "da03_provincia.shp")
Encoding(levels(prov.map$PROVINCIA)) <- "latin1"

Compruebo que es el mapa de Andalucía

plot(prov.map)

plot of chunk unnamed-chunk-9

Seleccionamos las provincias de Andalucía

# En el objeto prov.map tenemos una variable con el nombre de las provincias
prov.map$PROVINCIA
## [1] Almería    Cádiz      Córdoba    Granada    Huelva     Jaén      
## [7] Málaga     Sevilla   
## Levels: Almería Cádiz Córdoba Granada Huelva Jaén Málaga Sevilla
# pongo en minúsculas las variables en prov.map@data
colnames(prov.map@data) <- tolower(colnames(prov.map@data))
# la usamos para seleccionar las provincias en tasa.paro.provincial
tasa.paro.and.provincial <- tasa.paro[tasa.paro$prov %in% prov.map$provincia, 
    ]

head(tasa.paro.and.provincial)
##       prov prov.n           gedad                 nforma3    paro
## 28 Almería      4 De 16 a 34 años sin estudios y primaria 0.52579
## 29 Almería      4 De 16 a 34 años              secundaria 0.45231
## 30 Almería      4 De 16 a 34 años                superior 0.30521
## 31 Almería      4 De 35 a 54 años sin estudios y primaria 0.44038
## 32 Almería      4 De 35 a 54 años              secundaria 0.31080
## 33 Almería      4 De 35 a 54 años                superior 0.08823

Mapa utilizando ggplot2

Con fortify convertimos el objeto prov.map a un objeto que pueda entender ggplot2. En el argumento region ponemos la variable que va a servir de enlace con los datos.

and.ggmap <- fortify(prov.map, region = "cod_prov")
## Loading required package: rgeos
## rgeos version: 0.3-2, (SVN revision 413M)
##  GEOS runtime version: 3.3.3-CAPI-1.7.4 
##  Polygon checking: TRUE 
## 
## 
## Attaching package: 'rgeos'
## 
## The following object is masked from 'package:Hmisc':
## 
##     translate

Renombramos prov.n como cod_prov en el data.frame con los datos del paro y convertimos a cáracter para que se pueda enlazar el código 04 de Almería

names(tasa.paro.and.provincial)[2] <- "cod_prov"

tasa.paro.and.provincial[tasa.paro.and.provincial$cod_prov == 4, "cod_prov"] <- "04"

Ahora ya podemos crear el mapa, utilizando ggplot y geom_map. Como facets utilizamos gedad y nforma3

ggplot(tasa.paro.and.provincial) + geom_map(aes(map_id = cod_prov, fill = paro), 
    map = and.ggmap, colour = "black") + expand_limits(x = and.ggmap$long, y = and.ggmap$lat) + 
    facet_grid(gedad ~ nforma3) + scale_fill_gradient(low = "#FDECDD", high = "#D94701") + 
    scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) + 
    theme(axis.text.y = element_blank(), axis.text.x = element_blank(), plot.title = element_text(face = "bold", 
        size = rel(1.4)), legend.text = element_text(size = rel(1.1)), strip.text = element_text(face = "bold", 
        size = rel(1))) + labs(list(x = "", y = "", fill = "")) + ggtitle("Tasa de paro\npor edad y estudios")

plot of chunk unnamed-chunk-13

También podemos categorizar la tasa de paro. Utilizamos las función classIntervals y findInterval del paquete classInt

intervalos <- classIntervals(tasa.paro.and.provincial$paro, 5, style = "pretty")
tasa.paro.and.provincial$intervalos <- as.factor(findInterval(tasa.paro.and.provincial$paro, 
    intervalos$brks, all.inside = TRUE))

Mapa con tasa de paro categorizada.

ggplot(tasa.paro.and.provincial) + geom_map(aes(map_id = cod_prov, fill = intervalos), 
    map = and.ggmap, colour = "black") + expand_limits(x = and.ggmap$long, y = and.ggmap$lat) + 
    facet_grid(gedad ~ nforma3) + scale_fill_manual(values = c("#FDEBDD", "#F9C9AD", 
    "#E1885F", "#D34400"), labels = c("Menos del 20%", "[20% - 40%)", "[40% - 60%)", 
    "[60% - 80%]")) + scale_x_continuous(breaks = NULL) + scale_y_continuous(breaks = NULL) + 
    theme(axis.text.y = element_blank(), axis.text.x = element_blank(), plot.title = element_text(face = "bold", 
        size = rel(1.4)), legend.text = element_text(size = rel(1.1)), strip.text = element_text(face = "bold", 
        size = rel(1.1))) + labs(list(x = "", y = "", fill = "")) + ggtitle("Tasa de paro\npor edad y estudios")

plot of chunk unnamed-chunk-15