Este paquete se integra perfectamente con el tidyverse y se dara un ejemplo muy basico para mostrar las principales funciones.
Se procedera a obtener una aproximacion usando dplyr ya que puede haber personas que no son de la comuna y aparecen censadas. Sin embargo no se hara el filtro que corrige esto para mantener el ejemplo lo mas simple posible.
Primero se cargan los paquetes necesarios.
Hay que realizar algunos cruces de tablas de manera de filtrar la region que nos interesa. Comienzo con la tabla zonas, genero la provincia a partir del geocodigo y luego filtro para unir hasta llegar a la tabla personas. La v variable p15
, cuya descripcion esta en el repositorio, que interesa para este ejemplo.
nivel_educacional_biobio <- tbl(censo_bbdd(), "zonas") %>%
mutate(
region = substr(as.character(geocodigo), 0, 2),
comuna = substr(as.character(geocodigo), 1, 5)
) %>%
filter(region == "08") %>%
select(comuna, geocodigo, zonaloc_ref_id) %>%
inner_join(select(tbl(censo_bbdd(), "viviendas"), zonaloc_ref_id, vivienda_ref_id), by = "zonaloc_ref_id") %>%
inner_join(select(tbl(censo_bbdd(), "hogares"), vivienda_ref_id, hogar_ref_id), by = "vivienda_ref_id") %>%
inner_join(select(tbl(censo_bbdd(), "personas"), hogar_ref_id, nivel_educ = p15), by = "hogar_ref_id") %>%
collect()
Con lo anterior se puede agrupar por o comuna y obtener la cuenta.
nivel_educacional_biobio <- nivel_educacional_biobio %>%
group_by(comuna, nivel_educ) %>%
summarise(cuenta = n()) %>%
group_by(comuna) %>%
mutate(proporcion = cuenta / sum(cuenta))
Veo los datos antes de seguir.
nivel_educacional_biobio
#> # A tibble: 860 x 4
#> # Groups: comuna [54]
#> comuna nivel_educ cuenta proporcion
#> <chr> <int> <int> <dbl>
#> 1 08101 1 4851 0.0217
#> 2 08101 2 2701 0.0121
#> 3 08101 3 3579 0.0160
#> 4 08101 4 831 0.00372
#> 5 08101 5 37538 0.168
#> 6 08101 6 5687 0.0254
#> 7 08101 7 47356 0.212
#> 8 08101 8 18641 0.0834
#> 9 08101 9 5854 0.0262
#> 10 08101 10 2653 0.0119
#> # … with 850 more rows
Ahora obtengo el mapa de la provincia y procedo a pegar los datos a la tabla del mapa. Se usara chilemapas para simplificar al limite.
mapa_biobio <- mapa_comunas %>%
filter(codigo_region == "08") %>%
left_join(nivel_educacional_biobio, by = c("codigo_comuna" = "comuna"))
Ahora que cargue toda la informacion necesaria en R desde la base de datos, debo cerrar la conexion SQL (importante).
Finalmente procedo a generar el mapa.
colors <- c("#DCA761","#C6C16D","#8B9C94","#628CA5","#5A6C7A")
g <- ggplot() +
geom_sf(data = mapa_biobio %>%
select(codigo_comuna, geometry) %>%
left_join(
mapa_biobio %>%
filter(nivel_educ == 14) %>%
select(codigo_comuna, nivel_educ, proporcion),
by = "codigo_comuna"
),
aes(fill = proporcion, geometry = geometry),
size = 0.1) +
scale_fill_gradientn(colours = rev(colors), name = "Porcentaje") +
labs(title = "Porcentaje de habitantes con el grado de doctor\npor comuna en la Region del Bio Bio") +
theme_minimal(base_size = 13)
g
Notas:
tbl()
y collect()
en la primera parte se podra entender mejor leyendo, por ejemplo, A Crash Course on PostgreSQL for R Users.censo_tabla()
ya que SQL almacena la columna geometry
(de tipo poligono) como cadena de texto mientras que R lee poligonos sin problema.chilemapas
podria haber generado con las cartografias de la base de datos. Sin embargo, el nivel de detalle baja mucho la velocidad del ejemplo y CRAN pide ejemplos minimos.p10
en la tabla personas
y realizar un grafico que de cuenta de la poblacion efectiva de la comuna (e.g. mejorando el problema de personas que podrian no ser de la comuna en el ejemplo).chilemapas
. Una forma de hacerlo es la siguiente