Pular para o conteúdo principal
Ciência de dados

ARIMAX: como prever séries temporais com variáveis externas

Veja como o ARIMAX estende o ARIMA com preditores externos, entenda seus parâmetros e premissas e construa um modelo de previsão em Python com statsmodels.
Vinod Chugani's photo
Vinod Chugani
Actualizado · 9 min leer

Explore com IA

ChatGPTClaudePerplexity

Crie sua conta gratuita

Pratique e programa seu progresso.

Continuar Com O Google
Ao continuar, você aceita nossos Termos de Uso, nossa Política de Privacidade e que seus dados serão armazenados nos EUA.

Imagine que você esteja prevendo a demanda mensal de eletricidade. Você tem um ARIMA bem calibrado, capturando autocorrelação e tendência da série. Aí chega uma onda de calor e sua previsão erra por 15%. A série não mudou; o clima mudou. É exatamente para esse cenário que o ARIMAX foi criado: previsão de séries temporais quando fatores externos explicam tanto da variação quanto o próprio histórico da série.

Vamos ver o que é ARIMAX, como ele difere de ARIMA e SARIMAX e quando faz sentido usar um ou outro. Também vamos passar por uma implementação completa em Python cobrindo preparação de dados, ajuste do modelo, diagnósticos e avaliação de previsões, para você aplicar no seu dia a dia.

O que é ARIMAX?

ARIMAX significa AutoRegressive Integrated Moving Average with eXogenous variables. É um modelo ARIMA que também aceita entradas externas, ou seja, preditores de fora da própria série alvo. Exemplos que vêm à mente: investimento em marketing, temperatura, flags de promoção, taxas de juros.

A notação geral é ARIMAX(p, d, q) com um ou mais regressores exógenos. Os parâmetros p, d e q têm o mesmo significado do ARIMA: ordem autorregressiva, grau de diferenciação e ordem da média móvel. O "X" indica que você pode passar colunas adicionais que acredita influenciarem o alvo. Um ponto importante: alguns pacotes implementam ARIMAX como uma regressão com erros ARIMA, em vez de tratar variáveis externas como entradas AR diretas. A distinção é sutil matematicamente, mas afeta a interpretação dos coeficientes. Vamos voltar a isso quando analisarmos o output do statsmodels.

Como o ARIMAX funciona

O ARIMAX combina duas coisas: a memória da própria série e o poder explicativo de variáveis externas.

Os componentes AR, I e MA

O componente AR (autorregressivo) usa valores defasados da série alvo para prever o valor atual. Se as vendas do mês passado foram altas, isso importa.

O componente I (integrado) diferencia a série para remover tendências ou raízes unitárias, tornando-a estacionária.

O componente MA (média móvel) usa erros de previsão passados para corrigir erros sistemáticos que o modelo vem cometendo.

Juntos, esses três elementos lidam com boa parte do que move uma série típica: tendências, ciclos e autocorrelação nos resíduos.

Onde entram as variáveis exógenas

Variáveis exógenas trazem informações que o histórico da série não consegue fornecer. Em previsão de vendas, o passado informa padrões típicos. Mas um corte de preço ou a entrada de um concorrente são informações novas. O modelo estima um coeficiente para cada preditor externo enquanto leva em conta a autocorrelação nos erros.

Na prática: se sua série é bem explicada por seus próprios valores passados e você não tem bons preditores externos, ARIMA puro provavelmente basta. Mas quando você sabe que fatores externos entram em jogo — e quando você realmente terá os valores futuros desses preditores — o ARIMAX tende a entregar previsões mais precisas.

ARIMA vs. ARIMAX vs. SARIMAX

O SARIMAX amplia o SARIMA ao adicionar variáveis exógenas. Na prática, a maioria das implementações de ARIMAX em Python usa SARIMAX() do statsmodels, com ordem sazonal zerada.

Não é gambiarra. É o padrão recomendado. SARIMAX é uma ótima primeira escolha quando sua série tem um padrão sazonal claro ou quando você precisa de regressores externos; ele lida bem com ambos. Um porém: "ARIMAX" e "SARIMAX" não são sinônimos em todas as bibliotecas. Em alguns pacotes, SARIMAX sem termos sazonais e ARIMAX são idênticos na prática. Em outros, diferem em como as variáveis exógenas entram na verossimilhança. Consulte a documentação da ferramenta que você está usando.

