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!
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.
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
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.
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.
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”.
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?
| 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.
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.
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.
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"))
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.
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>
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")
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
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!