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

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,                        
                                "Primary school or les"  = 1 <- c("AN","P1","P2"),
                                "Secondary" = 2 <- c("S1","SG","SP"),
                                "University"  = 3 <- c("SU")
  )
  dat$gedad <- memisc::recode(dat$edad,
                              "15 years old or less" = 1 <- c(0,5,10),
                              "16-34 years old" = 2 <- c(16,20,25,30),
                              "35-54 years old" = 3 <- c(35,40,45,50),
                              "55 years or older" = 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 years old"   "35-54 years old"   "55 years or older"

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 years old Primary school or les 0.35318396
## 2 Álava      1 16-34 years old             Secondary 0.30653385
## 3 Álava      1 16-34 years old            University 0.23296153
## 4 Álava      1 35-54 years old Primary school or les 0.44723024
## 5 Álava      1 35-54 years old             Secondary 0.15542125
## 6 Álava      1 35-54 years old            University 0.08405399

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 years old Primary school or les 0.6039355
## 29 Almería      4 16-34 years old             Secondary 0.4300822
## 30 Almería      4 16-34 years old            University 0.3596546
## 31 Almería      4 35-54 years old Primary school or les 0.6365965
## 32 Almería      4 35-54 years old             Secondary 0.3007886
## 33 Almería      4 35-54 years old            University 0.1283872

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-8, (SVN revision 460)
##  GEOS runtime version: 3.4.2-CAPI-1.8.2 r3921 
##  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")

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