Primero, instalamos los paquetes necesarios para esta sesiรณn:

Cargamos los paquetes necesarios

library(data.table)
library(tidyverse)
library(leaflet) # Mapas
library(sp)
library(broom)
library(janitor) #Paquete para limpiar datos
library(rgbif) #Datos para ejemplo de mapas
library(sf) #Geografia
library(chilemapas) #Geografรญa de Chile
library(RColorBrewer)
library(classInt)
library(plotly)

Limpiamos el environment

rm(list=ls())

Mapas con ggplot

base <- data.frame(longitud = -71.530144, latitud=-33.020034)
ggplot(base, aes(longitud,latitud)) +
  geom_point()

Graficamos el punto en el mapa de la comuna de Vina del Mar

comunas <-data.table(mapa_comunas)
vina <- comunas[codigo_comuna=='05109']
ggplot() +
  geom_sf(vina, mapping=aes(geometry=geometry))+
  geom_point(base,mapping = aes(longitud,latitud) ) 

Vamos a crear un objeto con la proporciรณn de ninos 10 a 14 anios que viven en la region de Valparaiso

censo <- data.table(censo_2017_comunas)
censo <- censo[, .(poblacion=sum(poblacion, na.rm = T)), by=.(codigo_comuna,edad)]
censo[, proporcion:=poblacion/sum(poblacion)*100, by=.(codigo_comuna)]
censo <- censo[as.numeric(codigo_comuna) %between% c(5000,5999) & edad=='10 a 14',]

Graficaremos en un mapa la informacion anterior

region <- merge(censo, comunas, by='codigo_comuna',all.x=T)
ggplot() +
  geom_sf(region,mapping=aes(geometry=geometry, fill=proporcion))+
  coord_sf(xlim = c(-71.8,-70), ylim = c(-34,-32))

Crear intervalos

breaks_pretty <-  classIntervals(region$proporcion, style = "pretty",n=6)
region$pretty <-  cut(region$proporcion,breaks = breaks_pretty$brks, include.lowest = T)
codigos_territoriales <- data.table(codigos_territoriales) 
region <- merge(region, codigos_territoriales, by='codigo_comuna')
mapa <- ggplot() +
  geom_sf(region,mapping=aes(geometry=geometry, fill=pretty, text =      paste("Comuna:", nombre_comuna, "\n",'Porcentaje:',proporcion, '%')))+
  scale_fill_viridis_d(name="Intervalos") +
  coord_sf(xlim = c(-71.8,-70), ylim = c(-34,-32)) +
  theme_void() + labs(title="Porcentaje de niรฑos de 10 a 14 aรฑos" , subtitle = "En la regiรณn de Valparaรญso", caption = "Fuente: Censo")  
mapa

Mapa interactivo

ggplotly(mapa, tooltip = c("text"))

Mapas con Leaflet

Leaflet es una de las librerรญas abiertas mรกs populares y reconocidas de JavaScript. El #paquete de R con el mismo nombre nos permite crear mapas interactivos. Probablemente ya han visto mapas de leaflet antes, porque muchรญsimas pรกginas web las utilizan, como por ejemplo #http://openstreetmap.org.

leaflet funciona por capas, y al igual que en ggplot existen muchรญsimas capas disponibles #para mejorar el aspecto de nuestros mapas. Hoy veremos:

Para hacer nuestro primer mapa simple, vayamos a Google Maps para encontrar las coordenadas de la universidad. Aquรญ hacemos mapas con diferentes Provider Tiles.

Mapa de la RM con datos del MINEDUC

Ahora, vamos a aprender a agregar layers como marcadores o polรญgonos.

Abrir la base de datos Rendimiento_2018.csv. Esta representa el rendimiento escolar de alumnos de octavo bรกsico de la Regiรณn Metropolitana, para el aรฑo 2018.

rend_2018 <- fread("Rendimiento_2018.csv")

Ahora podemos empezar a explorar nuestros datos. Primero hagamos un grรกfico simple para ver la distribuciรณn de las notas en la muestra completa:

ggplot(rend_2018[prom_gral>=40 & prom_gral<=70], aes(x=prom_gral)) +
  geom_bar()

