Saltar al contingut principal
Capítol 1 bàsic pandas matplotlib fonaments

El teu primer encontre amb el temps com a dada

8 min lectura
Què és una sèrie temporal, per què necessita un tractament especial i com descompondre-la en tendència, estacionalitat i soroll amb pandas i matplotlib.

Imagina que intentes predir les vendes de la teva botiga en línia utilitzant només el preu mitjà del mes. Funcionaria força malament, oi? El problema no és que el preu no importi: és que estàs ignorant el factor més obvi de l’univers: l’ordre en el temps.

Les sèries temporals són simplement observacions recollides en intervals consecutius. Vendes diàries, temperatures horàries, preus de tancament d’una acció, batecs per minut… Tot això té en comú que cada punt depèn, en major o menor mesura, del que va passar abans. I aquest detall canvia per complet com els has d’analitzar.

En aquest capítol aprendràs a pensar en el temps com una dimensió més de les teves dades, no com una etiqueta decorativa.


Què converteix unes dades en una sèrie temporal?

Un dataset normal registra files independients: clients, productes, enquestes. Pots barrejar-les i l’anàlisi segueix sent vàlid. En una sèrie temporal, l’ordre importa. Barrejar les dades destrueix la informació més valuosa: la dependència entre el present i el passat.

Formalment, una sèrie temporal és una seqüència:

Yt={y1,y2,y3,...,yt}Y_t = \{y_1, y_2, y_3, ..., y_t\}

On cada yty_t és una observació en l’instant tt. La màgia està en que yty_t no és un valor aïllat: està relacionat amb y{t1}y_\{t-1\}, y{t2}y_\{t-2\} i, de vegades, amb el mateix mes de l’any passat.

Tipus de dadaExemple¿Importa l’ordre?
Corte transversalEnquesta de satisfaccióNo
Sèrie temporalVendes diàriesSí, totalment
Panel de dadesVendes diàries per botigaSí, i també hi ha grups

Les quatre cares d’una sèrie temporal

Gairebé qualsevol sèrie temporal es pot descompondre en quatre components:

  1. Tendència: moviment a llarg termini. ¿Puja? ¿Baixa? ¿Es manté pla?
  2. Estacionalitat: patrons que es repeteixen a intervals fixos. Dies de la setmana, mesos, estacions.
  3. Cicle: oscil·lacions de més llarg termini, no necessàriament regulars. Els cicles econòmics són l’exemple clàssic.
  4. Soroll: la part aleatòria que no expliques amb l’anterior.

La forma més comuna de modelar-ho és de manera additiva:

Yt=Tt+St+Ct+εtY_t = T_t + S_t + C_t + \varepsilon_t

No sempre necessites els quatre. De vegades la sèrie només té tendència i soroll. Altres vegades, l’estacionalitat ho domina tot. El primer pas sempre és el mateix: dibuixar-la. Mai comencis modelant sense mirar la gràfica.

Activa i desactiva cada component per veure el seu efecte Y_t = T_t + S_t + ε_t
Tendència (T_t)
Estacionalitat (S_t)
Residual (ε_t)

La teva primera sèrie temporal amb pandas

Anem a crear una sèrie sintètica que simuli vendes mensuals durant cinc anys. Tendrà tendència creixent, un patró estacional anual i una mica de soroll. Així podrem veure cada component per separat.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Fijamos semilla para que puedas reproducir los resultados
np.random.seed(42)

# 60 meses, desde enero de 2020
fechas = pd.date_range(start="2020-01-01", periods=60, freq="ME")
t = np.arange(60)

# Componentes
tendencia = 50 + 0.8 * t
estacionalidad = 10 * np.sin(2 * np.pi * t / 12)
ruido = np.random.normal(0, 4, 60)

# Serie completa
ventas = tendencia + estacionalidad + ruido
serie = pd.Series(ventas, index=fechas)

# Visualización
plt.figure(figsize=(10, 5))
plt.plot(serie, color="#1a1a1a", linewidth=2)
plt.title("Vendes mensuals simulades")
plt.xlabel("Data")
plt.ylabel("Vendes")
plt.grid(True, alpha=0.3)
plt.show()

Fixa’t en dues coses del codi. Primer, usem pd.date_range amb freq="ME" per tenir un índex temporal de final de mes. Segon, convertim l’array de NumPy en una pd.Series amb aquest índex. Això és el que converteix uns números solts en una sèrie temporal manipulable.

Vendes mensuals simulades (60 mesos)

