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