Ahora que ya sabemos abrir un dataset y conocer que información tiene, vamos a aprender a manipular, limpiar, normalizar y transformar los datos, o lo que se conoce como data wrangling. Para esto vamos a trabajar con uno de los paquetes más usados y más útiles de R que se llama tidyverse
.
Pero, ¿Qué es un paquete?
Cuando instalamos R ya viene con múltiples funciones básicas para manipular datos, sin embargo el potencial de la herramienta surge con la posibilidad de incorporar constantemente nuevas funciones que nos permitan realizar nuevas tareas o mejorar el resultado de las ya existentes.
Estos grupos de funciones son a los que llamamos paquetes o packages y para poder utilizarlos es necesario instalarlos por única vez en la computadora, y luego activarlos cada vez que vayamos a usarlos.
Comencemos instalándolo. Esto podemos hacerlo manualmente en Tools/Install packages:
O directamente escribiendo install.packages()
adentro de un chunk:
#install.packages("tidyverse")
Una vez que instalamos el paquete, no vamos a tener que volver a hacerlo. Solamente vamos a tener que “activarlo” cada vez que queramos usarlo. Esta activación se hace con library()
así:
library(tidyverse)
Ahora volvamos a cargar el mismo dataset de la clase anterior y ajustemos el parámetro stringsAsFactors para estar seguros que los campos de tipo string sean tomados como factor:
suaci_202110 <- read.csv("data/suaci_202110.csv", stringsAsFactors = TRUE)
Revisemos nuevamente el resumen estadístico:
summary(suaci_202110)
## contacto periodo categoria
## 00441631/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :18200
## 00441632/21: 1 1st Qu.:202110 TRÁNSITO :16037
## 00441633/21: 1 Median :202110 BARRIOS EMERGENTES : 4275
## 00441634/21: 1 Mean :202110 CALLES Y VEREDAS : 4233
## 00441635/21: 1 3rd Qu.:202110 ARBOLADO Y ESPACIOS VERDES : 2460
## 00441636/21: 1 Max. :202110 ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422
## (Other) :52920 (Other) : 6299
## subcategoria
## DENUNCIA VIAL :14759
## RESIDUOS VOLUMINOSOS :13216
## REPARACIÓN DE VEREDA : 3342
## CESTOS Y CONTENEDORES : 3063
## LIMPIEZA DE VÍA PÚBLICA: 1906
## DESAGOTE : 1898
## (Other) :14742
## prestacion tipo_prestacion
## Vehículo mal estacionado :14475 Denuncia :17891
## Retiro de escombros / restos de obra : 9592 Queja : 2434
## Reparación de vereda : 2122 Reporte : 940
## Retiro de restos de jardinería domiciliaria: 1985 Servicio :13249
## Desagote de pozo ciego (atmosférico) : 1898 Solicitud:18412
## Desobstrucción (Vactor) : 1761
## (Other) :21093
## domicilio_comuna domicilio_barrio canal
## Comuna 11: 5199 Palermo : 4091 App BA 147 :18348
## Comuna 12: 4993 Flores : 3030 GCS Web :17584
## Comuna 13: 4849 Caballito : 2865 App Denuncia Vial: 7740
## Comuna 15: 4315 Belgrano : 2675 Boti : 4429
## Comuna 14: 4067 Villa Urquiza: 2267 Operador UGIS : 4274
## Comuna 7 : 3992 (Other) :37196 Comuna : 376
## (Other) :25511 NA's : 802 (Other) : 175
## genero
## : 4274
## Femenino :21440
## Masculino:27164
## Otros : 48
##
##
##
Tal como vimos la práctica anterior, los datos incluidos en el dataset pertenecen al mes de octubre 2021, donde la comuna con mayor cantidad de registros fue la 11 con 5.199 y el barrio con mayor cantidad fue Palermo con 4.091.
A su vez, también podemos observar que la categoría que más se registró fue “Limpieza y recolección” (18.200) y la subcategoría “Denuncia vial” (14.759). Respecto a los usuarios, se registró que el género Masculino (27.164) fue predominante en los reclamos.
Ahora si, comencemos a utilizar el famoso paquete tidyverse
que nos permitirá manipular nuestros datos a partir de las funciones: filtrar, modificar, seleccionar, ordenar, resumir, agrupar y unir.
Cabe destacar que, aprender a utilizar todas estas funciones es muy importante ya que la comprensión, transformación y limpieza de los datos es la etapa que más tiempo nos llevará a la hora de encarar cualquier proyecto de Ciencia de Datos.
Como su nombre lo indica, esta función hace referencia a realizar un filtro determinado sobre los registros/filas de toda la base de datos, es decir, quedarnos solo con las filas que cumplan cierta condición establecida. Gráficamente se vería como algo así:
Esto nos será muy útil si por algún motivo queremos dejar de lado registros y utilizar solo una parte de la base. Por ejemplo, en el caso de nuestro dataset, que ya vimos que incluye datos de las 15 Comunas de CABA, podríamos filtrar la data y quedarnos solo con los registros ubicados en la Comuna con mayor cantidad de contactos:
filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11")
dim(filtro)
## [1] 5199 10
Efectivamente, mi nuevo dataset tiene los mismos 5.199 registros que en el summary()
anterior vimos que había en la Comuna 11. Ahora veamos el resumen estadístico de lo que pasó en la Comuna 11 durante octubre 2021:
summary(filtro)
## contacto periodo categoria
## 00441638/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :2362
## 00441650/21: 1 1st Qu.:202110 TRÁNSITO :1494
## 00441659/21: 1 Median :202110 CALLES Y VEREDAS : 497
## 00441672/21: 1 Mean :202110 ARBOLADO Y ESPACIOS VERDES : 335
## 00441692/21: 1 3rd Qu.:202110 ALUMBRADO : 141
## 00441733/21: 1 Max. :202110 CONTROL EDILICIO, OBRAS Y CATASTRO: 87
## (Other) :5193 (Other) : 283
## subcategoria
## RESIDUOS VOLUMINOSOS :1628
## DENUNCIA VIAL :1344
## CESTOS Y CONTENEDORES : 467
## REPARACIÓN DE VEREDA : 398
## LIMPIEZA DE VÍA PÚBLICA : 266
## PODA DE ÁRBOL Y DESPEJE DE LUMINARIA: 142
## (Other) : 954
## prestacion
## Vehículo mal estacionado :1307
## Retiro de escombros / restos de obra :1029
## Retiro de restos de jardinería domiciliaria : 387
## Reparación de vereda : 244
## Retiro de residuos voluminosos (muebles y electrodomésticos): 212
## Poda de árbol/despeje de luminaria o semáforo : 142
## (Other) :1878
## tipo_prestacion domicilio_comuna domicilio_barrio
## Denuncia :1529 Comuna 11:5199 Villa Devoto :2011
## Queja : 265 Comuna 1 : 0 Villa Del Parque :1581
## Reporte : 80 Comuna 10: 0 Villa Santa Rita : 896
## Servicio :1631 Comuna 12: 0 Villa Gral. Mitre: 707
## Solicitud:1694 Comuna 13: 0 Flores : 2
## Comuna 14: 0 Floresta : 1
## (Other) : 0 (Other) : 1
## canal genero
## App BA 147 :2154 : 0
## GCS Web :1768 Femenino :2472
## App Denuncia Vial: 703 Masculino:2726
## Boti : 414 Otros : 1
## Comuna : 145
## Mail 147 : 11
## (Other) : 4
Se puede ver que en la comuna 11, la categoría que más se registró fue la misma que para la Ciudad completa: “Limpieza y recolección”. Sin embargo, la subcategoría predominante fue “Residuos voluminosos”, cuando en la CABA completa era “Denuncia vial”.
Aprovechemos y hagamos un segundo filtro sobre los datos, así nos quedamos solo con los correspondientes a la categoría “Limpieza y recolección” y vemos como se componen estos reclamos. Para esto reescribamos nuestro objeto comuna 11:
filtro <- filter(filtro, categoria=="LIMPIEZA Y RECOLECCIÓN")
dim(filtro)
## [1] 2362 10
Ahora nos quedamos con los 2.362 registros correspondientes a la categoría por la que filtramos. Veamos el resumen estadístico:
summary(filtro)
## contacto periodo categoria
## 00441672/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :2362
## 00441786/21: 1 1st Qu.:202110 : 0
## 00441787/21: 1 Median :202110 ALUMBRADO : 0
## 00441841/21: 1 Mean :202110 ARBOLADO Y ESPACIOS VERDES: 0
## 00441843/21: 1 3rd Qu.:202110 BARRIOS EMERGENTES : 0
## 00441856/21: 1 Max. :202110 CALLES Y VEREDAS : 0
## (Other) :2356 (Other) : 0
## subcategoria
## RESIDUOS VOLUMINOSOS :1628
## CESTOS Y CONTENEDORES : 467
## LIMPIEZA DE VÍA PÚBLICA : 266
## INCONVENIENTES CON EMPRESAS DE RECOLECCIÓN: 1
## : 0
## ACCESO A LA INFORMACIÓN PÚBLICA : 0
## (Other) : 0
## prestacion
## Retiro de escombros / restos de obra :1029
## Retiro de restos de jardinería domiciliaria : 387
## Retiro de residuos voluminosos (muebles y electrodomésticos): 212
## Instalación de cesto papelero : 124
## Reparación de contenedor : 124
## Reubicación de contenedor : 103
## (Other) : 383
## tipo_prestacion domicilio_comuna domicilio_barrio
## Denuncia : 1 Comuna 11:2362 Villa Devoto :833
## Queja : 130 Comuna 1 : 0 Villa Del Parque :766
## Reporte : 14 Comuna 10: 0 Villa Santa Rita :460
## Servicio :1628 Comuna 12: 0 Villa Gral. Mitre:302
## Solicitud: 589 Comuna 13: 0 Flores : 1
## Comuna 14: 0 Agronomia : 0
## (Other) : 0 (Other) : 0
## canal genero
## App BA 147 :1132 : 0
## GCS Web :1061 Femenino :1230
## Boti : 133 Masculino:1131
## Comuna : 35 Otros : 1
## Mail 147 : 1
## App Denuncia Vial: 0
## (Other) : 0
Bien, ahora estamos viendo un universo aún más pequeño: Los reclamos de “Limpieza y recolección” en la Comuna 11. Y en esta muestra, por ejemplo podemos ver que:
La subcategoría más denunciada fue “Residuos voluminosos”.
El tipo de prestación más utilizada fue “Servicio”.
El barrio de la Comuna 11 con más reclamos fue Villa Devoto.
La mayor cantidad de reclamos la hizo el género femenino.
Seguro notaron que en los 2 ejemplos anteriores, para filtrar bajo la condición de “igual” utilizamos “==”, pero ¡Hay muchas más posibilidades! Es decir que también podríamos haber utilizado otras condiciones como:
Entonces, por ejemplo si quiero quedarme con todos los registros que no sean de la categoría Limpieza y recolección debería escribirlo así:
filtro <- filter(suaci_202110, categoria != "LIMPIEZA Y RECOLECCIÓN")
dim(filtro)
## [1] 34726 10
En este caso, solo nos quedaron 34.726 observaciones ya que el resto (18.200) correspondía a “Limpieza y recolección”.
Veamos otro caso, si por ejemplo queremos filtrar todos los reclamos ubicados en 3 barrios diferentes como por ejemplo Belgrano, Barracas y Villa del Parque debemos utilizar %in% de la siguiente forma:
filtro <- filter(suaci_202110, domicilio_barrio %in% c("Belgrano", "Barracas", "Villa Del Parque"))
dim(filtro)
## [1] 5829 10
Podemos ver que de los 52.926 reclamos de la base, solo hay 5.829 (11%) ubicados en los barrios de Belgrano, Barracas y Villa del Parque. Veamos como se conforman:
summary(filtro)
## contacto periodo categoria
## 00441631/21: 1 Min. :202110 TRÁNSITO :1929
## 00441632/21: 1 1st Qu.:202110 LIMPIEZA Y RECOLECCIÓN :1830
## 00441633/21: 1 Median :202110 BARRIOS EMERGENTES : 782
## 00441640/21: 1 Mean :202110 CALLES Y VEREDAS : 340
## 00441647/21: 1 3rd Qu.:202110 ARBOLADO Y ESPACIOS VERDES : 222
## 00441654/21: 1 Max. :202110 ORDENAMIENTO DEL ESPACIO PÚBLICO: 208
## (Other) :5823 (Other) : 518
## subcategoria
## DENUNCIA VIAL :1821
## RESIDUOS VOLUMINOSOS :1310
## DESOBSTRUCCIÓN : 391
## CESTOS Y CONTENEDORES: 347
## DESAGOTE : 285
## REPARACIÓN DE VEREDA : 253
## (Other) :1422
## prestacion tipo_prestacion
## Vehículo mal estacionado :1787 Denuncia :2159
## Retiro de escombros / restos de obra : 953 Queja : 185
## Desobstrucción (Vactor) : 391 Reporte : 88
## Desagote de pozo ciego (atmosférico) : 285 Servicio :1314
## Retiro de restos de jardinería domiciliaria: 209 Solicitud:2083
## Reparación de vereda : 164
## (Other) :2040
## domicilio_comuna domicilio_barrio canal
## Comuna 13:2675 Belgrano :2675 App BA 147 :2182
## Comuna 11:1581 Villa Del Parque:1582 GCS Web :1502
## Comuna 4 :1572 Barracas :1572 App Denuncia Vial: 891
## Comuna 15: 1 Agronomia : 0 Operador UGIS : 782
## Comuna 1 : 0 Almagro : 0 Boti : 434
## Comuna 10: 0 Balvanera : 0 Comuna : 26
## (Other) : 0 (Other) : 0 (Other) : 12
## genero
## : 782
## Femenino :2312
## Masculino:2729
## Otros : 6
##
##
##
Ahora, con este filtro, la categoría predominante es “Tránsito” y la prestación “Vehículo mal estacionado”.
Si quisiésemos hacer lo contrario, es decir filtrar todos los registros que no estén ubicados en estos barrios debemos utilizar ! + %in% de la siguiente forma:
filtro <- filter(suaci_202110, !(domicilio_barrio %in% c("Belgrano", "Barracas", "Villa Del Parque")))
summary(filtro)
## contacto periodo categoria
## 00441634/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :16370
## 00441635/21: 1 1st Qu.:202110 TRÁNSITO :14108
## 00441636/21: 1 Median :202110 CALLES Y VEREDAS : 3893
## 00441637/21: 1 Mean :202110 BARRIOS EMERGENTES : 3493
## 00441638/21: 1 3rd Qu.:202110 ARBOLADO Y ESPACIOS VERDES: 2238
## 00441639/21: 1 Max. :202110 TRÁMITES Y SERVICIOS : 1285
## (Other) :47091 (Other) : 5710
## subcategoria
## DENUNCIA VIAL :12938
## RESIDUOS VOLUMINOSOS :11906
## REPARACIÓN DE VEREDA : 3089
## CESTOS Y CONTENEDORES : 2716
## LIMPIEZA DE VÍA PÚBLICA: 1737
## DESAGOTE : 1613
## (Other) :13098
## prestacion
## Vehículo mal estacionado :12688
## Retiro de escombros / restos de obra : 8639
## Reparación de vereda : 1958
## Retiro de restos de jardinería domiciliaria : 1776
## Desagote de pozo ciego (atmosférico) : 1613
## Retiro de residuos voluminosos (muebles y electrodomésticos): 1491
## (Other) :18932
## tipo_prestacion domicilio_comuna domicilio_barrio
## Denuncia :15732 Comuna 12: 4993 Palermo : 4091
## Queja : 2249 Comuna 15: 4314 Flores : 3030
## Reporte : 852 Comuna 14: 4067 Caballito : 2865
## Servicio :11935 Comuna 7 : 3992 Villa Urquiza: 2267
## Solicitud:16329 Comuna 11: 3618 Villa Devoto : 2014
## Comuna 10: 3408 (Other) :32028
## (Other) :22705 NA's : 802
## canal genero
## App BA 147 :16166 : 3492
## GCS Web :16082 Femenino :19128
## App Denuncia Vial: 6849 Masculino:24435
## Boti : 3995 Otros : 42
## Operador UGIS : 3492
## Comuna : 350
## (Other) : 163
Pero esto no es todo, ¿Cómo hago si quiero filtrar por 2 o más condiciones a la vez?
En este caso debemos utilizar los siguientes operadores lógicos:
Por ejemplo, en el primer caso que hicimos 2 filtros sobre el mismo objeto, en vez de hacerlo por separado podríamos haberlo realizado de la siguiente forma:
filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11" & categoria=="LIMPIEZA Y RECOLECCIÓN")
summary(filtro)
## contacto periodo categoria
## 00441672/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :2362
## 00441786/21: 1 1st Qu.:202110 : 0
## 00441787/21: 1 Median :202110 ALUMBRADO : 0
## 00441841/21: 1 Mean :202110 ARBOLADO Y ESPACIOS VERDES: 0
## 00441843/21: 1 3rd Qu.:202110 BARRIOS EMERGENTES : 0
## 00441856/21: 1 Max. :202110 CALLES Y VEREDAS : 0
## (Other) :2356 (Other) : 0
## subcategoria
## RESIDUOS VOLUMINOSOS :1628
## CESTOS Y CONTENEDORES : 467
## LIMPIEZA DE VÍA PÚBLICA : 266
## INCONVENIENTES CON EMPRESAS DE RECOLECCIÓN: 1
## : 0
## ACCESO A LA INFORMACIÓN PÚBLICA : 0
## (Other) : 0
## prestacion
## Retiro de escombros / restos de obra :1029
## Retiro de restos de jardinería domiciliaria : 387
## Retiro de residuos voluminosos (muebles y electrodomésticos): 212
## Instalación de cesto papelero : 124
## Reparación de contenedor : 124
## Reubicación de contenedor : 103
## (Other) : 383
## tipo_prestacion domicilio_comuna domicilio_barrio
## Denuncia : 1 Comuna 11:2362 Villa Devoto :833
## Queja : 130 Comuna 1 : 0 Villa Del Parque :766
## Reporte : 14 Comuna 10: 0 Villa Santa Rita :460
## Servicio :1628 Comuna 12: 0 Villa Gral. Mitre:302
## Solicitud: 589 Comuna 13: 0 Flores : 1
## Comuna 14: 0 Agronomia : 0
## (Other) : 0 (Other) : 0
## canal genero
## App BA 147 :1132 : 0
## GCS Web :1061 Femenino :1230
## Boti : 133 Masculino:1131
## Comuna : 35 Otros : 1
## Mail 147 : 1
## App Denuncia Vial: 0
## (Other) : 0
O si además quisiese eliminar los registros que corresponden a algún barrio, por ejemplo Villa Devoto debería hacer el siguiente chunk:
filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 11" & categoria=="LIMPIEZA Y RECOLECCIÓN" & domicilio_barrio != "Villa Devoto")
summary(filtro)
## contacto periodo categoria
## 00441672/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :1529
## 00441786/21: 1 1st Qu.:202110 : 0
## 00441787/21: 1 Median :202110 ALUMBRADO : 0
## 00441841/21: 1 Mean :202110 ARBOLADO Y ESPACIOS VERDES: 0
## 00441843/21: 1 3rd Qu.:202110 BARRIOS EMERGENTES : 0
## 00441856/21: 1 Max. :202110 CALLES Y VEREDAS : 0
## (Other) :1523 (Other) : 0
## subcategoria
## RESIDUOS VOLUMINOSOS :1037
## CESTOS Y CONTENEDORES : 328
## LIMPIEZA DE VÍA PÚBLICA : 164
## : 0
## ACCESO A LA INFORMACIÓN PÚBLICA: 0
## ADMINISTRATIVA Y LEGAL : 0
## (Other) : 0
## prestacion
## Retiro de escombros / restos de obra :710
## Retiro de restos de jardinería domiciliaria :206
## Retiro de residuos voluminosos (muebles y electrodomésticos):121
## Instalación de cesto papelero :115
## Reparación de contenedor : 85
## Recolección de residuos fuera del contenedor : 64
## (Other) :228
## tipo_prestacion domicilio_comuna domicilio_barrio
## Denuncia : 0 Comuna 11:1529 Villa Del Parque :766
## Queja : 69 Comuna 1 : 0 Villa Santa Rita :460
## Reporte : 10 Comuna 10: 0 Villa Gral. Mitre:302
## Servicio :1037 Comuna 12: 0 Flores : 1
## Solicitud: 413 Comuna 13: 0 Agronomia : 0
## Comuna 14: 0 Almagro : 0
## (Other) : 0 (Other) : 0
## canal genero
## App BA 147 :760 : 0
## GCS Web :666 Femenino :799
## Boti : 88 Masculino:730
## Comuna : 14 Otros : 0
## Mail 147 : 1
## App Denuncia Vial: 0
## (Other) : 0
Hagamos un ejemplo más para ver que pasa si queremos filtrar todos los registros pertenecientes a la Comuna 5 y a la Comuna 13:
filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 5" & domicilio_comuna=="Comuna 13")
dim(filtro)
## [1] 0 10
El resultado es 0 porque un registro no puede pertenecer a ambas comunas al mismo tiempo, sin embargo si queremos filtrar aquellos que pertenecen a una u otra podemos hacerlo así:
filtro <- filter(suaci_202110, domicilio_comuna=="Comuna 5" | domicilio_comuna=="Comuna 13")
head(filtro)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442993/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00443043/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442102/21 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 3 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
## 4 Vehículo mal estacionado Denuncia Comuna 5 Almagro
## 5 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 6 Vehículo mal estacionado Denuncia Comuna 5 Almagro
## canal genero
## 1 App BA 147 Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino
Por último, otro tipo de filtro muy común es el que utilizamos para filtrar valores nulos (NA). Por ejemplo, quedémonos con todos los registros que tienen NAs en la variable domicilio_barrio:
filtro <- filter(suaci_202110, is.na(domicilio_barrio))
summary(filtro)
## contacto periodo categoria
## 00441707/21: 1 Min. :202110 TRÁMITES Y SERVICIOS :667
## 00441776/21: 1 1st Qu.:202110 MEDIOS DE TRANSPORTE : 90
## 00441940/21: 1 Median :202110 CALLES Y VEREDAS : 34
## 00442049/21: 1 Mean :202110 SALUD Y SERVICIOS SOCIALES: 11
## 00442051/21: 1 3rd Qu.:202110 : 0
## 00442052/21: 1 Max. :202110 ALUMBRADO : 0
## (Other) :796 (Other) : 0
## subcategoria
## ACCESO A LA INFORMACIÓN PÚBLICA :473
## PROPUESTAS PARA LA MEJORA EN TRÁMITES :175
## BICICLETAS : 46
## TAXIS : 44
## OTROS : 34
## INCONVENIENTE CON EL SISTEMA PARA LA INSCRIPCIÓN DE DEFUNCIONES (CARGA HOSPITALES): 19
## (Other) : 11
## prestacion
## Acceso a la información pública :449
## Propuestas para la mejora en trámites :175
## Inconvenientes con el registro de usuario de BA Ecobici por Tembici: 45
## Felicitación / Agradecimiento : 34
## Reclamo ante el Órgano Garante por Ley 104 : 24
## Taxi: tarifa mal cobrada : 20
## (Other) : 55
## tipo_prestacion domicilio_comuna domicilio_barrio canal
## Denuncia : 11 Comuna NA:801 Agronomia: 0 GCS Web :620
## Queja :342 Comuna 1 : 1 Almagro : 0 App BA 147 :175
## Reporte : 0 Comuna 10: 0 Balvanera: 0 Operador GCBA : 4
## Servicio : 0 Comuna 11: 0 Barracas : 0 Comuna : 3
## Solicitud:449 Comuna 12: 0 Belgrano : 0 App Denuncia Vial: 0
## Comuna 13: 0 (Other) : 0 Boti : 0
## (Other) : 0 NA's :802 (Other) : 0
## genero
## : 0
## Femenino :398
## Masculino:402
## Otros : 2
##
##
##
En el resumen estadístico se ve que todas las observaciones que nos quedaron (802) tienen NA en la columna domicilio_barrio. Hagamos lo opuesto: filtremos los datos para quedarnos solo con las observaciones que no tienen NA en domicilio_barrio:
filtro <- filter(suaci_202110, !is.na(domicilio_barrio))
summary(filtro)
## contacto periodo categoria
## 00441631/21: 1 Min. :202110 LIMPIEZA Y RECOLECCIÓN :18200
## 00441632/21: 1 1st Qu.:202110 TRÁNSITO :16037
## 00441633/21: 1 Median :202110 BARRIOS EMERGENTES : 4275
## 00441634/21: 1 Mean :202110 CALLES Y VEREDAS : 4199
## 00441635/21: 1 3rd Qu.:202110 ARBOLADO Y ESPACIOS VERDES : 2460
## 00441636/21: 1 Max. :202110 ORDENAMIENTO DEL ESPACIO PÚBLICO: 1422
## (Other) :52118 (Other) : 5531
## subcategoria
## DENUNCIA VIAL :14759
## RESIDUOS VOLUMINOSOS :13216
## REPARACIÓN DE VEREDA : 3342
## CESTOS Y CONTENEDORES : 3063
## LIMPIEZA DE VÍA PÚBLICA: 1906
## DESAGOTE : 1898
## (Other) :13940
## prestacion tipo_prestacion
## Vehículo mal estacionado :14475 Denuncia :17880
## Retiro de escombros / restos de obra : 9592 Queja : 2092
## Reparación de vereda : 2122 Reporte : 940
## Retiro de restos de jardinería domiciliaria: 1985 Servicio :13249
## Desagote de pozo ciego (atmosférico) : 1898 Solicitud:17963
## Desobstrucción (Vactor) : 1761
## (Other) :20291
## domicilio_comuna domicilio_barrio canal
## Comuna 11: 5199 Palermo : 4091 App BA 147 :18173
## Comuna 12: 4993 Flores : 3030 GCS Web :16964
## Comuna 13: 4849 Caballito : 2865 App Denuncia Vial: 7740
## Comuna 15: 4315 Belgrano : 2675 Boti : 4429
## Comuna 14: 4067 Villa Urquiza: 2267 Operador UGIS : 4274
## Comuna 7 : 3992 Villa Devoto : 2014 Comuna : 373
## (Other) :24709 (Other) :35182 (Other) : 171
## genero
## : 4274
## Femenino :21042
## Masculino:26762
## Otros : 46
##
##
##
¡Y así se pueden hacer todas las combinaciones de filtros que queramos!
Ahora, ¿Qué hacemos si en vez de quitar filas queremos quitar columnas? Bueno, aquí tenemos que usar la función de “seleccionar” que veremos a continuación.
La función select()
nos permite elegir u ordenar columnas de nuestro dataset. Esto se puede hacer indicando los nombres completos de las columnas, palabras que contienen, o la letra con la que empiezan o terminan.
Gráficamente sería algo así:
Por ejemplo, de la siguiente forma podríamos quedarnos solo con las columnas periodo, categoría, domicilio_comuna, domicilio_barrio:
seleccion <- select(suaci_202110, periodo, categoria, domicilio_comuna, domicilio_barrio)
head(seleccion)
## periodo categoria domicilio_comuna domicilio_barrio
## 1 202110 LIMPIEZA Y RECOLECCIÓN Comuna 13 Belgrano
## 2 202110 TRÁNSITO Comuna 10 Monte Castro
## 3 202110 TRÁNSITO Comuna 1 San Telmo
## 4 202110 TRÁNSITO Comuna 13 Belgrano
## 5 202110 TRÁNSITO Comuna 1 Puerto Madero
## 6 202110 TRÁNSITO Comuna 13 Nuñez
También podríamos elegir que columna/s no queremos tener más en nuestro dataset agregando un “-” antes de su nombre:
seleccion <- select(suaci_202110, -genero)
head(seleccion)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442090/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00442395/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 10 Monte Castro
## 3 Vehículo mal estacionado Denuncia Comuna 1 San Telmo
## 4 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 5 Vehículo mal estacionado Denuncia Comuna 1 Puerto Madero
## 6 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
## canal
## 1 App BA 147
## 2 App Denuncia Vial
## 3 App Denuncia Vial
## 4 App Denuncia Vial
## 5 App Denuncia Vial
## 6 App Denuncia Vial
Con “:” podríamos indicar que queremos seleccionar un rango de columnas. Por ejemplo, desde periodo hasta domicilio_comuna:
seleccion <- select(suaci_202110, periodo:domicilio_comuna)
head(seleccion)
## periodo categoria subcategoria
## 1 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 202110 TRÁNSITO DENUNCIA VIAL
## 3 202110 TRÁNSITO DENUNCIA VIAL
## 4 202110 TRÁNSITO DENUNCIA VIAL
## 5 202110 TRÁNSITO DENUNCIA VIAL
## 6 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna
## 1 Reubicación de contenedor Solicitud Comuna 13
## 2 Vehículo mal estacionado Denuncia Comuna 10
## 3 Vehículo mal estacionado Denuncia Comuna 1
## 4 Vehículo mal estacionado Denuncia Comuna 13
## 5 Vehículo mal estacionado Denuncia Comuna 1
## 6 Vehículo mal estacionado Denuncia Comuna 13
O un rango según la posición que ocupan. Por ejemplo, de la 5 a la 8:
seleccion <- select(suaci_202110, 5:8)
head(seleccion)
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 10 Monte Castro
## 3 Vehículo mal estacionado Denuncia Comuna 1 San Telmo
## 4 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 5 Vehículo mal estacionado Denuncia Comuna 1 Puerto Madero
## 6 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
Agregando un “-” adelante podríamos quedarnos con aquellas que no ocupan de la posición 5 a 8:
seleccion <- select(suaci_202110, -(5:8))
head(seleccion)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442090/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00442395/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## canal genero
## 1 App BA 147 Femenino
## 2 App Denuncia Vial Masculino
## 3 App Denuncia Vial Masculino
## 4 App Denuncia Vial Masculino
## 5 App Denuncia Vial Masculino
## 6 App Denuncia Vial Masculino
Otra opción es seleccionar columnas de acuerdo a la primer letra de los nombres. Por ejemplo aquellas que comienzan con la letra “p”:
seleccion <- select(suaci_202110, starts_with("p"))
head(seleccion)
## periodo prestacion
## 1 202110 Reubicación de contenedor
## 2 202110 Vehículo mal estacionado
## 3 202110 Vehículo mal estacionado
## 4 202110 Vehículo mal estacionado
## 5 202110 Vehículo mal estacionado
## 6 202110 Vehículo mal estacionado
O aquellas que sus nombres terminan con la letra “o”:
seleccion <- select(suaci_202110, ends_with("O"))
head(seleccion)
## contacto periodo domicilio_barrio genero
## 1 00443037/21 202110 Belgrano Femenino
## 2 00442177/21 202110 Monte Castro Masculino
## 3 00442090/21 202110 San Telmo Masculino
## 4 00442314/21 202110 Belgrano Masculino
## 5 00442395/21 202110 Puerto Madero Masculino
## 6 00442458/21 202110 Nuñez Masculino
O aquellas que sus nombres contengan la palabra “domicilio”:
seleccione <- select(suaci_202110, contains("domicilio"))
head(seleccion)
## contacto periodo domicilio_barrio genero
## 1 00443037/21 202110 Belgrano Femenino
## 2 00442177/21 202110 Monte Castro Masculino
## 3 00442090/21 202110 San Telmo Masculino
## 4 00442314/21 202110 Belgrano Masculino
## 5 00442395/21 202110 Puerto Madero Masculino
## 6 00442458/21 202110 Nuñez Masculino
Esta función nos permitirá ordenar las columnas en orden ascendente o descendente como se ve a continuación:
Probemos ordenar las filas de nuestro dataframe en función de los valores de una o más columnas. Por defecto se ordena en forma ascendente:
ordenar <- arrange(suaci_202110, domicilio_barrio)
head(ordenar)
## contacto periodo categoria
## 1 00442945/21 202110 TRÁNSITO
## 2 00442455/21 202110 LIMPIEZA Y RECOLECCIÓN
## 3 00442812/21 202110 ARBOLADO Y ESPACIOS VERDES
## 4 00443018/21 202110 SEGURIDAD
## 5 00441762/21 202110 LIMPIEZA Y RECOLECCIÓN
## 6 00442785/21 202110 LIMPIEZA Y RECOLECCIÓN
## subcategoria
## 1 DENUNCIA VIAL
## 2 CESTOS Y CONTENEDORES
## 3 PROBLEMA CON INTERVENCIONES DE ARBOLADO
## 4 OTROS
## 5 RESIDUOS VOLUMINOSOS
## 6 RESIDUOS VOLUMINOSOS
## prestacion tipo_prestacion
## 1 Vehículo mal estacionado Denuncia
## 2 Reparación de contenedor Solicitud
## 3 Falta de recolección de restos de poda de arbolado público Solicitud
## 4 Mayor presencia policial Reporte
## 5 Retiro de restos de jardinería domiciliaria Servicio
## 6 Retiro de restos de jardinería domiciliaria Servicio
## domicilio_comuna domicilio_barrio canal genero
## 1 Comuna 15 Agronomia App Denuncia Vial Masculino
## 2 Comuna 15 Agronomia GCS Web Femenino
## 3 Comuna 15 Agronomia GCS Web Femenino
## 4 Comuna 15 Agronomia App BA 147 Masculino
## 5 Comuna 15 Agronomia GCS Web Femenino
## 6 Comuna 15 Agronomia App BA 147 Masculino
Pero si queremos ordenar en forma descendente debemos aclararlo con desc()
:
ordenar <- arrange(suaci_202110, desc(domicilio_barrio))
head(ordenar)
## contacto periodo categoria subcategoria prestacion
## 1 00442615/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 2 00442206/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 3 00443192/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 4 00442625/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 5 00443038/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## 6 00443191/21 202110 TRÁNSITO DENUNCIA VIAL Vehículo mal estacionado
## tipo_prestacion domicilio_comuna domicilio_barrio canal genero
## 1 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
## 2 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
## 3 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
## 4 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
## 5 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
## 6 Denuncia Comuna 12 Villa Urquiza App Denuncia Vial Masculino
También podemos ordenar por 2 o más columnas. En este caso, R priorizará ordenar la primera, luego la segunda, y así sucesivamente. Veamos un ejemplo:
ordenar <- arrange(suaci_202110, domicilio_barrio, categoria)
head(ordenar)
## contacto periodo categoria
## 1 00470309/21 202110 ALUMBRADO
## 2 00491626/21 202110 ALUMBRADO
## 3 00493160/21 202110 ALUMBRADO
## 4 00493474/21 202110 ALUMBRADO
## 5 00442812/21 202110 ARBOLADO Y ESPACIOS VERDES
## 6 00445376/21 202110 ARBOLADO Y ESPACIOS VERDES
## subcategoria
## 1 MAYOR ILUMINACIÓN EN CALLE
## 2 REPARACIÓN DE LUMINARIA
## 3 MAYOR ILUMINACIÓN EN CALLE
## 4 REPARACIÓN DE LUMINARIA
## 5 PROBLEMA CON INTERVENCIONES DE ARBOLADO
## 6 PLANTACIÓN DE ÁRBOL
## prestacion tipo_prestacion
## 1 Mayor iluminación en calle / plaza Solicitud
## 2 Reparación de luminaria apagada durante la noche Solicitud
## 3 Mayor iluminación en calle / plaza Solicitud
## 4 Reparación de luminaria apagada durante la noche Solicitud
## 5 Falta de recolección de restos de poda de arbolado público Solicitud
## 6 Plantación de árbol Solicitud
## domicilio_comuna domicilio_barrio canal genero
## 1 Comuna 15 Agronomia Operador GCBA Femenino
## 2 Comuna 15 Agronomia App BA 147 Femenino
## 3 Comuna 15 Agronomia App BA 147 Femenino
## 4 Comuna 15 Agronomia App BA 147 Femenino
## 5 Comuna 15 Agronomia GCS Web Femenino
## 6 Comuna 15 Agronomia GCS Web Masculino
Ahora veamos como mutar nuestro dataset agregando nuevas columnas o cambiando el contenido de las existentes. Gráficamente sería algo así:
En este caso podríamos separar el contenido de una columna en 2, por ejemplo dividamos en año y mes la data que aparece en periodo. Para esto utilizaremos substr()
:
modificar <- mutate(suaci_202110,
year = substr(periodo, 1, 4),
month = substr(periodo, 5, 6))
head(modificar)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442090/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00442395/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 10 Monte Castro
## 3 Vehículo mal estacionado Denuncia Comuna 1 San Telmo
## 4 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 5 Vehículo mal estacionado Denuncia Comuna 1 Puerto Madero
## 6 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
## canal genero year month
## 1 App BA 147 Femenino 2021 10
## 2 App Denuncia Vial Masculino 2021 10
## 3 App Denuncia Vial Masculino 2021 10
## 4 App Denuncia Vial Masculino 2021 10
## 5 App Denuncia Vial Masculino 2021 10
## 6 App Denuncia Vial Masculino 2021 10
Otra aplicación que tiene mutate()
es la de agregar columnas con algún contenido que elijamos nosotros, como por ejemplo sumemos una nueva columna que indique la fuente de donde descargamos toda esta información:
modificar <- mutate(suaci_202110, fuente="BA Data")
head(modificar)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442090/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00442395/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 10 Monte Castro
## 3 Vehículo mal estacionado Denuncia Comuna 1 San Telmo
## 4 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 5 Vehículo mal estacionado Denuncia Comuna 1 Puerto Madero
## 6 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
## canal genero fuente
## 1 App BA 147 Femenino BA Data
## 2 App Denuncia Vial Masculino BA Data
## 3 App Denuncia Vial Masculino BA Data
## 4 App Denuncia Vial Masculino BA Data
## 5 App Denuncia Vial Masculino BA Data
## 6 App Denuncia Vial Masculino BA Data
También podríamos modificar el tipo de dato dentro de una columna:
class(modificar$fuente)
## [1] "character"
Vemos que la variable “fuente” es de tipo character, así que cambiemos su formato a factor:
modificar <- mutate(modificar, fuente=as.factor(fuente))
class(modificar$fuente)
## [1] "factor"
En el ejemplo anterior utilizamos as.factor()
pero si quisiésemos convertir una variable a character utilizaríamos as.character()
, a numérica as.numeric()
o a número entero as.integer()
.
Por último, veamos como unir 2 columnas de texto en una con paste()
:
modificar <- mutate(suaci_202110, comuna_barrio=paste(domicilio_comuna, domicilio_barrio, sep="_"))
head(modificar)
## contacto periodo categoria subcategoria
## 1 00443037/21 202110 LIMPIEZA Y RECOLECCIÓN CESTOS Y CONTENEDORES
## 2 00442177/21 202110 TRÁNSITO DENUNCIA VIAL
## 3 00442090/21 202110 TRÁNSITO DENUNCIA VIAL
## 4 00442314/21 202110 TRÁNSITO DENUNCIA VIAL
## 5 00442395/21 202110 TRÁNSITO DENUNCIA VIAL
## 6 00442458/21 202110 TRÁNSITO DENUNCIA VIAL
## prestacion tipo_prestacion domicilio_comuna domicilio_barrio
## 1 Reubicación de contenedor Solicitud Comuna 13 Belgrano
## 2 Vehículo mal estacionado Denuncia Comuna 10 Monte Castro
## 3 Vehículo mal estacionado Denuncia Comuna 1 San Telmo
## 4 Vehículo mal estacionado Denuncia Comuna 13 Belgrano
## 5 Vehículo mal estacionado Denuncia Comuna 1 Puerto Madero
## 6 Vehículo mal estacionado Denuncia Comuna 13 Nuñez
## canal genero comuna_barrio
## 1 App BA 147 Femenino Comuna 13_Belgrano
## 2 App Denuncia Vial Masculino Comuna 10_Monte Castro
## 3 App Denuncia Vial Masculino Comuna 1_San Telmo
## 4 App Denuncia Vial Masculino Comuna 13_Belgrano
## 5 App Denuncia Vial Masculino Comuna 1_Puerto Madero
## 6 App Denuncia Vial Masculino Comuna 13_Nuñez
También se pueden hacer operaciones matemáticas entre columnas cuando hay 2 o más con datos numéricos (sumar, restar, multiplicar, dividir), pero esto lo veremos al final de la práctica.
Esta función es muy útil cuando manipulamos datos ya que nos permite realizar resúmenes/sumarios de la data completa, obteniendo por ejemplo conteos, valores promedio, máximos o mínimos de una o más columnas.
Probemos calculando un conteo de toda la base de datos:
summarise(suaci_202110, cantidad=n())
## cantidad
## 1 52926
Como verán, esta función resulta útil para ver valores agregados de toda la base, sin embargo, también podemos agrupar los datos previo a calcular los resúmenes, y así obtener resúmenes por agrupaciones en vez de uno solo para toda la base. Para esto vamos a utilizar summarise()
junto a group_by()
. Veamos un ejemplo:
Primero agrupemos los datos por la variable “domicilio_barrio” (podríamos hacerlo también por 2 o más variables).
Luego calculemos la cantidad de registros sobre cada categoría (barrio) de la agrupación realizada previamente.
agrupar <- group_by(suaci_202110, domicilio_barrio)
resumir <- summarise(agrupar, cantidad=n())
head(resumir)
## # A tibble: 6 x 2
## domicilio_barrio cantidad
## <fct> <int>
## 1 Agronomia 358
## 2 Almagro 1812
## 3 Balvanera 1593
## 4 Barracas 1572
## 5 Belgrano 2675
## 6 Boca 316
Podemos ver que el barrio con menor cantidad de reclamos es Villa Riachuelo (284) y el barrio con mayor cantidad de reclamos es Palermo (4.091).
Pero, ¿Cómo sabemos si los reclamos en Palermo son “muchos” o los de Villa Riachuelo son “pocos”? ¡Midiendo ambos datos en la misma unidad de análisis! Es decir, calculando una densidad de reclamos por habitante (población) o por hectárea (superficie) que nos permita comparar el dato entre diferentes barrios.
Para poder hacer esto, carguemos un nuevo dataset (https://data.world/angie-scetta/pob-caba-2010) con la información que nos falta:
poblacion <- read.csv("data/poblacion_caba.csv", stringsAsFactors = TRUE)
Revisemos el contenido dataset:
head(poblacion)
## BARRIO COMUNA POBLACION AREA
## 1 Agronomia Comuna 15 13912 2.12
## 2 Almagro Comuna 5 131699 4.05
## 3 Balvanera Comuna 3 138926 4.34
## 4 Barracas Comuna 4 89452 7.95
## 5 Belgrano Comuna 13 126267 8.00
## 6 Boca Comuna 4 45113 5.04
Y volvamos a ver el dataset que agrupamos en el paso anterior:
head(resumir)
## # A tibble: 6 x 2
## domicilio_barrio cantidad
## <fct> <int>
## 1 Agronomia 358
## 2 Almagro 1812
## 3 Balvanera 1593
## 4 Barracas 1572
## 5 Belgrano 2675
## 6 Boca 316
Si observan con atención, verán que ambos dataset tienen en común la columna que indica el Barrio. Seguro se estén preguntando: ¿Y cómo los unificamos? La respuesta es: con left_join(), una función de tidyverse que nos permite enriquecer los datos sumando información de otras bases de datos.
Cuando tenemos 2 dataset, existen 4 formas de unirlos: inner join, left join, full join o right join y conceptualmente son así:
En este caso vamos a utilizar left_join() porque queremos mantener “intacta” nuestra base resumen y sumarle toda la información de la base de población.
resumir <- left_join(resumir, poblacion, by=c("domicilio_barrio"="BARRIO"))
head(resumir)
## # A tibble: 6 x 5
## domicilio_barrio cantidad COMUNA POBLACION AREA
## <fct> <int> <fct> <int> <dbl>
## 1 Agronomia 358 Comuna 15 13912 2.12
## 2 Almagro 1812 Comuna 5 131699 4.05
## 3 Balvanera 1593 Comuna 3 138926 4.34
## 4 Barracas 1572 Comuna 4 89452 7.95
## 5 Belgrano 2675 Comuna 13 126267 8
## 6 Boca 316 Comuna 4 45113 5.04
Tal como queríamos, ahora tenemos el listado de barrios con la cantidad de reclamos, la población y la superficie. Con esto ya podemos calcular la densidad con mutate():
resumir <- mutate(resumir, densidad_pob=cantidad/POBLACION)
head(resumir)
## # A tibble: 6 x 6
## domicilio_barrio cantidad COMUNA POBLACION AREA densidad_pob
## <fct> <int> <fct> <int> <dbl> <dbl>
## 1 Agronomia 358 Comuna 15 13912 2.12 0.0257
## 2 Almagro 1812 Comuna 5 131699 4.05 0.0138
## 3 Balvanera 1593 Comuna 3 138926 4.34 0.0115
## 4 Barracas 1572 Comuna 4 89452 7.95 0.0176
## 5 Belgrano 2675 Comuna 13 126267 8 0.0212
## 6 Boca 316 Comuna 4 45113 5.04 0.00700
Dejemos solo 2 decimales y ordenemos los datos de mayor a menor de acuerdo a la variable densidad_pob:
resumir <- mutate(resumir, densidad_pob=round(cantidad/POBLACION,2))
resumir <- arrange(resumir, desc(densidad_pob))
head(resumir)
## # A tibble: 6 x 6
## domicilio_barrio cantidad COMUNA POBLACION AREA densidad_pob
## <fct> <int> <fct> <int> <dbl> <dbl>
## 1 Puerto Madero 759 Comuna 1 6726 5.04 0.11
## 2 Agronomia 358 Comuna 15 13912 2.12 0.03
## 3 Chacarita 857 Comuna 15 27761 3.12 0.03
## 4 Parque Chas 494 Comuna 15 17489 1.39 0.03
## 5 Villa Del Parque 1582 Comuna 11 55273 3.4 0.03
## 6 Villa Devoto 2014 Comuna 11 66521 6.4 0.03
En el resultado se puede ver que el barrio con la mayor cantidad de reclamos por habitante es Puerto Madero. Esto seguramente se deba a que hay muy pocos habitantes en este Barrio. Veamos que pasa con densidad por hectárea:
resumir <- mutate(resumir, densidad_ha=round(cantidad/AREA,2))
resumir <- arrange(resumir, desc(densidad_ha))
head(resumir)
## # A tibble: 6 x 7
## domicilio_barrio cantidad COMUNA POBLACION AREA densidad_pob densidad_ha
## <fct> <int> <fct> <int> <dbl> <dbl> <dbl>
## 1 San Cristobal 1045 Comuna 3 48611 2.04 0.02 512.
## 2 Villa Del Parque 1582 Comuna 11 55273 3.4 0.03 465.
## 3 Almagro 1812 Comuna 5 131699 4.05 0.01 447.
## 4 Villa Crespo 1583 Comuna 15 81959 3.62 0.02 437.
## 5 Caballito 2865 Comuna 6 176076 6.85 0.02 418.
## 6 Villa Santa Rita 896 Comuna 11 33325 2.15 0.03 417.
El Barrio con más densidad de reclamos por hectárea es San Cristóbal, seguido por Villa del Parque.
Como verán, en este caso queríamos dividir y por eso usamos / pero para hacer cálculos entre variables numéricas también podríamos utilizar:
Llegamos al final de la clase, ya vimos varias funciones por separado, pero ¿Qué pasa si queremos aplicar varias a la vez dentro del mismo chunk? ¿Cómo podemos hacerlo?
En este caso debemos usar el operador pipe (%>%) Ctrl+Shift+M que sirve para encadenar funciones, y en vez de realizar una por una, poder realizar todas juntas.
Veamos algunos ejemplos:
Imaginemos que necesitamos calcular cuál es el Top 10 de categorías registradas por canal para la Comuna 11 (mayor cantidad de reclamos). Así lo tenemos que hacer según lo aprendido hasta ahora:
concatenar <- filter(suaci_202110, domicilio_comuna=="Comuna 11")
concatenar <- group_by(concatenar, canal, categoria)
concatenar <- summarise(concatenar, cantidad=n())
concatenar <- arrange(concatenar, desc(cantidad))
head(concatenar, 10)
## # A tibble: 10 x 3
## # Groups: canal [4]
## canal categoria cantidad
## <fct> <fct> <int>
## 1 App BA 147 LIMPIEZA Y RECOLECCIÓN 1132
## 2 GCS Web LIMPIEZA Y RECOLECCIÓN 1061
## 3 App Denuncia Vial TRÁNSITO 703
## 4 App BA 147 TRÁNSITO 405
## 5 Boti TRÁNSITO 280
## 6 GCS Web CALLES Y VEREDAS 263
## 7 App BA 147 CALLES Y VEREDAS 182
## 8 GCS Web ARBOLADO Y ESPACIOS VERDES 148
## 9 App BA 147 ARBOLADO Y ESPACIOS VERDES 145
## 10 Boti LIMPIEZA Y RECOLECCIÓN 133
Con lo aprendido hasta ahora pudimos llegar perfectamente al resultado esperado: Vemos que el Top 10 es encabezado por registros sobre Limpieza y recolección vía la App BA 147. Pero, fueron muchas líneas de código. Y si quisiésemos entrar más en detalle (sumar filtros, agrupaciones, etc) deberíamos escribir bastantes más. Pero quédense tranquilos que desde R podemos concatenar las funciones y simplificar el código dentro del chunk.
Esto lo logramos con el pipe (%>%) de la siguiente forma:
concatenar <- suaci_202110 %>%
filter(domicilio_comuna=="Comuna 11") %>%
group_by(canal, categoria) %>%
summarise(cantidad=n()) %>%
arrange(desc(cantidad))
head(concatenar, 10)
## # A tibble: 10 x 3
## # Groups: canal [4]
## canal categoria cantidad
## <fct> <fct> <int>
## 1 App BA 147 LIMPIEZA Y RECOLECCIÓN 1132
## 2 GCS Web LIMPIEZA Y RECOLECCIÓN 1061
## 3 App Denuncia Vial TRÁNSITO 703
## 4 App BA 147 TRÁNSITO 405
## 5 Boti TRÁNSITO 280
## 6 GCS Web CALLES Y VEREDAS 263
## 7 App BA 147 CALLES Y VEREDAS 182
## 8 GCS Web ARBOLADO Y ESPACIOS VERDES 148
## 9 App BA 147 ARBOLADO Y ESPACIOS VERDES 145
## 10 Boti LIMPIEZA Y RECOLECCIÓN 133
Como verán, en ambos casos llegamos al mismo resultado, pero sin dudas, la segunda opción es la recomendable porque nos ahorramos varias líneas de código y resultados intermedios.
¡Ahora les toca practicar a uds!