1. INTRODUCCIÓN 2. ALGO TUVO QUE SUCEDER 2.1. ¿Por qué R? 2.2. Instalación 2.3. Conociendo la Interfaz 2.4. El directorio 2.5. Todo en R es un Objeto 2.6. Operadores 2.7. Tipos de datos 2.8. Funciones 2.9. Bibliotecas 3. PRIMER PROYECTO 3.1. Aproximación 3.2. Cargar datos 3.3. Explorando el dataframe 3.4. Transformación de datos 3.5. Nuestro primer mapa



1- INTRODUCCIÓN

Uno de los desafíos que nos planteamos al momento de diseñar este curso se vincula con las capacidades de sintetizar tres elementos centrales: el conocimiento teórico, la práctica y el contexto. Entre los motivos principales que impulsan el desarrollo de esta actividad se encuentra la falta de herramientas que tenemos las/los que participamos de las Ciencias Sociales para poder insertarnos en el campo de la investigación social ligados a los diseños cuantitativos y en las diferentes dimensiones del mercado de trabajo. En este sentido, las/los que organizamos este curso creemos que estas herramientas potencian el oficio dentro de este campo disciplinario.

También nos permite fijar una posición política al defender nuestro objeto de estudio, que se recorta en los acontecimientos y hechos sociales. De esta manera, creemos en el trabajo interdisciplinario para abordar estos acontecimientos, pero respetando las formaciones teóricas y prácticas de cada uno de los campos de estudios. Creemos, que las/los que formamos parte del campo sociales tenemos que conocer aunque sea de manera superficial y aproximada la lógica de procesamiento de la información que muchas veces es realizado por otros tipos de perfiles profesionales.

En sintesis, este curso está destinado a estudiantes y graduadas/os de las Ciencias Sociales que buscan conocer las lógicas de procesamiento, transformación y visualización de datos. Está construido por personas “amateurs”, que están lejos de conocer con profundidad el uso de estas herramientas. Creemos en la idea de un “aprendizaje colectivo”, que enriquezca nuestra formación, a través de compartir y crear un espacio de discusión sobre esta temática. Seguramente que, con las dudas, preguntas y experiencias que intercambiemos vamos a ir enriqueciendo el curso entre todas y todos.

Por último, los materiales van a estar disponibles para que puedan consultarlos y realizar el curso a los tiempos que ustedes consideren. La modalidad de cursado se divide en dos dimensiones: sincrónico y asincrónico. Con respecto a la primera, esperamos que puedan sumarse a las clases para participar de la parte “teórica” e intercambiar dudas y dificultades. La parte asincrónica consiste en una serie de guías y ejercicios prácticos para que también a su ritmo puedan ir resolviendo.

¡Bienvenidas/os y esperamos que tenga un buen transitar por el curso!


2- ALGO TUVO QUE SUCEDER
2.1. ¿Por qué R?

Porque es un lenguaje y desarrollo libre, que nos permite dar indicaciones dentro de un software, para el procesamiento y la visualización de grandes cantidades de datos. Esto favorece la apertura de nuevo horizontes y desafíos a las Ciencias Sociales. Cuando nos referimos a información, hablamos de: estadística cuando es generada por un diseño muestral o poblacional, registros administrativos vinculada a la administración pública (ejemplo el DNI, la SUBE, etc.) o de una empresa privada (Estados contables, etc), como así también al uso de información de alguna red social (twitter, etc), entre otros. Al ser gratuíto, cualquiera puede bajarse R y Rstudio para trabajar, nos libramos de la agobiante tarea de buscar esa verisión crackeada del software que necesitamos.

Pensemos que, hoy en día grandes dimensiones de nuestras vidas se encuentran atravesadas por la producción de información. Por ejemplo, cuando usamos nuestras redes sociales, seguramente todos esos datos producidos por nostros, se almacena en alguna base. Esta información, que en algunos casos está disponible y en otros no, puede ser un gran insumo para nuestras investigaciones, trabajos de campos, diseños de políticas públicas, etc. Desde las/los que construimos este curso, creemos en la necesidad de complementar los diseños cualitativos y cuantitativos a través de lo que se llama una triangulación metodológica.

Por esto, consideramos necesario empezar a formarnos como comunidad en el uso de estas herramientas, con el objetivo de potenciar nuestro oficio en este campo. Un ejemplo del potencial de esta herramienta, se observa cuando queremos analizar información que está en distintas fuentes, y tratamos de manera “artesanal” unir esa información. Muchas veces tienen una columna en común que facilita el trabajo con esas tablas (en poco tiempo podemos unir esa información, a diferencia del copiado y pegado artesanal que nos demora horas y horas).

Por todo esto elegimos R. Y por muchas otras razones que por cuestiones de limitación no enunciamos pero que van/vamos a ir descubriendo colectivamente.


2.2. Instalación

Como es lógico, empezamos con la instalación. A continuación, presentamos un instructivo, con el paso a paso de la instalación de R y Rstudio. Pero…, ¿son dos programas?. Sí. Primero, descargamos y ejecutamos el instalador de R. Este primer programa es la base sobre la que funciona RStudio.

R es el lenguaje (o el motor), RSudio la carcasa. Este último programa es un entorno de desarrollo integrado (IDE) para el lenguaje de programación R, dedicado a la computación estadística y a la representación gráfica. Este entorno incluye: una consola, editor de script, gestión del espacio de trabajo, entre otras muchas ventajas. En términos de las Ciencias Sociales, R es la estructura sobre la que se monta la superestructura RStudio.

Instructivo R y RStudio by Buceando R on Scribd



2.3. Conociendo la interfaz de Rstudio

Como comentamos antes RStudio es un entorno de desarrollo integrado (IDE) para R, no es el único, pero es el más usado y la verdad que es muy completo. La interfaz de RStudio se compone escencialmente de 4 ventanas o paneles:

  • Source: aquí abrimos los distintos tipos de archivos para escribir nuestras instrucciones y programas. El más común es el script de R, que no es más que un especie de bolck de notas que nos reconoce las palabras reservadas de R y nos ayuda a escribir con autocompletado y mucho más.

  • Console: es donde se ejecuta las instrucciones propiamente dichas y donde visualizamos los resultados de las mismas

  • Environment: fundamental, acá vemos todos los objetos que vamos creando. Por ejemplo, si levantamos una tabla, o definimos una variable (así por ejemplo edad <- 20) la vamos a ver en ese panel.

  • Por último, el panel en donde vemos, los archivos, gráficos, bibliotecas, ayudas y visualizador de objetos del tipo web.

