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()

Sobre el dataset

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 ...

Concatenar funciones

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

Resumir datos por grupos

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.

Condicionales

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.

Substracciones

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

Uniones

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

Tablas pivot

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.

Conclusión

Existen muchas funciones dentro de la colección tidyverse. ¡Los invito a seguir explorandolas!