Modelos de Regressão com o Tempo: ARIMA e Séries Temporais

, editado •0•0Comment iconComment iconComment iconComment icon

Entenda os componentes AR, I e MA, a notação ARIMA(p,d,q), um exemplo de previsão passo a passo, o código no statsmodels e exercícios com gabarito.

Editar artigo

O ARIMA (AutoRegressive Integrated Moving Average), ou modelo autorregressivo integrado de médias móveis, é um modelo estatístico muito usado para analisar e prever séries temporais. Ele combina três componentes:

  • AR (autorregressivo): dependência dos valores passados da própria série.
  • I (integrado): diferenciação para tornar a série estacionária.
  • MA (médias móveis): dependência dos erros passados.

Com isso, o ARIMA cria uma estrutura muito mais adequada para séries temporais do que uma regressão linear simples contra o tempo. Vamos explicar o que é o ARIMA e depois compará-lo com essa regressão para entender por que ele costuma ser melhor quando lidamos com dados ao longo do tempo.

Componentes do Modelo ARIMA

1. AR(p) – Autorregressivo de Ordem p

Séries autorregressivas são aquelas em que o valor de hoje depende dos próprios valores passados. Pense na inflação mensal: um mês de inflação alta tende a ser seguido por outro mês de inflação alta, porque contratos e preços são reajustados com base no passado. O mesmo vale para a demanda diária de energia ou para a temperatura média de um dia em relação ao dia anterior.

O modelo AR(p) escreve \( Y_t \) como uma combinação linear dos seus valores passados:

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

Sendo p o número de defasagens (lags) usadas. Para escolher p, olhamos a função de autocorrelação parcial (FACP): em um AR(p) ela corta depois do lag p.

2. I(d) – Integração de Ordem d

O d é o número de diferenciações necessárias para tornar a série estacionária, isto é, sem tendência de crescimento ou de queda.

Uma série temporal é estacionária quando suas propriedades estatísticas (média, variância e autocorrelação) não mudam ao longo do tempo. Isso é essencial para o ARIMA, que supõe estacionariedade (depois das diferenciações) para fazer previsões confiáveis. O teste formal é o de Dickey-Fuller aumentado (ADF), que veremos mais adiante; por enquanto, vamos avaliar a estacionariedade olhando a série.

Observe a série a seguir e repare que, trabalhando com a diferença entre valores consecutivos, a série passa a oscilar em torno de uma média constante:

Mês (t)Vendas (Yₜ)1ª diferença (∇Yₜ)
1100–
2120120 − 100 = 20
3130130 − 120 = 10
4150150 − 130 = 20
5170170 − 150 = 20
6190190 − 170 = 20

Assim, aplicamos I(d) quando percebemos uma tendência de crescimento ou de queda na série. Se a primeira diferença ainda tiver tendência (por exemplo, quando a série cresce de forma quadrática), usamos I(2), isto é, diferenciamos de novo até a média ficar constante.

3. MA(q) – Médias Móveis de Ordem q

Usamos o MA(q) quando a série sofre choques que afetam só alguns períodos seguintes e depois somem: a série tem "memória curta" dos erros. No MA(1), o valor de hoje é afetado pelo erro de ontem; no MA(2), pelos erros de ontem e de anteontem. Exemplos de dados com impactos temporários: preços de ações ou de produtos após um evento único, demanda após uma promoção relâmpago.

O modelo MA(q) escreve \( Y_t \) como uma combinação linear dos erros passados:

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

  • q: número de termos de erro usados.
  • FAC (função de autocorrelação): identifica a ordem q, porque em um MA(q) ela corta depois do lag q.

Exemplo de um MA(2) com \( \mu = 50 \), \( \theta_1 = 0{,}8 \) e \( \theta_2 = 0{,}3 \), supondo erros iguais a zero antes do dia 1:

Dia (t)Erro (εₜ)Cálculo do modelo MA(2)Preço (Yₜ)
1+2,00Y₁ = 50 + 2,00 + 0,8×0 + 0,3×052,00
2−1,00Y₂ = 50 + (−1,00) + 0,8×2 + 0,3×050,60
3+1,50Y₃ = 50 + 1,50 + 0,8×(−1) + 0,3×251,30
4−0,80Y₄ = 50 + (−0,80) + 0,8×1,5 + 0,3×(−1)50,10
5+0,34Y₅ = 50 + 0,34 + 0,8×(−0,8) + 0,3×1,550,15
6−0,28Y₆ = 50 + (−0,28) + 0,8×0,34 + 0,3×(−0,8)49,75

Repare que o preço sempre volta para perto de 50: cada choque só influencia os dois dias seguintes.