Por otro lado, en la barra de superior encontramos un montón de ayudas y herramientas que nos permiten personalizar RStudio y que nos hacen la vida un poco más fácil.


2.4. El directorio

Una ley univiersal en este mundo: el primer error que vamos a encontrar es consecuencia de que no definimos correctamente el directorio de trabajo. ¿Qué es eso? Simple, es la carpeta desde donde R parte para para buscar los archivos que necesitemos. Esto es parte escencial del flujo de trabajo. Para eso, contamos con dos funciones básicas.

# Obtener el directorio de trabajo
getwd()

Corriendo esta función vamos a saber donde está R en ese momento y si lo queremos modificar, para establecer un nuevo punto lo hacemos otra función.

# Setear el directorio de trabajo
setwd("C:/Users/colis/Desktop")

Ahora tenemos el directorio de trabajo en el escritorio.

Otra opción muy interesante es trabajar con Rproject, una funcionalidad de Rstudio.


2.5. Todo en R es un Objeto

Cualquier cosa que existe en R y que tiene un nombre es un OBJETO: gráficos, números, vectores, funciones, secuencias, bases de datos, etc. Pero vayamos a un ejemplo práctico concreto.

Vamos a crear nuestro primer objeto: uno que se llame “weber” y que contenga la frase “Clásico de la sociología”. Para las/los que vienen de otros campos disciplinarios aclaramos que, como vamos a usarlos en otros ejercicios, Weber, Durkheim y Marx son los intelecturales fundadores de la Sociología.

Dos puntos muy importantes: R es sensible a los signos de puntuación, las mayúsculas y las minúsculas. A lo Paulina Cocina: “escriban a lo pelado”. Por ejemplo, weber sin mayúscula (sabemos que es un nombre propio). Seguramente a muchas/os de ustedes (nos pasó) les están sangrando los ojos, pero facilita un montón de cosas y les aseguramos que evitan otro montón de errores. Principalmente se aplica esta recomendación en los nombre de los objetos. Pero lo vamos a ir viendo paso a paso. No se preocupen.

#Todo es un objeto en R
weber <- "Clásico de la Sociología"
weber
## [1] "Clásico de la Sociología"

De manera sencilla, lo que realizamos utilizando el operador <- es asignar “Clásico de la Sociología” a weber. Cuando escribimos weber y corremos el código, la consola de RStudio nos devuelve “Clásico de la Sociología”.


2.6. Operadores

Vamos a introducirnos en los operadores básicos. Seguramente sean muy conocidos por ustedes. Pero experimentemos para que queden claro su uso. La mayor dificultad creemos está en identificar si el > o < es mayor o menor. ¿No les pasó que se ponen hasta nerviosos con esa situación?

Tipos de Operadores
Operadores Comparación Operadores Arirmeticos Operadores Lógicos
> Mayor + Suma ! Negación
>= Mayor o igual - Resta | O lógico
< Menor * Multiplicación & Y lógico
<= Menor o igual / División
== Igual ^ Portencia
!= Diferente
2.6.1 Operadores de comparación

A modo aburrido, los operadores de comparación generan un resultado a partir de que se cumpla o no una condición de comparar. Por ejemplo, queremos saber si Weber es igual a Marx. Recuerden que a Weber le asignamos la frase “Clásico de la Sociología”. Ahora creamos otro objeto que se llame Marx y le asignamos también “Clásico de la Sociología”. Posteriormente, pedimos que compare a Weber y a Marx para evaluar si son iguales.

#¿Marx igual a Weber?
marx <- "Clásico de la Sociología"
marx == weber
## [1] TRUE

Magia. Cuando comparamos a través del == (igual) a Marx y a Weber, nos devuelve TRUE. En pocas palabras, quiere decir que efectivamente Marx y Weber, que son objetos que nosotros construimos, son iguales. Pero, ¿por qué? Justamente, porque a los dos le asignamos la frase “Clásico de la Sociología”. Veamos que sucede con el operador lógico != (diferente de).

#¿Marx diferente a Weber?
marx!=weber
## [1] FALSE

Después de correr el código, nos está diciendo, a pedido nuestro (esto es muy importante: no hay nada que R corra si nosotras/os no lo indicamos), que Marx y Weber no son diferentes (FALSE). Recuerden que, lo que comparamos es la asignación que hicimos “Clásicos de la Sociología”. Veamos que sucede con los tediosos, pero muy útiles (como vamos a ver más adelante en el curso), > o <. Construimos dos nuevos objetos: uno el año de nacimiento de Marx y otro el año de nacimiento de Weber. Y la pregunta a la que queremos generar una respuesta es: ¿Quién nació antes?

#Años de nacimiento de Weber y Marx
nacimiento_ano_weber <- 1864
nacimiento_ano_marx <- 1818

#Comparación Nacimiento
nacimiento_ano_weber > nacimiento_ano_marx
## [1] TRUE
nacimiento_ano_weber<nacimiento_ano_marx
## [1] FALSE

La comparación resultó que Weber nació después de Marx. Simplemente, porque 1864 es mayor (>) a 1818 que es el año de nacimiento de Marx. Por esto, la primera comparación nos devolvió TRUE (Weber nació después de Marx) y la segunda FALSE (Weber nació antes que Marx).

A los operadores lógicos menor y mayor se los puede combinar con el igual <=(igual o menor)/>=(igual o mayor). Esto quiere decir que se incluye el valor en la condición. Por ejemplo si decimos > a 4 no incluimos el 4, pero si decimos >= incluimos el 4.

Parece tediosa esta parte, pero está muy relacionada con la lógica de funcionamiento de R. Y ahora en tono serio: sirven y mucho.

2.6.2 Operadores aritméticos

Este tipo de operadores, los usamos todo el tiempo en nuestra vida cotidiana: sumamos, restamos, dividimos, multiplicamos, etc. Veamos cómo funcionan los operadores aritméticos. En pocas palabra, R lo que hace es funcionar como una calculadora.

A continuación, les dejamos un resumen de las principales funciones:

#Suma
2+2
## [1] 4
#Resta
2-2
## [1] 0
#División
2/2
## [1] 1
#Múltiplicación
2*2
## [1] 4
#Potencia
2^2
## [1] 4

Veamos un ejemplo con un poco más de complejidad. Imaginense que son profesores y quieren sumar un punto más a todas/os las/los alumnos por su buen desenvolvimiento en los prácticos (nunca nos pasó pero no dejamos de ilusionarnos). Y lo quieren hacer de manera rápida. Para esto arman un objeto que se llama “notas alumnes”. En este objeto, ponen las calificaciones de los alumnas/os (8, 7, 8, 9, 8) y suman un punto más a cada nota. Veamos cómo se hace en R:

