💡
El script correspondiente a este apartadado se puede descargar en el link script_tipo_datos
El periódico NYTimes señaló en 2014 que “los científicos de datos dedican entre el 50 y el 80 % de su tiempo a la mundana tarea de recopilar, manipular y preparar datos, antes de aplicar ninguna técnica estadística”. Por tanto, es conveniente aprender a procesar los datos brutos para ahorrar tiempo y esfuerzo.
Este procesamiento previo, también conocido como data wrangling, hace referencia al proceso de transformar y limpiar datos brutos en un formato estructurado adecuado para su posterior análisis. Este proceso implica diferentes operaciones (filtrado, agrupamiento, ordenación…). Esta labor constituye un paso previo indispensable antes de someter nuestros datos a análisis más concienzudos.
Importación de datos: cargar datos desde diferentes formatos (como archivos de texto plano) a R para su análisis.
Limpieza de datos: identificar y corregir errores, duplicados, valores atípicos y datos faltantes en el conjunto de datos.
Transformación de datos: reestructurar y remodelar los datos para el formato deseado, por ejemplo, de formato ancho a largo o viceversa.
Enriquecimiento de datos: combinar datos de múltiples fuentes para añadir información adicional y mejorar la calidad de los datos.
Validación de datos: verificar la coherencia, calidad y seguridad de los datos después de las transformaciones.
Almacenamiento: guardar el resultado final junto con los pasos de transformación para permitir la auditoría y la reproducibilidad.
La herramienta fundamental para este tipo de análisis son los
paquetes del ecosistema tidyverse
. Son una colección de
paquetes de R diseñados para la ciencia de datos, que incluye
herramientas para el data wrangling. Para las actividades de este
apartado del temario, los paquetes fundamentales son:
dplyr: para la manipulación de datos
tidyr para la reestructuración de datos, con el fin de obtener datos ordenados y listos para que sean más fáciles de analizar y visualizar
Cabe señalar además el relevante papel del operador %>% (pipe), que permite encadenar funciones, facilitando la lectura y escritura del código al pasar los datos de una operación a la siguiente sin necesidad de multiplicar el número de objetos en el Global Environment.
Como veremos más adelante, en la mayoría de los casos se trabaja con dataframes cuya estructura se denomina wide (ancha, en inglés), pues:
Esta estructura, sin embargo, puede ser transformada.
Para no tener que cargar los paquetes dplyr
y
tidyr
, se procede a activar el paquete
tidyverse
ya que incluye los dos anteriores como
dependencias
library(tidyverse)
Establecer la carpeta de trabajo
setwd("D:/G2040/TEMA_1_Introduccion/TEMA_1_ejercicios")
Cargar el fichero
load("zonas_verdes.RData")
Estructura del fichero (similar a str()
)
glimpse(zonas_verdes)
## Rows: 100
## Columns: 6
## $ ID <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
## $ barrio <chr> "Retiro", "Retiro", "Chamberí", "Retiro", "Retiro",…
## $ parques <int> 6, 4, 6, 7, 4, 5, 6, 8, 10, 9, 9, 10, 4, 5, 7, 3, 9…
## $ superficie <dbl> 6.863999, 6.945574, 3.365407, 6.102484, 7.146998, 3…
## $ obras <int> 0, 1, 1, 0, NA, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ fecha_inauguracion <date> 1984-12-05, 1935-09-25, 1962-07-11, 1990-02-06, 20…
Conocer los nombres de las variables
names(zonas_verdes)
## [1] "ID" "barrio" "parques"
## [4] "superficie" "obras" "fecha_inauguracion"
o también
colnames(zonas_verdes)
## [1] "ID" "barrio" "parques"
## [4] "superficie" "obras" "fecha_inauguracion"
pipe %>%
Este operador encadena varios pasos simples y consecutivos para
obtener un único resultado final, concatenando o uniendo varias
funciones, que están disponibles en el paquete magrittr
,
que forma parte de dplyr
. Este operador aumenta la
expresividad de R, como si fuera un lenguaje hablado. Su símbolo es
%>%
Obsérvese en el siguiente ejemplo. En el paquete base de R, cada vez que se aplican varias funciones consecutivas se escribe cada una de ellas en un reglón, pudiéndose obtener además varios objetos diferentes.
Para ahorrar espacio y reducir el número de objetos en el Global Environment es posible elaborarlas como una secuencia “anidada” que resulta habitualmente bastante ilegible: tercera(segunda(primera(x))). Este anidamiento no es una forma natural de expresar un secuencia de operaciones.
El operador %>% nos permite escribir una secuencia de operaciones de izquierda a derecha: primera(x) %>% segunda(x) %>% tercera(x) Obsérvese que las siguientes instrucciones. En este caso, primero se crea el objeto operacion_1 que contiene 2 variables, conferencia y puntos.
operacion_1 <- select(zonas_verdes, superficie, obras)
operacion_1
A continuación, el objeto operacion_2 selecciona del objeto anterior todos los parques con una superficie superior a 10 ha.
operacion_2 <- filter(operacion_1, superficie >= 10)
operacion_2
Con pipe
es posible realizar ambas operaciones de manera
consecutiva, creando un único objeto final.
resultado_combinado <- zonas_verdes %>%
select(superficie, obras) %>%
filter(superficie >= 25)
Eliminamos los datos
rm(operacion_1, operacion_2)
dplyr
?El paquete dplyr()
es la herramienta más utilizada para
la labor de procesamiento de datos en R.
Este paquete proporciona una serie de funciones (verbos) para la manipulación y operaciones con data frames y fáciles de recordar (incluso en inglés). Las funciones (verbos) son las siguientes:
⌦ select(): selecciona columnas específicas.
⌦ rename(): cambiar el nombre de columnas específicas.
⌦ relocate(): cambiar el orden de columnas específicas.
⌦ mutate(): crea nuevas variables a partir de las existentes.
⌦ bind_cols(): anexar otro dataframe (mismo número de casos).
⌦ join(): anexar otro dataframe (diferente número de casos).
⌦ filter(): selecciona filas específicas.
⌦ distinct(): identifica casos duplicados.
⌦ arrange(): ordena los datos (orden de las filas) según criterios específicos.
⌦ bind_rows()/add_rows(): anexa otro dataframe.
⌦ slice(): fragmenta el dataframe según criterios determinados.
⌦ n_sample(): selecciona filas aleatoriamente.
Análisis por grupos de filas):
⌦ group_by(): segmenta un conjunto de datos en grupos.
⌦ summarize(): calcula estadísticas de resumen.
⌦ pivot_longer(): transforma una base de datos “ancha” en “larga”.
⌦ pivot_wider(): transforma una base de datos “larga” en “ancha”.
Las funciones dplyr se procesan más rápido que las funciones base R. También son más estables en la sintaxis y admiten mejor los conjuntos de datos.
Usa el mismo lenguaje que otros paquetes, como ggplot2(), lo cual facilita su uso.
El resultado de la aplicación de cualquier función es un nuevo data frame.
Todas las funciones de dplyr tienen en común una serie de argumentos. En particular:
El primer argumento es un data frame. Los data frames deben estar bien organizados/estructurados, es decir debe existir una observación por columna y, cada columna representar una variable, medida o característica de esa observación.
Los argumentos posteriores describen qué hacer con el data frame, utilizando los nombres de las variables (sin comillas). Los otros argumentos describen que hacer con el data frame especificado en el primer argumento, podemos referirnos a las columnas en el data frame directamente sin utilizar el operador $, es decir sólo con el nombre de la columna/variable.
Valores perdidos. Todas las funciones de
agregación aceptan el argumento na.rm
que no toma en
consideración los valores faltantes antes del cálculo.
Recuentos. Siempre que se vaya a realizar una
agregación es una buena idea incluir un recuento (n())
o un
recuento de valores no faltantes (sum(!is.na(x)))
. De esa
manera, se puede comprobar comprobar que no estás sacando conclusiones
basadas en cantidades muy pequeñas de datos.