Uma série vale 10, 14, 18, 22, 26 nos meses 1 a 5. Qual a ordem de integração d mais adequada?

Loading icon

Gabarito: d = 1 — a primeira diferença dá 4, 4, 4, 4, uma série de média constante, então uma diferenciação basta. d = 2 seria necessário se a primeira diferença ainda crescesse, como numa série quadrática.

Em um MA(1) com μ = 100 e θ1 = 0,5, o erro do último período foi +4. Qual a previsão para o próximo período (o erro futuro tem valor esperado zero)?

Loading icon

Gabarito: 102 — a previsão é μ mais θ1 vezes o último erro: 100 + 0,5 × 4 = 102. A opção 104 soma o erro inteiro, esquecendo de multiplicar por θ1.

Notação ARIMA(p, d, q)

Por exemplo, no ARIMA(1, 1, 1):

  • AR(1): a série diferenciada depende do seu valor anterior;
  • I(1): aplica-se uma diferenciação;
  • MA(1): depende também do erro anterior, \( \epsilon_{t-1} \).

Equação do ARIMA(1,1,1):

\[ \nabla Y_t = c + \phi_1 \nabla Y_{t-1} + \theta_1 \epsilon_{t-1} + \epsilon_t \]

Exemplo Prático: Previsão de Vendas Mensais

Passo 1: Carregar e Visualizar os Dados

Dados de vendas mensais (em milhares):

MêsVendas
1100
2120
3130
4150
5170
6190

Passo 2: Verificar a Estacionariedade

A série tem uma tendência clara de crescimento, então não é estacionária. O teste ADF confirma (rodando o adfuller do statsmodels nesses 6 pontos, o p-valor é cerca de 0,99, longe de 0,05). Aplicamos então a primeira diferenciação:

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

MêsVendas\( \nabla Y_t \)
212020
313010
415020
517020
619020

A série diferenciada oscila em torno de uma média constante. Atenção: com tão poucas observações, o teste ADF tem pouquíssimo poder, e na prática ele exige dezenas de pontos; aqui a decisão é visual.

Passo 3: Definir o Modelo ARIMA(1,1,1)

Para simplificar as contas, vamos usar o modelo sem constante:

\[ \nabla Y_t = \phi_1 \nabla Y_{t-1} + \theta_1 \epsilon_{t-1} + \epsilon_t \]

Onde:

  • \( \nabla Y_t = Y_t - Y_{t-1} \) (série diferenciada);
  • \( \phi_1 \) = coeficiente AR(1);
  • \( \theta_1 \) = coeficiente MA(1);
  • \( \epsilon_t \) = erro no tempo \( t \).

Passo 4: Escolher os Coeficientes (AR e MA)

Como estamos fazendo as contas à mão, usaremos valores típicos para ilustrar:

  • \( \phi_1 = 0{,}6 \) (AR)
  • \( \theta_1 = -0{,}3 \) (MA)

Pacotes como o statsmodels, do Python, estimam esses coeficientes por máxima verossimilhança: escrevem o modelo em forma de espaço de estados e usam o filtro de Kalman para encontrar os valores que tornam os dados observados mais prováveis (o que, com erros normais, equivale aproximadamente a minimizar a soma dos quadrados dos erros).

Passo 5: Montar as Previsões

A previsão de cada mês usa a diferença real do mês anterior e o erro do mês anterior:

Mês∇Yₜ (real)Previsão ARIMA(1,1,1)
310\( \widehat{\nabla Y_3} = 0{,}6 \times 20 + (-0{,}3) \times \epsilon_2 \)
420\( \widehat{\nabla Y_4} = 0{,}6 \times 10 + (-0{,}3) \times \epsilon_3 \)
520\( \widehat{\nabla Y_5} = 0{,}6 \times 20 + (-0{,}3) \times \epsilon_4 \)
620\( \widehat{\nabla Y_6} = 0{,}6 \times 20 + (-0{,}3) \times \epsilon_5 \)

Passo 6: Calcular os Erros (\( \epsilon_t \))

No mês 2 ainda não há diferença anterior para usar. Como o modelo não tem constante, a previsão sem informação é 0, e o erro inicial é a própria diferença: \( \epsilon_2 = 20 - 0 = 20 \).