#Suma de un punto a todos los/las alumnas
notas_alumnes <- c(8,7,8,9,8)
notas_alumnes <- notas_alumnes + 1
notas_alumnes
## [1]  9  8  9 10  9

Después de sumar uno al objeto notas de los alumnes, nos devuelve todos los valores de las notas con un punto más. No queremos seguir aburriendo con los operadores. Pero sí, vayan practicando y encontrando la lógica del procesamiento de la información que realiza el softwate.

2.6.3 Operadores lógicos

Para culminar con los operadores más comunes que nos vamos a encontrar cuando demos nuestros primeros pasos con R, presentamos los operadores lógicos. Estos nos ayudan a evaluar una o más expresiones lógicas, es decir, los datos FALSE y TRUE. Bajemoslo a tierra con unos ejemplos:

#Negación
!(marx==weber)
## [1] FALSE
# Utilizamos el comparador y los lógicos
# Lo leemos como: marx es igual a weber Ó el nacimiento de ambos es igual
(marx==weber) | (nacimiento_ano_weber == nacimiento_ano_marx)
## [1] TRUE
# Utilizamos el comarador o lógicos
# Lo leemos como: marx es igual a weber y el nacimiento de ambos es igual
(marx==weber) & (nacimiento_ano_weber == nacimiento_ano_marx)
## [1] FALSE

Habiamos visto como utilizar los operadores de comparación marx y weber, el resultado era verdadero porque ambos ojetos los definimos como ‘Clásicos de la Sociología’. Entonces utilizamos el operador negación, como consecuencia el TRUE se convierte en FALSE. Luego utilizamos los operadores | o lógicos e & y lógicos. Para evaluar dos expresiones de verdadero o falso.

Por supuesto que estos ejemplos son de juguetes, pero van a ser claves en la medida que nos vayamos adentrando en este lenguaje.


2.7. Tipos de datos

Con los ejemplos que estuvimos viendo hasta el momento nos encontramos con tres tipos de datos escenciales. Los de texto, los númericos y los booleanos o lógicos. Esto parece obvio pero es muy oportuno explicitarlo. Para saber que clase de dato o de variable tenemos podemos verlos con la función class()

class(marx) 
## [1] "character"
class(nacimiento_ano_weber)
## [1] "numeric"
compara <- marx==weber
class(compara)
## [1] "logical"

Hicimos una variable que se llama compara que toma el valor TRUE porque, como habíamos visto antes es igual. De los numéricos, se desprenden otros tipos, pueden ser enteros como también tener decimales, dando nacimiento a los tipos INTEGER y FLOAT. Por último, mencionemos un tipo especial de dato, los FACTORS. Son un tipo particular de datos de texto, la diferencia es que le podemos otorgar un orden particular, lo cual es muy útil para trabajar con variables ordinales. Por ejemplo, una aplicación clara puede ser la respuesta de una encuesta cuyas opciones son: Muy bueno, bueno, regular, malo, muy malo. Las posibles respuestas son texto, pero sabemos que tienen un orden.


2.8. Funciones

Las funciones son un instrucciones (acciones) pre definidas, a la que se les asigna un nombre. Aceptan argumentos, es decir, especificaciones sobre cómo deben funcionar. Ejemplo de funciones: mean(), sd(), filter(), etc. Toman valores de entrada y nos devuelve un resultado. Ya sea modificar ese input, crear otro o lo que sea que querramos.

Hay un montón de funciones (miles y miles) que previamente un/a programador/a diseñó y están disponible para que nosotros/as las usemos. En R todo lo hacemos con funciones, y es muy difícil que no encontremos lo que necestiamos. En general tenemos el problema contrario, todo se puede hacer de múltiples maneras.

Lo mágico de R, es que en caso de que no encontremos lo que necesitamos o queremos algo que se adapte a nuestras necesidades, podemos definir nuestras propias funciones. Esto lo vamos a dejar para más adelante, pero está bueno mencionarlo, porque es el verdadero diferencial que nos ofrece R.

Retomemos nuestro objeto notas_alumnes para indagar sobre las estadísticas básicas. Para esto, utilizamos las funciones: mean(), sum(), median(), sd() var() y quantile(). Notemos que en todos los casos, entre parentesisi difinimos el objeto al que queremos aplicarle el calculo, como primer argumento. Además en el caso del percentil utilizamos la (,) para separar los argumentos y pasamos 0.90 al argumento probs para que nos de el percentil 90.

#Promedio del curso
mean(notas_alumnes)
## [1] 9
#Suma de las notas
sum(notas_alumnes)
## [1] 45
#Mediana
median(notas_alumnes)
## [1] 9
#Desvío estándar
sd(notas_alumnes)
## [1] 0.7071068
#Varianza
var(notas_alumnes)
## [1] 0.5
#Percentil 90
quantile(notas_alumnes, probs = 0.90)
## 90% 
## 9.6

¿Qué pasa si hacemos notas_alumnes/5? Si nosotros indicamos que haga notas_alumnos/5, el programa entiende que tiene que dividir cada una de las notas de los alumnos por 5. Por esto es importantes conocer la lógica de funcionamiento. Este comentario también, lo hacemos extensivos a cualquier software estadístico que utilicen. El resultado que nos devuelve no es lo que queríamos.


2.9. Biblioteca

Además de las funciones básicas que tiene R (se conoce como R base), se pueden instalar bibliotecas que agrupan un conjunto de diferentes funciones que favorecen algún área de la transformación y visualización de la información. Por ejemplo, el paquete ggplot2 tiene un conjunto de funciones relacionadas con las representaciones gráficas. Otro ejemplo es dplyr que es un conjunto de funciones vinculadas a la manipulación de los datos. A modo de síntesis, una biblioteca o library contiene un conjunto de funciones que en su agrupamiento responde a una necesidad del procesamiento, la visualización, modelización y/o transformación de datos.

En R, los paquete se instalan con la función install.packages() y se los activa con library(). En este curso utilizamos tres paquetes principales: tidyverse, simple features y EPH.

La misma comunidad de R actualiza y/o construye permanentemente paquetes con nuevas funcionalidades. En los próximos encuentros, vamos a mostrar algunos ejemplos. Por ahora, creemos que es suficiente.

Un párrafo aparte merece tidyverse, no es una biblioteca, sino que es un conjunto de ellas. Más que eso, podríamos decir que es un páradigama de programación en R, que nos permite realizar acciones de una manera mucho más intuitiva que con R base. Además, al ser un conjunto de biblotecas abarcan mucho de lo que necesitamos. Son parte de tidyverse las ya mencionadas ggplot2 y dplyr, además encontramos tidyr, haven, stringr, lubridate, forecast, tidymodel y más… No es la intención de este curso verlas todas, pero si que sepan que existen y que pueden recurrir a ellas para resolver problemas con los que se topen.

