Introducción

El objetivo de este analisis es hacer un repaso a las diferentes fases de un proyecto de datos utilizando la herramineta de analisis R aplicada a datos de Udalmap. “UDALMAP es un sistema integrado de información territorial con base en los municipios de la C.A. de Euskadi, cuya finalidad es prestar un servicio publico al permitir un mejor conocimiento de la realidad socio-economica de los mismos”

Las fases de un proyecto de anlisis de datos son: Leer datos, Reorganizar y Limpiar datos, Manipilar y Visualizar y finalmente comunicar resultados. Ver presentación sobre el workflow de un proyecto de datos

En R, antes de nada tenemos que empezar cargando las librerías de funciones que vamos a utilizar en nuestro analisis.

suppressMessages(library(dplyr))    # awesome data manipulation
library(tidyr)    # reshaping data
library(ggplot2)  # plotting

Leer Datos

En este caso tenemos todos los datos de udalmap recogidos en un unico fichero CSV, un formato muy común para tablas y documentos de hojas de cálculo. Utilizamos la función “read.csv()” para leer los datos y después miraremos el numero de filas y columnas que contiene la tabla para empezar a ver cómo son los datos recogidos.

#Leer Datos
datuak2016<- read.csv("udalmap2016.csv", stringsAsFactors = FALSE)
#numero de columnas
length(datuak2016)
## [1] 24
#numero de filas
nrow(datuak2016)
## [1] 49838

La tabla que hemos leido se compone de 24 filas y 49838 columnas. Ahora vamos a ver las primeras filas de la tabla para saber cómo están metidos los datos.

#mostrar las 3 primeras filas de la tabla
head(datuak2016, 3)
##     indid                               name X1998 X1999 X2000 X2001 X2002
## 1 E.1.1.1                           Abadiño    NA    NA   0.8    NA    NA
## 2 E.1.1.1                       Abaltzisketa    NA    NA   9.7    NA    NA
## 3 E.1.1.1 Abanto y Ciérvana-Abanto Zierbena    NA    NA   0.5    NA    NA
##   X2003 X2004 X2005 X2006 X2007 X2008 X2009 X2010 X2011 X2012 X2013 X2014
## 1    NA    NA   0.2    NA    NA   0.2    NA   0.2    NA   0.2    NA    NA
## 2    NA    NA   8.1    NA    NA   4.5    NA   7.4    NA   6.9    NA    NA
## 3    NA    NA   0.3    NA    NA   0.3    NA   0.4    NA   0.4    NA    NA
##   X2015 X2016
## 1    NA    NA
## 2    NA    NA
## 3    NA    NA
##                                                      indname_eus
## 1 Nekazaritza eta arrantza sektorearen balio erantsi gordina (%)
## 2 Nekazaritza eta arrantza sektorearen balio erantsi gordina (%)
## 3 Nekazaritza eta arrantza sektorearen balio erantsi gordina (%)
##                                                      indname_en
## 1 Gross value added of the agriculture and fisheries sector (%)
## 2 Gross value added of the agriculture and fisheries sector (%)
## 3 Gross value added of the agriculture and fisheries sector (%)
##                                         indname_es
## 1 Valor Añadido Bruto del sector agropesquero (%)
## 2 Valor Añadido Bruto del sector agropesquero (%)
## 3 Valor Añadido Bruto del sector agropesquero (%)

En la primera columna tenemos el identificador del indicador, que no es nada intuitivo. Despues la columna “name” contiene el nombre del municipio, en este caso el nombre de la columna tampoco indica bien el dato que contiene y vemos que en los municipios, los caráteres de ‘ñ’-s tildes… están mal. Después tenemos varias columnas que indican el valor de los indicadores en diferentes años y finalmente tenemos los nombres completos de los identificadores en varios idiomas.

Reorganizar y Limpiar Datos

Después de ver el estado de los datos, queda claro que para poder trabajar con ellos, tendremos que hacer algunos cambios.

Reorganizar Tablas

Formato estandard para organizar tablas: Tidy Data. Cada columna es una variable y cada fila es una observación. Primero con la funcion “select()” vamos a coger solamente las columnas que necesitamos para nuestro analisis. Después, vamos a crear la variable “Año” y la variable “Valor”, pasando las columnas de años a una unica columna y separando el valor de cada observación.

