Saltar al contenido
Análisis de Series de Tiempo con Python

Introducción a las Series de Tiempo

Introducción

Las series de tiempo son un conjunto de observaciones realizadas en un intervalo de tiempo específico. Es una herramienta importante en la estadística y en la economía, ya que se utiliza para modelar la evolución de una variable a lo largo del tiempo. Esta variable puede ser el precio de una acción, el número de ventas de un producto, la temperatura de una región, entre otras.

El análisis de series de tiempo puede utilizarse para predecir el comportamiento futuro de una variable, identificar patrones estacionales o cíclicos, así como para tomar decisiones informadas en el ámbito empresarial o financiero. En este curso aprenderás a utilizar algoritmos para el análisis, visualización y predicción de series de tiempo con Python. También aprenderás a identificar diferentes tipos de series de tiempo y los modelos matemáticos adecuados para cada una de ellas.

Con este conocimiento, podrás realizar análisis precisos y tomar decisiones informadas basadas en datos.

Resumen

Las series de tiempo son un tipo de datos que se utiliza para analizar la evolución de una variable en el tiempo. En lugar de analizar solo datos estáticos o puntuales, como por ejemplo la edad de un grupo de personas, las series de tiempo abarcan un período o un lapso de tiempo determinado y muestran cómo cambia la variable en cuestión a lo largo de ese período.

Las series de tiempo son muy utilizadas en la economía, la ingeniería, las finanzas, la meteorología, la biología, la física y muchas otras disciplinas. Algunos ejemplos de variables que se miden como series de tiempo son: el precio de las acciones, el clima, la inflación, el tráfico, la producción de una fábrica y el rendimiento de un motor.

Dado que las series de tiempo son una herramienta tan útil, es importante aprender a analizarlas y a extraer información valiosa a partir de ellas. El análisis de series de tiempo puede ayudarnos a hacer predicciones más precisas, a entender mejor los patrones y tendencias de una variable a lo largo del tiempo y a tomar mejores decisiones basadas en datos.

Aplicación teórica

Componentes de las Series de Tiempo

En el análisis de series temporales, las series suelen descomponerse en varios componentes fundamentales para entender mejor su comportamiento y realizar predicciones. Estos componentes incluyen:

1. Tendencia

La tendencia representa el movimiento general de largo plazo en una serie temporal, indicando la dirección en la que los datos están evolucionando a lo largo del tiempo. La tendencia puede ser ascendente, descendente o estable. Matemáticamente, se puede modelar como una función de tiempo \( t \):

\[
T(t) = \beta_0 + \beta_1 t
\]

donde \( \beta_0 \) es el intercepto y \( \beta_1 \) es la pendiente de la tendencia.

2. Estacionalidad

La estacionalidad refleja los patrones repetitivos que ocurren en intervalos regulares, como estacionalidades diarias, semanales, mensuales o anuales. Estos patrones se deben a factores cíclicos recurrentes. En términos matemáticos, la estacionalidad puede representarse como una función periódica:

\[
S(t) = \sum_{k=1}^{K} \gamma_k \sin\left(\frac{2 \pi k t}{P}\right) + \delta_k \cos\left(\frac{2 \pi k t}{P}\right)
\]

donde \( \gamma_k \) y \( \delta_k \) son los coeficientes de los términos seno y coseno, \( K \) es el número de términos, y \( P \) es el periodo de la estacionalidad.

3. Ciclo

El componente cíclico captura las fluctuaciones en los datos que no siguen un patrón regular y son más largas que los ciclos estacionales. Los ciclos suelen estar relacionados con condiciones económicas o eventos externos y tienen una duración variable. No hay una fórmula matemática exacta para los ciclos debido a su naturaleza irregular, pero se pueden modelar utilizando procesos estocásticos como el modelo ARIMA (AutoRegressive Integrated Moving Average).

4. Ruido

El ruido representa las variaciones aleatorias o errores en los datos que no pueden ser explicados por los otros componentes. Es el componente residual que queda después de ajustar los efectos de tendencia, estacionalidad y ciclos. Matemáticamente, se puede modelar como un término de error en el modelo:

\[
E(t) = Y(t) - [T(t) + S(t) + C(t)]
\]

donde \( E(t) \) es el componente de ruido en el tiempo \( t \), \( Y(t) \) es el valor observado, y \( T(t) \), \( S(t) \), y \( C(t) \) son los componentes de tendencia, estacionalidad y ciclo, respectivamente.

