Series temporales
R cuenta con numerosas funciones para el análisis de series temporales en esta lección aprenderemos las funciones y estructuras de datos más básicas para su manejo.
El formato de fecha
Normalmente cuando cargamos un fichero, el formato de la(s) columna(s) que representan fechas será del tipo carácter (chr
). Esto significa que R lo interpreta como letras y números en lugar de fechas que contienen un valor secuencial.
Por este motivo, será necesario convertir las columnas que representan fechas, normalmente almacenadas como strings en un tipo de datos que se pueda mostrar como una variable continua. Como es de esperar, R tiene un tipo de datos para representar fechas, podemos realizar esta conversión usando la función as.Date()
.
Cuando ejecutamos la función as.Date()
, debemos decirle a R cómo se formatea la fecha: la posición del mes, el día y el año y en qué formato se encuentra cada elemento.
Por ejemplo: 1/11/10 vs 11-1-2010 representan la misma fecha, pero tienen diferente formato. Podemos usar las siguientes designaciones para los componentes de los datos de fecha y hora:
%Y : Año expresado con 4 dígitos.
%y : Año expresado con 2 dígitos.
%m : Mes.
%d - Día.
Si queremos expresar las fechas anteriores con un string que especifica el formato lo haríamos de la siguiente manera:
1/11/10 : “%d/%m/%y”
11-1-2010 : “%m/%d/%Y”
Veamos un ejemplo de transformación de fecha del tipo de datos string a fecha, usaremos la función antes mencionada y el parámetro format
para especificar el formato.
[3]:
fecha_str = "1/11/10"
fecha = as.Date(fecha_str, format="%d/%m/%y")
fecha
Esta operación también es aplicable a vectores enteros, de esta manera podemos transformar columnas enteras de nuestros dataframes.
La estructura de datos ts
El uso de funciones para el análisis de series temporales requiere que los objetos a los que se aplican sean de la clase ts (time series). La función ts()
convierte un objeto, por ejemplo un vector, al tipo de datos serie temporal.
Vamos a usar el conjunto de datos Daily climate data in the city of Delhi from 2013 to 2017 que podemos encontrar en la plataforma Kaggle (enlace). veremos que existen 2 ficheros, nosotros usaremos aquel llamado: DailyDelhiClimateTrain.csv.
Vamos a cargarlo:
[ ]:
datos = read.csv("data/DailyDelhiClimateTrain.csv")
str(datos)
Como podemos observar la columna `date
Como podemos observar la columna date
tiene el tipo de datos chr
. El primer paso que realizaremos es transformarlo a tipo fecha y a continuación usaremos la libreria ggplot2
para realizar una primera visualización de los datos, en concreto un diagrama de barras de la temperatura media según el dia.
[ ]:
datos$date = as.Date(datos$date, format="%Y-%d-%m")
tail(datos)
[ ]:
library(ggplot2)
ggplot(datos) + geom_col(mapping=aes(x=date, y=meantemp),fill = "coral") # geom_col es un nuevo tipo de geom
El siguiente paso que realizaremos será el de construir un objeto del tipo ts
que nos permitirá trabajar de forma más específica con los datos de temperatura media. Necesitaremos especificar la frecuencia de las observaciones y si queremos mantener la información de fechas, también la fecha inicial.
Veamos un ejemplo:
[40]:
temp_m = ts(datos$meantemp, frequency=365, start = c(2013, 1))
plot(temp_m)
Cuando tenemos la estructura correctamente creada, podemos usar diferentes funciones que nos permitiran obtener información de la serie:
start: proporciona el inicio de la serie temporal.
end: proporciona el final de la serie temporal.
[42]:
start(temp_m)
end(temp_m)
- 2013
- 1
- 2017
- 2
decompose: devuelve una lista como resultado, donde las estimaciones del componente estacional, el componente de tendencia y el componente irregular se almacenan en elementos de la lista, denominados “seasonal”, “trend”, y “random” respectivamente.
[43]:
decomp_temp = decompose(temp_m)
plot(decomp_temp)
Otras funciones que pueden ser de interés:
window: extrae los valores de la serie temporal comprendidos entre una fecha de inicio y otra final. Podemos especificar sólo el año.
ts.union(): junta dos series temporales, rellenando con
NA
los periodos en que una serie sea más larga que la otra.intersect.ts(): junta dos series temporales, pero sólo con los datos correspondientes al periodo común a ambas.
Ejercicios
Descargar los datos “Dades COVID-19 Casos Confirmats Illes Balears (Per Municipis)” de la página del Govern Balear.
Cargarlos en R y verificar que los formatos de datos son correctos, realizar las transformaciones necesarias.
Realizar las operaciones necesarias para obtener un nuevo dataframe donde tengamos los casos por día.
Dibujar un diagrama de barras donde se visualice la evolución temporal de los positivos.
Crear un objeto
ts
con los datos que has construido. Realiza el plot del año 2021 para asegurarte que el objeto tiene la información correcta.