A continuación les dejamos los paquetes necesarios para el curso:

#install.packages(c("tidyverse", "eph", "sf"))

3- PRIMER PROYECTO
3.1. Aproximación

Una de las formas de hacer más amigable esta introducción al lenguaje, es observando cómo, con unas pocas líneas de código, se logran resultados que nos sorprendan (¡tampoco exageremos!). Muchas veces, se nos presenta el mundo de la “programación estadística” como una “representación deformada, artificial, ilusoria de las cosas, de las mercancías, de las relaciones de producción, que aparece infaliblemente en el marco de la producción mercantil fundada en la propiedad privada, y sobre todo, en la producción capitalista.” Disculpen, seguramente no sea ni la primera ni la última vez que se nos escape alguna que otra frase de algunos tipos que estaban aburridos y sentaron las bases de la sociología. Pero sí, detrás del mundo de la programación estadística hay un halo de misterio imposible de acceder: el “fetiche de la programación”.

Volviendo al tema principal, escuchamos en el primer párrafo la palabra diabólica: “programación”. Esperamos que no tengan pesadillas al momento de dormir. Cuando “deconstruimos” esta palabra, nos encontramos que simplemente es “indicar” al software que realice una serie de actividades para alcanzar un determinado resultado. Entonces, el resultado es la síntesis de algo diferente a la sumatoria de órdenes (que capacidad de citar autores, ¿no?)

Previo a continuar, queremos enfatizar en la mediática frase: siempre es el marco teórico. Esto quiere decir, que siempre partimos de una definición teórica-práctica para realizar el trabajo que estemos haciendo en R: siempre (cuando decimos siempre es siempre) partimos de una visión de cómo son o cómo deberían ser las cosas en el mundo. Es fundamental que tengamos una buena definición conceptual de las variables para alcanzar el objetivo que nos propusimos. Nunca descuiden esta noción porque de lo contrario estaríamos haciendo en simples palabras “cualquier cosa”.

Entonces, haciendo honor a nuestro axioma (¡Siempre es el marco teórico!), proponemos a lo largo de los próximos encuentros, utilizar un mismo tema para presentar algunas de las potencialidades, que tiene la herramienta. Queremos aclarar que este curso es exitoso, siempre y cuando despierte la curiosidad en ustedes. Difícilmente podamos abarcar ni siquiera lo “básico” de R en los cuatros encuentros que siguen. Pero sí, creemos que podemos ayudarlas/los (y ayudarnos con sus preguntas y sugerencias) a ingresar en este mundo del “fetichismo de la programación estadística”, que como dijimos más arriba es alcanzar un resultado a partir de indicar una serie de órdenes utilizando, en este caso particular, el lenguaje R.

Como desafío para los próximos encuentros, nos propusimos abordar un tema que está vinculado con la realidad que nos toca vivir. Por eso, planteamos un ejercicio muy simplificado sobre el Coronavirus. A modo de simplificación extrema, utilizamos la Encuesta Permanente de Hogares (EPH) para analizar de forma muy (cuando decimos muy es porque es “muy muy”) aproximada a través de dos variables la situación que se encuentran los aglomerados urbanos y las regiones del país en términos de hacinamiento y desocupación en el último cuatrimestre del 2019. Para esto vamos a caracterizar a los individuos de acuerdo a las condiciones de hacinamiento del hogar y la tasa de desocupación.

A través de un tema de actualidad ligado al contexto sanitario, intentamos presentar superficialmente algunas de las cosas que podemos hacer con este lenguaje y software. Para empezar tenemos que conocer qué funciones hacen qué cosa. No se preocupen que con el correr de los encuentros profundizando en este tema.

Pero vayamos a la práctica.


3.2. Cargar datos

Empecemos a cargar información a R. Para esto, utilizamos la función read_csv. Una aclaración para perder miedo al fetiche de la programación, la función traducida al español es “leer”_csv, simplemente le estamos diciendo a R que lea ese tipo de archivo. Sencillo, ¿no? Seguramente la mayor dificultad, la van a encontrar en la ubicación del archivo y del directorio en el que estén trabajando. A continuación presentamos una breve introducción al formato CSV:

Aclaración: CSV (comma separate values) es un tipo de archivo que tiene separadas las columnas por una coma.

En un archivo csv la información esta almacenada de la siguiente manera:

Tabla CSV
Cantidad de ambientes en la vivienda, edad,sexo
2,15,F
3,19,M
1,35.F

Cuando aplicamos la función read.csv, R nos devuelve el siguiente resultado:

Tabla después de aplicar CSV
Cantidad de ambientes en la vivienda edad sexo
2 15 F
3 19 M
1 35 F

¿Qué sucedió? A través de esa función, R estructura la información de nuestro archivo CSV en columnas. Quisimos hacer la introducción a CSV porque es uno de los formatos que más se utilizan en los portales de datos abiertos. Según el tipo de archivo que tengamos, es la función que utilizamos: .sav (SPSS), .xlsx (Excel), .dta (STATA), .txt (Bloc de notas), etc. Recuerden verificar en qué paquete se encuentra cada una de las funciones: ejemplo read.sav está en la biblioteca “haven” de tidyverse. Para esto tenemos que activar la biblioteca que queremos utilizar a través de la función library() y después tipear la función. Pero vamos despacio para construir bases sólidas y que puedan ir ganando autonomía en el uso de esta herramienta a medida que transitamos los encuentros.

#Avtivamos las library's
library(tidyverse)
library(sf)

¿En qué estábamos? Vamos a leer nuestro archivo en R. Directamente descargamos, escribiendo el link del portal BAdata, que aloja el csv a utilizar, dentro de los paréntesis de la función read_csv. Recuerdan que en R, todo es un objeto. Entonces, con el operador de asignación<- creamos un objeto, que contiene la información sobre la pandemia y se llama “casos_covid”.

# Creación de objeto con la información sobre los casos de COVID en CABA
casos_covid <- read_csv("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/salud/casos-covid-19/casos_covid19.csv")

