Trabajo Aplicado Visualizaciones con ggplot2 + leaflet + rmarkdown

Este trabajo tiene como finalidad realizar visualización de variables de una base de datos con ggplot2 y leaflet , utilizando rmarkdown, para la generación de un informe que sea armonioso y que pueda incluir características de un script de R. Se evaluará la correcta ejecución del código y el uso eficiente de las herramientas de codificación entregadas.

Formato de rmarkdown

El formato de respuesta es el siguiente:

  1. Antes de la respuesta debes agregar un encabezado de tercer nivel (###) con P y el número de pregunta.
  2. Abajo del encabezado, debe estar escrita la pregunta.
  3. Agregar la linea de código.
  4. Agregar el output de ser necesario.
  5. Si requieres agregar alguna respuesta analítica, agregar al final de la pregunta (después del output).
  6. El título del informe debe tener un encabezado de primer nivel (#) y debe ser: Actividad 5.
  7. En los autores, agregar todos/as los/as integrantes del grupo
  8. El nombre del archivo .rmd debe tener la siguiente forma: Control 2 - Apellido.

El formato tiene un puntaje asignado dentro de la nota (3 puntos)

Importante: Deben ser suprimidos los mensajes y warnings del informe.

Reglas de Envío

  1. Este trabajo debe ser publicado en el rpubs personal de un integrante.
  2. Se habilitará en webcursos un apartado para que envíen la actividad publicada en su rpubs y el archivo .rmd.
  3. El plazo para enviar es hasta finalizar la clase.

Accidentes en moto en la Región Metropolitana

Esta base de datos contiene información del número de accidentes en moto producidos por comuna en la Región Metropolitana en el año 2016. Podemos encontrar información detallada del accidente como el número de personas involucradas, la gravedad del accidente, es decir, si hubo lesionados leves, graves o incluso fallecidos. Así como también encontramos la causa del accidente, la ubicación, fecha y tipo de accidente.

1. Cargue los siguientes paquetes: data.table,rgdal,ggplot2,treemap,leaflet,sp,tidyverse y RColorBrewer. (1 punto)

library(data.table)
library(rgdal)
library(ggplot2)
library(treemap)
library(rgdal)
library(leaflet)
library(sp)
library(tidyverse)
library(RColorBrewer)

2. Cargue la base de datos de las motos (.shp), obtenga la base de datos y transformarla en un data.table (3 puntos)

motoMap<-readOGR(dsn = "Motos/MotosGS2016_2.shp")
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/caromolinare/Dropbox/Carolina Molinare/Cursos/Clases y labs/Control 2/Motos/MotosGS2016_2.shp", layer: "MotosGS2016_2"
## with 2685 features
## It has 29 fields
moto<-as.data.table(motoMap@data)

3. La variable ESTADO_CAL describe el estado de la calzada por la cual circulaba el/la motociclista. De esta forma, las categorías que debe considerar esta variable son 3: BUENO, REGULAR y MALO. Por lo tanto, lo que debe hacer, es considerar todas aquellas observaciones que tengan alguna de esas 3 categorías en la variable ESTADO_CAL. (3 puntos)

moto<-moto[ESTADO_CAL=="BUENO"|ESTADO_CAL=="REGULAR"|ESTADO_CAL=="MALO"]

4. ¿Cuántos accidentes hay por comuna? (3 puntos)

moto[,.N,by="COMUNA1"]
##              COMUNA1   N
##  1:            LAMPA  14
##  2:         SANTIAGO 321
##  3:            NUNOA 132
##  4:        EL BOSQUE  89
##  5:      PUENTE ALTO 176
##  6:       HUECHURABA  35
##  7:         PUDAHUEL  65
##  8:         VITACURA  66
##  9:       LA PINTANA  28
## 10:      PROVIDENCIA 205
## 11:       LAS CONDES 213
## 12:    QUINTA NORMAL  82
## 13:        PENALOLEN  98
## 14:           COLINA  31
## 15:         RECOLETA  50
## 16:        QUILICURA  66
## 17:           PIRQUE   2
## 18:            RENCA  35
## 19:            MACUL  77
## 20:       LA FLORIDA  95
## 21: P. AGUIRRE CERDA  28
## 22:    INDEPENDENCIA  44
## 23:        LA GRANJA  52
## 24:            MAIPU 150
## 25:     LO BARNECHEA  28
## 26:         CONCHALI  48
## 27:        CERRILLOS  49
## 28:       SAN MIGUEL  52
## 29: ESTACION CENTRAL  60
## 30:      CERRO NAVIA  36
## 31:      LA CISTERNA  54
## 32:         LA REINA  52
## 33:      SAN JOAQUIN  58
## 34:        SAN RAMON  38
## 35:     SAN BERNARDO   6
## 36:        LO ESPEJO  15
## 37:         LO PRADO  19
##              COMUNA1   N

5. ¿Cuántos accidentes con personas fallecidas hay por comuna? (3 puntos)

moto[FALLECIDOS!=0,.N,by="COMUNA1"]
##              COMUNA1 N
##  1:    QUINTA NORMAL 2
##  2:         PUDAHUEL 3
##  3: ESTACION CENTRAL 2
##  4:           COLINA 1
##  5:        EL BOSQUE 1
##  6:         SANTIAGO 5
##  7:            MAIPU 6
##  8:        SAN RAMON 1
##  9:      PUENTE ALTO 1
## 10:       LAS CONDES 3
## 11:      PROVIDENCIA 2
## 12:      SAN JOAQUIN 2
## 13:            MACUL 2
## 14:         RECOLETA 1
## 15:            NUNOA 4
## 16:        LA GRANJA 1
## 17:         LO PRADO 1
## 18:       LA FLORIDA 1
## 19:        CERRILLOS 1

6. ¿Cuántos accidentes con personas graves hay por comuna? (3 puntos)

moto[GRAVES!=0,.N,by="COMUNA1"]
##              COMUNA1  N
##  1:            LAMPA  4
##  2:            NUNOA 47
##  3:         SANTIAGO 81
##  4:      PROVIDENCIA 54
##  5:       LAS CONDES 56
##  6:    QUINTA NORMAL 24
##  7:           COLINA  6
##  8:         RECOLETA  5
##  9:           PIRQUE  1
## 10:            RENCA 12
## 11:         PUDAHUEL 22
## 12:       HUECHURABA  7
## 13:            MAIPU 33
## 14:        PENALOLEN 21
## 15:         CONCHALI 13
## 16:        CERRILLOS 18
## 17: ESTACION CENTRAL 16
## 18:      PUENTE ALTO 29
## 19: P. AGUIRRE CERDA  2
## 20:         VITACURA 23
## 21:      SAN JOAQUIN 18
## 22:         LA REINA 18
## 23:       LA FLORIDA 13
## 24:    INDEPENDENCIA 10
## 25:       SAN MIGUEL 11
## 26:            MACUL 22
## 27:        EL BOSQUE 14
## 28:        SAN RAMON 11
## 29:      LA CISTERNA 11
## 30:        QUILICURA  8
## 31:     SAN BERNARDO  1
## 32:     LO BARNECHEA  2
## 33:      CERRO NAVIA 10
## 34:        LA GRANJA 11
## 35:         LO PRADO  4
## 36:        LO ESPEJO  2
## 37:       LA PINTANA  1
##              COMUNA1  N

7. ¿Cómo podría mostrar el resultado de la pregunta 6 en un gráfico?. Muestre un gráfico legible. (5 puntos)

graves<-moto[GRAVES!=0,.N,by="COMUNA1"]

ggplot(data=graves,aes(x=COMUNA1,y=N)) + 
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle=85, vjust=0.6))

