LH Previsão — Como foi feito (explicado fácil)
Imagina que você joga futebol há 2 jogos e o técnico te pede pra prever quantos gols o time fará nos próximos 12 jogos. Faz sentido tentar? Faz. Mas faz mais sentido avisar que o histórico curto limita a precisão do que entregar com cara de certeza.
O que é isso, em uma frase?
É o módulo que tenta prever o faturamento dos próximos meses pra apoiar compras de estoque e planejamento financeiro. Comparei 2 modelos simples e — talvez o mais importante — reportei honestamente a qualidade da previsão (R² baixo) por causa do histórico curto.
O grande aprendizado aqui é que "prever direito" inclui dizer quando não dá pra prever bem. Um modelo com R² = 0,10 ainda é útil pra dar um norte — desde que o usuário saiba que é norte, não GPS.
Por que importa? Porque na hora de comprar 1000 unidades de algo, um chute mais informado já reduz erro vs. "olhômetro". Mas se o time achar que é certeza, vai se machucar feio quando errar.
Dois modelos, uma confissão
1 · Agregar por mês. Não dá pra prever vendas hora a hora; pra negócio de varejo, granularidade mensal é certa. Saio do fato_vendas e agrupo.
mensal = (
vendas.assign(mes=vendas["data"].dt.to_period("M").dt.to_timestamp())
.groupby("mes")["valor"].sum()
.reset_index()
.sort_values("mes")
)
print(f"Meses de historico: {len(mensal)}") # apenas 24 — pouco
2 · Modelo A: Média Móvel. O modelo mais simples do mundo: "o mês que vem será a média dos últimos 3". Sem ML, sem ajuste. Serve de baseline — se qualquer modelo mais complexo não bater isso, não vale a complexidade.
mensal["mm3"] = mensal["valor"].rolling(window=3).mean() # previsao do mes seguinte = media dos 3 ultimos prev_mm = mensal["valor"].tail(3).mean()
3 · Modelo B: Regressão Linear sobre o tempo. Trato cada mês como um número (mês 1, 2, 3...) e ajusto uma reta. A reta vira a "tendência geral" e dá pra extrapolar.
from sklearn.linear_model import LinearRegression
import numpy as np
X = np.arange(len(mensal)).reshape(-1, 1)
y = mensal["valor"].values
modelo = LinearRegression().fit(X, y)
r2 = modelo.score(X, y)
print(f"R² = {r2:.2f}") # 0,10 ← BAIXO
# previsao dos proximos 6 meses
futuro = np.arange(len(mensal), len(mensal) + 6).reshape(-1, 1)
prev_lr = modelo.predict(futuro)
4 · Ler o R² com honestidade. R² mede quanto da variação da receita a reta explica. 1,0 = perfeito · 0 = a reta não explica nada. Cheguei a R² ≈ 0,10 — ou seja, a reta capta só 10% da variação. Isso significa: existe sazonalidade, choque, ruído que a linha não pega.
5 · A escolha consciente. Apresentei os DOIS modelos com uma nota explícita: "com 24 meses de histórico, qualquer previsão tem incerteza alta. Use como guia direcional, não como número de cofre.". O time pode confiar mais na direção (subindo/caindo) que no valor exato.
| modelo | qualidade |
|---|---|
| Média Móvel (3) | baseline — boa pra mês imediato |
| Regressão Linear | R² ≈ 0,10 (reportado abertamente) |
| Horizonte recomendado | 3-6 meses, com banda de incerteza |
6 · O que faria com mais dado. Com 5+ anos: SARIMA (modelo que entende sazonalidade), Prophet (do Facebook, robusto a feriados/eventos), ou XGBoost com features de tempo (mês, dia da semana, dummies sazonais).
A previsão com banda de incerteza
Em uma linha: o que esse projeto ensina
Que "não dá pra prever bem ainda" também é resposta. Reportar um modelo ruim com transparência é mais útil que reportar um modelo bom com falsa confiança. Honestidade analítica é diferencial competitivo.
Coisas técnicas que apareceram aqui: agregação temporal mensal, baseline (média móvel), regressão linear como tendência, R² e leitura honesta, escolha de horizonte, banda de incerteza, recomendações de modelos futuros (SARIMA, Prophet, XGBoost).