El código se puede encontrar en https://dl.dropboxusercontent.com/u/2712908/paro_andalucia.R
library(MicroDatosEs)
library(plyr)
library(maptools)
library(sp)
library(RColorBrewer)
library(classInt)
library(ggmap) # tb carga ggplot2
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)
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"
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
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
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")