8. ¿Cuál es la principal causa (CAUSA__CON) de accidentes? (3 puntos)

moto[,.N,by="CAUSA__CON"]
##                         CAUSA__CON    N
##  1:                   OTRAS CAUSAS  340
##  2:      IMPRUDENCIA DEL CONDUCTOR 1197
##  3:         CAUSAS NO DETERMINADAS  511
##  4:         IMPRUDENCIA DEL PEATON   64
##  5:       PERDIDA CONTROL VEHICULO  147
##  6:            DEFICIENCIAS VIALES   14
##  7:   DESOBEDIENCIA A SENALIZACION  306
##  8: DROGAS Y/O FATIGA EN CONDUCTOR    4
##  9:               FALLAS MECANICAS    9
## 10:           VELOCIDAD IMPRUDENTE   10
## 11:           ALCOHOL EN CONDUCTOR   62
## 12:              ALCOHOL EN PEATON    4
## 13:       IMPRUDENCIA DEL PASAJERO    1

Bonus 1: ¿Cuál es la principal causa (CAUSA__CON) de accidentes por comuna? (3 puntos)

## si lo queremos ver por comuna
motivo<-moto[,.(n_causa=.N),by=c("COMUNA1","CAUSA__CON")]
motivo<-motivo[!duplicated(motivo)]
motivo[,.SD[which.max(n_causa)], by="COMUNA1"]
##              COMUNA1                CAUSA__CON n_causa
##  1:            LAMPA IMPRUDENCIA DEL CONDUCTOR       8
##  2:         SANTIAGO    CAUSAS NO DETERMINADAS     114
##  3:            NUNOA IMPRUDENCIA DEL CONDUCTOR      67
##  4:        EL BOSQUE IMPRUDENCIA DEL CONDUCTOR      55
##  5:      PUENTE ALTO IMPRUDENCIA DEL CONDUCTOR      82
##  6:       HUECHURABA IMPRUDENCIA DEL CONDUCTOR      22
##  7:         PUDAHUEL IMPRUDENCIA DEL CONDUCTOR      28
##  8:         VITACURA IMPRUDENCIA DEL CONDUCTOR      43
##  9:       LA PINTANA IMPRUDENCIA DEL CONDUCTOR      24
## 10:      PROVIDENCIA IMPRUDENCIA DEL CONDUCTOR     119
## 11:       LAS CONDES    CAUSAS NO DETERMINADAS      77
## 12:    QUINTA NORMAL IMPRUDENCIA DEL CONDUCTOR      34
## 13:        PENALOLEN IMPRUDENCIA DEL CONDUCTOR      61
## 14:           COLINA    CAUSAS NO DETERMINADAS      15
## 15:         RECOLETA    CAUSAS NO DETERMINADAS      23
## 16:        QUILICURA IMPRUDENCIA DEL CONDUCTOR      35
## 17:           PIRQUE    CAUSAS NO DETERMINADAS       1
## 18:            RENCA IMPRUDENCIA DEL CONDUCTOR      12
## 19:            MACUL              OTRAS CAUSAS      58
## 20:       LA FLORIDA IMPRUDENCIA DEL CONDUCTOR      52
## 21: P. AGUIRRE CERDA    CAUSAS NO DETERMINADAS      14
## 22:    INDEPENDENCIA IMPRUDENCIA DEL CONDUCTOR      41
## 23:        LA GRANJA    CAUSAS NO DETERMINADAS      26
## 24:            MAIPU IMPRUDENCIA DEL CONDUCTOR      88
## 25:     LO BARNECHEA IMPRUDENCIA DEL CONDUCTOR      11
## 26:         CONCHALI              OTRAS CAUSAS      21
## 27:        CERRILLOS IMPRUDENCIA DEL CONDUCTOR      33
## 28:       SAN MIGUEL    CAUSAS NO DETERMINADAS      35
## 29: ESTACION CENTRAL IMPRUDENCIA DEL CONDUCTOR      29
## 30:      CERRO NAVIA IMPRUDENCIA DEL CONDUCTOR      17
## 31:      LA CISTERNA IMPRUDENCIA DEL CONDUCTOR      39
## 32:         LA REINA    CAUSAS NO DETERMINADAS      22
## 33:      SAN JOAQUIN    CAUSAS NO DETERMINADAS      44
## 34:        SAN RAMON IMPRUDENCIA DEL CONDUCTOR      19
## 35:     SAN BERNARDO IMPRUDENCIA DEL CONDUCTOR       2
## 36:        LO ESPEJO              OTRAS CAUSAS      13
## 37:         LO PRADO    CAUSAS NO DETERMINADAS      10
##              COMUNA1                CAUSA__CON n_causa

