La limpieza y el preprocesamiento de los datos es una tarea fundamentamental del científico de datos. Para realizar un preprocesamiento de la información podemos utilizar principalmente la librería dplyr que forma parte de la colección tidyverse. Recuerden instalar previamente la librería con install.packages()
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.3 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.3.1 ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
A continuación, vamos a utilizar un dataset sobre los barrios populares relevados por el Registro Nacional de Barrios Populares (RENABAP). Los datos originales fueron descargados desde el portal de datos abiertos de Argentina.
Sobre el dataset original se incorporó información sobre la pertenencia y la distancia a los 31 aglomerados urbanos definidos en la Encuesta Permanente de Hogares (EPH) por el INDEC. La incorporación de esta información se realizó mediante un geoproceso de superposición. La definición de los aglomerados urbanos se realizó con la información del Censo 2010, siguiendo la metodología de la OECD publicada en 2012.
barrios_populares <- read.csv("https://github.com/paulavidela/utdt_cienciadedatos/raw/main/data/barrios_renabap_utdt.csv", stringsAsFactors = TRUE)
Exploremos el dataset
names(barrios_populares)
## [1] "id" "origen_listado"
## [3] "origen_provincia" "departamento"
## [5] "localidad" "municipio"
## [7] "nombre" "nombre2"
## [9] "familias" "anio_creacion"
## [11] "superficie_m2" "clasificacion"
## [13] "situacion_dominial" "tipo_tierra"
## [15] "tipo_estado" "electricidad"
## [17] "cloaca" "agua"
## [19] "cocina" "calefaccion"
## [21] "precariedad" "pertenece_aglomerado"
## [23] "aglomerado_pertenecia" "aglomerado_mas_prox"
## [25] "distancia_aglomerado_prox" "poligono"
El dataset cuenta con 26 variables que determinan particularidades de cada barrio popular.
str(barrios_populares)
## 'data.frame': 4416 obs. of 26 variables:
## $ id : int 4139 3871 3430 3702 4037 3665 3675 3550 3640 3119 ...
## $ origen_listado : Factor w/ 5 levels "BUENOS AIRES",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ origen_provincia : Factor w/ 24 levels "Buenos Aires",..: 24 14 13 9 21 8 8 4 8 8 ...
## $ departamento : Factor w/ 243 levels "12 de Octubre",..: 62 198 103 170 90 231 100 23 101 57 ...
## $ localidad : Factor w/ 607 levels "25 De Mayo","Abasto",..: 451 222 217 148 420 121 215 402 216 122 ...
## $ municipio : Factor w/ 361 levels "25 de Mayo","25 De Mayo",..: 268 138 137 92 247 76 135 237 136 77 ...
## $ nombre : Factor w/ 3320 levels "11 de Septiembre y Bruguetti",..: 2466 565 1122 1055 1861 1679 2734 2224 1801 2218 ...
## $ nombre2 : Factor w/ 1353 levels "-","...",".17 de noviembre //",..: NA NA NA NA NA NA NA NA NA NA ...
## $ familias : int 150 30 10 250 80 180 200 20 10 300 ...
## $ anio_creacion : int NA 2010 2011 NA NA NA NA 2015 2014 NA ...
## $ superficie_m2 : int 159762 19255 15354 190242 25372 64185 51537 29569 4105 149075 ...
## $ clasificacion : Factor w/ 2 levels "Asentamiento",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ situacion_dominial : Factor w/ 3 levels "La mayoría de los vecinos cuentan con boleto de compra-venta, pero no tienen título.",..: 3 1 3 1 1 3 3 1 3 3 ...
## $ tipo_tierra : Factor w/ 2 levels "Mayoritariamente fiscales",..: 2 1 1 1 1 2 1 1 1 2 ...
## $ tipo_estado : Factor w/ 3 levels "Municipal","Nacional",..: NA 3 3 1 1 NA 1 3 1 NA ...
## $ electricidad : Factor w/ 9 levels "Acceso formal con consumo limitado",..: 4 4 4 3 3 3 3 4 4 4 ...
## $ cloaca : Factor w/ 8 levels "Baño seco","Conexión formal a la red cloacal pública",..: 6 6 6 6 6 6 6 6 6 4 ...
## $ agua : Factor w/ 12 levels "Acarreo de baldes y/o bidones desde fuera del barrio",..: 8 8 8 8 8 8 8 8 8 8 ...
## $ cocina : Factor w/ 5 levels "Conexión formal al gas natural de red pública",..: 4 5 4 4 4 4 4 4 4 5 ...
## $ calefaccion : Factor w/ 6 levels "Conexión formal al gas natural de red pública",..: 6 6 4 3 3 4 6 3 4 6 ...
## $ precariedad : Factor w/ 3 levels "Altamente precario",..: 3 1 1 3 3 1 3 3 1 1 ...
## $ pertenece_aglomerado : Factor w/ 2 levels "no","si": 1 1 2 1 1 1 1 1 1 1 ...
## $ aglomerado_pertenecia : Factor w/ 31 levels "Bahía Blanca - Cerri",..: NA NA 19 NA NA NA NA NA NA 3 ...
## $ aglomerado_mas_prox : Factor w/ 31 levels "Bahía Blanca - Cerri",..: 15 21 19 5 11 3 27 22 27 3 ...
## $ distancia_aglomerado_prox: num 7.6 71 7 122 199.9 ...
## $ poligono : Factor w/ 4416 levels "MultiPolygon (((-53.64191333073934942 -26.24920989317330111, -53.64220007151796921 -26.24914391741893738, -53.6"| __truncated__,..: 3452 155 4175 2336 2370 764 2321 3404 1224 576 ...
De la estructura del dataset podemos observar que las variables ‘nombre’ y ‘nombre2’ parecerían ser de texto libre: se observan muchos niveles.
Vamos a transformar las dos variables en texto libre con la función mutate() y as.character(). También vamos a quitar la variable ‘poligono’ con la función select().
barrios_populares1 <- mutate(barrios_populares,
nombre = as.character(nombre),
nombre2 = as.character(nombre2))
barrios_populares1 <- select(barrios_populares1, -poligono)
Veamos el resultado
str(barrios_populares1)
## 'data.frame': 4416 obs. of 25 variables:
## $ id : int 4139 3871 3430 3702 4037 3665 3675 3550 3640 3119 ...
## $ origen_listado : Factor w/ 5 levels "BUENOS AIRES",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ origen_provincia : Factor w/ 24 levels "Buenos Aires",..: 24 14 13 9 21 8 8 4 8 8 ...
## $ departamento : Factor w/ 243 levels "12 de Octubre",..: 62 198 103 170 90 231 100 23 101 57 ...
## $ localidad : Factor w/ 607 levels "25 De Mayo","Abasto",..: 451 222 217 148 420 121 215 402 216 122 ...
## $ municipio : Factor w/ 361 levels "25 de Mayo","25 De Mayo",..: 268 138 137 92 247 76 135 237 136 77 ...
## $ nombre : chr "Progreso" "Barrio Solar" "El Eucalipto" "Dos de Abril" ...
## $ nombre2 : chr NA NA NA NA ...
## $ familias : int 150 30 10 250 80 180 200 20 10 300 ...
## $ anio_creacion : int NA 2010 2011 NA NA NA NA 2015 2014 NA ...
## $ superficie_m2 : int 159762 19255 15354 190242 25372 64185 51537 29569 4105 149075 ...
## $ clasificacion : Factor w/ 2 levels "Asentamiento",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ situacion_dominial : Factor w/ 3 levels "La mayoría de los vecinos cuentan con boleto de compra-venta, pero no tienen título.",..: 3 1 3 1 1 3 3 1 3 3 ...
## $ tipo_tierra : Factor w/ 2 levels "Mayoritariamente fiscales",..: 2 1 1 1 1 2 1 1 1 2 ...
## $ tipo_estado : Factor w/ 3 levels "Municipal","Nacional",..: NA 3 3 1 1 NA 1 3 1 NA ...
## $ electricidad : Factor w/ 9 levels "Acceso formal con consumo limitado",..: 4 4 4 3 3 3 3 4 4 4 ...
## $ cloaca : Factor w/ 8 levels "Baño seco","Conexión formal a la red cloacal pública",..: 6 6 6 6 6 6 6 6 6 4 ...
## $ agua : Factor w/ 12 levels "Acarreo de baldes y/o bidones desde fuera del barrio",..: 8 8 8 8 8 8 8 8 8 8 ...
## $ cocina : Factor w/ 5 levels "Conexión formal al gas natural de red pública",..: 4 5 4 4 4 4 4 4 4 5 ...
## $ calefaccion : Factor w/ 6 levels "Conexión formal al gas natural de red pública",..: 6 6 4 3 3 4 6 3 4 6 ...
## $ precariedad : Factor w/ 3 levels "Altamente precario",..: 3 1 1 3 3 1 3 3 1 1 ...
## $ pertenece_aglomerado : Factor w/ 2 levels "no","si": 1 1 2 1 1 1 1 1 1 1 ...
## $ aglomerado_pertenecia : Factor w/ 31 levels "Bahía Blanca - Cerri",..: NA NA 19 NA NA NA NA NA NA 3 ...
## $ aglomerado_mas_prox : Factor w/ 31 levels "Bahía Blanca - Cerri",..: 15 21 19 5 11 3 27 22 27 3 ...
## $ distancia_aglomerado_prox: num 7.6 71 7 122 199.9 ...
Como pueden ver, para obtener el dataset barrios_populares1 realizamos 2 operaciones sobre el dataset original, una a continuación de la otra. Para esto, necesitamos realizar 2 líneas de código. Si bien el código es correcto, podría estar mejor diseñado: estas operaciones se podrían realizar en la misma línea de códico concatenando funciones.
¿Cómo concatenamos funciones? Es simple! Se utiliza un operador (un nexo conector) que se llama ‘pipe’ y se escribe %>%. Este operador forma parte de la librería magrittr que forma parte de la colección tidyverse.
barrios_populares2 <- barrios_populares %>%
mutate(nombre = as.character(nombre),
nombre2 = as.character(nombre2)) %>%
select(-poligono)
Veamos los resultados
str(barrios_populares2)
## 'data.frame': 4416 obs. of 25 variables:
## $ id : int 4139 3871 3430 3702 4037 3665 3675 3550 3640 3119 ...
## $ origen_listado : Factor w/ 5 levels "BUENOS AIRES",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ origen_provincia : Factor w/ 24 levels "Buenos Aires",..: 24 14 13 9 21 8 8 4 8 8 ...
## $ departamento : Factor w/ 243 levels "12 de Octubre",..: 62 198 103 170 90 231 100 23 101 57 ...
## $ localidad : Factor w/ 607 levels "25 De Mayo","Abasto",..: 451 222 217 148 420 121 215 402 216 122 ...
## $ municipio : Factor w/ 361 levels "25 de Mayo","25 De Mayo",..: 268 138 137 92 247 76 135 237 136 77 ...
## $ nombre : chr "Progreso" "Barrio Solar" "El Eucalipto" "Dos de Abril" ...
## $ nombre2 : chr NA NA NA NA ...
## $ familias : int 150 30 10 250 80 180 200 20 10 300 ...
## $ anio_creacion : int NA 2010 2011 NA NA NA NA 2015 2014 NA ...
## $ superficie_m2 : int 159762 19255 15354 190242 25372 64185 51537 29569 4105 149075 ...
## $ clasificacion : Factor w/ 2 levels "Asentamiento",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ situacion_dominial : Factor w/ 3 levels "La mayoría de los vecinos cuentan con boleto de compra-venta, pero no tienen título.",..: 3 1 3 1 1 3 3 1 3 3 ...
## $ tipo_tierra : Factor w/ 2 levels "Mayoritariamente fiscales",..: 2 1 1 1 1 2 1 1 1 2 ...
## $ tipo_estado : Factor w/ 3 levels "Municipal","Nacional",..: NA 3 3 1 1 NA 1 3 1 NA ...
## $ electricidad : Factor w/ 9 levels "Acceso formal con consumo limitado",..: 4 4 4 3 3 3 3 4 4 4 ...
## $ cloaca : Factor w/ 8 levels "Baño seco","Conexión formal a la red cloacal pública",..: 6 6 6 6 6 6 6 6 6 4 ...
## $ agua : Factor w/ 12 levels "Acarreo de baldes y/o bidones desde fuera del barrio",..: 8 8 8 8 8 8 8 8 8 8 ...
## $ cocina : Factor w/ 5 levels "Conexión formal al gas natural de red pública",..: 4 5 4 4 4 4 4 4 4 5 ...
## $ calefaccion : Factor w/ 6 levels "Conexión formal al gas natural de red pública",..: 6 6 4 3 3 4 6 3 4 6 ...
## $ precariedad : Factor w/ 3 levels "Altamente precario",..: 3 1 1 3 3 1 3 3 1 1 ...
## $ pertenece_aglomerado : Factor w/ 2 levels "no","si": 1 1 2 1 1 1 1 1 1 1 ...
## $ aglomerado_pertenecia : Factor w/ 31 levels "Bahía Blanca - Cerri",..: NA NA 19 NA NA NA NA NA NA 3 ...
## $ aglomerado_mas_prox : Factor w/ 31 levels "Bahía Blanca - Cerri",..: 15 21 19 5 11 3 27 22 27 3 ...
## $ distancia_aglomerado_prox: num 7.6 71 7 122 199.9 ...
¡Los dos datasets son iguales! ¿Cuál es la ventaja de usar el operador? Al concatenar funciones dentro de una misma línea de código, el código es más fácil de comprender por terceros (o por uno mismo en el futuro). Además, se generan menos pasos intermedios, y eventualmente menos objetos intermedios. Vamos a realizar un resumen estadístico con el nuevo dataset.
summary(barrios_populares2)
## id origen_listado origen_provincia
## Min. : 1 BUENOS AIRES : 283 Buenos Aires:1726
## 1st Qu.:1200 FICHA BARRIOS :1353 Santa Fe : 341
## Median :2334 RENABAP : 437 Misiones : 268
## Mean :2344 TECHO :1868 Chaco : 263
## 3rd Qu.:3506 TECHO / BUENOS AIRES: 475 Mendoza : 247
## Max. :5005 Tucumán : 203
## (Other) :1368
## departamento localidad municipio
## Capital : 471 Córdoba Capital : 124 La Plata : 153
## San Fernando: 183 Rosario : 112 La Matanza : 129
## Rosario : 159 Resistencia : 88 Córdoba Capital: 124
## La Plata : 153 San Miguel De Tucumán: 71 Rosario : 112
## La Matanza : 129 Posadas : 69 Moreno : 92
## Moreno : 98 Corrientes : 57 Resistencia : 88
## (Other) :3223 (Other) :3895 (Other) :3718
## nombre nombre2 familias anio_creacion
## Length:4416 Length:4416 Min. : 8.0 Min. :1900
## Class :character Class :character 1st Qu.: 36.0 1st Qu.:1980
## Mode :character Mode :character Median : 80.0 Median :2000
## Mean : 209.6 Mean :1993
## 3rd Qu.: 200.0 3rd Qu.:2010
## Max. :14000.0 Max. :2016
## NA's :1418
## superficie_m2 clasificacion
## Min. : 368 Asentamiento:3703
## 1st Qu.: 15891 Villa : 713
## Median : 41631
## Mean : 100599
## 3rd Qu.: 103507
## Max. :9896882
##
## situacion_dominial
## La mayoría de los vecinos cuentan con boleto de compra-venta, pero no tienen título. : 542
## La mayoría de los vecinos cuentan con otro tipo de seguridad de tenencia provista por el Estado. : 280
## La mayoría de los vecinos no tiene título de propiedad, ni boleto de compra-venta, ni ningún otro tipo de documento que dé seguridad en la tenencia.:3594
##
##
##
##
## tipo_tierra tipo_estado
## Mayoritariamente fiscales:1166 Municipal : 359
## Mayoritariamente privadas: 423 Nacional : 212
## NA's :2827 Provincial: 370
## NA's :3475
##
##
##
## electricidad
## Conexión irregular a la red pública :2744
## Conexión formal a la red pública de energía eléctrica con medidores domiciliarios. :1327
## Conexión a la red pública con medidor comunitario / social : 235
## No tiene conexión eléctrica : 52
## Acceso formal con consumo limitado : 32
## Conexión regular a la red pública con medidores domiciliarios pero sin boleta/factura: 22
## (Other) : 4
## cloaca
## Desagüe sólo a pozo negro/ciego u hoyo :3355
## Desagüe a cámara séptica y pozo ciego : 691
## Conexión irregular a la red cloacal pública: 111
## Red cloacal conectada al pluvial : 97
## Desagüe a intemperie o cuerpo de agua : 79
## Conexión formal a la red cloacal pública : 68
## (Other) : 15
## agua
## Conexión irregular a la red pública de agua corriente :2619
## Bomba de agua de pozo domiciliaria : 692
## Bomba de agua de pozo comunitaria : 243
## Conexión formal al agua corriente de red pública : 235
## Sin conexión formal al agua corriente de red pública (RPPVAP): 141
## (Other) : 485
## NA's : 1
## cocina
## Conexión formal al gas natural de red pública: 89
## Conexión irregular a la red de gas natural : 3
## Energía eléctrica : 25
## Gas en garrafa :3950
## Leña o carbón : 335
## NA's : 14
##
## calefaccion precariedad
## Conexión formal al gas natural de red pública: 34 Altamente precario: 806
## Conexión irregular a la red de gas natural : 3 Levemente precario: 558
## Energía eléctrica :1491 Precario :2408
## Gas en garrafa : 340 NA's : 644
## Inexistente : 337
## Leña o carbón :1521
## NA's : 690
## pertenece_aglomerado aglomerado_pertenecia
## no:2171 Gran Buenos Aires :1127
## si:2245 Gran Rosario : 158
## Gran La Plata : 155
## Gran Resistencia : 146
## Gran Tucuman - Tafi Viejo: 128
## (Other) : 899
## NA's :1803
## aglomerado_mas_prox distancia_aglomerado_prox
## Gran Buenos Aires :1269 Min. : 0.50
## Gran Resistencia : 273 1st Qu.: 6.50
## Posadas : 272 Median : 19.70
## Gran La Plata : 254 Mean : 51.22
## Mendoza : 239 3rd Qu.: 51.10
## Neuquen - Plottier: 232 Max. :449.60
## (Other) :1877
En nuestro dataset tenemos la cantidad de familias por barrio, y la pertenencia del barrio a una provincia. Queremos calcular la cantidad de familias viviendo en barrios informales por provincia. Para eso necesitaríamos sumar la cantidad de familias para cada provincia. Vamos a utilizar las funciones group_by() y summarise().
La función group_by() transforma el dataset en una tabla agrupada. No genera operaciones sobre los datos, sino que identifica grupos dentro del dataset original.
La función summarise() crea un nuevo dataset “resumido”. Si el dataset es una tabla agrupada, entonces realiza un resumen siguiendo los grupos. En caso de que haya variables de agrupación, el resumen se realiza de forma general (con todas las filas), resulando en una única fila.
En nuestro ejemplo, vamos a agrupar por la variable ‘origen_provincia’, y al resumir, vamos a sumar la cantidad de familias, a partir de la variable ‘familias’.
familias_por_provincia <- barrios_populares1 %>%
group_by(origen_provincia) %>%
summarise(total_familias = sum(familias))
head(familias_por_provincia)
## # A tibble: 6 × 2
## origen_provincia total_familias
## <fct> <int>
## 1 Buenos Aires 484045
## 2 Catamarca 3225
## 3 Chaco 32570
## 4 Chubut 5977
## 5 Ciudad Autónoma de Buenos Aires 73673
## 6 Córdoba 23030
Podemos ordenar los resultados por cantidad de familias de forma descendiente
head(arrange(familias_por_provincia, desc(total_familias)))
## # A tibble: 6 × 2
## origen_provincia total_familias
## <fct> <int>
## 1 Buenos Aires 484045
## 2 Ciudad Autónoma de Buenos Aires 73673
## 3 Santa Fe 72552
## 4 Misiones 41181
## 5 Tucumán 34847
## 6 Chaco 32570
Nos gustaría sumar información al dataset por provincia: ¿cuántos barrios se relevaron en cada provincia? ¿en qué año se estableció el primer barrio en cada provincia? ¿cuál es la superficie del barrio grande de cada provincia? ¿Cuántes familias viven en promedio en los barrios de cada provincia? Estas preguntas pueden responderse incorporando variables dentro de la función summarise(). Por ejemplo, la función n() nos permite realizar un conteo de observaciones.
Nota: dado que hay muchos valores NA en la variable ‘anio_creacion’, vamos a omitir estos valores al resumir los datos. Para ello, incorporamos el siguiente parámetor: na.rm =TRUE
resumen_provincial <- barrios_populares1 %>%
group_by(origen_provincia) %>%
summarise(total_familias = sum(familias),
cantidad_barrios = n(),
anio_inicial = min(anio_creacion, na.rm = TRUE),
sup_max = max(superficie_m2),
prom_fam_barrio = mean(familias))
Veamos el dataset completo (solo son 24 observaciones)
resumen_provincial
## # A tibble: 24 × 6
## origen_provincia total_familias cantidad_barrios anio_inicial sup_max
## <fct> <int> <int> <int> <int>
## 1 Buenos Aires 484045 1726 1900 2092457
## 2 Catamarca 3225 32 2010 157348
## 3 Chaco 32570 263 1900 931712
## 4 Chubut 5977 56 2000 1099797
## 5 Ciudad Autónoma de Buen… 73673 57 1930 414769
## 6 Córdoba 23030 194 1900 1168743
## 7 Corrientes 17956 120 1922 1292974
## 8 Entre Ríos 18010 169 1995 511417
## 9 Formosa 18594 86 1914 1155234
## 10 Jujuy 10577 92 2010 502500
## # … with 14 more rows, and 1 more variable: prom_fam_barrio <dbl>
Vemos por ejemplo que Santa Cruz se registró más recientemente la creación del primer barrio popular, o que Misiones tiene el barrio popular de mayor extensión.
Podemos utilizar varias funciones para escribir condicionales. Vamos a utilizar 2 funciones: if_else() y case_when().
Vamos a utilizar las dos funciones dentro de la función mutate() ya que queremos modificar el dataset.
La función if_else() permite establecer una condición, si la condición se cumple asignar un valor, y si no se cumple, asignar otro.
Vamos a calcular cuantos barrios fueron creados en este siglo, y cuantos en el siglo anterior.
barrios_populares1<- barrios_populares1 %>%
mutate(siglo = if_else(anio_creacion >= 2000, "Siglo XXI", "Siglo XX"))
Hagamos un resumen agrupando por siglo
barriosxsiglo <- barrios_populares1 %>%
group_by(siglo) %>%
summarise(cantidad = n())
head(barriosxsiglo)
## # A tibble: 3 × 2
## siglo cantidad
## <chr> <int>
## 1 Siglo XX 1485
## 2 Siglo XXI 1513
## 3 NA 1418
Observamos que durante los 100 años del siglo XX se crearon menos barrios populares, que en los 16 años del siglo XXI (el relevamiento de barrios se realizó en 2016). ¿Qué podemos suponer de los barrios sin año de creación?
Otra función para generar condicionales es la función case_when(). Esta función permite establecer varias condiciones. Si la primer condición no se cumple, evaluar la siguiente.
Vamos a establecer la década de creación de los barrios.
barrios_populares1 <- barrios_populares1 %>%
mutate(decada = case_when(
anio_creacion < 1910 ~ "Década 1900",
anio_creacion < 1920 ~ "Década 1910",
anio_creacion < 1930 ~ "Década 1920",
anio_creacion < 1940 ~ "Década 1930",
anio_creacion < 1950 ~ "Década 1940",
anio_creacion < 1960 ~ "Década 1950",
anio_creacion < 1970 ~ "Década 1960",
anio_creacion < 1980 ~ "Década 1970",
anio_creacion < 1990 ~ "Década 1980",
anio_creacion < 2000 ~ "Década 1990",
anio_creacion < 2010 ~ "Década 2000",
anio_creacion < 2020 ~ "Década 2010",
is.na(anio_creacion) ~ "Sin datos"
))
Veamos los resultados en una tabla para visualizar la cantidad de barrios según año de creación.
table(barrios_populares1$decada)
##
## Década 1900 Década 1910 Década 1920 Década 1930 Década 1940 Década 1950
## 8 16 10 32 50 97
## Década 1960 Década 1970 Década 1980 Década 1990 Década 2000 Década 2010
## 189 236 397 450 701 812
## Sin datos
## 1418
En cada década se incrementa la cantidad de barrios que se originan. La década 2010 está incompleta ya que los barrios fueron relevados en 2016.
Notamos que la palabra ‘Siglo’ dentro de la variable siglo reitera información. Podemos recortar las variables de tipo caracter de acuerdo a la posición de cada caracter. En este caso, vamos a quitar ‘Siglo’, es decir que vamos a mantener desde la posición 6 hasta el final. Como no sabemos la posición final, ya que el largo del texto varía según si es siglo XXI (9 posiciones) o siglo XX (8 posiciones), vamos a utilizar la función nchar() para que cuente la cantidad de caracteres en cada texto. Para realizar la operación de sustracción, utilizamos la función substr() dentro de la función mutate() dado que vamos a generar una nueva variable.
barrios_substr <- barrios_populares1 %>%
mutate(siglo_ok = substr(siglo, #nombre de la variable
6, #posición inicial,
nchar(siglo))) #posición final
Veamos el resultado en una tabla resumen.
table(barrios_substr$siglo_ok)
##
## XX XXI
## 1485 1513
Previamente generamos un dataset con la cantidad de familias viviendo en barrios vulnerables por provincia. Nos gustaría entender que porcentaje de la población de cada provincia vive en barrios vulnerables.
Para ello, vamos a cargar otro dataset que contiene la población estimada por provincia para los años 2015, 2016, y 2017. Los datos fueron obtenidos de INDEC, de las estimaciones anuales realizadas por provincia.
pob_prov <- read.csv("https://github.com/paulavidela/utdt_cienciadedatos/raw/main/data/poblacion_provincia.csv")
Exploremos el dataset
head(pob_prov)
## provincia a_2015 a_2016 a_2017
## 1 Buenos Aires 16659931 16841135 17020012
## 2 Catamarca 396895 400678 404433
## 3 Chaco 1143201 1155723 1168165
## 4 Chubut 566922 577466 587956
## 5 Ciudad Autónoma de Buenos Aires 3054267 3059122 3063728
## 6 Córdoba 3567654 3606540 3645321
La función principal del Registro Nacional de Barrios Populares (RENABAP), según el decreto nacional 358/17, será registrar los bienes inmuebles ya sean de propiedad fiscal o de particulares donde se asientan los barrios populares, las construcciones existentes en dichos barrios y los datos de las personas que habitan en ellas, al 31 de diciembre de 2016. Dado que considera el año 2016, vamos a utilizar ese año para estimar el porcentaje de población que habita en barrios populares por provincia. ¿Cómo podemos unir los dos datasets?
Como en otros casos, podemos utilizar muchas funciones. En este ejemplo, vamos a utilizar la función: left_join.
Esta función permite “unir” (join) dos tablas, manteniendo los registros de la tabla izquierda y uniendolos (según una o más variables) a la tabla de la derecha. Si la tabla de la derecha tiene valores que no existen en la tabla izquierda, esos valores se pierden.
Existen otras funciones similares como inner_join, full_join o right_join que permiten diferentes tipos de uniones. Un ejemplo a continuación:
Ejemplo de funciones ‘join’
Dentro de la función left_join tenemos que seleccionar las tablas que vamos unir, y aclarar el parámetro por el cual vamos a unir las tablas. En este caso, en la tabla pob_prov la variable que contiene el nombre de la provincia se llama ‘provincia’, mientras que en la tabla resumen_provincial, la variable se llama ‘origen_provincia’
datos_provincia <- left_join(pob_prov, #tabla izquierda
resumen_provincial, #tabla derecha
by = c("provincia" = "origen_provincia") #parámetro de unión
)
Si en ambas columnas la variable se llamase igual, por ejemplo ‘nombre_prov’, el parámetro by se podría simplificar de la siguiente manera: by = "nombre_prov"
Veamos la nueva tabla
head(datos_provincia)
## provincia a_2015 a_2016 a_2017 total_familias
## 1 Buenos Aires 16659931 16841135 17020012 484045
## 2 Catamarca 396895 400678 404433 3225
## 3 Chaco 1143201 1155723 1168165 32570
## 4 Chubut 566922 577466 587956 5977
## 5 Ciudad Autónoma de Buenos Aires 3054267 3059122 3063728 73673
## 6 Córdoba 3567654 3606540 3645321 23030
## cantidad_barrios anio_inicial sup_max prom_fam_barrio
## 1 1726 1900 2092457 280.4432
## 2 32 2010 157348 100.7812
## 3 263 1900 931712 123.8403
## 4 56 2000 1099797 106.7321
## 5 57 1930 414769 1292.5088
## 6 194 1900 1168743 118.7113
Ahora vamos a calcular el ratio entre la cantidad de familias en barrios populares y la población estimada para el año 2016.
datos_provincia <- datos_provincia %>%
mutate(ratio = total_familias/a_2016)
Realicemos un resumen de nuestros datos:
summary(datos_provincia$ratio)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0006759 0.0076330 0.0146494 0.0158752 0.0246858 0.0341983
¿Cuales son las 5 provincias con mayor ratio de familias viviendo en barrios populares?
datos_provincia %>%
arrange(desc(ratio)) %>%
rename(pob_prov_2016 = a_2016 ) %>%
select(provincia, pob_prov_2016, total_familias, ratio) %>%
head(5)
## provincia pob_prov_2016 total_familias ratio
## 1 Misiones 1204182 41181 0.03419832
## 2 Formosa 584614 18594 0.03180560
## 3 Buenos Aires 16841135 484045 0.02874183
## 4 Chaco 1155723 32570 0.02818149
## 5 Tierra del Fuego 156509 4364 0.02788338
Ahora queremos entender el tipo de precariedad de los barrios populares según el aglomerado de pertenencia. Vamos a entonces agrupar y resumir realizando un conteo por las variables ‘aglomerado_pertenecia’ y ‘precariedad’.
precariedad_aglom <- barrios_populares1 %>%
group_by(aglomerado_pertenecia, precariedad) %>%
summarise(cantidad = n())
## `summarise()` has grouped output by 'aglomerado_pertenecia'. You can override using the `.groups` argument.
Veamos el resultado
head(precariedad_aglom, 10)
## # A tibble: 10 × 3
## # Groups: aglomerado_pertenecia [4]
## aglomerado_pertenecia precariedad cantidad
## <fct> <fct> <int>
## 1 Bahía Blanca - Cerri Altamente precario 5
## 2 Bahía Blanca - Cerri Precario 3
## 3 Bahía Blanca - Cerri NA 12
## 4 Cdro. Rivadavia - R. Tilly Altamente precario 10
## 5 Cdro. Rivadavia - R. Tilly Levemente precario 2
## 6 Cdro. Rivadavia - R. Tilly Precario 18
## 7 Concordia Altamente precario 18
## 8 Concordia Precario 24
## 9 Corrientes Altamente precario 11
## 10 Corrientes Levemente precario 4
Si bien tenemos los datos, nos sería más fácil leer la tabla si cada nivel de precariedad fuese una columna. Esto implicaría transformala en una tabla más ancha. Cambiar las dimensiones de la tabla manteniendo los datos se conoce como “pivot”. Podemos pasar de una tabla ancha (muchas variables) a una más larga (con muchas observaciones), o viceversa.
Ejemplo de ‘pivot’
En este caso, queremos tener una tabla más ancha. Para eso, podemos usar la función pivot_wider().
precariedad_aglom_wider <- pivot_wider(precariedad_aglom,
names_from = precariedad, #nuevos nombres de las columnas
values_from = cantidad) #valores en las columnas
Veamos el resultado
head(precariedad_aglom_wider)
## # A tibble: 6 × 5
## # Groups: aglomerado_pertenecia [6]
## aglomerado_pertenecia `Altamente precario` Precario `NA` `Levemente prec…
## <fct> <int> <int> <int> <int>
## 1 Bahía Blanca - Cerri 5 3 12 NA
## 2 Cdro. Rivadavia - R. Tilly 10 18 NA 2
## 3 Concordia 18 24 NA NA
## 4 Corrientes 11 40 2 4
## 5 Formosa 6 22 NA 4
## 6 Gran Buenos Aires 78 496 333 220
Si quisiesemos una tablar más larga, podríamos usar la función pivot_longer()
precariedad_aglom_longer <- precariedad_aglom_wider %>%
pivot_longer(precariedad_aglom_wider,
cols = 2:5, #se establece que columnas son las afectadas
names_to = "tipo_precariedad", #variable que proviene de los nombres de las columnas
values_to = "cantidad") #variable que proviene del contenido de las columnas
## Warning in gsub(paste0("^", names_prefix), "", names(cols)): argument 'pattern'
## has length > 1 and only the first element will be used
Veamos el resultado
head(precariedad_aglom_longer )
## # A tibble: 6 × 3
## # Groups: aglomerado_pertenecia [2]
## aglomerado_pertenecia tipo_precariedad cantidad
## <fct> <chr> <int>
## 1 Bahía Blanca - Cerri Altamente precario 5
## 2 Bahía Blanca - Cerri Precario 3
## 3 Bahía Blanca - Cerri NA 12
## 4 Bahía Blanca - Cerri Levemente precario NA
## 5 Cdro. Rivadavia - R. Tilly Altamente precario 10
## 6 Cdro. Rivadavia - R. Tilly Precario 18
Obtenemos un dataset muy similar a nuestro dataset de origen.
Existen muchas funciones dentro de la colección tidyverse. ¡Los invito a seguir explorandolas!