casos_covid #Impresión de la tabla
## # A tibble: 747,479 x 14
##    numero_de_caso fecha_apertura_~ fecha_toma_mues~ fecha_clasifica~ provincia
##             <dbl> <chr>            <chr>            <chr>            <chr>    
##  1        1592782 30JUL2020:00:00~ 24JUL2020:00:00~ 24JUL2020:00:00~ Buenos A~
##  2        2242847 31AUG2020:00:00~ 31AUG2020:00:00~ 31AUG2020:00:00~ Buenos A~
##  3        1247304 03JUL2020:00:00~ 03JUL2020:00:00~ 04JUL2020:00:00~ Buenos A~
##  4        1615052 31JUL2020:00:00~ 31JUL2020:00:00~ 02AUG2020:00:00~ Buenos A~
##  5        2234291 31AUG2020:00:00~ 31AUG2020:00:00~ 31AUG2020:00:00~ Buenos A~
##  6        1593473 30JUL2020:00:00~ 28JUL2020:00:00~ 28JUL2020:00:00~ CABA     
##  7        2216550 29AUG2020:00:00~ 27AUG2020:00:00~ 27AUG2020:00:00~ Buenos A~
##  8        2078013 24AUG2020:00:00~ 23AUG2020:00:00~ 25AUG2020:00:00~ CABA     
##  9        1690919 05AUG2020:00:00~ 07AUG2020:00:00~ 08AUG2020:00:00~ Buenos A~
## 10        1711099 06AUG2020:00:00~ 06AUG2020:00:00~ 10AUG2020:00:00~ CABA     
## # ... with 747,469 more rows, and 9 more variables: barrio <chr>, comuna <dbl>,
## #   genero <chr>, edad <dbl>, clasificacion <chr>, fecha_fallecimiento <chr>,
## #   fallecido <chr>, fecha_alta <chr>, tipo_contagio <chr>

3.3. Funciones Exploratorias

En R, existen funciones que permiten conocer la estructura de la tabla (en este lenguaje se conocen popularmente como dataframes). ¿Qué es la estructura de una tabla? Básicamente, la cantidad de columnas, filas, tipos de variables, etc. Algunas de estas funciones son names(),View(),str(), head(), tail(), summary(). Existen muchas otras en diferentes paquetes para complementar el análisis exploratorio de la información. Estas funciones, a excepción de View que nos muestra completo nuestro dataframe, ayudan a conocer las tablas con las que estamos trabajando. Muchas veces se van a encontrar con dataframes con cientos de columnas y miles/millones de registro. Piensen que, la EPH tiene más de 150 variables y cerca de 60 mil filas. A continuación, resumimos las funciones para explorar el dataframe.

Tabla de funciones exploratorias
Nombre Función
names() Nombres de las columnas (variables)
str() Estructura de la tabla. Muestra la cantidad de filas, el tipo de variable, las categorías y otros atributos del dataframe
summary() Realiza un resumen estadistico con algunas medidas de tendencia central como la media y la mediana.
head() Muestra las primera filas de un dataframe. Por default son las primeras seis pero se pueden cambiar
tail() Muestra las últimas filas de un dataframe. Por default son las primeras seis pero se pueden cambiar
View() Abre el dataframe en el visor de R

Presentamos un ejemplo de cada función (con excepción de view que dejamos que practiquen en sus tiempos libres):