9. ¿Cómo podríamos mostrar,gráficamente, las diferentes causas para las dos comunas con más accidentes? Muestre un gráfico legible. (5 puntos)

ggplot(data=moto[COMUNA1 %in% c("LAS CONDES","SANTIAGO")], aes(x=CAUSA__CON)) + geom_bar() + 
facet_wrap(facets = "COMUNA1") + 
theme(axis.text.x = element_text(angle=85, vjust=0.6, size = 6))

10. Muestre gráficamente la cantidad de accidentes que hay para las distintas causas de accidentes. (5 puntos)

moto$IdAcciden<-as.numeric(moto$IdAcciden)

treemap(moto,index="CAUSA__CON", vSize ="IdAcciden", type="value")

11. Muestre en un mapa el número de accidentes en motos que hay para cada comuna. Este mapa debe tener colores más intensos para aquellas comunas con más accidentes en moto. Para esto:

  1. Cargue el mapa de las comunas de Santiago y verifique que la proyección sea la misma que para el objeto de las motos. (3 puntos)
ComunasR13Map<-readOGR(dsn = "ComunasR13/COMUNA_C17.shp")
## Warning in OGRSpatialRef(dsn, layer, morphFromESRI =
## morphFromESRI, dumpSRS = dumpSRS, : Discarded datum
## Sistema_de_Referencia_Geocentrico_para_las_AmericaS_2000 in CRS definition:
## +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/caromolinare/Dropbox/Carolina Molinare/Cursos/Clases y labs/Control 2/ComunasR13/COMUNA_C17.shp", layer: "COMUNA_C17"
## with 52 features
## It has 8 fields
motoMap@proj4string #proyección
## CRS arguments: +proj=longlat +datum=WGS84 +no_defs
ComunasR13Map@proj4string #proyección
## CRS arguments:
##  +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
ComunasR13Map<-spTransform(ComunasR13Map,CRSobj = proj4string(motoMap))
## Warning in proj4string(motoMap): CRS object has comment, which is lost in output
ComunasR13Map@proj4string
## CRS arguments: +proj=longlat +datum=WGS84 +no_defs
  1. Cree un nuevo objeto que contenga aquellas comunas de Santiago que posean accidentes de motos. (3 puntos)
