En este caso, vamos a leer una base de datos que está almacenada desde internet. Para esto utilizaremos la función read_delim de la librería readr.
library(readr)
carpetas <- read_delim("http://segasi.com.mx/clases/cide/datos/carpetas-de-investigacion-pgj-de-la-ciudad-de-mexico_modificado.csv",
";",
escape_double = FALSE,
trim_ws = TRUE, skip = 6)
## Parsed with column specification:
## cols(
## ao_hechos = col_double(),
## mes_hechos = col_character(),
## fecha_hechos = col_datetime(format = ""),
## delito = col_character(),
## categoria_delito = col_character(),
## fiscalia = col_character(),
## agencia = col_character(),
## unidad_investigacion = col_character(),
## alcaldia_hechos = col_character(),
## colonia_hechos = col_character(),
## ao_inicio = col_double(),
## mes_inicio = col_character(),
## fecha_inicio = col_datetime(format = ""),
## calle_hechos = col_character(),
## calle_hechos2 = col_character(),
## longitud = col_double(),
## latitud = col_double(),
## geopoint = col_character()
## )
Exploramos la base de datos. Para esto, utilizamos las funciones dim() y glimpse.
library(tidyverse)
## ── Attaching packages ──────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.0 ✔ purrr 0.3.2
## ✔ tibble 2.1.3 ✔ dplyr 0.8.2
## ✔ tidyr 0.8.3 ✔ stringr 1.4.0
## ✔ ggplot2 3.2.0 ✔ forcats 0.4.0
## ── Conflicts ─────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
class(carpetas)
## [1] "spec_tbl_df" "tbl_df" "tbl" "data.frame"
# Funcion para conocer las dimensiones de la base de datos
dim(carpetas)
## [1] 16623 18
# Para dar un vistazo a la base de datos
glimpse(carpetas)
## Observations: 16,623
## Variables: 18
## $ ao_hechos <dbl> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2…
## $ mes_hechos <chr> "Agosto", "Agosto", "Agosto", "Agosto", "Ag…
## $ fecha_hechos <dttm> 2019-08-03 17:40:00, 2019-08-03 15:42:00, …
## $ delito <chr> "ABUSO SEXUAL", "ROBO A REPARTIDOR CON VIOL…
## $ categoria_delito <chr> "DELITO DE BAJO IMPACTO", "ROBO A REPARTIDO…
## $ fiscalia <chr> "INVESTIGACIÓN PARA LA ATENCIÓN DE DELITOS …
## $ agencia <chr> "FDS-2", "GAM-6", "XO-2", "TLP-4", "AO-4", …
## $ unidad_investigacion <chr> "FDS-2-02", "UI-2CD", "UI-1SD", "UI-2CD", "…
## $ alcaldia_hechos <chr> "TLALPAN", "GUSTAVO A MADERO", "XOCHIMILCO"…
## $ colonia_hechos <chr> "CUMBRES DE TEPETONGO", "VALLEJO", "SANTA M…
## $ ao_inicio <dbl> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2…
## $ mes_inicio <chr> "Agosto", "Agosto", "Agosto", "Agosto", "Ag…
## $ fecha_inicio <dttm> 2019-08-03 19:46:00, 2019-08-03 19:53:00, …
## $ calle_hechos <chr> "NO PRECISA CALLES", "SHUMMAN", "CARRETERA …
## $ calle_hechos2 <chr> NA, "SAINT SAENZ", "DESIDERIO PEÑA", "ANILL…
## $ longitud <dbl> -99.18821, -99.13494, -99.08921, -99.13896,…
## $ latitud <dbl> 19.27284, 19.46920, 19.24722, 19.28201, 19.…
## $ geopoint <chr> "19.2728434436,-99.1882139267", "19.4692030…
¿En qué consiste limpiar una Base de datos?
Consiste en pasar de una base cruda a una base que tenga exactamente la información que queremos.
# Limpiar base de datos.
# Queremos las 5 calles mas peligrosas de la ciudad de Mexico.
#####################
# Son equivalentes. #
####################
# Con el argumento sort desde la funcion count
carpetas %>%
count(calle_hechos, sort = TRUE)
## # A tibble: 9,650 x 2
## calle_hechos n
## <chr> <int>
## 1 CALZADA DE TLALPAN 65
## 2 CALZADA DE GUADALUPE 63
## 3 AVENIDA TLAHUAC 62
## 4 CALZADA IGNACIO ZARAGOZA 58
## 5 EJE CENTRAL LAZARO CARDENAS 53
## 6 INSURGENTES SUR 42
## 7 AV. INSURGENTES SUR 40
## 8 PERIFERICO SUR 40
## 9 CALZADA ERMITA IZTAPALAPA 36
## 10 ERMITA IZTAPALAPA 34
## # … with 9,640 more rows
# Con la funcion arrange y la funcion desc() de ordenamiento descendiente.
carpetas %>%
count(calle_hechos) %>%
arrange(desc(n))
## # A tibble: 9,650 x 2
## calle_hechos n
## <chr> <int>
## 1 CALZADA DE TLALPAN 65
## 2 CALZADA DE GUADALUPE 63
## 3 AVENIDA TLAHUAC 62
## 4 CALZADA IGNACIO ZARAGOZA 58
## 5 EJE CENTRAL LAZARO CARDENAS 53
## 6 INSURGENTES SUR 42
## 7 AV. INSURGENTES SUR 40
## 8 PERIFERICO SUR 40
## 9 CALZADA ERMITA IZTAPALAPA 36
## 10 ERMITA IZTAPALAPA 34
## # … with 9,640 more rows
# Guardando la nueva base en un objeto llamado noCaminesPorAhi, pasando el argumento -n a la funcion arrange.
noCaminesPorAhi <- carpetas %>%
count(calle_hechos) %>%
arrange(-n)
noCaminesPorAhi
## # A tibble: 9,650 x 2
## calle_hechos n
## <chr> <int>
## 1 CALZADA DE TLALPAN 65
## 2 CALZADA DE GUADALUPE 63
## 3 AVENIDA TLAHUAC 62
## 4 CALZADA IGNACIO ZARAGOZA 58
## 5 EJE CENTRAL LAZARO CARDENAS 53
## 6 INSURGENTES SUR 42
## 7 AV. INSURGENTES SUR 40
## 8 PERIFERICO SUR 40
## 9 CALZADA ERMITA IZTAPALAPA 36
## 10 ERMITA IZTAPALAPA 34
## # … with 9,640 more rows
# Ahora, a esta base le recortamos las 5 calles más peligrosas y le renombramos las variables.
noCaminesPorAhi %>%
head(n = 5) %>%
rename(Calles = calle_hechos,
No_Delitos = n) # Primero nombre nuevo, luego igual, y luego nombre viejo
## # A tibble: 5 x 2
## Calles No_Delitos
## <chr> <int>
## 1 CALZADA DE TLALPAN 65
## 2 CALZADA DE GUADALUPE 63
## 3 AVENIDA TLAHUAC 62
## 4 CALZADA IGNACIO ZARAGOZA 58
## 5 EJE CENTRAL LAZARO CARDENAS 53
# Seleccionamos la columna fecha_hechos y todas las variables que contengan el caracter 2.
carpetas %>%
select(fecha_hechos, contains("2"))
## # A tibble: 16,623 x 2
## fecha_hechos calle_hechos2
## <dttm> <chr>
## 1 2019-08-03 17:40:00 <NA>
## 2 2019-08-03 15:42:00 SAINT SAENZ
## 3 2019-08-02 11:00:00 DESIDERIO PEÑA
## 4 2019-08-02 20:25:00 ANILLO PERIFERICO (BLVD. ADOLFO RUIZ CORTINES)
## 5 2019-08-02 17:40:00 <NA>
## 6 2019-08-03 15:30:00 <NA>
## 7 2019-08-03 19:00:00 <NA>
## 8 2019-08-02 06:00:00 <NA>
## 9 2019-08-03 15:30:00 <NA>
## 10 2019-08-02 07:00:00 EJIDO SAN ANTONIO TOMATLAN
## # … with 16,613 more rows
# Seleccionamos la columna fecha_hechos y todas las columnas que terminen con ito, las que empiecen con a y las que contengan fec, y las guardamos en un objeto que se llame baseNueva
baseNueva <- carpetas %>%
select(fecha_hechos,
ends_with("ito"),
starts_with("a"),
contains("fec"))
# A esta base nueva le filtramos lo siguiente:
# 1. Las observaciones que sean de la alcaldia Benito Juarez o de la Alcaldia Coyoacan,
# 2. de estas, las que correspondan solamente a la categoria de Delitos de Bajo Impacto
# 3. y de estas, las que hayan ocurrido entre el 2 y el 30 de agosto
baseNueva %>%
filter(alcaldia_hechos == "BENITO JUAREZ" | alcaldia_hechos == "COYOACAN",
categoria_delito == "DELITO DE BAJO IMPACTO",
fecha_hechos > "2019-08-01" & fecha_hechos < "2019-08-31 00:00:00")
## # A tibble: 1,920 x 8
## fecha_hechos delito categoria_delito ao_hechos agencia
## <dttm> <chr> <chr> <dbl> <chr>
## 1 2019-08-03 15:30:00 AMENA… DELITO DE BAJO … 2019 BJ-5
## 2 2019-08-02 07:00:00 ROBO … DELITO DE BAJO … 2019 COY-3
## 3 2019-08-02 18:00:00 ROBO … DELITO DE BAJO … 2019 TUR-2
## 4 2019-08-03 18:30:00 ROBO … DELITO DE BAJO … 2019 COY-3
## 5 2019-08-01 16:00:00 ROBO … DELITO DE BAJO … 2019 COY-2
## 6 2019-08-03 18:00:00 ABUSO… DELITO DE BAJO … 2019 FDS-5
## 7 2019-08-04 06:30:00 DAÑO … DELITO DE BAJO … 2019 COY-1
## 8 2019-08-04 04:00:00 ROBO … DELITO DE BAJO … 2019 COY-2
## 9 2019-08-04 09:50:00 ROBO … DELITO DE BAJO … 2019 COY-2
## 10 2019-08-02 21:39:00 ROBO … DELITO DE BAJO … 2019 BJ-1
## # … with 1,910 more rows, and 3 more variables: alcaldia_hechos <chr>,
## # ao_inicio <dbl>, fecha_inicio <dttm>
# Estos dos cachitos de codigo se pueden escribir en una sola cadena:
nuevaNuevaBase <- carpetas %>%
select(fecha_hechos,
ends_with("ito"),
starts_with("a"),
contains("fec")) %>%
filter(alcaldia_hechos == "BENITO JUAREZ" | alcaldia_hechos == "COYOACAN",
categoria_delito == "DELITO DE BAJO IMPACTO",
fecha_hechos > "2019-08-01" & fecha_hechos < "2019-08-31 00:00:00")
# Todo Junto.
Suerte en el exámen chicos 😉.