Media móvil para la emisión de alertas tempranas: el día en el que falló el sistema de facturación electrónica en Costa Rica¶

Juan M. Fonseca-Solís · September 2018 (actualizado en Julio 2025) · 5 min read


Resumen¶

La detección de anomalías es un problema interesante de estudiar porque permite emitir alertas tempranas y realizar mantenimientos preventivos antes que las fallas se vuelvan catastróficas. Con este propósito algunos autores utilizan inteligencia artificial (AI, por sus siglas en inglés), pero también existen métodos computacionalmente más baratos y que requieren menos datos de entrenamiento, como la media móvil (MA, por sus siglas en Inglés). En el presente notebook explicamos la teoría detra del MA y planteamos un ejemplo de monitoreo de tiempos de respuesta en un servidor web, luego indicamos el número de vecinos a elegir en la ventana de análisis para evitar falsos positivos o retrasos en la emisión de las alertas.

Historia¶

En septiembre del 2018 unos 156.965 contribuyentes en todo el país migraron sus sistemas para emitir los tiquetes de compra de manera electrónica usando el sistema implementado por una colaboración entre el Ministerio de Hacienda, el Banco Central de Costa Rica (BCCR) y la Empresas de Servicios Públicos de Heredia (ESPH). La expectativa general era que los sistemas de Hacienda retornarían una aprobación inmediata de los documentos generados, por esa razón, al presentarse retrasos de hasta 47 segundos en los tiempos de respuesta los comercios involucrados se alarmaron y reportaron problemas. Algunos de los contribuyentes hicieron uso del artículo 15º de la resolución Nº DGT-R-48-2016, que permitía emitir temporalmente las facturas en papel para luego ingresarlas cuando el sistema cuando este estuviera arriba [4, 5].

Los equipos de desarrollo de Hacienda, BCCR y ESPH realizaron una investigación al respecto y no encontraron problemas en sus sistemas, pues la respuesta que daban a los comercios estaba por debajo de las tres horas, el máximo establecido por ley; aunque sí identificaron oportunidades de mejora en el tiempo de verificación de la firma digital [4]. Todo parece indicar que hubo un problema de comunicación entre las partes. Actualmente los sistemas son más eficientes y la recepción de un tiquete electrónico tarda usualmente unos pocos minutos después de realizar la compra.

Un ejemplo teórico¶

Podemos simular un ejemplo de tiempos de respuesta de aprobación de tiquete electrónico usando un proceso normal de media $\mu=5$ y varianza $\sigma^2=900$ (en minutos) y agregando dos eventos que excedan el máximo de tres horas, en los instantes 25 a 85 y 200.

In [1]:
import matplotlib.pylab as plt
import numpy as np;

Ts = 5.0*60.0 # periodo de muestreo (en segundos)
D = 20*60.0*60.0 # duración de la señal (en segundos)
N = int(D/Ts)
mu, sigma = 5, 30
x = np.abs(np.random.normal(mu, sigma, N))

n0=25
x[n0:n0+60] += 180*np.hanning(60)
x[200] = 200

plt.figure()
plt.plot(x,'tab:blue')
plt.axhline(y=180, color='r', linestyle='--')
plt.ylim([0, 250])
plt.xlabel('Entradas grabadas')
plt.ylabel('Tiempo de respuesta (min)')
plt.show()
No description has been provided for this image

Como observamos en la figura anterior, los instantes 25 a 85 sobrepasan el límite de tres horas señalado con una línea roja, y ameritan la emisión de una alerta; sin embargo, el instante 200 es más bien un evento transitorio que puede ser ignorado ya que tiene amplitud baja y corta duración. Para ignorar este tipo de eventos transitorios (o frecuencias altas) se empleamos un filtrado por media móvil, que es una función ya conocida en plataformas de monitoreo del rendimiento de los sistemas, como New Relic o Graphene [7, 8].

Media móvil¶

La media móvil -también llamada integral con fuga- es un filtro pasabajas cuya ecuación se describe a continuación [2]: $$ y[n] = \frac{1}{M}\sum_{m=0}^{M}{x[n-m]}\quad (1), $$ donde $M$ es la cantidad de vecinos de la ventana de análisis y el índice $n$ es la posición analizada en la señal (también llamada serie de tiempo). No se consideran los vecinos posteriores a la muestra actual, pues el procesamiento se realiza de manera causal, es decir, que no se pueden usar muestras que no han sido grabadas.

Eligiendo arbitrariamente $M=20$ vecinos, la ecuación anterior permite obtener la siguiente version suavizada de la señal de ejemplo generada por nosotros:

In [4]:
def graficar_seniales(x:np.ndarray, y:np.ndarray):
    plt.figure()
    plt.plot(x,'c',label='Original')
    plt.plot(y,'blue',label='Suavizada')
    plt.legend()
    plt.axhline(y=180, color='r', linestyle='--')
    plt.ylim([0, 250])
    plt.xlabel('Entradas grabadas')
    plt.ylabel('Tiempo de respuesta (min)')
    plt.show()

def ma(x:np.ndarray, M:int) -> np.ndarray:
    N = len(x)
    y = [0.0]*N
    for n in range(M,N):
        y[n] = np.sum(x[n-M:n])/M
    return y

graficar_seniales(x, ma(x, 20))
No description has been provided for this image

Donde se observa que el pico en 200 a sido eliminado y la anomalía en el rango 60 a 85 se conserva, como es deseado.

Retraso temporal¶