Quando usar ARIMAX

Geralmente a decisão se resume a: você tem preditores externos que plausivelmente influenciam o alvo e terá seus valores futuros quando for prever?

Situações em que o ARIMAX agrega valor

Bons candidatos incluem previsão de vendas com flags de promoção ou mudanças de preço, demanda de energia com temperatura, tráfego do site com investimento em campanhas e indicadores econômicos com dados de juros. Em cada caso, a variável externa fornece informação que a série não gera sozinha.

ARIMA puro pode bastar quando preditores externos não estão disponíveis, não são confiáveis ou simplesmente não melhoram a acurácia fora da amostra. Adicionar preditores que trazem mais ruído que sinal não ajuda. Mais entradas não garantem melhores previsões. Avalie qualquer preditor proposto em dados separados antes de adotá-lo.

Um comentário sobre causalidade

Relação entre um preditor e o alvo não estabelece causalidade. ARIMAX é um arcabouço de previsão; ele estima associações. Se o investimento em marketing correlaciona com vendas porque ambos sobem em dezembro, o modelo pode capturar isso, mas não dirá que a propaganda causou o aumento. Essa diferença importa se você usa previsões para orientar decisões, e não apenas prever resultados. Vale ser explícito sobre isso ao apresentar resultados.

Como construir um modelo ARIMAX em Python

Agora, mãos à obra.

Vamos usar um exemplo reproduzível: vendas mensais de sorvete (unidades vendidas) com temperatura (°C) e uma flag de promoção como preditores exógenos. O conjunto tem 48 meses, sendo 36 para treino e 12 para avaliação.

Prepare os dados

Comece carregando ou construindo um DataFrame com índice mensal consistente. Defina sua variável alvo e as colunas exógenas e alinhe tudo por data. Trate valores ausentes antes de dividir. Não faça imputação atravessando a fronteira entre treino e teste — isso causa vazamento.

Regra para internalizar desde cedo: quaisquer valores exógenos usados no treino precisarão estar disponíveis no futuro, na hora de prever. Se você não consegue obter previsões de temperatura futuras, não dá para usar temperatura como preditor. Não é detalhe: isso elimina muitos candidatos.

import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import mean_absolute_error

# Construct a sample monthly dataset
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="MS")
temperature = 15 + 10 * np.sin(np.linspace(0, 4 * np.pi, 48)) + np.random.normal(0, 1, 48)
promotion = np.where((np.arange(48) % 6 == 0), 1, 0)
sales = (
    500
    + 8 * temperature
    + 150 * promotion
    + np.cumsum(np.random.normal(0, 10, 48))
)

df = pd.DataFrame({"sales": sales, "temperature": temperature, "promotion": promotion}, index=dates)

# Train/test split
train = df.iloc[:36]
test = df.iloc[36:]

Normalmente não é preciso escalonar variáveis para estimação no statsmodels, mas isso pode ajudar na estabilidade numérica quando os preditores estão em escalas muito diferentes. Escalonar ou não é uma decisão de julgamento.

Verifique a série e os preditores

Antes de escolher parâmetros do modelo, inspecione visualmente a série alvo e rode um teste de estacionariedade. O teste de Dickey-Fuller aumentado (ADF) é o padrão. Um p-valor abaixo de 0,05 sugere estacionariedade e provavelmente dispensa diferenciação (d=0). Se houver tendência clara, normalmente se usa d=1. Testes são um insumo; conhecimento de domínio e inspeção visual também contam.

Cheque também seus preditores: estão alinhados ao alvo? Existe chance de algum preditor ser medido depois da data de previsão? Uma flag de promoção definida antes do início do mês tudo bem. A receita daquele mês, não.

Escolha parâmetros candidatos e ajuste o modelo

Gráficos de ACF e PACF ajudam a sugerir valores para p e q. Pico significativo na defasagem 1 no PACF com ACF decaindo costuma indicar AR(1); o inverso sugere MA(1). Compare um pequeno conjunto de candidatos usando AIC ou BIC no treino e deixe o teste apenas para a avaliação final.

# Fit ARIMAX(1,1,1) via SARIMAX with no seasonal order
exog_train = train[["temperature", "promotion"]]
exog_test = test[["temperature", "promotion"]]

