Suavizado Exponencial (Exponential Smoothing) - Series de tiempo

Esta técnica de suavizacion se basa en la atenuación de los valores de la serie de tiempo, obteniendose el valor de estos de manera exponenecial; es decir, los datos se ponderan, dandole un mayor peso a las observaciones recientes y menor peso a las mas antiguas. Al más reciente se le otorga el valor de $\alpha$, a la observación inmediata anterior se le otorga $\alpha(1-\alpha)$, a la siguiente observacion inmediata anterior se le da el peso de ponderación  de $\alpha(1-\alpha)^2$  y asi sucesivamente hasta completar el número de valores observados en la serie de tiempo, todo este proceso nos conlleva a la siguiente expresión  para realizar el cálculo de la Suavización Exponencial Simple (SES).

$$ \begin{aligned} P_{t+1} & =\alpha \cdot Y_t + \alpha\cdot (1-\alpha)\cdot T_{t-1} + \alpha\cdot (1-\alpha)^2\cdot Y_{t-2} + \ldots  \\ P_{t+1} & = \alpha\cdot Y_t + (1-\alpha)\cdot P_t \end{aligned}$$.

Donde:

$Y_t$: Es el valor de la serie en el periodo $t$.

$P_{t+1}$: Es el pronóstico o predicción para el periodo $t+1$.

$\alpha$: Es el factor de suavización $0 \leq \alpha \leq 1$.

El valor de la serie suavizada en el periodo $t+1$ es igual a $\alpha$ veces el valor de la serie de tiempo en el periodo $t$, más $1-\alpha$ veces el valor predicho en el periodo $t$.

Es por ello que se requiere la existencia de un valor inicial $P_0$, el cual puede ser un promedio de los datos anteriores o simplemente el primer valor de la serie.

Método de suavizado exponencial Doble - Método de Brown

El método de suavización exponencial de Brown (Pindyck, 2001) produce una serie de datos suavizada a partir de una serie de datos históricos, ya que la nueva serie está constituida por promedios de valores de la serie original. Como en el caso de la suavización exponencial simple es muy importante fijar de manera de correcta el parámetro $\alpha$ entre 0 y 1.

Se menciona una regla práctica: “Si los datos presentan fuertes fluctuaciones o gran aleatoriedad se deben usar valores de alpha cercanos a 0; es decir, que si el parámetro de suavización alpha está próximo a cero, el valor inicial de la serie influirá durante muchos períodos de tiempo. Por el contrario, con valores de alpha próximos a uno, desaparecerá rápidamente la influencia del valor histórico” (Pérez, 2005).

En este método se calcula primero una suavizacion exponencial simple para cada valor de la serie y luego se vuelve a calcular otra suavizacion expoencial sobre los datos resultantes de la primera:

Suavización Exponencial simple:

$$P_t = \alpha\cdot Y_t + (1 - \alpha) \cdot P_{t-1}$$

Suavización Exponencial Doble:

$$Y_t^{\prime} = \alpha\cdot P_t + (1 - \alpha) \cdot Y_{t-1}^{\prime}$$

Donde:

$P_t$: Es el valor atenuado segun el modelo de SES en el tiempo $t$.

$P_{t-1}$: Es el valor atenuado según el modelo de SES en el tiempo $t-1$.

$Y_t^{\prime}$: Es el valor pronosticado sobre la segunda suavizacion exponencial en el tiempo $t$.

$Y_{t-1}^{\prime}$: Es el valor pronosticado sobre la segunda suavizacion exponencial en el tiempo $t-1$.

$\alpha$: Constante de suavizacion exponencial $0 \leq \alpha \leq 1$.

Pronóstico futuro.-

Para realizar un pronóstico, se utiliza una interpretacion lineal en la que se contempla la componente de tendencia (Segunda suavizacion exponencial) de la siguiente forma:

$$\hat{Y}_{t+j}=a_t + j \cdot b_j $$

Considerando:

$$\begin{aligned} a_t  & = 2\cdot P_{t}-Y_{t}^{\prime} \\ b_t & = \left(\dfrac{\alpha}{1-\alpha}\right)\cdot (P_{t}-Y_{t}^{\prime}) \end{aligned}$$.