Descomposición de Series Temporales

Para analizar y prever series temporales, la serie se puede descomponer en estos componentes usando técnicas como:

1. Descomposición Aditiva

   En la descomposición aditiva, la serie temporal se modela como la suma de los componentes:
   \[
   Y(t) = T(t) + S(t) + C(t) + E(t)
   \]

2. Descomposición Multiplicativa

   En la descomposición multiplicativa, se modela como el producto de los componentes:
   \[
   Y(t) = T(t) \times S(t) \times C(t) \times E(t)
   \]

   Donde \( \times \) denota la multiplicación. Esta es útil cuando los componentes tienen efectos proporcionales.

Ejemplos de Aplicación

1. Tendencia

   Si se observa un aumento constante en las ventas de un producto a lo largo de varios años, la tendencia se modelará con una pendiente positiva.

2. Estacionalidad

   Las ventas de un producto de temporada pueden mostrar picos durante ciertos meses del año, que se capturan con componentes estacionales.

3. Ciclo

   La economía puede experimentar ciclos de crecimiento y recesión que afectan a las ventas y que se modelan con componentes cíclicos.

4. Ruido

   Las fluctuaciones diarias aleatorias en las ventas que no se explican por la estacionalidad o la tendencia representan el ruido.

Descomponer series temporales en estos componentes permite a los analistas comprender mejor el comportamiento de los datos y hacer predicciones más precisas.

Modelado y Pronóstico de Series de Tiempo

El modelado y pronóstico de series de tiempo son procesos clave en el análisis de datos temporales, utilizados para prever futuros valores basándose en patrones observados en datos históricos. Aquí se detallan las técnicas y enfoques matemáticos más comunes utilizados en este campo:

1. Modelos de Series Temporales

Modelos de series temporales son matemáticos y estadísticos que intentan capturar las características principales de los datos temporales para hacer predicciones.

a. Modelos Autorregresivos (AR)

Los modelos autorregresivos (AR) asumen que el valor actual de la serie temporal es una combinación lineal de valores pasados. El modelo AR(p) se define como:

\[
Y_t = \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \cdots + \phi_p Y_{t-p} + \epsilon_t
\]

donde:
- \( Y_t \) es el valor en el tiempo \( t \).
- \( \phi_1, \phi_2, \ldots, \phi_p \) son los parámetros del modelo.
- \( \epsilon_t \) es el término de error, normalmente asumido como ruido blanco.

b. Modelos de Media Móvil (MA)

Los modelos de media móvil (MA) modelan el valor actual de la serie temporal como una combinación lineal de errores pasados. El modelo MA(q) se define como:

\[
Y_t = \mu + \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \cdots + \theta_q \epsilon_{t-q}
\]

donde:
- \( \mu \) es la media de la serie.
- \( \theta_1, \theta_2, \ldots, \theta_q \) son los parámetros del modelo.

c. Modelos Autorregresivos Integrados de Media Móvil (ARIMA)

El modelo ARIMA combina las características de los modelos AR y MA y añade la diferencia estacional para hacer que la serie sea estacionaria. El modelo ARIMA(p,d,q) se define como:

\[
\Delta^d Y_t = \phi_1 \Delta^d Y_{t-1} + \phi_2 \Delta^d Y_{t-2} + \cdots + \phi_p \Delta^d Y_{t-p} + \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \cdots + \theta_q \epsilon_{t-q}
\]

donde \( \Delta^d \) representa el operador de diferenciación de orden \( d \).

 d. Modelos de Suavizamiento Exponencial

Los modelos de suavizamiento exponencial, como el modelo de Holt-Winters, utilizan suavización exponencial para capturar tendencias y estacionalidades. El modelo de suavizamiento exponencial triple (Holt-Winters) es:

\[
\hat{Y}_{t+h} = (L_t + h T_t) S_{t-h+1}
\]

donde:
- \( L_t \) es el nivel.
- \( T_t \) es la tendencia.
- \( S_{t-h+1} \) es el componente estacional ajustado.

2. Evaluación de Modelos

Para evaluar la precisión de los modelos de series temporales, se utilizan métricas de error. Algunas métricas comunes son:

- Error Absoluto Medio (MAE):
  \[
  \text{MAE} = \frac{1}{n} \sum_{t=1}^{n} |Y_t - \hat{Y}_t|
  \]

- Error Cuadrático Medio (MSE):
  \[
  \text{MSE} = \frac{1}{n} \sum_{t=1}^{n} (Y_t - \hat{Y}_t)^2
  \]