Un problema del procesamiento anterior es que la señal suavizada está retrasada (o desplazada a la derecha) respecto de la señal original y esto se conoce como retraso de grupo. El retraso de grupo es determinado por el tamaño de la ventana de análisis, donde una ventana pequeña produce un retraso de grupo corto (las alertas se generan rápidamente) y un mayor número de falsos positivos; por el contrario, una ventana de análisis grande brinda un mejor filtrado de las frecuencias altas y produce un retraso de grupo largo (las alertas se generan de forma tardía).

El retraso de grupo se puede expresar en terminos temporales multiplicando el periodo de muestreo $T_s$ por el tamaño de la ventana, es decir, $MT_s$ [2]. Con $M=20$ y un periodo de muestreo de $T_s=5$ minutos se obtiene un retraso de grupo de 100 minutos (1 hora y 40 minutos), mientras que con $M=3$ (figura de abajo) el retraso de grupo se reduce a 15 minutos. El retraso de grupo también puede reducirse aumentando el periodo de muestreo, pero esto significa generar más datos, lo que podría aumentar los gastos en almacenamiento en la nube.

In [3]:
graficar_seniales(x, ma(x, 3))
No description has been provided for this image

Con una ventana de análisis más pequeña se observa en la gráfica de arriba que el procesamiento sigue siendo útil y que la señal suavizada está menos desplazada respecto del fitrado anterior; el precio que se paga es un suavizado menos fuerte.

Inteligencia artificial¶

Como se mencionó al inicio del notebook cada vez más autores utilizan la inteligencia artificial para realizar detección de anomalías, aunque con métodos más costozos que la media móvil. Un ejemplo es el uso de encoders, donde se entrena el modelo usando grandes volúmenes de datos cuando el sistema está estable (se usan entradas similares a las que recibe el sistema a simular) para luego calcular el error mínimo cuadrado (MSE, por su siglas en Inglés) entre la señal real y la señal simulada y emitir una alerta cuando el MSE sobrepasa un umbral previamente establecido [6].

Conclusiones¶

La media móvil puede ser empleada para la detección de anomalías de un sistema, para ello es necesario establecer un umbral máximo para la métrica elegida (tiempo de respuesta del servidor, en el ejemplo presentado) y un tamaño de ventana. El tamaño de la ventana determina el retraso de grupo de la media móvil, donde una ventana pequeña produce un retraso de grupo corto pero con un mayor número de falsos positivos, mientras que una ventana de análisis grande brinda un mejor filtrado pero produce un retraso de grupo largo (las alertas se generan de forma tardía). Como trabajo futuro se propone investigar si hay algún método que permita calcular el tamaño de ventana óptimo para la señal usando algunos estadísticos (media, varianza), esto con el fin de evitar procesos de prueba y error.

Referencias¶

  1. Brian Jackson. How to Effectively Monitor and Scale for Website Traffic. KeyCDN. 10 de enero de 2017. URL: https://www.keycdn.com/blog/scale-website-traffic/ (última vez consultado el 16 de setiembre de 2018)
  2. John G. Proakis y Dimitris K. Manolakis. Digital Signal Processing (4 edición). Prentice-Hall, Inc., Upper Saddle River, NJ, USA. 2006
  3. Derek Kraan. Why is my site slow if New Relic says it's fast? Request Queueing. URL: https://img.springe.st/2013_11_26_10_40_22_zdspb.jpg (última vez consultado el 20 de setiembre de 2018)
  4. Carlos Cordero. Sistema de factura electrónica falló el día que recibía a nuevo grupo de contribuyentes. La República, tecnología. URL: https://www.elfinancierocr.com/tecnologia/sistema-de-factura-electronica-fallo-el-dia-que/OQ42RGIS2NFPHD2UDAGI66KNQM/story/ (última vez consultado el 23 de setiembre de 2018)
  5. Ministerio de Hacienda, Dirección General de Tributación. Comprobantes electrónicos, resolución Nº DGT-R-48-2016. Gobierno de Costa Rica. URL: https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4/Resolucion%20Comprobantes%20Electronicos%20%20DGT-R-48-2016.pdf (última vez consultado el 24 de setiembre de 2018)
  6. Brian Douglas. Introduction to Anomaly Detection for Engineers. Mathworks. URL: https://www.mathworks.com/videos/introduction-to-anomaly-detection-for-engineers-1663930223584.html (consultado por última vez el 1 de Julio del 2025).
  7. New Relic. Use sliding windows for smoother charts. URL: https://docs.newrelic.com/docs/nrql/using-nrql/create-smoother-charts-sliding-windows/ (consultado por última vez el 5 de Julio del 2025).
  8. Graphite. Functions. URL: https://graphite.readthedocs.io/en/latest/functions.html#graphite.render.functions.movingAverage (consultado por última vez el 5 de Julio del 2025).

Creditos de la imagen¶

  • iMin Technology. https://www.pexels.com/photo/a-close-up-shot-of-a-person-holding-a-payment-terminal-12935062/ (image free to use).

licencia Creative Commons

Esta obra está bajo una licencia Creative Commons Atribución 4.0 Internacional. El sitio juanfonsecasolis.github.io es un blog costarricence dedicado a la investigación independiente en temas relacionados al procesamiento digital de señales. Para reutilizar este artículo y citar la fuente puede usar Bibtex:

@online{Fonseca2018,
  author = {Juan M. Fonseca-Solís},
  title = {Media móvil para la emisión de alertas tempranas: el día en el que falló el sistema de facturación electrónica en Costa Rica},
  year = 2018,
  url = {https://juanfonsecasolis.github.io/blog/JFonseca.suavizadoTraficoServidorWeb.html},
  urldate = {}
}