Mês∇Yₜ (real)Previsão (\( \widehat{\nabla Y_t} \))Erro (\( \epsilon_t = \nabla Y_t - \widehat{\nabla Y_t} \))
2200 (sem histórico)\( \epsilon_2 = 20 - 0 = 20 \)
310\( 0{,}6 \times 20 + (-0{,}3) \times 20 = 6 \)\( \epsilon_3 = 10 - 6 = 4 \)
420\( 0{,}6 \times 10 + (-0{,}3) \times 4 = 4{,}8 \)\( \epsilon_4 = 20 - 4{,}8 = 15{,}2 \)
520\( 0{,}6 \times 20 + (-0{,}3) \times 15{,}2 = 7{,}44 \)\( \epsilon_5 = 20 - 7{,}44 = 12{,}56 \)
620\( 0{,}6 \times 20 + (-0{,}3) \times 12{,}56 = 8{,}23 \)\( \epsilon_6 = 20 - 8{,}23 = 11{,}77 \)

Passo 7: Prever o Próximo Mês (Mês 7)

Usando os últimos valores:

\[ \widehat{\nabla Y_7} = 0{,}6 \times 20 + (-0{,}3) \times 11{,}77 = 8{,}47 \]

\[ \hat{Y}_7 = Y_6 + \widehat{\nabla Y_7} = 190 + 8{,}47 = 198{,}47 \]

Resumo do modelo ARIMA(1,1,1)

  • Equação usada: \( \nabla Y_t = 0{,}6 \nabla Y_{t-1} - 0{,}3 \epsilon_{t-1} + \epsilon_t \)
  • Previsão para o mês 7: cerca de 198,5

Repare que todos os erros foram positivos: o modelo subestimou o crescimento em todos os meses. Isso acontece porque as vendas sobem, em média, 18 por mês, e o modelo sem constante supõe que a diferença oscila em torno de zero. Em uma série com tendência, o ARIMA(1,1,1) deve incluir a constante c (chamada de drift), que representa esse crescimento médio.

Fazendo o Mesmo no Python

No statsmodels atual, o ARIMA fica em statsmodels.tsa.arima.model. Com d = 1, a constante de crescimento é pedida com trend="t":

import pandas as pd
from statsmodels.tsa.arima.model import ARIMA

vendas = pd.Series([100, 120, 130, 150, 170, 190], index=pd.period_range("2024-01", periods=6, freq="M"))
modelo = ARIMA(vendas, order=(1, 1, 1), trend="t")
resultado = modelo.fit()
print(resultado.params)
print(resultado.forecast(steps=1))

O drift estimado fica perto de 17,8 por mês e a previsão para o mês 7 sai em torno de 206, acima dos 198,5 do modelo sem constante. Com só 6 observações, porém, os coeficientes AR e MA estimados são muito instáveis: use o código para aprender a sintaxe, não para confiar nesses números.

Em um ARIMA(1,1,0) sem constante, com φ1 = 0,5, os dois últimos valores da série foram 190 e 200. Qual a previsão para o próximo período?

Loading icon

Gabarito: 205 — a última diferença é 200 menos 190 = 10; a diferença prevista é 0,5 × 10 = 5; somando ao último valor, 200 + 5 = 205. A opção 210 repete a última diferença inteira, como num passeio aleatório com tendência, ignorando o φ1.

No exemplo das vendas, todos os erros do ARIMA(1,1,1) sem constante foram positivos. O que isso indica?

Loading icon

Gabarito: Que falta a constante (drift): a série cresce em média 18 por mês e o modelo supõe crescimento médio zero — erros sempre do mesmo sinal são sinal de viés. Mudar o sinal de θ1 não resolveria, porque o problema está no nível médio da série diferenciada.

Diferença entre os ARIMAs

ModeloFórmulaQuando usar?Exemplo prático
ARIMA(0,0,0)
(ruído branco)
\( Y_t = \mu + \epsilon_t \)Quando a série é puro ruído, sem padrõesTemperatura de um ambiente climatizado
ARIMA(0,1,0)
(passeio aleatório)
\( Y_t = Y_{t-1} + \epsilon_t \)Séries com tendência estocásticaPreços de ações
ARIMA(1,0,0)
(AR(1))
\( Y_t = c + \phi_1 Y_{t-1} + \epsilon_t \)Quando Yₜ depende apenas de Yₜ₋₁Demanda diária de energia
ARIMA(0,0,1)
(MA(1))
\( Y_t = \mu + \epsilon_t + \theta_1 \epsilon_{t-1} \)Choques temporários que afetam só 1 períodoVendas após uma promoção
ARIMA(1,0,1)
(ARMA(1,1))
\( Y_t = c + \phi_1 Y_{t-1} + \theta_1 \epsilon_{t-1} + \epsilon_t \)Quando há memória do valor passado e do erro passadoPreços de commodities
ARIMA(1,1,0)\( \nabla Y_t = \phi_1 \nabla Y_{t-1} + \epsilon_t \)Tendência + autocorrelação no 1º lagCrescimento do PIB
ARIMA(0,1,1)\( \nabla Y_t = \theta_1 \epsilon_{t-1} + \epsilon_t \)Tendência + choques temporáriosPreços do petróleo
ARIMA(1,1,1)\( \nabla Y_t = \phi_1 \nabla Y_{t-1} + \theta_1 \epsilon_{t-1} + \epsilon_t \)Combina tendência, memória do valor e memória do erroVendas com tendência e choques