model = SARIMAX(
    train["sales"],
    exog=exog_train,
    order=(1, 1, 1),
    seasonal_order=(0, 0, 0, 0),
    trend="n"
)
result = model.fit(disp=False)
print(result.summary())

O summary() mostra os coeficientes do ARIMA junto com os coeficientes das variáveis exógenas. O coeficiente de temperatura indica quanto um aumento de um grau está associado a uma mudança no nível das vendas, depois que a estrutura autorregressiva explica o “embalo” da série. Um detalhe: o statsmodels usa a formulação de regressão com erros ARIMA, o que significa que a diferenciação (d=1) é aplicada ao processo de erro, não à equação de regressão em si. O coeficiente representa o efeito no nível das vendas independentemente de d. Em uma formulação de função de transferência (usada por alguns pacotes), d=1 faria os coeficientes refletirem efeitos em mudanças, e não em níveis. Essa diferença confunde muita gente, então vale conferir a documentação da sua ferramenta.

Verifique resíduos e avalie previsões

Resíduos devem se parecer com ruído branco. Verifique a ACF dos resíduos para autocorrelação remanescente. Picos significativos indicam estrutura faltando no modelo. Se surgirem padrões sistemáticos em defasagens sazonais, mude para SARIMAX com ordem sazonal.

# Generate out-of-sample predictions
predictions = result.forecast(steps=12, exog=exog_test)

# Evaluate
mae = mean_absolute_error(test["sales"], predictions)

# Naive baseline: forecast each period using the previous period's actual value
naive_forecast = np.concatenate([[train["sales"].iloc[-1]], test["sales"].values[:-1]])
naive_mae = mean_absolute_error(test["sales"], naive_forecast)

print(f"ARIMAX MAE: {mae:.1f}")
print(f"Naive MAE:  {naive_mae:.1f}")

Compare o MAE do ARIMAX com um baseline ingênuo (usar o valor do período anterior como previsão). Se o ARIMAX não superar o modelo ingênuo no seu conjunto de teste, isso é um achado relevante. A complexidade extra não se justifica. Já vi isso acontecer mais do que se imagina, especialmente quando os preditores exógenos são mais ruidosos do que parecem dentro da amostra.

Preveja valores futuros

Prever além do período de treino funciona igual à avaliação fora da amostra: forneça valores exógenos futuros junto com a chamada forecast(). Para flags de promoção, isso costuma ser simples, já que o calendário promocional é conhecido. Para temperatura, use previsões meteorológicas ou médias sazonais históricas.

Atenção: os intervalos de confiança do statsmodels são condicionais aos valores de preditores que você fornece. Eles não capturam a incerteza desses preditores. Se a previsão de temperatura for incerta, a incerteza real da previsão é maior do que os intervalos sugerem. Vale comunicar isso para quem pode agir com base nos resultados.

Desafios comuns e limitações

A implementação acima cobre o caminho feliz. Aqui é onde as coisas costumam dar errado.

  • Preditores futuros podem ser desconhecidos: Este é o obstáculo prático mais comum. Se você não consegue obter valores futuros confiáveis para suas variáveis exógenas, não dá para usá-las. Prever demanda de energia com a temperatura de amanhã exige uma previsão de temperatura, não a de ontem.
  • Preditores podem vazar informação: Uma variável medida após a data de previsão pode inflar demais seu desempenho dentro da amostra. Cuidado com os carimbos de tempo reais dos seus preditores.
  • Relações podem mudar: Coeficientes estimados no histórico podem não se manter. Uma elasticidade de preço estável por dois anos pode mudar após um choque de mercado — e 2024 e 2025 trouxeram choques suficientes para isso deixar de ser teoria. Reestimar o modelo periodicamente é boa prática.
  • Preditores correlacionados dificultam a interpretação: Entradas altamente colineares podem tornar estimativas individuais instáveis. Isso nem sempre prejudica a acurácia da previsão, mas dificulta dizer qual preditor está fazendo o trabalho.
  • Mais entradas não garantem melhores previsões: Avalie cada preditor proposto contra um baseline em dados separados. Alguns recursos que parecem informativos dentro da amostra adicionam ruído fora dela.
  • Sazonalidade exige termos sazonais: Se sua série tem padrão sazonal consistente, como vendas mensais com pico em dezembro, SARIMAX com ordem sazonal é o caminho. ARIMAX sozinho não captura isso.
  • Causalidade não está estabelecida: Reforçando: ARIMAX é um framework de previsão, não um método de inferência causal. Não use sinais de coeficientes para alegar causalidade sem análise adicional.