#Nombre de las variables
names(casos_covid)
##  [1] "numero_de_caso"      "fecha_apertura_snvs" "fecha_toma_muestra" 
##  [4] "fecha_clasificacion" "provincia"           "barrio"             
##  [7] "comuna"              "genero"              "edad"               
## [10] "clasificacion"       "fecha_fallecimiento" "fallecido"          
## [13] "fecha_alta"          "tipo_contagio"
#Estructura de la tabla
str(casos_covid)
## tibble [747,479 x 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ numero_de_caso     : num [1:747479] 1592782 2242847 1247304 1615052 2234291 ...
##  $ fecha_apertura_snvs: chr [1:747479] "30JUL2020:00:00:00.000000" "31AUG2020:00:00:00.000000" "03JUL2020:00:00:00.000000" "31JUL2020:00:00:00.000000" ...
##  $ fecha_toma_muestra : chr [1:747479] "24JUL2020:00:00:00.000000" "31AUG2020:00:00:00.000000" "03JUL2020:00:00:00.000000" "31JUL2020:00:00:00.000000" ...
##  $ fecha_clasificacion: chr [1:747479] "24JUL2020:00:00:00.000000" "31AUG2020:00:00:00.000000" "04JUL2020:00:00:00.000000" "02AUG2020:00:00:00.000000" ...
##  $ provincia          : chr [1:747479] "Buenos Aires" "Buenos Aires" "Buenos Aires" "Buenos Aires" ...
##  $ barrio             : chr [1:747479] NA NA NA NA ...
##  $ comuna             : num [1:747479] NA NA NA NA NA 10 NA 9 NA 1 ...
##  $ genero             : chr [1:747479] "masculino" "masculino" "masculino" "femenino" ...
##  $ edad               : num [1:747479] 27 58 14 49 45 27 26 59 24 36 ...
##  $ clasificacion      : chr [1:747479] "confirmado" "confirmado" "confirmado" "confirmado" ...
##  $ fecha_fallecimiento: chr [1:747479] NA NA NA NA ...
##  $ fallecido          : chr [1:747479] NA NA NA NA ...
##  $ fecha_alta         : chr [1:747479] NA NA NA NA ...
##  $ tipo_contagio      : chr [1:747479] "Comunitario" "En Investigación" "Comunitario" "Comunitario" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   numero_de_caso = col_double(),
##   ..   fecha_apertura_snvs = col_character(),
##   ..   fecha_toma_muestra = col_character(),
##   ..   fecha_clasificacion = col_character(),
##   ..   provincia = col_character(),
##   ..   barrio = col_character(),
##   ..   comuna = col_double(),
##   ..   genero = col_character(),
##   ..   edad = col_double(),
##   ..   clasificacion = col_character(),
##   ..   fecha_fallecimiento = col_character(),
##   ..   fallecido = col_character(),
##   ..   fecha_alta = col_character(),
##   ..   tipo_contagio = col_character()
##   .. )
#Resumen estadistico
summary(casos_covid)
##  numero_de_caso    fecha_apertura_snvs fecha_toma_muestra fecha_clasificacion
##  Min.   : 718084   Length:747479       Length:747479      Length:747479      
##  1st Qu.:1510654   Class :character    Class :character   Class :character   
##  Median :2241942   Mode  :character    Mode  :character   Mode  :character   
##  Mean   :2338623                                                             
##  3rd Qu.:3110628                                                             
##  Max.   :4253641                                                             
##                                                                              
##   provincia            barrio              comuna          genero         
##  Length:747479      Length:747479      Min.   : 1.0     Length:747479     
##  Class :character   Class :character   1st Qu.: 4.0     Class :character  
##  Mode  :character   Mode  :character   Median : 7.0     Mode  :character  
##                                        Mean   : 7.7                       
##                                        3rd Qu.:12.0                       
##                                        Max.   :15.0                       
##                                        NA's   :330241                     
##       edad        clasificacion      fecha_fallecimiento  fallecido        
##  Min.   :  0.00   Length:747479      Length:747479       Length:747479     
##  1st Qu.: 27.00   Class :character   Class :character    Class :character  
##  Median : 37.00   Mode  :character   Mode  :character    Mode  :character  
##  Mean   : 39.46                                                            
##  3rd Qu.: 51.00                                                            
##  Max.   :131.00                                                            
##  NA's   :413                                                               
##   fecha_alta        tipo_contagio     
##  Length:747479      Length:747479     
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 
#Primeras 10 filas
head(casos_covid,10)
## # A tibble: 10 x 14
##    numero_de_caso fecha_apertura_~ fecha_toma_mues~ fecha_clasifica~ provincia
##             <dbl> <chr>            <chr>            <chr>            <chr>    
##  1        1592782 30JUL2020:00:00~ 24JUL2020:00:00~ 24JUL2020:00:00~ Buenos A~
##  2        2242847 31AUG2020:00:00~ 31AUG2020:00:00~ 31AUG2020:00:00~ Buenos A~
##  3        1247304 03JUL2020:00:00~ 03JUL2020:00:00~ 04JUL2020:00:00~ Buenos A~
##  4        1615052 31JUL2020:00:00~ 31JUL2020:00:00~ 02AUG2020:00:00~ Buenos A~
##  5        2234291 31AUG2020:00:00~ 31AUG2020:00:00~ 31AUG2020:00:00~ Buenos A~
##  6        1593473 30JUL2020:00:00~ 28JUL2020:00:00~ 28JUL2020:00:00~ CABA     
##  7        2216550 29AUG2020:00:00~ 27AUG2020:00:00~ 27AUG2020:00:00~ Buenos A~
##  8        2078013 24AUG2020:00:00~ 23AUG2020:00:00~ 25AUG2020:00:00~ CABA     
##  9        1690919 05AUG2020:00:00~ 07AUG2020:00:00~ 08AUG2020:00:00~ Buenos A~
## 10        1711099 06AUG2020:00:00~ 06AUG2020:00:00~ 10AUG2020:00:00~ CABA     
## # ... with 9 more variables: barrio <chr>, comuna <dbl>, genero <chr>,
## #   edad <dbl>, clasificacion <chr>, fecha_fallecimiento <chr>,
## #   fallecido <chr>, fecha_alta <chr>, tipo_contagio <chr>
#ultimas 10 filas
tail(casos_covid,10)
## # A tibble: 10 x 14
##    numero_de_caso fecha_apertura_~ fecha_toma_mues~ fecha_clasifica~ provincia
##             <dbl> <chr>            <chr>            <chr>            <chr>    
##  1        2042135 22AUG2020:00:00~ 21AUG2020:00:00~ 21AUG2020:00:00~ Buenos A~
##  2        2416202 07SEP2020:00:00~ 08SEP2020:00:00~ 09SEP2020:00:00~ CABA     
##  3        2381123 05SEP2020:00:00~ 04SEP2020:00:00~ 04SEP2020:00:00~ CABA     
##  4        1739071 07AUG2020:00:00~ 04AUG2020:00:00~ 05AUG2020:00:00~ Buenos A~
##  5        1867871 13AUG2020:00:00~ 13AUG2020:00:00~ 13AUG2020:00:00~ CABA     
##  6        1765790 08AUG2020:00:00~ 08AUG2020:00:00~ 09AUG2020:00:00~ CABA     
##  7        1471070 22JUL2020:00:00~ 22JUL2020:00:00~ 22JUL2020:00:00~ CABA     
##  8        1160833 24JUN2020:00:00~ 19JUN2020:00:00~ 20JUN2020:00:00~ Buenos A~
##  9        1977424 19AUG2020:00:00~ 18AUG2020:00:00~ 18AUG2020:00:00~ CABA     
## 10        2050493 22AUG2020:00:00~ 22AUG2020:00:00~ 22AUG2020:00:00~ Buenos A~
## # ... with 9 more variables: barrio <chr>, comuna <dbl>, genero <chr>,
## #   edad <dbl>, clasificacion <chr>, fecha_fallecimiento <chr>,
## #   fallecido <chr>, fecha_alta <chr>, tipo_contagio <chr>

Una vez que “exploramos” la tabla podemos comenzar a realizar nuestro análisis. Como es un primer encuentro, no pretendemos que entiendan todo. Es más, si fuera así quiere decir que ya conocen los contenidos del curso. A partir de ahora, proponemos mostrar el potencial que tiene R para nuestro campo disciplinario: las Ciencias Sociales. Compartimos los códigos para que puedan ver cómo armamos las tablas y las visualizaciones. El/la que quiera avanzar un poco más rápido pueda empezar a sumergirse en estos ejercicios. Pero la idea es exponer una muestra de los ejercicios teóricos/prácticos que vamos ir resolviendo juntos con el correr de los encuentros. Por ser el primer encuentro es suficiente. Ahora a “chusmear” el potencial de este lenguaje.

A continuación, a través de una serie de órdenes que escribimos, pretendemos realizar un mapa comparando la tasa de contagios cada 100 mil habitantes entre los barrios de la Ciudad de Buenos Aires. Para esto utilizamos el dataframe que cargamos casos_covid. Pero además, para poder calcular la tasa, necesitamos la información sobre la población de los barrios. A la espera del censo 2020, seguimos utilizando la información provista por el censo del 2010 y sistematizada en la página de la Dirección General de Estadística y Censos (Ministerio de Hacienda GCBA). Entonces, lo que hacemos es crear un nuevo objeto poblacion_barrios.

Aclaración: R NO permite la creación de nombres de los objetos con espacios. Por esto utilizamos . o _ para separarar las palabras. Otra opción que utilizan los progrmadores el la notacion de camello que consiste en poner la primer letra en mayuscula de cada palabra, por ejemplo, PoblacionBarrios.

#Creación de tabla con información sobre la población en los barrios
poblacion_barrios <- read.csv("https://raw.githubusercontent.com/flavioscargiali/desembarcandorensociales/master/barrios_poblacion%20-%20Hoja%201.csv", encoding = "UTF-8")

3.4. Transformación de datos

Una vez que tenemos las dos tablas cargadas, avanzamos con la transformación de los datos. Es decir, a partir de la información contenida en los dataframes, calculamos la tasa de contagios cada 100 mil habitantes. Para esto, lo primero que tenemos que realizar es un resumen de los casos por barrio.