Nenhum desses modelos captura sazonalidade (picos que se repetem todo ano, como as vendas de Natal). Para isso existe a extensão SARIMA, que acrescenta termos AR, I e MA sazonais.

As vendas mensais de uma loja crescem ano a ano e têm um pico todo mês de dezembro. Qual modelo é o mais indicado?

Loading icon

Gabarito: SARIMA, com diferenciação e termos sazonais de período 12 — a tendência pede diferenciação e o pico anual pede a parte sazonal. Um ARIMA comum ou uma reta contra o tempo não reproduzem o pico de dezembro.

Por que usar ARIMA em vez de Regressão Linear com o Tempo?

A escolha entre o ARIMA e a regressão linear com o tempo depende da estrutura dos dados e das suposições estatísticas. A regressão linear com o tempo (modelo simples) supõe que a série pode ser escrita como:

\[ Y_t = \beta_0 + \beta_1 \cdot t + \epsilon_t \]

Onde:

  • \( t \) = variável de tempo (ex.: 1, 2, 3, ...);
  • \( \epsilon_t \) = erro aleatório.

A vantagem é ser simples de implementar e de interpretar, e ela funciona bem quando há uma tendência linear clara (crescimento constante). Mas ela tem limitações:

  • Ignora a autocorrelação: em séries temporais, valores passados influenciam valores futuros (demanda de produtos, preços de ações), e a regressão trata cada observação como independente, o que raramente é verdade.
  • Não lida com sazonalidade nem com ciclos se o único regressor for t: padrões repetitivos (como as vendas de Natal) ficam nos resíduos.
  • Exige resíduos não correlacionados: em séries temporais, os resíduos costumam ter autocorrelação (se hoje a demanda foi alta, amanhã também pode ser), o que torna os testes t e os intervalos de confiança da regressão enganosos.

Comparação Direta: Regressão Linear vs. ARIMA

CritérioRegressão linear com o tempoARIMA
TendênciaModela apenas tendência linearRemove a tendência por diferenciação
AutocorrelaçãoIgnoraCaptura (termos AR e MA)
SazonalidadeNão lida (só com variáveis extras)Só na extensão SARIMA
ResíduosSupõe independênciaModela a dependência; os resíduos finais devem ser ruído branco
ComplexidadeBaixaAlta (escolha de p, d, q)

Por que uma regressão linear simples de Y contra t costuma dar testes t enganosos em séries temporais?

Loading icon

Gabarito: Porque os resíduos costumam ser autocorrelacionados, violando a suposição de independência — com resíduos dependentes, os erros padrão ficam subestimados e os testes acusam significância demais. Ao contrário da última opção, regressões contra o tempo muitas vezes têm R² alto justamente por causa da tendência.

Exercícios

Nos exercícios com termo MA, quando não houver valor anterior para usar, a previsão é só a constante c (como no Passo 6 do exemplo, em que c = 0).

1. Qual é a diferença entre os componentes AR e MA em um ARIMA?

a) AR usa valores passados; MA usa erros passados.
b) AR é para tendência; MA é para sazonalidade.
c) Ambos são iguais.

2. Faça uma previsão para o mês 7 usando um ARIMA(0,1,0) (passeio aleatório, sem constante).

MêsVendas
1100
2120
3130
4150
5170
6190

3. Ajuste um ARIMA(1,0,0) à série abaixo e faça uma previsão para t = 5 com \( \phi_1 = 0{,}6 \), \( \theta_1 = -0{,}3 \) e \( c = 10 \). (Atenção: um dos coeficientes dados não é usado neste modelo.)

tY
110
215
320
425

4. Ajuste um ARIMA(1,0,1) à série abaixo e faça uma previsão para t = 5 com \( \phi_1 = 0{,}6 \), \( \theta_1 = -0{,}3 \) e \( c = 10 \).

tY
110
215
320
425

5. Ajuste um ARIMA(1,1,1) à série abaixo e faça uma previsão para t = 5 com \( \phi_1 = 0{,}6 \), \( \theta_1 = -0{,}3 \) e \( c = 10 \).

tY
110
215
320
425

