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

El código se puede encontrar en https://dl.dropboxusercontent.com/u/2712908/paro_andalucia.R

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/EPA4T2014",
              destfile="epa4t14" ,quiet=TRUE, method="wget")
epa <- epa2005("epa4t14")

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,                        
                                "Est primarios o menos"  = 1 <- c("AN","P1","P2"),
                                "Secundarios" = 2 <- c("S1","SG","SP"),
                                "Universitarios"  = 3 <- c("SU")
  )
  dat$gedad <- memisc::recode(dat$edad,
                              "15 años o menos" = 1 <- c(0,5,10),
                              "16-34" = 2 <- c(16,20,25,30),
                              "35-54" = 3 <- c(35,40,45,50),
                              "Más de 55" = 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] "16-34"     "35-54"     "Más de 55"

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 16-34 Est primarios o menos 0.41822856
## 2 Álava      1 16-34           Secundarios 0.31931511
## 3 Álava      1 16-34        Universitarios 0.13597031
## 4 Álava      1 35-54 Est primarios o menos 0.45570448
## 5 Álava      1 35-54           Secundarios 0.19460645
## 6 Álava      1 35-54        Universitarios 0.08398285

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"

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 16-34 Est primarios o menos 0.6587080
## 29 Almería      4 16-34           Secundarios 0.4295185
## 30 Almería      4 16-34        Universitarios 0.1983121
## 31 Almería      4 35-54 Est primarios o menos 0.5424457
## 32 Almería      4 35-54           Secundarios 0.2968724
## 33 Almería      4 35-54        Universitarios 0.2071776

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")

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(title= " Tasa de paro\npor edad y estudios\n 4º Trimestre 2014 ",x="",y="",
            fill="")) 

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(title= " Tasa de paro\npor edad y estudios\n 4º Trimestre 2014 ",x="",y="",
            fill=""))