Pero antes, como el dataframe tiene una variable que clasifica los casos en diferentes estados, tenemos que retener aquellas observaciones que tengan como categoría confirmado. Entonces, aplicamos un filtro con la función filter() (1) en la que indicamos a R que retenga los casos que cumplan con la condición confirmados. ¡Acá vemos una aplicación práctica de los operadores de comparación!

Una vez realizado esto, con la función group_by() (2) agrupamos los casos por barrio (imaginen que dividen la tabla original en una tabla por cada barrio) y con summarise() (3) pedimos el resumen de los barrios sumando las observaciones que tiene condición confirmado. Creamos un nuevo objeto, para no sobreescribir el anterior que se llama casos.

casos <- casos_covid %>%
  #(1) Filtramos por condición Confirmado
  filter(clasificacion=="confirmado") %>%  
  #(2) Agrupamos por barrio
  group_by(barrio) %>% 
  #(3)Sumamos los casos por barrio
  summarise(casos=n()) %>%
  #Convertimos el resultado en una tabla
  as.data.frame() 

#Imprimimos el resultado
casos
##               barrio  casos
## 1          AGRONOMIA    412
## 2            ALMAGRO   6642
## 3          BALVANERA   9415
## 4           BARRACAS   7509
## 5           BELGRANO   4513
## 6               BOCA   3275
## 7              BOEDO   2261
## 8          CABALLITO   6708
## 9          CHACARITA   1771
## 10           COGHLAN    654
## 11        COLEGIALES   1817
## 12      CONSTITUCION   3182
## 13            FLORES  10678
## 14          FLORESTA   1739
## 15           LINIERS   1853
## 16         MATADEROS   2940
## 17         MONSERRAT   2449
## 18      MONTE CASTRO   1110
## 19     NUEVA POMPEYA   3378
## 20             NUÑEZ   1721
## 21           PALERMO   9849
## 22 PARQUE AVELLANEDA   3337
## 23  PARQUE CHACABUCO   2569
## 24       PARQUE CHAS    684
## 25  PARQUE PATRICIOS   2492
## 26          PATERNAL   1209
## 27     PUERTO MADERO    688
## 28          RECOLETA   6734
## 29            RETIRO   4647
## 30          SAAVEDRA   1454
## 31     SAN CRISTOBAL   3104
## 32       SAN NICOLAS   2037
## 33         SAN TELMO   1081
## 34   VELEZ SARSFIELD   1328
## 35         VERSALLES    451
## 36      VILLA CRESPO   3585
## 37  VILLA DEL PARQUE   1792
## 38      VILLA DEVOTO   2267
## 39 VILLA GRAL. MITRE   1399
## 40      VILLA LUGANO   9050
## 41        VILLA LURO   1369
## 42     VILLA ORTUZAR    818
## 43  VILLA PUEYRREDON   1210
## 44        VILLA REAL    481
## 45   VILLA RIACHUELO    900
## 46  VILLA SANTA RITA   1274
## 47     VILLA SOLDATI   4260
## 48     VILLA URQUIZA   3571
## 49              <NA> 119616

Una vez que tenemos el resumen de la cantidad de casos por barrios de la ciudad, lo unimos a través de la función left_join() (4) a la tabla de la población de los barrios. ¿Se acuerdan que al principio contamos una situación engorrosa sobre juntar y pegar tablas? Este es un ejemplo de cómo se pueden unir dos tablas sin mucho esfuerzo. En este caso, las categorías y el nombre de la variable coinciden en las dos tablas (población_barrios, casos). Asignamos esta nueva tabla al objetivo que vamos a crear: barrios_casos.

# (4) Unión de tablas
barrios_casos <- poblacion_barrios %>% 
                    left_join(casos)
barrios_casos
##               barrio  Total casos
## 1       CONSTITUCION  44107  3182
## 2          MONSERRAT  39914  2449
## 3      PUERTO MADERO   6726   688
## 4             RETIRO  65413  4647
## 5        SAN NICOLAS  29273  2037
## 6          SAN TELMO  20453  1081
## 7           RECOLETA 157932  6734
## 8          BALVANERA 138926  9415
## 9      SAN CRISTOBAL  48611  3104
## 10          BARRACAS  89452  7509
## 11              BOCA  45113  3275
## 12     NUEVA POMPEYA  42695  3378
## 13  PARQUE PATRICIOS  40985  2492
## 14           ALMAGRO 131699  6642
## 15             BOEDO  47306  2261
## 16         CABALLITO 176076  6708
## 17            FLORES 164310 10678
## 18  PARQUE CHACABUCO  56281  2569
## 19      VILLA LUGANO 126374  9050
## 20   VILLA RIACHUELO  14084   900
## 21     VILLA SOLDATI  46779  4260
## 22           LINIERS  44132  1853
## 23         MATADEROS  64436  2940
## 24 PARQUE AVELLANEDA  53229  3337
## 25          FLORESTA  37575  1739
## 26      MONTE CASTRO  33623  1110
## 27   VELEZ SARSFIELD  35081  1328
## 28         VERSALLES  13822   451
## 29        VILLA LURO  32502  1369
## 30        VILLA REAL  13419   481
## 31  VILLA SANTA RITA  33325  1274
## 32  VILLA DEL PARQUE  55273  1792
## 33      VILLA DEVOTO  66521  2267
## 34 VILLA GRAL. MITRE  34713  1399
## 35           COGHLAN  18604   654
## 36          SAAVEDRA  50295  1454
## 37  VILLA PUEYRREDON  39654  1210
## 38     VILLA URQUIZA  91563  3571
## 39          BELGRANO 126831  4513
## 40        COLEGIALES  52551  1817
## 41             NUÑEZ  51949  1721
## 42           PALERMO 225970  9849
## 43         AGRONOMIA  13912   412
## 44         CHACARITA  27761  1771
## 45       PARQUE CHAS  17489   684
## 46          PATERNAL  19717  1209
## 47      VILLA CRESPO  81959  3585
## 48     VILLA ORTUZAR  21736   818

Ojo con el uso del Join. En este caso estamos uniendo por el nombre de los barrios, esto quiere decir que si en una tabla tenemos un barrio escrito como Barracas y en la otra como barracas, no va a haber match. Por eso hay que estar seguro de que identificador vamos a usar.

Por fin, estamos en condiciones de calcular la tasa de contagios cada 100 mil habitantes. Para esto, usamos la función mutate() (5) para crear la variable tasa_100mil. La tasa se calcula dividiendo los casos por el total poblacional por barrio (variable Total en nuestra tabla) y multiplicada por 100. Decidimos sobreescribir el archivo asignando el nombre barrio_casos porque lo único que hacemoa es agregar una nueva variable a la tabla.