# seleccionar columnas
datuak2016<- datuak2016 %>% select(name, X1998:X2016, indname_es)
# reorganizar tablar
datuak2016<- datuak2016 %>% gather(ano, valor, X1998:X2016) 
# cambiar nombres a las columnas
names(datuak2016) <- c("municipio", "indicador", "ano", "valor")
head(datuak2016, 3)
##                            municipio
## 1                           Abadiño
## 2                       Abaltzisketa
## 3 Abanto y Ciérvana-Abanto Zierbena
##                                          indicador   ano valor
## 1 Valor Añadido Bruto del sector agropesquero (%) X1998    NA
## 2 Valor Añadido Bruto del sector agropesquero (%) X1998    NA
## 3 Valor Añadido Bruto del sector agropesquero (%) X1998    NA

Limpiar Datos

Ahora vamos a corregir los caracteres no reconocidos que tenemos en nuestros datos utilizando la función “gsub()” para sustituir estos caracteres por el texto adecuado.

# limpiar columna de año
datuak2016$ano<- gsub("X", "", datuak2016$ano)
# limpiar columna de indicador
datuak2016$indicador<- gsub("ñ", "ñ", datuak2016$indicador)
datuak2016$indicador<- gsub("Ã", "Í", datuak2016$indicador)
datuak2016$indicador<- gsub("ͳ", "ó", datuak2016$indicador)
datuak2016$indicador<- gsub("Í©", "é", datuak2016$indicador)
datuak2016$indicador<- gsub("ͺ", "é", datuak2016$indicador)
datuak2016$indicador<- gsub("ͼ", "ü", datuak2016$indicador)
datuak2016$indicador<- gsub("Í¡", "á", datuak2016$indicador)
datuak2016$indicador<- gsub("â,¬", "???", datuak2016$indicador)
datuak2016$indicador<- gsub("â???°", "%0", datuak2016$indicador)

# limpiar nombres de municipios
datuak2016$municipio<- gsub("ñ", "ñ", datuak2016$municipio)
datuak2016$municipio<- gsub("é", "é", datuak2016$municipio)
datuak2016$municipio<- gsub("á", "á", datuak2016$municipio)
head(datuak2016, 3)
##                           municipio
## 1                           Abadiño
## 2                      Abaltzisketa
## 3 Abanto y Ciérvana-Abanto Zierbena
##                                         indicador  ano valor
## 1 Valor Añadido Bruto del sector agropesquero (%) 1998    NA
## 2 Valor Añadido Bruto del sector agropesquero (%) 1998    NA
## 3 Valor Añadido Bruto del sector agropesquero (%) 1998    NA

Manipular Datos y Visualizar

Una vez tenemos los datos adecuadamente formateados podemos empezar a manipular y visualizar los resultados. Vamos a ver varios ejemplos:

Tasa de ocupación global

primero, utilizando la función “filter()” vamos a seleccionar las filas correspondientes al indicador “Tasa de Ocupación”.

Después utilizando la función ggplot() creamos un gráfico con estos datos, indicamos los valores de los ejes x e y, y con la funcion geom_boxplot() especificamos que queremos un grafico de tipo “cajas”. Con la funcion na.omit() indicamos que queremos excluir las entradas en la tabla que no tienen valor y con la variable fill coloreamos las cajas dependiento del año.

#filtrar datos
ocupacion<- datuak2016%>% filter(indicador== "Tasa de ocupación")
#visualizar
ggplot(data = na.omit(ocupacion), aes(x=ano, y=valor, fill=ano))+geom_boxplot()

En el gráfico de cajas podemos ver en cada año la mediana, los percentiles más significativos y las observaciones que se salen de lo común.

Evolución de la tasa de ocupación en las capitales

En este caso vamos a utilizar la tabla anterior que hemos creado y que contiene los datos de la Tasa de Ocupación y vamos a filtrar algunos municipios que nos interesan para comparar la evolución de cada uno de ellos.

Para ello primero creamos una lista con los municipios que nos interesan, en este caso las 3 capitales de euskadi. Después utilizamos la función filter que ya conocemos y en la condición utilizamos la condición %in% para coger cualquier municipio que esté dentro de nuestra lista.

Una vez tenemos los nuevos datos, volvemos a crear un gráfico, pero esta vez utilizamos geom_line y geom_point para dibujarlo en formato de lineas.

