Detección de anomalías en series temporales

Publicado el 19 enero 2022 por Daniel Rodríguez @analyticslane

La detección de anomalías es un campo del aprendizaje automático con múltiples aplicaciones prácticas. Poder identificar automáticamente los datos que son atípicos para una variable permite lanzar alarmas para comprobar la existencia temprana de algún problema. Pudiendo actuar en consecuencia y minimizar las posibles consecuencias. Recientemente he descubierto un paquete de R, anomalize, el cual permite identificar de una forma sencilla las anomalías en series temporales.

Instalación de los paquetes necesarios

La instalación de anomalize se puede hacer como es habitual desde el CRAN, por lo que solamente hay que escribir en una sesión de R el siguiente comando (o emplear el instalador de paquetes de RStudio)

install.packages("anomalize")

Para trabajar de una forma eficiente con anomalize es aconsejable tener instalado el paquete tidyverse, en el caso de que alguien no lo tenga a estas alturas. Además, para obtener fácilmente series de datos, una de las mejores opciones son las cotizaciones de acciones, las cuales se pueden obtener mediante el paquete tidyquant. Un paquete que se pueden instalar simplemente escribiendo en la terminal de R el siguiente comando

install.packages("tidyquant")

Obtención de un conjunto de datos

Para demostrar cómo se pueden identificar anomalías con anomalize voy a utilizar la cotización de la acción de BBVA en 2021. Para esto solamente hay que importar los paquetes y usar la función ‌tq_get del paquete tidyquant con las opciones adecuadas.

library(anomalize)
library(tidyverse)
library(tidyquant)

# Obtención de los datos
bbva <- tq_get('BBVA.MC',
               from = "2020-12-01",
               to = "2021-12-01",
               get = "stock.prices")

head(bbva)
# A tibble: 6 × 8
  symbol  date        open  high   low close   volume adjusted
  <chr>   <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
1 BBVA.MC 2020-12-01  3.86  4.01  3.84  4.00 45127272     3.90
2 BBVA.MC 2020-12-02  3.98  4.08  3.94  4.08 43622604     3.97
3 BBVA.MC 2020-12-03  4.08  4.10  3.99  4.08 26349754     3.97
4 BBVA.MC 2020-12-04  4.07  4.30  4.06  4.30 53906462     4.19
5 BBVA.MC 2020-12-07  4.25  4.30  4.17  4.2  24370848     4.09
6 BBVA.MC 2020-12-08  4.18  4.24  4.15  4.16 14456337     4.05

En este código se ha descargado la cotización de BBVA en el Mercado Continuo de la Bolsa de Madrid desde el primero de diciembre de 2020 hasta el mismo día del año siguiente. Valores que se han cargado en la variable bbva.

Identificación de anomalías en series temporales con anomalize

Ahora, una vez cargados los datos, solamente hay que usar las funciones de anomalize para analizarlos.

bbva_anomalized <- bbva %>% 
  time_decompose(close) %>%
  anomalize(remainder) %>%
  time_recompose()

En primer lugar es necesario usar la función time_decompose() para transformar los valores de la columna que se desea analizar, en este caso el valor de cierre de la acción ( close), creando un objeto con los datos para ser analizados. Objeto que contiene cuatro columnas valores: observed, season, trend, y remainder.

Posteriormente, se emplea la función anomalize() para identificar anomalías sobre la columna con los residuos ( remainder). Añadiendo tres nuevas columnas: remainder_l1, remainder_l2 y anomaly al objeto. Siendo la columna que nos interesa la tercera, en la que se indica si el dato es atípico o no para la serie.

Finalmente, la función time_recompose() recompone los datos en base a las columnas season y trend creadas con antelación.

Representación gráfica de las anomalías detectadas

Ahora se puede repensar la cotización de la acción para ver visualmente las anomalías detectadas en la serie temporal. Algo que se puede hacer con el siguiente código.

bbva_anomalized %>%
  plot_anomalies(time_recomposed = TRUE, alpha_dots = 0.25) +
  labs(title = "Anomalías detectadas en cotización de BBVA")
Anomalías detectadas en cotización de BBVA detectadas con anomalize

Una figura en la que cada punto es la cotización de un día y los valores marcados en rojo son las anomalías detectadas. Las cuales se detectan durante los últimos días de cotización debido a las alarmas producidas por la variante ómicron durante esas fechas.

Conclusiones

Solamente con un par de líneas de código se ha podido analizar la cotización de una acción e identificar anomalías en esta gracias a las funciones del paquete anomalize. Un paquete que debemos considerar si necesitamos implementar modelos de detección de anomalías en series temporales de una forma fácil y rápida.