Conclusão

O ARIMAX mostra seu valor quando existem fatores externos que de fato influenciam o alvo e você consegue fornecer seus valores futuros na hora da previsão. É uma extensão natural do ARIMA, não um substituto. Se sua série é comportada e você não tem preditores confiáveis, ARIMA puro costuma ser o melhor ponto de partida. Adicionar variáveis dá sensação de progresso. Às vezes, não é.

O fluxo de trabalho se resume a quatro coisas bem-feitas:

  1. alinhar corretamente seus preditores,
  2. verificar vazamento antes de avaliar,
  3. validar em dados genuinamente separados e
  4. sempre comparar com um baseline simples.

Um ARIMAX que mal supera uma previsão ingênua não é melhor que a previsão ingênua. Só é mais caro.

Se quiser se aprofundar nos fundamentos de séries temporais, nosso curso Time Series Analysis in Python aborda ARIMA, estacionariedade e diagnósticos em detalhe. Para o lado do statsmodels, nosso curso Introduction to Regression with statsmodels in Python desenvolve a intuição estatística que você vai querer ao interpretar sumários de modelos e checar resíduos.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani começou a carreira em Tóquio como o mais jovem Head do Hedge Fund Sales Desk do JPMorgan e, depois, bateu um recorde individual de vendas no Lehman Brothers, em seguida construiu um negócio de distribuição de eletrônicos em 30 países que superou SG$ 100 milhões em receita antes de migrar para dados. Formado em economia por Duke e ex-aluno da NYC Data Science Academy, foi um dos três bolsistas selecionados entre mais de 100 candidatos para o curso Building AI Applications, do Hugo Bowne-Anderson, na Maven. Hoje, escreve para a DataCamp, KDnuggets, Machine Learning Mastery e Statology sobre temas que vão de estatística a IA agente e mentora profissionais de dados na NYC Data Science Academy, com mais de 1.000 sessões individuais no currículo.

 

FAQs

Qual é a diferença entre ARIMAX e ARIMA?

ARIMA faz previsões usando apenas os próprios valores passados da série alvo e erros de previsão passados. ARIMAX estende isso incorporando variáveis exógenas — entradas externas como temperatura, promoções ou taxas de juros — que influenciam o alvo. Se esses fatores externos realmente explicam a variação na sua série e você consegue fornecer seus valores futuros, o ARIMAX tende a produzir previsões melhores do que o ARIMA sozinho.

Como o ARIMAX difere do SARIMAX?

ARIMAX lida com variáveis externas, mas não com padrões sazonais. SARIMAX adiciona termos sazonais de AR, diferenciação e MA por cima do ARIMAX, sendo a escolha certa quando a série tem estrutura sazonal recorrente. No statsmodels do Python, ARIMAX costuma ser implementado via SARIMAX() com ordem sazonal (0, 0, 0, 0). Nessa configuração, funcionalmente são o mesmo modelo.

Preciso fornecer valores futuros das variáveis exógenas para prever com ARIMAX?

Sim — este é um dos constraints práticos mais importantes. Ao gerar previsões além do período de treino, você precisa fornecer valores para cada variável exógena em todos os passos futuros. Para flags de promoção ou indicadores de feriado, isso costuma ser simples. Para variáveis como temperatura ou preços de commodities, será preciso valores previstos ou suposições razoáveis, o que adiciona incerteza.

Como escolher p, d e q para um modelo ARIMAX?

Comece com os gráficos de ACF e PACF da série (diferenciada). Pico significativo na defasagem 1 no PACF e ACF decaindo costuma sugerir AR(1); o padrão inverso sugere MA(1). Use conhecimento de domínio e o teste ADF para definir d. Depois compare um pequeno conjunto de combinações (p, d, q) usando AIC ou BIC no treino. Evite usar o conjunto de teste nessa etapa — ele deve ficar apenas para a avaliação final.

O que significa o coeficiente de uma variável exógena em um modelo ARIMAX?