# lista de municipios que queremos filtrar
capitales<- c("Vitoria-Gasteiz", "Donostia / San Sebastián", "Bilbao")
# filtrado de datos
ocupacion_capitales<- ocupacion %>% 
  filter(municipio %in% capitales) %>%
  arrange(indicador, municipio, ano) # ordenar filas de la tabla

#visualizar
ggplot(data=na.omit(ocupacion_capitales), aes(x=ano, y=valor, color=municipio, group=municipio))+
  geom_line() + geom_point()

Tasa de ocupación respecto a Contratos indefinidos

Como ultimo ejemplo, vamos a comparar la relación entre dos variables diferentes. Para ello utilizamos otra vez la función filter para recoger las filas que tienen los indicadores que nos interesan. Como esta vez nos interesan varios indicadores, utilizamos la ocndición | para indicar que queremos ambos.

#filtrar datos
ocupacion<- datuak2016%>% filter(indicador== "Tasa de ocupación" | indicador== "Contratos indefinidos registrados en el año (% total contratos)")
head(na.omit(ocupacion))
##                              municipio         indicador  ano valor
## 1489                           Abadiño Tasa de ocupación 2001 31.94
## 1490                      Abaltzisketa Tasa de ocupación 2001 17.15
## 1491 Abanto y Ciérvana-Abanto Zierbena Tasa de ocupación 2001 29.22
## 1492                             Aduna Tasa de ocupación 2001 21.08
## 1493                               Aia Tasa de ocupación 2001 19.81
## 1494                      Aizarnazabal Tasa de ocupación 2001 27.07

Para poder analizar adecuadamente los datos, vamos a reordenar la tabla, ya que en la columna “valor”, tenemos dos variables diferentes: la tasa de ocupacion y el porcentaje de contrados indefinidos.

En este caso vamos a crear dos nuevas columnas para las variables que tenemos en “indicador” utilizando la funcion spread. En el caso anterior hemos unido varias columnas en una sola y en este caso, vamos a separar las variables que tenemos en una unica columna a varias columnas.

# separar la columna indicador en varias columnas
ocupacion<- spread(ocupacion, indicador, valor)
# cambiar los nombres de las columnas
names(ocupacion)<- c("municipio", "ano","contratos", "tasa_ocupacion")
head(na.omit(ocupacion))
##       municipio  ano contratos tasa_ocupacion
## 9       Abadiño 2006     11.25          21.60
## 14      Abadiño 2011      5.93          13.20
## 18      Abadiño 2015      6.75          10.63
## 28 Abaltzisketa 2006      9.31          16.12
## 33 Abaltzisketa 2011      7.03          17.17
## 37 Abaltzisketa 2015      2.03           5.89

Finalmente, para visualizar los datos definimos los ejes ‘x’ e ‘y’ y añadimos los puntos y el color. Finalmente, con la función “facet_grid” separamos el gráfico por años.

#visualizar grafico
ggplot(na.omit(ocupacion), aes(x=tasa_ocupacion, y=contratos, color=ano))+ geom_point(alpha=0.7)+ facet_grid(~ano)

Comunicación

Este documento se ha creado ejecutando el fichero Rmd que acompaña este documento en el repositorio del proyecto. El formato Rmd combina código R con narrativa en LaTeX o Markdown para crear informes en formato web (Html) o pdf. En ese repositorio también se encuentran disponibles los datos de Udalmap que se han utilizado en el analisis. De esta forma, se puede decir que este documento cumple el criterio de analisis reproducible.

La presentación sobre el Workflow de un proceso de datos también está creado utilizando las herramientas de R Studio y siguiendo la misma filosofía.

Conclusiones

A lo largo del analisis hemos visto cómo aplicar R a un proyecto de analisis y visualización de datos y los recursos que nos ofrece para hacer frente a los problemas que nos encontramos en cada caso. Hemos visto funciones para leer datos, reorganizar tablas, limpiar datos, filtrar filas y columnas y hacer diferentes tipos de visualizaciones utilizando poco código y de forma simple.

Sin embargo, por el camino hemos dejado muchas funcionalidades importantes de R sin mencionar: crear nuevas variales con mutate() o calcular estadisticas con summarize().

“A code that works is better than no code. NEVER be ashamed of your code” Hadley Wickham.

Más información sobre R: introduction to R

Repositorio del Taller: Repositorio