- Raíz del Error Cuadrático Medio (RMSE):
  \[
  \text{RMSE} = \sqrt{\text{MSE}}
  \]

- Error Absoluto Porcentual Medio (MAPE):
  \[
  \text{MAPE} = \frac{1}{n} \sum_{t=1}^{n} \left|\frac{Y_t - \hat{Y}_t}{Y_t}\right| \times 100
  \]

3. Pronóstico

El pronóstico de series temporales implica usar el modelo ajustado para predecir valores futuros. Basándose en el modelo seleccionado (ARIMA, Holt-Winters, etc.), se genera una proyección que puede incluir intervalos de confianza para indicar la incertidumbre en las predicciones.

Ejemplo de Pronóstico con ARIMA

Para un modelo ARIMA(1,1,1), la predicción de un valor futuro \( \hat{Y}_{t+h} \) puede calcularse utilizando los parámetros estimados del modelo:

\[
\hat{Y}_{t+h} = \hat{\phi}_1 Y_{t+h-1} + \hat{\theta}_1 \epsilon_{t+h-1}
\]

donde \( \hat{\phi}_1 \) y \( \hat{\theta}_1 \) son los parámetros estimados y \( \epsilon_{t+h-1} \) es el término de error estimado.

Resumen

El modelado y pronóstico de series temporales requieren la selección de un modelo adecuado, la evaluación de su precisión y la generación de pronósticos basados en el modelo ajustado. Las técnicas y fórmulas descritas ayudan a entender los datos temporales, identificar patrones y hacer previsiones informadas para la toma de decisiones.

Transformaciones y Preparación de Datos Temporales

La transformación y preparación de datos temporales es un proceso esencial en el análisis de series temporales que garantiza que los datos estén en un formato adecuado para el modelado y análisis. A continuación se detallan los pasos y técnicas matemáticas involucradas en este proceso.

1. Estacionariedad

Antes de modelar una serie temporal, es crucial que los datos sean estacionarios, lo que significa que sus propiedades estadísticas no cambian con el tiempo. Una serie es estacionaria si su media, varianza y covarianza son constantes a lo largo del tiempo.

a. Pruebas de Estacionariedad

Se pueden usar varias pruebas estadísticas para comprobar la estacionariedad:

- Prueba de Dickey-Fuller Aumentada (ADF): La prueba ADF evalúa la presencia de una raíz unitaria en una serie temporal, que indica no estacionariedad. El test se basa en la hipótesis nula de que la serie tiene una raíz unitaria.

  La forma general de la prueba ADF es:

  \[
  \Delta Y_t = \alpha + \beta t + \gamma Y_{t-1} + \sum_{i=1}^p \delta_i \Delta Y_{t-i} + \epsilon_t
  \]

  donde \( \Delta \) es el operador de diferencia, \( \alpha \) es el intercepto, \( \beta t \) es una tendencia lineal, y \( \gamma \) es el coeficiente de la raíz unitaria.

 b. Diferenciación

Si una serie no es estacionaria, puede hacerse estacionaria mediante diferenciación. La diferenciación de una serie temporal implica restar el valor anterior del valor actual:

\[
\Delta Y_t = Y_t - Y_{t-1}
\]

La diferenciación se puede aplicar varias veces si es necesario, utilizando el operador de diferenciación:

\[
\Delta^d Y_t = \left(1 - L\right)^d Y_t
\]

donde \( L \) es el operador de rezago y \( d \) es el número de diferencias necesarias para lograr la estacionariedad.

2. Transformaciones Matemáticas

Para mejorar la estacionariedad y preparar los datos para el análisis, se pueden aplicar varias transformaciones matemáticas:

a. Transformación Logarítmica

La transformación logarítmica es útil para estabilizar la varianza en datos con tendencia exponencial o heterocedasticidad. La transformación se aplica como:

\[
Y_t' = \log(Y_t)
\]