ComunasMoto<-ComunasR13Map[ComunasR13Map@data$COMUNA%in%motoMap@data$COD_COMUNA,]
  1. El nuevo objeto que creó no contiene el número de accidentes por comuna, por lo tanto debe agregar esta información. (5 puntos)
NumAccMoto<-moto[,.(NumAccMoto=.N),by=COD_COMUNA]

ComunasMoto@data<-merge(ComunasMoto@data,NumAccMoto,by.x="COMUNA",by.y="COD_COMUNA",sort=F, all.x=T)
  1. Cree la paleta de colores. (3 puntos)
pColor<-colorQuantile(palette = brewer.pal(4,name = "Reds"),domain =range(ComunasMoto@data$NumAccMoto,na.rm = T),n = 5)
  1. Cree los labels o las etiqutas. (3 puntos)
labels <- sprintf(
  "<strong>Comuna: %s </strong><br/>Acc.Motos: %g ",
  ComunasMoto$NOM_COMUNA, ComunasMoto$NumAccMoto
) %>% lapply(htmltools::HTML)
  1. Realice el mapa por comunas utilizando toda la información anterior. (6 puntos)
leaflet(ComunasMoto)%>%
  addTiles()%>%
  addPolygons(fillColor = ~pColor(NumAccMoto),color='white',weight=1,fillOpacity = 0.7,highlight = highlightOptions(
    weight = 5,
    color = "#666",
    fillOpacity = 0.7,
    bringToFront = TRUE),label=labels)

Bonus 2: Realice el mismo mapa de la pregunta 11, pero muestre la proporción de fallecidos en relación al número de accidente en las comunas donde hubo fallecidos por accidentes de moto. (7 puntos)

Recomendación: Limpie el enviroment y vuelva a abrir las bases de motos y comunas

rm(list=ls())

motoMap<-readOGR(dsn = "Motos/MotosGS2016_2.shp")
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/caromolinare/Dropbox/Carolina Molinare/Cursos/Clases y labs/Control 2/Motos/MotosGS2016_2.shp", layer: "MotosGS2016_2"
## with 2685 features
## It has 29 fields
moto<-as.data.table(motoMap@data)

ComunasR13Map<-readOGR(dsn = "ComunasR13/COMUNA_C17.shp")
## Warning in OGRSpatialRef(dsn, layer, morphFromESRI =
## morphFromESRI, dumpSRS = dumpSRS, : Discarded datum
## Sistema_de_Referencia_Geocentrico_para_las_AmericaS_2000 in CRS definition:
## +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
## OGR data source with driver: ESRI Shapefile 
## Source: "/Users/caromolinare/Dropbox/Carolina Molinare/Cursos/Clases y labs/Control 2/ComunasR13/COMUNA_C17.shp", layer: "COMUNA_C17"
## with 52 features
## It has 8 fields
ComunasR13Map<-spTransform(ComunasR13Map,CRSobj = proj4string(motoMap))
## Warning in proj4string(motoMap): CRS object has comment, which is lost in output
NumAccMoto<-moto[,.(NumAccMoto=.N),by=COD_COMUNA]
NumFallMoto<-moto[FALLECIDOS!=0,.(NumFallMoto=.N),by=COD_COMUNA]
NumFallMoto<-merge(NumFallMoto,NumAccMoto,by="COD_COMUNA")
NumFallMoto[,Prop_fall:=NumFallMoto/NumAccMoto,by=COD_COMUNA]

ComunasMoto<-ComunasR13Map[ComunasR13Map@data$COMUNA%in%NumFallMoto$COD_COMUNA,]

ComunasMoto@data<-merge(ComunasMoto@data,NumFallMoto,by.x="COMUNA",by.y="COD_COMUNA",sort=F, all.x=T)
pColor<-colorQuantile(palette = brewer.pal(4,name = "Reds"),domain =range(ComunasMoto@data$Prop_fall,na.rm = T),n = 5)
labels <- sprintf(
  "<strong>Comuna: %s </strong><br/>Proporción Fallecidos: %g ",
  ComunasMoto$NOM_COMUNA, ComunasMoto$Prop_fall
) %>% lapply(htmltools::HTML)
leaflet(ComunasMoto)%>%
  addTiles()%>%
  addPolygons(fillColor = ~pColor(Prop_fall),color='white',weight=1,fillOpacity = 0.7,highlight = highlightOptions(
    weight = 5,
    color = "#666",
    fillOpacity = 0.7,
    bringToFront = TRUE),label=labels)