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")
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.