6. Use um ARIMA(1,1,0) para calcular a previsão de todos os tempos possíveis, do 2 ao 6 (o 6 é a previsão do período seguinte aos dados). Use \( \phi_1 = 0{,}6 \) e \( c = 20 \) (o \( \theta_1 = 0{,}3 \) não entra neste modelo). Depois, calcule o SEE das previsões dos tempos 2 a 5.

TempoY (vendas)
180
270
390
4110
5120

7. Use um ARIMA(1,1,1) para calcular a previsão de todos os tempos possíveis, do 2 ao 6. Use \( \phi_1 = 0{,}6 \), \( \theta_1 = 0{,}3 \) e \( c = 20 \).

TempoY (vendas)
180
270
390
4110
5120

Gabarito

1. a)

2. No passeio aleatório, a previsão é o último valor: \( \hat{Y}_7 = Y_6 = 190 \).

3. \( \hat{Y}_5 = 10 + 0{,}6 \times 25 = 25 \). O \( \theta_1 \) não entra, porque o ARIMA(1,0,0) não tem termo MA.

4. Previsões e erros: \( \hat{Y}_1 = 10 \) (só a constante), \( \epsilon_1 = 0 \); \( \hat{Y}_2 = 10 + 0{,}6 \times 10 = 16 \), \( \epsilon_2 = -1 \); \( \hat{Y}_3 = 10 + 0{,}6 \times 15 - 0{,}3 \times (-1) = 19{,}3 \), \( \epsilon_3 = 0{,}7 \); \( \hat{Y}_4 = 10 + 0{,}6 \times 20 - 0{,}3 \times 0{,}7 = 21{,}79 \), \( \epsilon_4 = 3{,}21 \). Previsão: \( \hat{Y}_5 = 10 + 0{,}6 \times 25 - 0{,}3 \times 3{,}21 \approx 24{,}04 \).

5. Diferenças: 5, 5, 5 (t = 2, 3, 4). \( \widehat{\nabla Y_2} = 10 \), \( \epsilon_2 = -5 \); \( \widehat{\nabla Y_3} = 10 + 0{,}6 \times 5 - 0{,}3 \times (-5) = 14{,}5 \), \( \epsilon_3 = -9{,}5 \); \( \widehat{\nabla Y_4} = 10 + 3 - 0{,}3 \times (-9{,}5) = 15{,}85 \), \( \epsilon_4 = -10{,}85 \); \( \widehat{\nabla Y_5} = 10 + 3 - 0{,}3 \times (-10{,}85) = 16{,}26 \). Previsão: \( \hat{Y}_5 = 25 + 16{,}26 \approx 41{,}26 \). Os erros crescentes e sempre negativos mostram que c = 10 é grande demais para uma série que cresce 5 por período.

6. Diferenças: −10, 20, 20, 10 (t = 2 a 5). Diferenças previstas: 20 (t = 2, só a constante), \( 20 + 0{,}6 \times (-10) = 14 \), \( 20 + 0{,}6 \times 20 = 32 \), 32 e \( 20 + 0{,}6 \times 10 = 26 \). Somando ao valor anterior, as previsões são \( \hat{Y}_2 = 100 \), \( \hat{Y}_3 = 84 \), \( \hat{Y}_4 = 122 \), \( \hat{Y}_5 = 142 \) e \( \hat{Y}_6 = 146 \). Erros nos tempos 2 a 5: −30, 6, −12 e −22; SSE = 1564. Com \( n - 2 \) no denominador, como na regressão, \( SEE = \sqrt{1564/2} \approx 27{,}96 \).

7. \( \widehat{\nabla Y_2} = 20 \), \( \epsilon_2 = -30 \); \( \widehat{\nabla Y_3} = 20 + 0{,}6 \times (-10) + 0{,}3 \times (-30) = 5 \), \( \epsilon_3 = 15 \); \( \widehat{\nabla Y_4} = 20 + 12 + 4{,}5 = 36{,}5 \), \( \epsilon_4 = -16{,}5 \); \( \widehat{\nabla Y_5} = 20 + 12 - 4{,}95 = 27{,}05 \), \( \epsilon_5 = -17{,}05 \); \( \widehat{\nabla Y_6} = 20 + 6 - 5{,}115 = 20{,}885 \). Previsões: \( \hat{Y}_2 = 100 \), \( \hat{Y}_3 = 75 \), \( \hat{Y}_4 = 126{,}5 \), \( \hat{Y}_5 = 137{,}05 \) e \( \hat{Y}_6 \approx 140{,}89 \).

O que você achou deste artigo?

0%
Nota dos usuários (0)

Compartilhe este artigo!