Prever demanda com precisão é um dos maiores desafios de qualquer operação industrial ou comercial. Estoque demais significa capital parado; estoque de menos gera vendas perdidas. Machine Learning oferece uma abordagem científica para esse problema, usando dados históricos para projetar o futuro com acurácia muito superior aos métodos tradicionais.
Este guia apresenta conceitos práticos e exemplos de código para que empresas de médio porte possam começar a implementar modelos preditivos, sem precisar de uma equipe de cientistas de dados.
Fundamentos da previsão de demanda
Por que métodos tradicionais falham?
Planilhas Excel com médias móveis ou projeções lineares funcionam em cenários estáveis. Mas a realidade é diferente:
- Sazonalidades múltiplas: Dia da semana, mês, feriados, eventos especiais
- Tendências não-lineares: Crescimento ou declínio acelerado
- Fatores externos: Clima, economia, ações de concorrentes
- Produtos novos: Sem histórico para basear projeções
- Promoções e campanhas: Impactos pontuais que distorcem padrões
Machine Learning consegue capturar essas complexidades porque aprende padrões diretamente dos dados, sem que você precise programar cada regra manualmente.
"O melhor modelo de previsão é aquele que erra de forma previsível. Com ML, você não apenas melhora a acurácia, mas também quantifica a incerteza."
Tipos de previsão
- Previsão pontual: "Quantas unidades venderemos na próxima semana?"
- Previsão por intervalo: "Entre 100 e 150 unidades, com 95% de confiança"
- Previsão probabilística: Distribuição completa de cenários possíveis
Preparando seus dados
A qualidade do modelo depende diretamente da qualidade dos dados. Antes de pensar em algoritmos, organize sua base:
Dados essenciais
- Histórico de vendas/demanda: Mínimo 2 anos para capturar sazonalidade anual
- Granularidade adequada: Diário é ideal, semanal aceitável, mensal limitado
- Identificação de produtos: SKU, categoria, linha, família
- Datas precisas: Data do pedido vs. data de faturamento vs. data de entrega
Dados complementares (features)
- Calendário: Feriados, finais de semana, eventos
- Promoções: Histórico de campanhas e descontos
- Preços: Variações de preço ao longo do tempo
- Clima: Temperatura, chuva (quando relevante)
- Econômicos: Índices de confiança, câmbio
Dados faltantes são comuns. Dias sem vendas devem ter registro com valor zero, não linha ausente. Dados inconsistentes (vendas negativas, datas futuras) precisam ser tratados antes de modelar.
Estrutura de dados recomendada
import pandas as pd
# Estrutura básica de dados para previsão
dados = pd.DataFrame({
'data': pd.date_range('2022-01-01', '2024-12-31'),
'produto_id': 'SKU-001',
'quantidade': [...], # vendas diárias
'preco': [...],
'promocao': [...], # 0 ou 1
'feriado': [...], # 0 ou 1
})
# Features de tempo
dados['dia_semana'] = dados['data'].dt.dayofweek
dados['mes'] = dados['data'].dt.month
dados['semana_ano'] = dados['data'].dt.isocalendar().week
Algoritmos para começar
Existem dezenas de algoritmos de ML para séries temporais. Recomendamos começar pelos mais acessíveis e com bom custo-benefício:
1. Prophet (Meta/Facebook)
Desenvolvido pelo Facebook, é ideal para quem está começando. Lida automaticamente com sazonalidade, feriados e outliers.
from prophet import Prophet
# Preparar dados no formato do Prophet
df = dados[['data', 'quantidade']].rename(
columns={'data': 'ds', 'quantidade': 'y'}
)
# Criar e treinar modelo
modelo = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
seasonality_mode='multiplicative'
)
modelo.fit(df)
# Criar dataframe futuro
futuro = modelo.make_future_dataframe(periods=30)
# Fazer previsões
previsao = modelo.predict(futuro)
# Visualizar
modelo.plot(previsao)
modelo.plot_components(previsao)
2. XGBoost / LightGBM
Algoritmos de gradient boosting são poderosos quando você tem muitas features. Requerem mais preparação mas oferecem alta acurácia.
from sklearn.model_selection import train_test_split
import lightgbm as lgb
# Features
features = ['dia_semana', 'mes', 'semana_ano',
'preco', 'promocao', 'feriado',
'lag_7', 'lag_30', 'media_movel_7']
X = dados[features]
y = dados['quantidade']
# Dividir treino/teste
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, shuffle=False
)
# Treinar modelo
modelo = lgb.LGBMRegressor(
n_estimators=500,
learning_rate=0.05,
max_depth=6
)
modelo.fit(X_train, y_train)
# Avaliar
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
y_pred = modelo.predict(X_test)
print(f"MAE: {mean_absolute_error(y_test, y_pred):.2f}")
print(f"MAPE: {mean_absolute_percentage_error(y_test, y_pred)*100:.1f}%")
3. ARIMA / SARIMA
Modelos estatísticos clássicos, bons para séries simples e como baseline de comparação.
from statsmodels.tsa.statespace.sarimax import SARIMAX
# Modelo SARIMA com sazonalidade semanal
modelo = SARIMAX(
dados['quantidade'],
order=(1, 1, 1), # (p, d, q)
seasonal_order=(1, 1, 1, 7) # (P, D, Q, s)
)
resultado = modelo.fit()
# Previsão
previsao = resultado.forecast(steps=30)
Métricas de avaliação
Como saber se seu modelo é bom? Use múltiplas métricas:
- MAE (Mean Absolute Error): Erro médio em unidades absolutas. Fácil de interpretar
- MAPE (Mean Absolute Percentage Error): Erro percentual. Permite comparar produtos diferentes
- RMSE (Root Mean Square Error): Penaliza erros grandes. Útil quando erros grandes são críticos
- Bias: Viés médio. Modelo tende a superestimar ou subestimar?
Nunca avalie o modelo com os mesmos dados usados para treinar. Use sempre dados que o modelo nunca viu (teste ou validação cruzada temporal).
Benchmark: batendo a média móvel
Um modelo de ML só vale a pena se superar métodos simples. Compare sempre com:
# Baseline: média móvel de 4 semanas
dados['baseline'] = dados['quantidade'].rolling(28).mean().shift(1)
# Seu modelo precisa ter MAPE menor que isso
baseline_mape = mean_absolute_percentage_error(
dados['quantidade'].iloc[28:],
dados['baseline'].iloc[28:]
) * 100
print(f"MAPE Baseline: {baseline_mape:.1f}%")
Implementação na prática
Arquitetura recomendada
- Extração de dados: Conecte ao ERP/banco de dados com Python ou N8N
- Preparação: Script de limpeza e feature engineering
- Treinamento: Retreine modelos semanalmente ou mensalmente
- Previsão: Gere previsões e salve em banco de dados
- Visualização: Dashboard no Power BI ou Metabase
Fluxo automatizado com N8N
// Workflow N8N para previsão semanal
1. Trigger: Cron (toda segunda às 6h)
2. Query MySQL: Extrai vendas da semana anterior
3. HTTP Request: Envia para API Python
4. API Python: Executa modelo e retorna previsões
5. MySQL: Salva previsões na tabela forecast
6. Slack: Notifica equipe com resumo
API de previsão simples
# api.py - FastAPI para servir previsões
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
app = FastAPI()
modelo = joblib.load('modelo_demanda.pkl')
class PedidoPrevisao(BaseModel):
produto_id: str
dias: int = 30
@app.post("/prever")
def prever(pedido: PedidoPrevisao):
# Carregar dados do produto
dados = carregar_dados(pedido.produto_id)
# Gerar previsão
previsao = modelo.predict(dados, steps=pedido.dias)
return {
"produto_id": pedido.produto_id,
"previsao": previsao.tolist(),
"intervalo_confianca": calcular_intervalo(previsao)
}
Casos de uso por segmento
Indústria Têxtil
A indústria têxtil de Blumenau tem desafios específicos:
- Coleções sazonais: Primavera/Verão e Outono/Inverno com lead times longos
- Mix de produtos: Milhares de SKUs com ciclos de vida curtos
- Demanda B2B: Pedidos de atacadistas com volumes variáveis
Solução: Modelos por família de produto + ajuste manual de lançamentos. Use histórico de produtos similares para prever novos itens.
Distribuição e Atacado
- Reposição de estoque: Quando e quanto pedir de cada fornecedor
- Sazonalidade regional: Festas locais, clima, eventos
- Promoções: Impacto de campanhas de marketing
Solução: Modelos XGBoost com features de promoção e eventos. Integração com sistema de compras para sugestões automáticas.
Varejo e E-commerce
- Demanda volátil: Vendas diárias com alta variação
- Múltiplos canais: Loja física, e-commerce, marketplaces
- Concorrência: Ações de preço afetam demanda
Solução: Modelos por canal + agregação. Incorporar dados de preço de concorrentes quando disponíveis.
Erros comuns a evitar
- Overfitting: Modelo perfeito nos dados de treino mas ruim em dados novos. Use validação cruzada
- Vazamento de dados: Usar informação do futuro para prever o passado. Cuidado com features temporais
- Ignorar outliers: Eventos atípicos (pandemia, greves) distorcem o modelo. Trate separadamente
- Não atualizar: Modelos degradam com o tempo. Implemente retreinamento automático
- Complexidade prematura: Comece simples. Prophet resolve 80% dos casos
Próximos passos
Para começar sua jornada com ML para previsão de demanda:
- Organize seus dados: Exporte histórico de vendas do ERP em formato limpo
- Escolha um produto piloto: Comece com um SKU de alto volume e histórico estável
- Implemente Prophet: Use o código deste artigo como ponto de partida
- Compare com baseline: Seu modelo precisa superar a média móvel
- Automatize: Crie pipeline de retreinamento e atualização
A Blumenau TI oferece consultoria especializada em implementação de modelos preditivos. Podemos ajudar desde a estruturação dos dados até a integração com seus sistemas. Entre em contato para um diagnóstico inicial gratuito.