Donde:

$\hat{Y}_{t+j}$ Valor pronosticado agregando la tendencia lineal para el periodo $t+j$.

$a_t$: Ordenada de origen para el modelo lineal en el e tiempo $t$.

$b_t$: Pendiente de tendencia lineal en el periodo $t$.

$j$: Cantidad de periodoos pronosticadas $j=1,2,3,4, \ldots$

$\alpha$: Es la unica variable que debe ser determinada de manera experimental sobre los valores disponibles en los datos de la serie temporal.

Ejemplo con código python:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import SimpleExpSmoothing

# Crear datos simulados: 100 puntos de datos con alguna variabilidad aleatoria
np.random.seed(0)
datos_simulados = np.random.normal(0, 1, 100).cumsum()

# Convertir a DataFrame
df = pd.DataFrame(datos_simulados, columns=['Valor'])

# Aplicar Suavizado Exponencial Simple
# Seleccionamos un valor de alfa (factor de suavizado). En este caso, usaremos 0.2.
modelo = SimpleExpSmoothing(df['Valor'])
resultado = modelo.fit(smoothing_level=0.2, optimized=False)

df['Suavizado_Exponencial'] = resultado.fittedvalues

# Gráfico para visualizar los datos
plt.figure(figsize=(12, 6))
plt.plot(df['Valor'], label='Datos Originales')
plt.plot(df['Suavizado_Exponencial'], label='Suavizado Exponencial')
plt.title('Suavizado Exponencial Simple con Datos Simulados')
plt.xlabel('Tiempo')
plt.ylabel('Valor')
plt.legend()
plt.show()


En el código se generan datos simulados: Usamos numpy para crear 100 puntos de datos que siguen una distribución normal acumulativa, simulando una serie temporal con cierta tendencia y variabilidad.

Convertimos los Datos a un DataFrame de Pandas: Esto nos permite gestionar los datos de manera más eficiente.

Aplicamos el Suavizado Exponencial Simple: Utilizamos la función SimpleExpSmoothing de la biblioteca statsmodels. Establecemos un valor para el parámetro de suavizado $\alpha=2$. Un valor más bajo de $\alpha$ asigna más peso a los datos más antiguos, mientras que un valor más alto hace que el modelo responda más a los cambios recientes.

Visualizamos los Resultados: Creamos un gráfico que muestra tanto los datos originales como los datos después de aplicar el suavizado exponencial.

Resultados del DataFrame: Las primeras filas del DataFrame muestran tanto los valores originales como los valores suavizados. Se puede observar cómo el suavizado exponencial sigue la tendencia general de los datos, pero con menos variabilidad, haciendo que los patrones subyacentes sean más claros.

Cuyo Pronóstico es:
from statsmodels.tsa.holtwinters import SimpleExpSmoothing

# Suponemos que queremos hacer un pronóstico para los próximos 10 periodos
periodos_pronostico = 10

# Ajustar el modelo de suavizado exponencial a los datos
modelo = SimpleExpSmoothing(df['Valor'])
resultado = modelo.fit(smoothing_level=0.2, optimized=False)

# Realizar el pronóstico
pronostico = resultado.forecast(periodos_pronostico)

# Agregar el pronóstico al DataFrame para visualización
df_pronostico = pd.DataFrame({'Valor': pronostico}, index=range(len(df), len(df) + periodos_pronostico))
df_total = pd.concat([df, df_pronostico])

# Gráfico para visualizar los datos y el pronóstico
plt.figure(figsize=(12, 6))
plt.plot(df_total['Valor'], label='Datos Originales + Pronóstico')
plt.plot(df['Suavizado_Exponencial'], label='Suavizado Exponencial')
plt.axvline(x=len(df) - 1, color='gray', linestyle='--', label='Inicio del Pronóstico')
plt.title('Pronóstico Utilizando Suavizado Exponencial Simple')
plt.xlabel('Tiempo')
plt.ylabel('Valor')
plt.legend()
plt.show()






Comentarios

Entradas populares de este blog

Utilizando Gráficas Multivariantes con Python