5. Media móvil y componentes de una serie temporal
Nivel 8: Series Temporales - Estacionariedad
El suavizado por media móvil es una técnica ingenua y eficaz en predicción de series temporales. Puede usarse para preparar datos, para ingeniería de características e incluso directamente para hacer predicciones. Suavizar consiste en aplicar una técnica que elimine la variación de grano fino entre instantes consecutivos, con la esperanza de quitar ruido y exponer mejor la señal de los procesos causales subyacentes.
# media móvil de cola (usa solo el pasado)
rolling = df.rolling(window=3)
rolling_mean = rolling.mean()
rolling_mean.head(10)
# comparar original y transformada
df[-100:].plot()
rolling_mean[-100:].plot(color='red')Es una media móvil de cola: la media de la fila t se calcula con t-2, t-1 y t. Ese detalle importa porque existe también la media móvil centrada, que usa valores futuros y por tanto solo sirve para análisis descriptivo, nunca como característica de un modelo predictivo. Las dos primeras filas salen nulas: hasta la tercera observación no hay tres valores que promediar.
La media móvil como predicción. El valor de la media móvil puede usarse directamente para hacer predicciones. Es un modelo ingenuo y asume que los componentes de tendencia y estacionalidad ya se han eliminado o ajustado. Se presta muy bien a un esquema walk-forward: según llegan observaciones nuevas (por ejemplo, cada día), el modelo se actualiza y se hace una predicción para el día siguiente.
X = df.values
window = 3
history = [X[i] for i in range(window)]
test = [X[i] for i in range(window, len(X))]
predictions = []
# avanzar hacia delante sobre los instantes del conjunto de prueba
for t in range(len(test)):
length = len(history)
yhat = np.mean([history[i] for i in range(length - window, length)])
obs = test[t]
predictions.append(yhat)
history.append(obs)
rmse = np.sqrt(mean_squared_error(test, predictions))
print('RMSE: %.3f' % rmse)
plt.plot(test)
plt.plot(predictions, color='red')
plt.show()
plt.plot(test[:100]) # zoom
plt.plot(predictions[:100], color='red')
plt.show()El bucle es la esencia del walk-forward: se predice con lo que se sabe, se observa el valor real, se añade al historial y solo entonces se pasa al instante siguiente. En ningún momento se usa información futura. Al hacer zoom verás que la línea roja va sistemáticamente por detrás de la azul: cualquier suavizado introduce retraso, y ese retraso es exactamente el precio que se paga por reducir el ruido.
Componentes de una serie temporal. Una abstracción útil para elegir métodos de predicción es descomponer la serie en componentes sistemáticos y no sistemáticos.
- Sistemáticos: componentes con consistencia o recurrencia, que pueden describirse y modelarse.
- No sistemáticos: componentes que no pueden modelarse directamente.
Se considera que una serie consta de tres componentes sistemáticos y uno no sistemático:
- Nivel: el valor medio de la serie.
- Tendencia: el aumento o descenso del valor a lo largo del tiempo.
- Estacionalidad: el ciclo repetitivo de corto plazo.
- Ruido: la variación aleatoria de la serie (este es el no sistemático).
Nuestra serie puede contener tendencia, es decir, un aumento o descenso continuado a lo largo del tiempo, y puede haber ventaja en identificarla, modelarla e incluso eliminarla. También puede contener un componente estacional, un ciclo que se repite mensual o anualmente. Ese ciclo repetitivo puede oscurecer la señal que queremos modelar o, al contrario, aportar una señal fuerte a nuestros modelos predictivos. Hay muchos tipos de estacionalidad: hora del día, diaria, semanal, mensual, anual. Determinar si existe estacionalidad es en parte subjetivo, y el enfoque más simple es representar los datos y revisarlos a distintas escalas, quizá añadiendo líneas de tendencia.
Una serie a la que se le ha eliminado el componente estacional se llama estacionaria en estacionalidad. Si el conjunto de datos no tiene tendencia, o hemos conseguido eliminarla, se dice que es estacionaria en tendencia.