Aprendiendo a hacer mapas

A short description of the post.

Joshua Kunst http://jkunst.com/
03-30-2019

Table of Contents


Mapa

Para graficar el mapa de Santiago tomaremos los geojson y los pasaremos a Simple Feature.


library(tidyverse)

geourl <- "https://raw.githubusercontent.com/robsalasco/precenso_2016_geojson_chile/master/Zonas/R13.geojson"

zonas <- jsonlite::fromJSON(geourl, simplifyVector = FALSE)
zonas <- geojsonio::as.json(zonas)
zonas <- geojsonsf::geojson_sf(zonas)

glimpse(zonas)

Observations: 1,843
Variables: 10
$ REGION     <chr> "13", "13", "13", "13", "13", "13", "13", "13"...
$ PROVINCIA  <chr> "131", "131", "131", "131", "131", "131", "131...
$ COMUNA     <chr> "13123", "13123", "13123", "13123", "13123", "...
$ NOM_PROVIN <chr> "SANTIAGO", "SANTIAGO", "SANTIAGO", "SANTIAGO"...
$ COD_DIS    <dbl> 7, 8, 3, 3, 3, 3, 7, 3, 8, 3, 8, 2, 3, 3, 3, 2...
$ COD_ZONA   <dbl> 2, 2, 9, 3, 6, 2, 1, 1, 4, 11, 1, 2, 10, 7, 4,...
$ NOM_COMUNA <chr> "PROVIDENCIA", "PROVIDENCIA", "PROVIDENCIA", "...
$ NOM_URBANO <chr> "PROVIDENCIA", "PROVIDENCIA", "PROVIDENCIA", "...
$ NOM_REGION <chr> "REGIÓN METROPOLITANA DE SANTIAGO", "REGIÓN ...
$ geometry   <POLYGON [°]> POLYGON ((-70.60773 -33.416..., POLYG...

Todo bien hasta ahora. Grafiquemos y exploremos el contenido del geojson.


ggplot(zonas) +
  geom_sf(size = .2, fill = NA, colour = "gray80")

Vemos que hay zonas que estás dispersas. La verdad, al no ser experto en SIGs no se me ocurre otra forma mejor que obtener los centroides y filtrar a mano.


zonas <- zonas %>% 
  mutate(centro = sf::st_centroid(geometry))

centros_coords <- zonas %>% 
  pull(centro) %>% 
  sf::st_coordinates() 

zonas <- zonas %>% 
  mutate(
    x = centros_coords[, 1],
    y = centros_coords[, 2]
  )

zonas <- zonas %>% 
  filter(y <= -33.30) %>%
  filter(y >= -33.70) %>%
  filter(x >= -70.85) %>%
  filter(x <= -70.40)

ggplot(zonas) +
  geom_sf(size = .2, fill = "gray95", colour = "gray80") +
  coord_sf(ndiscr = 0) # https://stackoverflow.com/a/52426976/829971

No quedaron las mismas zonas que la versión original pero servirá para nuestros propósitos.

Datos

Acá debo enfatizar que no se mucho de representaciones geográficas y todas esas artes, ni menos el origen de datos y transformaciones se realizaron, así que con todo el empeño intentaré obtener algo similar para que sigamos con el post

Leeremos la información desde un servidor que, nuevamente, Don Rob me ayudó a levantar con los datos del CENSO, usaremos obviamente la tabla personas pues contiene las respuesta de la pregunta sobre el grado alcanzado.


con <- DBI::dbConnect(
  RMySQL::MySQL(),
  dbname = "censo2017",
  host = "142.93.20.188", 
  port = 3306,
  user = "test",
  password = "HFW9KYZBnEYr!"
)

DBI::dbListTables(con)

[1] "hogar"    "idgeo"    "personas" "vivienda"

tbl(con, "idgeo") %>% 
  collect(n = 10) %>% 
  rmarkdown::paged_table()

tbl(con, "personas") %>% 
  collect(n = 10) %>% 
  rmarkdown::paged_table()

A la tabla filtraremos por P07 = 1 que corresponden a los jefes de hogares, y luego por la region metropolitana (13) y obtendremos los conteos de cada respuesta segun región, provincia, comuna, dc, area, zc_loc.


dta_jefe_educ <- tbl(con, "personas") %>% 
  filter(P07 == 1) %>% 
  filter(REGION == 13) %>% 
  group_by(REGION, PROVINCIA, COMUNA, DC, AREA, ZC_LOC, ID_ZONA_LOC) %>% 
  count(P15, P15A) %>% 
  collect()

dta_jefe_educ <- dta_jefe_educ %>% 
  ungroup() %>% 
  mutate(
    P15_label = case_when(
      P15 %in% c(5, 6) & P15A == 1 ~ "Ed. Básica Completa",
      P15 %in% c(7:10) & P15A == 2 ~ "Ed. Media Incompleta",
      P15 %in% c(7:10) & P15A == 1 ~ "Ed. Media Completa",
      P15 == 11 ~ "Ed. Técnico Superior",
      P15 == 12 ~ "Ed. Superior",
      P15 %in% c(13, 14) ~ "Ed. Posgrado",
      TRUE ~ "Otra/Missing"
    )
  ) %>% 
  arrange(P15, P15A) %>% 
  mutate(P15_label = fct_inorder(P15_label))

dta_jefe_educ %>% 
  count(P15_label) %>% 
  knitr::kable()
P15_label n
Otra/Missing 13392
Ed. Básica Completa 4520
Ed. Media Completa 8803
Ed. Media Incompleta 8677
Ed. Técnico Superior 5301
Ed. Superior 5842
Ed. Posgrado 5387

dta_jefe_educ <- dta_jefe_educ %>% 
  group_by(REGION, PROVINCIA, COMUNA, DC, AREA, ZC_LOC, ID_ZONA_LOC) %>% 
  count(P15_label) %>% 
  mutate(porcentaje = n/sum(n)) %>% 
  ungroup()

Graficando los datos:


dta_jefe_educ <- dta_jefe_educ %>%
  mutate(id = paste(
    COMUNA,
    sprintf("%02d", DC),
    # AREA,
    sprintf("%03d", ID_ZONA_LOC),
    sep = ""
  ))

zonas <- zonas %>%
  mutate(id = paste(
    COMUNA,
    sprintf("%02d", COD_DIS),
    # AREA,
    sprintf("%03d", COD_ZONA),
    sep = ""
  ))

zonas %>% 
  left_join(dta_jefe_educ %>% select(P15_label , porcentaje, id), by = "id") %>% 
  filter(!is.na(porcentaje)) %>% 
  ggplot() +
  geom_sf(data = zonas, size = .2, fill = "gray95", colour = "gray80") +
  geom_sf(aes(fill = porcentaje)) +
  facet_wrap(vars(P15_label), ncol = 4)