Podemos hacer un anรกlisis mรกs profundo y separar los datos por gรฉnero. Con esto, podemos ver diferencias entre el rendimiento de niรฑos y niรฑas. (Hombres gen_alu=1 y mujeres gen_alu=2)

ggplot(rend_2018[prom_gral>=40 & prom_gral<=70], aes(x=prom_gral)) +
  geom_bar(fill = "dark green") +
  labs(x="Promedio General", y="Nรบmero de alumnos", title="Distribuciรณn de notas por gรฉnero", caption="Fuente: MINEDUC") +
  facet_wrap(facets = "gen_alu", nrow=2)

Podemos agregar el gรฉnero a la variable gen_alu. Podemos hacerlo de dos formas.

La primera:

rend_2018[gen_alu==1,genero:='Hombres']
rend_2018[gen_alu==2,genero:='Mujeres']
ggplot(rend_2018[prom_gral>=40 & prom_gral<=70], aes(x=prom_gral)) +
  geom_bar(fill = "dark green") +
  labs(x="Promedio General", y="Nรบmero de alumnos", title="Distribuciรณn de notas por gรฉnero", caption="Fuente: MINEDUC") +
  facet_wrap(facets = "genero", nrow=2)

La segunda:

rend_2018$gen_alu <- factor(rend_2018$gen_alu , levels = c(1,2), labels = c("Hombres","Mujeres"))
ggplot(rend_2018[prom_gral>=40 & prom_gral<=70], aes(x=prom_gral)) +
  geom_bar(fill = "dark green") +
  labs(x="Promedio General", y="Nรบmero de alumnos", title="Distribuciรณn de notas por gรฉnero", caption="Fuente: MINEDUC") +
  facet_wrap(facets = "gen_alu", nrow=2)

Uno puede seleccionar la variable de un objeto con el signo $, lo que se realiza es que se convierta en factor la variable gen_alu y los levels 1,2 correspondan a Hombres y Mujeres.

Ahora vamos a los mapas:

Primero, vamos a abrir los datos georeferenciales de las comunas de Santiago, desde el paquete de CRAN chilemapas. Este paquete tiene informaciรณn para generar mapas de las divisiones polรญticas y adminsitrativas de Chile. Incluye informaciรณn a nivel comunal, provincial y regional (entre otros). Es muy รบtil ya que nos entrega la geometrรญa de cada unidad geogrรกfica que quedamos mapear. En este caso, vamos a hacer un mapa de la RM por comuna.

Una vez que cargamos el paquete, podemos crear objetos con los datos que necesitamos. En este caso, vamos a usar la funciรณn filter del paquete dplyr para quedarnos solo con las comunas de la Regiรณn Metropolitana.

comunas1 <- mapa_comunas

comunas <- mapa_comunas %>% 
  filter(codigo_region==13)

Juntamos las comunas de los alumnos con las comunas del mapa.

rend_2018_geo <- merge(comunas, rend_2018, by.x="codigo_comuna", by.y="cod_com_alu")

Para identificar diferencias entre las comunas de Santiago, vamos a mapear el promedio general de los alumnos, por comuna (esta base de datos, por simplicidad, solo tiene a los alumnos que aprobaron). Esto nos mostrarรก una representaciรณn del promedio general promedio en cada comuna, en un mapa del Gran Santiago. Primero, creamos la variable de promedio general:

rend_2018_geo <- data.table(rend_2018_geo)
notas_geo <- rend_2018_geo[, nota:=mean(prom_gral), by=codigo_comuna]

Luego, con !duplicated nos quedamos solo con una observaciรณn por comuna, y seleccionamos solo las variables relevantes para crear el mapa en un nuevo objeto. Luego lo transformamos a formato sf para poder trabajar con leaflet

notas_geo <- notas_geo[!duplicated(codigo_comuna), .(codigo_comuna, geometry, nota)]
notas_geo <- st_sf(notas_geo)

Ahora, creemos un mapa. Con el paquete RColorBrewer podemos elegir muchas paletas de colores preexistentes. Con display.brewer.all() podemos verlas y elegir otra.