O coeficiente representa a mudança estimada no nível da série alvo associada a um aumento de uma unidade naquele preditor, após considerar a estrutura autorregressiva. No statsmodels, isso vale mesmo com d=1, porque a diferenciação é aplicada ao processo de erro, não à equação de regressão (formulação de regressão com erros ARIMA). Alguns pacotes usam função de transferência, em que d=1 faria os coeficientes refletirem efeitos em mudanças e não em níveis — então confira a documentação da sua ferramenta. A interpretação também complica quando preditores estão em escalas diferentes ou são correlacionados; padronizar entradas ajuda quando você quer comparar coeficientes.

Como detectar e lidar com multicolinearidade nos preditores exógenos?

Calcule o VIF (Variance Inflation Factor) para cada preditor antes de ajustar. Valores acima de 10 sugerem colinearidade problemática. Se houver, experimente remover o preditor menos justificável teoricamente ou combinar variáveis correlacionadas em um composto. Colinearidade alta não necessariamente prejudica a acurácia da previsão, mas torna coeficientes individuais pouco confiáveis e difíceis de interpretar.

Como avaliar se o ARIMAX realmente está agregando valor?

Sempre compare com um baseline simples — uma previsão ingênua (usar o valor do período anterior) é um bom começo. Se o ARIMAX não superar isso em dados de teste separados, o modelo não está justificando sua complexidade. MAE e RMSE são métricas razoáveis; MAE é mais fácil de explicar para stakeholders. Faça a comparação em um conjunto de teste que não foi usado na seleção de parâmetros.

Quando devo usar SARIMAX em vez de ARIMAX?

Use SARIMAX quando sua série apresentar padrão sazonal consistente — vendas mensais com pico em dezembro, tráfego semanal com pico na segunda, e assim por diante. O SARIMAX adiciona componentes sazonais de AR, diferenciação e MA que o ARIMAX não tem. Como o statsmodels já implementa ARIMAX por meio do SARIMAX(), a questão prática é se você vai definir uma ordem sazonal diferente de zero. Se, após ajustar ARIMAX, os resíduos mostrarem autocorrelação significativa em defasagens sazonais, é sinal para adicionar termos sazonais.

Temas
Ciência de dados

Aprenda com a DataCamp

Curso

Previsão em R

5 h
52.8K
Aprenda a fazer previsões sobre o futuro usando previsão de séries temporais em R, incluindo modelos ARIMA e métodos de suavização exponencial.
Ver detalhesComeçar Curso

Crie sua conta gratuita

Pratique e programa seu progresso.

Continuar Com O Google
Ao continuar, você aceita nossos Termos de Uso, nossa Política de Privacidade e que seus dados serão armazenados nos EUA.
Ver mais
Relacionado

Tutorial

Previsões do mercado de ações com LSTM em Python

Descubra as redes LSTM (Long Short-Term Memory) em Python e como você pode usá-las para fazer previsões do mercado de ações!
Thushan Ganegedara's photo

Thushan Ganegedara

15 min

Tutorial

Entendendo data drift e model drift: detecção de drift em Python

Navegue pelos riscos do model drift e confira nosso guia prático de monitoramento de data drift.
Moez Ali's photo

Moez Ali

9 min

Tutorial

Gráfico de linha de série temporal do Matplotlib

Este tutorial explora como criar e personalizar gráficos de linha de séries temporais no matplotlib.
Elena Kosourova's photo

Elena Kosourova

8 min

Tutorial

Otimização em Python: Técnicas, pacotes e práticas recomendadas

Este artigo ensina a você sobre otimização numérica, destacando diferentes técnicas. Ele discute os pacotes Python, como SciPy, CVXPY e Pyomo, e fornece um notebook DataLab prático para você executar exemplos de código.
Kurtis Pykes 's photo

Kurtis Pykes

11 min

Tutorial

Tutorial de execução de scripts Python no Power BI

Descubra as diferentes maneiras de usar o Python para otimizar a análise, a visualização e a modelagem de dados no Power BI.
Joleen Bothma's photo

Joleen Bothma

9 min

Python

Tutorial

Tutorial para entender a regressão logística em Python

Aprenda sobre a regressão logística, suas propriedades básicas e crie um modelo de aprendizado de máquina em um aplicativo do mundo real em Python.
Avinash Navlani's photo

Avinash Navlani

10 min

Ver mais