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
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.
Después de ver el estado de los datos, queda claro que para poder trabajar con ellos, tendremos que hacer algunos cambios.
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
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
Una vez tenemos los datos adecuadamente formateados podemos empezar a manipular y visualizar los resultados. Vamos a ver varios ejemplos:
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.
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()
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)
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.
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