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)
rm(list=ls())
base <- data.frame(longitud = -71.530144, latitud=-33.020034)
ggplot(base, aes(longitud,latitud)) +
geom_point()
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) )
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',]
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))
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
ggplotly(mapa, tooltip = c("text"))
LeafletLeaflet 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:
addTiles, addProviderTiles)addMarkers (lat= lng=), addAwesomeMarkers)Para hacer nuestro primer mapa simple, vayamos a Google Maps para encontrar las coordenadas de la universidad. Aquรญ hacemos mapas con diferentes Provider Tiles.
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.
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
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)]
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