Ciencia de datos

Detección de anomalías en series temporales

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.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Segmentación RFM: cómo clasificar tu cartera de clientes antes de calcular el CLV

En un artículo anterior vimos la fórmula clásica del CLV junto a sus limitaciones. Una…

2 horas ago

Los récords con asterisco, o la épica del titular sin contexto – El bestiario de los indicadores económicos absurdos (parte 8 y final)

Y llegamos al final de una serie que había programado para ser de tres entradas.…

5 días ago

PSI: Cómo Saber Cuándo tu Modelo de Credit Scoring se ha Degradado

Un modelo de credit scoring no es un artefacto estático. Se construye en un momento…

1 semana ago

Los indicadores que se autocumplen, o cuando medir es modificar – El bestiario de los indicadores económicos absurdos (parte 7)

En las seis entregas anteriores hemos paseado por casi todos los géneros del disparate económico:…

2 semanas ago

Customer Lifetime Value: la fórmula clásica que todo analista debería dominar

El Customer Lifetime Value (CLV) es, probablemente, la métrica más importante que puede calcular una…

2 semanas ago

Analytics Lane lanza la versión 1.4 del laboratorio con nuevas herramientas de conversión y modelos avanzados de CLV

Seguimos ampliando el laboratorio de Analytics Lane con el lanzamiento de la versión 1.4, que…

3 semanas ago

This website uses cookies.