Passa el cursor per sobre la gràfica per veure el valor exacte de cada punt. Veuràs clarament la tendència creixent i els pics estacionals que es repeteixen cada 12 mesos.


L’índex temporal és el teu millor aliat

Un cop tens un DatetimeIndex, pandas et dóna superpoders. Pots seleccionar rangs, canviar freqüències i calcular estadístiques mòbils sense escriure bucles.

# Seleccionar un any concret
serie_2022 = serie["2022"]

# Mitjana mòbil de 12 mesos per suavitzar l'estacionalitat
media_movil = serie.rolling(window=12).mean()

# Re-muestrejar a trimestres
serie_trimestral = serie.resample("QE").mean()

# Desplaçar un període cap endavant (lag)
serie_lag1 = serie.shift(1)

La mitjana mòbil és especialment útil. Si grafiques la sèrie juntament amb la seva mitjana de 12 mesos, veuràs com la línia suavitzada revela la tendència subjacent que l’estacionalitat amagava.

# Comparar sèrie original amb mitjana mòbil de 12 mesos
plt.figure(figsize=(10, 5))
plt.plot(serie, label="Vendes mensuals", color="#1a1a1a", linewidth=1.5)
plt.plot(serie.rolling(window=12).mean(), label="Mitjana mòbil 12 mesos", color="#ffcc00", linewidth=2.5)
plt.title("Sèrie original vs tendència suavitzada")
plt.xlabel("Data")
plt.ylabel("Vendes")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

La línia groga segueix la tendència a llarg termini sense distreure’s amb els pics i valls estacionals. És una forma ràpida de veure cap a on es dirigeix la sèrie.

Experimenta amb la finestra de la mitjana mòbil
Finestra (mesos): 12
Sèrie original Mitjana mòbil

¿Depèn avui d’ahir? El lag plot

Una forma visual de detectar dependència temporal és el lag plot: grafiques cada valor contra el seu valor anterior.

from pandas.plotting import lag_plot

plt.figure(figsize=(5, 5))
lag_plot(serie, lag=1, c="#1a1a1a", alpha=0.6)
plt.title("Lag plot: y(t) vs y(t-1)")
plt.grid(True, alpha=0.3)
plt.show()

Si els punts formen un núvol sense forma, no hi ha autocorrelació. Si s’alineen en diagonal, el valor actual depèn fortament de l’anterior. En la nostra sèrie sintètica veuràs una diagonal clara: les vendes d’un mes estan lligades a les del mes previ.

També pots calcular la correlació numèrica:

correlacion_lag1 = serie.corr(serie.shift(1))
print(f"Correlació amb lag 1: {correlacion_lag1:.3f}")

Un valor alt confirma el que intuïes amb el lag plot: el passat importa.


Descomposició automàtica amb statsmodels

Fins ara hem descompost la sèrie a mà. statsmodels pot fer-ho automàticament amb un model additiu o multiplicatiu.

from statsmodels.tsa.seasonal import seasonal_decompose

# Descomposició additiva amb període anual (12 mesos)
resultado = seasonal_decompose(serie, model="additive", period=12)

fig = resultado.plot()
fig.set_size_inches(10, 8)
plt.suptitle("Descomposició additiva de la sèrie", y=1.02)
plt.show()

Aquest gràfic separa observat, tendència, estacional i residual en quatre panells. És útil perquè et dóna una versió “oficial” de la descomposició i et permet comparar-la amb la teva intuïció visual.


¿Per què no usar una regressió lineal simple?

És la pregunta que molta gent es fa al començar. Si vull predir vendes, ¿no puc usar y = mx + b amb el temps com a x?

Pots, però només si la sèrie és pura tendència. En quant apareix estacionalitat, autocorrelació o soroll estructurat, una recta es queda curta. Pitjor encara: si uses les dades tal qual, els errors del model no seran independients. Això invalida els intervals de confiança i fa que les prediccions siguin poc fiables.


Comprova la teva comprensió

¿Què passa si barreges aleatòriament les files d'una sèrie temporal abans d'analitzar-la?

Resum i següent pas

En aquest capítol has après que una sèrie temporal és una seqüència ordenada on el passat influeix en el present. També has vist com descompondre-la en tendència, estacionalitat, cicle i soroll, i com manipular-la amb pandas utilitzant el seu índex temporal.

Abans de ficar models complexos, necessites dominar una idea central: l’estacionarietat. Una sèrie estacionària és molt més fàcil de modelar perquè les seves propietats estadístiques no canvien amb el temps. En el proper capítol veurem com detectar-la, com transformar una sèrie no estacionària en estacionària i com ajustar el teu primer model ARIMA.