Projetos
LH Nautical · Previsão · Desenvolvimento

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.

Nível Intermediário Stack Python · Pandas · scikit-learn Tipo Projeto preditivo
Visão geral

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.

Passo a passo

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.

modeloqualidade
Média Móvel (3)baseline — boa pra mês imediato
Regressão LinearR² ≈ 0,10 (reportado abertamente)
Horizonte recomendado3-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).

Resultado

A previsão com banda de incerteza

O que dá pra levar daqui

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).