pal <- colorNumeric(    # definimos la paleta de colores
  palette = "YlOrBr",
  domain = rend_2018_geo$nota
)
mapa <- leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(data = notas_geo,
              fillColor = ~pal(nota),
              color = "#b2aeae",  # usamos cรณdigo Hex para los colores
              fillOpacity = 1, # rellenamos con color los polรญgonos
              smoothFactor = 0.2,
              weight = 0.8) %>%   # para el grosor de la lรญnea
  addLegend(pal = pal, # paleta de colores 
            values = notas_geo$nota,
            position = "bottomright",
            title = "Promedio General") %>% 
  addScaleBar(position = "topright") # Agregar escala arriba a la derecha

mapa

Vacunas contra COVID-19 en chile

Cargar la base de datos de las primeras dosis de las vacunas

vacuna_dosis2 <- fread('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto80/vacunacion_comuna_2daDosis.csv')

Eliminamos las comunas desconocidas

vacuna_dosis2<-vacuna_dosis2[!Comuna %like% "Desconocido",] 

Debemos cambiar la estructura del dataframe para realizar el mapa, por ello, vamos a crear dos columnas, una de ellas serรกn las fechas de vacunaciรณn y la otra serรก la cantidad de personas vacunas en la fecha y comuna respectiva. Utilizaremos la funciรณn melt.

Columnas necesarias para hacer melt

Fechas <- names(vacuna_dosis2)
Fechas <- Fechas[6:269]

Hacemos un reshape con la funciรณn melt ?melt

vacuna_dosis2_1<-melt(data = vacuna_dosis2,id.vars = c("Region","Comuna","Codigo comuna","Poblacion"),measure.vars = Fechas ,variable.name = "Fecha")

#idvars las variables que quiero dejar estatica/s
#measure vars FECHAS no va entre comillas, es un objeto. 
# "Fecha" el nombre que le pondre a la variable

#si hago un dcast o melt el numero de observaciones aumenta

Porcentaje de primeras dosis por comuna

vacuna_dosis2_P <- vacuna_dosis2_1[,.(Suma_Segundas_dosis=sum(value)), by=.(`Codigo comuna`,Comuna,Poblacion)]
#estรก bien por el 346, hay 346 comunas en chile


vacuna_dosis2_P[,Porcentaje_Segundas_dosis:=(Suma_Segundas_dosis/Poblacion),by=.(`Codigo comuna`,Comuna)]

Mapa comunas

Hagamos un mapa para ver el porcentaje de personas vacunadas por comunas.

Agregar un cero adelante en codigo de las comunas que tengan 4 digitos

vacuna_dosis2_P[, `Codigo comuna` := ifelse(`Codigo comuna` < 10000 , paste0("0",vacuna_dosis2_P$`Codigo comuna`), vacuna_dosis2_P$`Codigo comuna`)] 


mapa<-merge(mapa_comunas,vacuna_dosis2_P,by.x='codigo_comuna', by.y='Codigo comuna') # Merge entre el mapa de las comunas que nos proporciona el paquete chilemapas y el dataframe de los porcentajes.

mapa<-st_sf(mapa) # Convierte el dataframe de data.table a sf

bins<-seq(0.2,1,0.2) # Intervalos del porcenateje para los colores del mapa. Del 0 al 1 con separaciรณn de 0.2
#los bins ayudan a graficar. ES UNA FORMA MANUAL DE CREAR INTERVALOS.

paleta<-colorBin(palette = 'Reds',domain = vacuna_dosis2_P$Porcentaje_Segundas_dosis,bins = bins) # Paleta de colores para el mapa


#si el codigo de cmunas es menor a 10000 (5 digitos) es decir que sea de 4 digitios, que me pegue un digito (0) en aquellas comunas que sean de 4 digitos. 
labels <- sprintf(
  "<strong>Comuna: %s</strong><br/>Porc. Segundas Dosis %g ",
  mapa$Comuna, mapa$Porcentaje_Segundas_dosis
) %>% lapply(htmltools::HTML) # Labels al pasar el mouse arriba del mapa

leaflet(mapa)%>% 
  addProviderTiles(provider = providers$OpenStreetMap.Mapnik)%>%
  addPolygons(color = ~paleta(Porcentaje_Segundas_dosis),
              weight = 1, 
              fillOpacity = 0.8,
              label = labels)%>%
  addLegend(pal = paleta, values = ~bins, opacity = 1,position = "bottomright",title ="Porc. 2ยบ dosis") # Agregar una leyenda