donde \( Y_t' \) es el valor transformado.

b. Transformación de Raíz Cuadrada

Similar a la transformación logarítmica, la transformación de raíz cuadrada también estabiliza la varianza, especialmente útil para datos con varianza proporcional a la media:

\[
Y_t' = \sqrt{Y_t}
\]

c. Transformación Box-Cox

La transformación Box-Cox es una familia de transformaciones que incluye la logarítmica y la raíz cuadrada como casos especiales. Se define como:

\[
Y_t' = \frac{Y_t^\lambda - 1}{\lambda} \quad \text{si} \quad \lambda \neq 0
\]

\[
Y_t' = \log(Y_t) \quad \text{si} \quad \lambda = 0
\]

donde \( \lambda \) es el parámetro de la transformación que se elige para optimizar la normalidad y la estabilización de la varianza.

3. Manejo de Valores Faltantes

En series temporales, los valores faltantes pueden ocurrir por diversas razones. Existen varios métodos para manejarlos:

a. Imputación

- Interpolación Lineal: Se usa para estimar valores faltantes basándose en los valores conocidos antes y después del valor faltante. Para un valor faltante en \( t \), la interpolación lineal es:

  \[
  Y_t = Y_{t-1} + \frac{Y_{t+1} - Y_{t-1}}{2}
  \]

- Imputación Basada en la Media: Se usa el valor medio de la serie temporal o de un grupo similar para reemplazar los valores faltantes.

  \[
  Y_t = \frac{1}{n} \sum_{i=1}^n Y_i
  \]

  donde \( n \) es el número de observaciones.

b. Modelos de Imputación

- Modelos ARIMA: Los modelos ARIMA pueden usarse para predecir y rellenar valores faltantes, basándose en la estructura temporal de los datos.

4. Resampling

El resampling implica cambiar la frecuencia de los datos para agregarlos o interpolarlos en intervalos de tiempo específicos. Esto puede hacerse para alinear los datos a una frecuencia uniforme o para simplificar el análisis:

 a. Resampling hacia Abajo

Para reducir la frecuencia, por ejemplo, de datos diarios a mensuales, se calcula una estadística agregada (como la media o la suma) para cada período:

\[
Y_{\text{mensual}} = \frac{1}{N} \sum_{i=1}^N Y_i
\]

b. Resampling hacia Arriba

Para aumentar la frecuencia, se puede usar interpolación para estimar los valores en los intervalos nuevos. La interpolación puede ser lineal o basada en métodos más complejos como spline:

\[
Y_t = Y_{t-1} + \frac{(t - t_{-1})}{(t_1 - t_{-1})} \cdot (Y_{t+1} - Y_{t-1})
\]

5. Descomposición de Series Temporales

La descomposición de series temporales permite separar una serie en sus componentes básicos: tendencia, estacionalidad, y ruido. Esto ayuda en el análisis y en la preparación de datos para el modelado:

\[
Y_t = T_t + S_t + E_t
\]

donde \( T_t \) es la tendencia, \( S_t \) es la estacionalidad, y \( E_t \) es el componente de error.

Resumen

La transformación y preparación de datos temporales involucran asegurar que los datos sean estacionarios, aplicar transformaciones matemáticas para estabilizar la varianza, manejar valores faltantes, realizar resampling y descomponer la serie en componentes significativos. Estos pasos son cruciales para preparar los datos para un análisis preciso y para construir modelos predictivos efectivos.

 

Aplicación práctica

Un ejemplo práctico de introducción a las series de tiempo con Python. Supongamos que tenemos una serie de tiempo con los gastos semanales de un restaurante durante los últimos 6 meses, y queremos visualizar la serie de tiempo y realizar una descomposición en componentes (tendencia, estacionalidad y ruido).

Primero, importaremos las librerías de pandas, matplotlib y statsmodels:


import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
    

Luego, cargaremos los datos en un DataFrame de pandas y estableceremos el índice como la fecha:


data = pd.read_csv('gastos_restaurante.csv')
data['fecha'] = pd.to_datetime(data['fecha'])
data = data.set_index('fecha')
    

Ahora, podemos visualizar la serie de tiempo con un gráfico simple:


plt.plot(data)
plt.title('Gastos semanales del restaurante')
plt.xlabel('Fecha')
plt.ylabel('Gastos')
plt.show()
    

Para realizar la descomposición en componentes, podemos utilizar la función seasonal_decompose de la librería statsmodels:


decomposed = seasonal_decompose(data, model='additive')
    

Finalmente, podemos visualizar los tres componentes (tendencia, estacionalidad y ruido) en tres gráficos separados:


trend = decomposed.trend
seasonal = decomposed.seasonal
residual = decomposed.resid

plt.subplot(311)
plt.plot(trend)
plt.title('Tendencia')

plt.subplot(312)
plt.plot(seasonal)
plt.title('Estacionalidad')

plt.subplot(313)
plt.plot(residual)
plt.title('Ruido')

plt.tight_layout()
plt.show()