Si no lo hicimos aún en la sesión en la que estamos trabajando, cargamos tidyverse
.
Vamos a practicar usando los registros del Sistema Único de Atención Ciudadana (SUACI) de la Ciudad Autónoma de Buenos Aires. El SUACI es el repositorio donde se integran las solicitudes y reclamos que los ciudadanos presentan a la ciudad por distintos canales: en persona, por teléfono o usando la aplicación BA 147. Vamos a trabajar con una versión de los datos que ha sido simplificada para hacer más ameno el trabajo con ella. Quién quiera acceder a los datos en su esplendor de complejidad original, puede encontrarlos en el portal de datos abiertos de la ciudad: https://data.buenosaires.gob.ar/
Comenzamos por acceder al archivo con los registros para cargarlo en R como un dataframe. Tendremos que ejercitar un poco la paciencia porque es un archivo de varios megas, que podría tardar unos minutos en ser descargado.
Lo primero que deberíamos hacer con un dataframe que no conocemos es usar la función str()
, que nos indica su estructura (por structure en inglés):
## 'data.frame': 57431 obs. of 5 variables:
## $ PERIODO : int 201301 201301 201301 201301 201301 201301 201301 201301 201301 201301 ...
## $ RUBRO : chr "ACERAS" "ACERAS" "ACERAS" "ACERAS" ...
## $ TIPO_PRESTACION: chr "RECLAMO" "RECLAMO" "RECLAMO" "RECLAMO" ...
## $ BARRIO : chr "AGRONOMIA" "ALMAGRO" "BALVANERA" "BARRACAS" ...
## $ total : int 6 172 92 45 79 10 38 109 20 45 ...
Para empezar, nos enteramos que el objeto que estamos analizando es un dataframe (“data.frame”). Eso ya lo sabíamos, pero como str()
puede usarse con cualquier clase de objeto en R, en ocasiones resultará que estamos ante un vector, una lista u otra clase de criatura. A continuación aparecen las dimensiones del dataframe: 57.432 observaciones (filas) con 5 variables (columnas). Los nombres de las columnas son PERIODO, RUBRO, TIPO_PRESTACION, BARRIO y total. Con eso ya podemos inferir que cada observación en el dataframe contiene la cantidad total de solicitudes según concepto, rubro y tipo de prestación (aunque no sepamos bien de que se tratan esas variables), en un período dado y en cada barrio.
Con str()
también obtenemos el tipo de datos representados pro cada variable, y un ejemplo de los valores contenidos en las primeras filas. PERIODO y total son variables de tipo “int”, es decir, números enteros o integers en inglés. El resto de las variables son de tipo “Factor”; en R las variables categóricas reciben el nombre de factores. ¿Y cómo sabe R que RUBRO o BARRIO son categorías? La culpable es la función read.csv()
que usamos al principio. Si no se le aclara lo contrario, read.csv()
interpreta como factores a todas las columnas que contienen texto. Para avisarle que no lo haga, hay que usar el parámetro stringsAsFactors
, así: misdatos <- read.csv("archivo_con_mis_datos", stringsAsFactors = FALSE)
. En general es buena idea evitar que los campos de texto se asuman como factores, pero en éste caso está bien: todas las columnas de texto, en efecto, contienen variables categóricas. (Ante la duda, una variable es categórica cuando es razonable considerar que se elige entre un conjunto finito de variables posibles; por ejemplo, los barrios de Buenos Aires son un conjunto finito y predeterminado).
La siguiente función a utilizar cuando estamos conociendo el contenido de un set de datos es summary()
, que nos dará un resumen en forma de estadísticas descriptivas para las variables numéricas (cuartiles y mediana) y un vistazo a las categorías más representadas par los factores.
## PERIODO RUBRO TIPO_PRESTACION BARRIO total
## Min. :201301 Length:57431 Length:57431 Length:57431 Min. : 1.00
## 1st Qu.:201309 Class :character Class :character Class :character 1st Qu.: 1.00
## Median :201404 Mode :character Mode :character Mode :character Median : 4.00
## Mean :201401 Mean : 34.85
## 3rd Qu.:201503 3rd Qu.: 16.00
## Max. :201512 Max. :19221.00
Las categorías posibles para un factor son llamadas “niveles” (levels). Para ver todos los niveles del factor BARRIO, es decir todos los barrios representados en la columna con la variable BARRIO, podemos usar la función levels()
## NULL
Para acceder en forma rápida al contenido de la columna BARRIO, hemos utilizado por primera vez un “truco” muy práctico. Para obtener el contenido de cualquier columna en particular, basta con el nombre del dataframe seguido del símbolo $
y el nombre de la columna a extraer: atencion_ciudadano$BARRIO
, o atencion_ciudadano$total
, etc.