barrios_casos<-barrios_casos %>%
  #(5) Calculamos la tasa
  mutate(tasa_100mil = (casos/Total) *100000) %>% 
  # Reemplazamos los valores perdidos
  mutate(tasa_100mil = replace_na(tasa_100mil,0)) 

# Imprimimos los casos
barrios_casos 
##               barrio  Total casos tasa_100mil
## 1       CONSTITUCION  44107  3182    7214.274
## 2          MONSERRAT  39914  2449    6135.692
## 3      PUERTO MADERO   6726   688   10228.962
## 4             RETIRO  65413  4647    7104.092
## 5        SAN NICOLAS  29273  2037    6958.631
## 6          SAN TELMO  20453  1081    5285.288
## 7           RECOLETA 157932  6734    4263.860
## 8          BALVANERA 138926  9415    6776.989
## 9      SAN CRISTOBAL  48611  3104    6385.386
## 10          BARRACAS  89452  7509    8394.446
## 11              BOCA  45113  3275    7259.548
## 12     NUEVA POMPEYA  42695  3378    7911.933
## 13  PARQUE PATRICIOS  40985  2492    6080.273
## 14           ALMAGRO 131699  6642    5043.318
## 15             BOEDO  47306  2261    4779.521
## 16         CABALLITO 176076  6708    3809.719
## 17            FLORES 164310 10678    6498.691
## 18  PARQUE CHACABUCO  56281  2569    4564.596
## 19      VILLA LUGANO 126374  9050    7161.283
## 20   VILLA RIACHUELO  14084   900    6390.230
## 21     VILLA SOLDATI  46779  4260    9106.650
## 22           LINIERS  44132  1853    4198.767
## 23         MATADEROS  64436  2940    4562.667
## 24 PARQUE AVELLANEDA  53229  3337    6269.139
## 25          FLORESTA  37575  1739    4628.077
## 26      MONTE CASTRO  33623  1110    3301.312
## 27   VELEZ SARSFIELD  35081  1328    3785.525
## 28         VERSALLES  13822   451    3262.914
## 29        VILLA LURO  32502  1369    4212.048
## 30        VILLA REAL  13419   481    3584.470
## 31  VILLA SANTA RITA  33325  1274    3822.956
## 32  VILLA DEL PARQUE  55273  1792    3242.089
## 33      VILLA DEVOTO  66521  2267    3407.946
## 34 VILLA GRAL. MITRE  34713  1399    4030.190
## 35           COGHLAN  18604   654    3515.373
## 36          SAAVEDRA  50295  1454    2890.943
## 37  VILLA PUEYRREDON  39654  1210    3051.395
## 38     VILLA URQUIZA  91563  3571    3900.047
## 39          BELGRANO 126831  4513    3558.278
## 40        COLEGIALES  52551  1817    3457.594
## 41             NUÑEZ  51949  1721    3312.865
## 42           PALERMO 225970  9849    4358.543
## 43         AGRONOMIA  13912   412    2961.472
## 44         CHACARITA  27761  1771    6379.453
## 45       PARQUE CHAS  17489   684    3911.030
## 46          PATERNAL  19717  1209    6131.764
## 47      VILLA CRESPO  81959  3585    4374.138
## 48     VILLA ORTUZAR  21736   818    3763.342

3.5. Nuestro primer mapa

Seguimos agregando complejidad al ejercicio. Como nuestra intención es crear un mapa comparando los barrios por tasa de contagio, necesitamos pegar a nuestra base los datos espaciales. Nuevamente recurrimos al portal BAdata(6)para desrgar estos datos. Aplicamos otra vez un left_join (7) y tenemos nuestra tabla lista para crear el mapa.

#(6) Creamos un objeto con los datos geofraficos
barrios <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson")
## Reading layer `barrios_badata' from data source `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## geographic CRS: WGS 84
# (7) Unimos la tabla con los objetos geograficos
barrios_casos <- barrios %>% left_join(barrios_casos)

Ahora viene la magia. Por lo menos nosotros nos conmovimos cuando vimos que con una línea de código teníamos un mapa. Miren lo que es esta genialidad (¿Es una cita a Paulina Cocina?). Utilizando el paquete ggplot2 (8), estamos en condiciones de graficar los polígonos de los barrios de CABA en los ejes cartesianos.

# (8) Mapa de los barrios de la ciudad
ggplot()+
  geom_sf(data=barrios_casos)

Sí. Con una línea de código armamos un mapa vacío (pero un mapa al fin) con la distribución espacial de los barrios de la ciudad. Ahora viene lo lindo, que es agregar usando complementos de las funciones de ggplot2 información a nuestro gráfico. Para esto indicamos a R, que “rellene” los polígonos de los barrios con una escala de colores para comparar la tasa de contagios cada 100 mil habitantes. En los próximos encuentrosm vamos a trabajar con mucha más profundidad este tipo de visualizaciones.

#(9) Mapa comparando la tasa de contagios cada 100 mil habitantes en la ciudad
ggplot() +
  geom_sf(data = barrios_casos, aes(fill = tasa_100mil), color = NA)+
  scale_fill_distiller("Contagios cada 100 mil", palette = "Reds", direction = 1)

Por último, y a riesgo de abrumar, agregamos la división administrativa de la ciudad: las comunas. Nuevamente, descargamos los datos espaciales y los asignamos a un objeto comunas (10). Y con respecto al código anterior, añadimos al mapa la división de las comunas y el número de la comuna (11).

#(10) Creamos el objeto comuna con la información espacial
comunas <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/comunas/CABA_comunas.geojson")
## Reading layer `comunas' from data source `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/comunas/CABA_comunas.geojson' using driver `GeoJSON'
## Simple feature collection with 15 features and 6 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## geographic CRS: WGS 84
#(11) Armamos el mapa de tasa de contagios covid cada 100 mil habitantes por barrio y comuna de la CABA
ggplot() +
  geom_sf(data=barrios_casos, aes(fill = tasa_100mil),color=NA) +
  geom_sf(data=comunas,color="black", fill=NA,size=1)+
  geom_sf_label(data = comunas, aes(label=COMUNAS),color="black", fill="white") +
  scale_fill_distiller("Contagios cada 100 mil",palette = "Reds",direction = 1)

Eso es todo por esta guía. Esperamos haber generado una mínima curiosidad en ustedes. Muchas gracias por leernos. Sigan adelante, despacio y sin abrumarse en este rompecabezas permanente.

¡Hasta la próxima!