3. Visualización: distribuciones y dispersión
Nivel 8: Series Temporales - Estacionariedad
Las series temporales se prestan de forma natural a la visualización. Los gráficos de línea de las observaciones a lo largo del tiempo son los más habituales, pero hay todo un repertorio de gráficos adicionales que puedes usar para conocer mejor tu problema. Cuanto más aprendas sobre tus datos, más probable es que desarrolles un modelo de predicción mejor.
df.plot() # niveles del S&P 500
Re.plot() # retornos logarítmicosEl contraste entre ambos gráficos ya cuenta la historia central del nivel: la serie de precios sube y baja sin volver nunca a un nivel de referencia, mientras que la de retornos oscila alrededor de cero con episodios de agitación concentrados (marzo de 2020 salta a la vista).
Histogramas y gráficos de densidad.
df.hist()
Re.hist()
df.plot(kind='kde')Esto significa representar los valores sin el orden temporal. Algunos métodos lineales de predicción de series temporales asumen una distribución bien comportada de las observaciones (una campana de Gauss, una normal). Eso puede comprobarse explícitamente con contrastes de hipótesis, pero los gráficos ofrecen una primera verificación muy útil de la distribución, tanto sobre las observaciones en bruto como después de cualquier transformación aplicada.
La estimación de densidad por núcleo (KDE, kernel density estimation) tiene como propósito principal ofrecer una versión suavizada del histograma, mostrando la distribución general de los datos. En una serie temporal ayuda a entender qué valores toma la serie, si están normalmente distribuidos, si hay asimetría, etc. En el caso de los retornos del S&P 500 verás una densidad más apuntada en el centro y con colas más gruesas que una normal: exceso de curtosis, la firma habitual de los datos financieros.
Gráficos de dispersión con retardo (lag scatter plots). La modelización de series temporales asume que existe una relación entre una observación y las observaciones previas. Las observaciones previas se llaman retardos: la del instante anterior es retardo 1, la de dos instantes atrás es retardo 2, y así sucesivamente. Un tipo de gráfico muy útil para explorar la relación entre cada observación y un retardo suyo es el gráfico de dispersión. Pandas tiene una función incorporada exactamente para eso, el lag plot: representa la observación del instante t en el eje x y la observación con retardo 1 (t-1) en el eje y.
- Si los puntos se agrupan a lo largo de una diagonal que va de abajo a la izquierda hacia arriba a la derecha, sugiere una relación de correlación positiva.
- Si se agrupan a lo largo de una diagonal que va de arriba a la izquierda hacia abajo a la derecha, sugiere una correlación negativa.
- Cualquiera de las dos relaciones es buena noticia, porque ambas se pueden modelar.
Cuantos más puntos pegados a la diagonal, más fuerte es la relación; cuanta más dispersión respecto a la línea, más débil. Una bola en el centro o una nube repartida por todo el gráfico sugiere una relación débil o inexistente.
lag_plot(ts) # sobre precios: una diagonal casi perfecta
lag_plot(Re) # sobre retornos: una bola informeY podemos generar una rejilla con varios retardos a la vez:
import matplotlib.gridspec as gridspec
values = pd.DataFrame(df.values)
lags = 12
columns = [values]
for i in range(1, lags + 1):
columns.append(values.shift(i))
dff = pd.concat(columns, axis=1)
dff.columns = ['t'] + ['t-' + str(i) for i in range(1, lags + 1)]
rows = (lags + 3) // 4
gs = gridspec.GridSpec(rows, 4)
fig = plt.figure(figsize=(15, 12))
for i in range(1, lags + 1):
ax = fig.add_subplot(gs[(i - 1) // 4, (i - 1) % 4])
ax.set_title('t vs t-' + str(i))
ax.scatter(x=dff['t'].values, y=dff['t-' + str(i)].values)
plt.tight_layout()
plt.show()