Pipeline reproduzível · 6 scripts + voz clonada

Os 6 scripts Python + 1 pipeline de áudio que produzem tudo do site.

Cada bloco abaixo tem o diagrama Excalidraw interativo (zoom com scroll, arrastar com mouse — clique em "abrir no painel" pra ampliar), o código fonte completo com syntax highlight, e a lista de outputs gerados.

script 01 / 06 · 223 linhas

01_eda.pyAnálise exploratória e diagnóstico inicial

Carrega o Excel original, agrega em série mensal, calcula CAGR 2018-2025, extrai sazonalidade via STL, faz heatmap cidade × setor e mede volatilidade (CV). É a base para tudo que vem depois.

Diagrama do raciocínio

📐 01_eda.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Load + parse
Lê Excel, normaliza colunas, cria date
Passo 2
Agregação
Soma mensal e anual, calcula CAGR 2018-2025
Passo 3
Índice sazonal
share por mês × 12 × 100 — base 100
Passo 4
STL robusto
Decompõe em tendência + sazonal + resíduo
Passo 5
Por setor/cidade
Volume, share, CAGR, delta absoluto
Passo 6
Heatmaps
CAGR e volume por (cidade × setor)
Passo 7
CV histórico
Volatilidade por corte = desvio / média
Passo 8
Resumo JSON
Top 3 setores/cidades + índices jan/dez
Output principal: resumo_eda.json, indice_sazonal.csv, setor_summary.csv, cidade_summary.csv, cv_por_corte.csv — todos consumidos pelos scripts seguintes ou pelo site.

Código completo

scripts/01_eda.py 223 linhas · Python 3.11
carregando…

Outputs gerados

  • outputs/monthly_total.csvsérie mensal agregada · 96 linhas
  • outputs/annual_total.csvtotais anuais + crescimento
  • outputs/indice_sazonal.csvíndice base 100 por mês
  • outputs/setor_summary.csvvol/share/CAGR por setor (30 setores)
  • outputs/cidade_summary.csvvol/share/CAGR por cidade
  • outputs/cv_por_corte.csvcoef. de variação cidade × setor
  • outputs/resumo_eda.jsonresumo executivo (consumido pelo site)
  • charts/01_stl_decomposition.pngdecomposição STL (4 painéis)
script 02 / 06 · 195 linhas

02_forecast.pyProjeção 2026 e backtest dos modelos

Treina 4 modelos (Holt-Winters multiplicativo, SARIMA, ETS aditivo, Naive sazonal) num hold-out 2025 para reportar MAPE/RMSE. Refita SARIMA na base completa para projetar 2026 com IC 80% e 95%.

Diagrama do raciocínio

📐 02_forecast.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Hold-out 2025
train: 2018-2024 · test: jan-dez/2025
Passo 2
Holt-Winters mul
trend=add + seasonal=mul · MLE
Passo 3
SARIMA(1,1,1)(1,1,1,12)
duas diferenciações · IC nativo
Passo 4
ETS aditivo (controle)
trend=add + seasonal=add — pra mostrar erro maior
Passo 5
Naive sazonal +CAGR
Y[t-12] × (1+cagr) — baseline forte
Passo 6
Refit completo
SARIMA na base toda para projetar 2026
Passo 7
3 cenários
base / -3pp / +3pp em torno do SARIMA
Passo 8
Resumo JSON
totais 2026 + métricas de cada modelo
Resultado: Holt-Winters mul venceu o hold-out (MAPE 8,14%), e SARIMA serve como base para projeção 2026 por ter IC nativo — fundamental para mostrar a incerteza honestamente. Naive sazonal (8,78%) confirma que a sazonalidade carrega quase toda a informação previsível.

Código completo

scripts/02_forecast.py 195 linhas · Python 3.11
carregando…

Outputs gerados

  • outputs/holdout_comparison.csvMAPE/RMSE/MAE de cada modelo em 2025
  • outputs/projecao_2026.csv12 meses · base/cons/otim + IC 80/95
  • outputs/projecao_2026_resumo.jsontotais + crescimento implícito (consumido pelo P3)
  • charts/06_projecao_2026.pnghistórico + projeção + bandas IC
  • charts/07_holdout_comparison.png4 modelos vs realizado 2025
script 03 / 06 · 211 linhas

03_error_analysis.pyDiagnóstico de incerteza bottom-up

Treina 240 modelos individuais (cidade × setor) e calcula MAPE no hold-out 2025 para cada corte. Combina com CV histórico e força sazonal STL para diagnosticar por que cada corte erra.

Diagrama do raciocínio

📐 03_error_analysis.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Painel completo
grade cidade × setor × mês com fillna(0)
Passo 2
fit_predict()
HW mul ⟶ HW add ⟶ média sazonal (fallback)
Passo 3
seasonal_strength()
1 − var(R) / [var(R) + var(S)] via STL
Passo 4
Loop por corte
240 cortes · skip se vol_train < 100
Passo 5
MAPE ponderado
por setor e cidade — leitura honesta
Passo 6
Heatmap MAPE
cidade × setor (top 12) — vermelho = erra
Passo 7
Atribuição de causa
CV alto / sazonal fraca / vol baixo / regime
Passo 8
Diagnóstico JSON
top 5 piores + 5 melhores + leitura de negócio
Resultado: MAPE mediano 22,7% e ponderado por volume 18,7%. Recomendação: usar agregado pra meta corporativa; cortes ruins como sinal de onde investigar — não como meta operacional mensal.

Código completo

scripts/03_error_analysis.py 211 linhas · Python 3.11
carregando…

Outputs gerados

  • outputs/erro_por_corte.csv240 linhas: vol/MAPE/CV/força sazonal
  • outputs/erro_por_setor.csvMAPE simples e ponderado por setor
  • outputs/erro_por_cidade.csvMAPE por cidade
  • outputs/diagnostico_p2.jsonresumo P2 (consumido pelo site)
  • charts/08_erro_vs_volume.pngscatter MAPE × volume · cor = CV
  • charts/09_heatmap_mape.pngheatmap MAPE cidade × setor
script 04 / 06 · 150 linhas

04_market_share.pyMeta de 20% e distribuição mensal

Aplica share alvo (20%) sobre 5 cenários de mercado 2026. Distribui a meta anual em 12 meses usando o índice sazonal histórico — para expor o pico jul-ago.

Diagrama do raciocínio

📐 04_market_share.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Carrega P2
resumo da projeção SARIMA + sazonal + anual
Passo 2
5 cenários
Cons / Base / Recente / Otim / YoY 25
Passo 3
Meta = mercado × 20%
por cenário · arredondada
Passo 4
Distribuição mensal
meta × share_sazonal · expõe pico jul-ago
Passo 5
Sensibilidade 5×5
cenário × share alvo (15-25%)
Passo 6
Resumo JSON
faixa robusta 65-76k + leitura de pico
Resultado: Meta base 20% no SARIMA = 67,5k vendas (faixa robusta 65-78k entre cenários). Pico jul-ago exige 6,2k/mês; vale dez 4,8k/mês. Distribuição uniforme subestima capacidade de pico em ~30%.

Código completo

scripts/04_market_share.py 150 linhas · Python 3.11
carregando…

Outputs gerados

  • outputs/meta_market_share.csvmeta anual + mensal média por cenário
  • outputs/meta_mensal.csvdistribuição mês a mês usando sazonalidade
  • outputs/sensibilidade_meta.csvmatriz 5×5 cenário × share alvo
  • outputs/resumo_p3.jsonresumo P3 (consumido pelo site)
script 05 / 06 · 131 linhas

05_priority_matrix.pyMatriz volume × CAGR e cluster Saúde

Plota os 30 setores na matriz volume × CAGR (escala log no X). Cortes nas medianas dividem em 4 quadrantes (ATACAR / APOSTAR / MANTER / DEPRIORIZAR).

Diagrama do raciocínio

📐 05_priority_matrix.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Junta setor + erro
vol/CAGR + MAPE ponderado
Passo 2
Filtra vol > 1500
remove ruído de cauda baixa
Passo 3
Medianas como linhas
divisão robusta em 4 quadrantes
Passo 4
Scatter + labels
escala log no X · cor = quadrante
Passo 5
Cluster Saúde
7 setores agregados — vetor mais forte
Passo 6
Cidades
vol + CAGR · azul se acima da mediana
Passo 7
Quadrantes JSON
listas para o site interativo
Resultado: Quadrante ATACAR contém Medicina, Psicologia, TI/DEV, Engenharia. Cluster Saúde sozinho representa 24% do mercado e cresce 21% a.a. — daí virar a frente prioritária #1 da estratégia.

Código completo

scripts/05_priority_matrix.py 131 linhas · Python 3.11
carregando…

Outputs gerados

  • outputs/quadrantes.jsonclassificação dos setores em 4 quadrantes
  • charts/12_matriz_oportunidade.pngscatter vol × CAGR com 4 quadrantes
  • charts/13_cluster_saude.png7 sub-setores de Saúde
  • charts/14_cidades.pngranking de cidades · cor = CAGR
script 06 / 06 · 257 linhas

06_build_data.pyConsolidação em data.json para o site

Reroda toda a pipeline e empacota tudo num único JSON ~35KB que alimenta o site interativo.

Diagrama do raciocínio

📐 06_build_data.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Passos da análise

Passo 1
Carrega Excel
mesma fonte de 01_eda
Passo 2
Sazonalidade normalizada
share/index_100 com ∑=1 garantido
Passo 3
4 modelos OOS
HW/SARIMA/ETS/Naive em jan-dez/25
Passo 4
6 cenários 2026
SARIMA/HW/ETS + 3 CAGR · pra slider do site
Passo 5
Bottom-up 240 cortes
re-roda P2 com fit_predict simplificado
Passo 6
Empacota JSON
meta + agregado + sazonal + hold-out + setores
Passo 7
Grava data.json
~35KB · lido pelo Plotly no front
Estrutura do JSON: meta, agregado, sazonal, holdout, forecast_2026, setores, cidades, erro_corte. Inspecionável em window.DATA no console.

Código completo

scripts/06_build_data.py 257 linhas · Python 3.11
carregando…

Output gerado

  • site/data.json~35KB · consumido pelo index.html via fetch()
produção · 7 / 7 · pipeline de áudio

omnivoicevoz clonada para a persona Claudio

Voz do Leonardo Drummond (Mind The Headphone) clonada via OmniVoice + animação Manim com persona Claudio. Resultado é o aula.mp4 de ~2:43.

Diagrama do raciocínio

📐 omnivoice.excalidraw
baixar .excalidraw baixar .svg
carregando diagrama interativo…

Etapas do pipeline

Etapa 1
Coleta de amostras
~3-5 min de áudio limpo do Leonardo Drummond
Etapa 2
Treino do clone
OmniVoice — fine-tuning do TTS na voz alvo
Etapa 3
Roteiro
script de ~2:43 cobrindo o caso completo
Etapa 4
Síntese
TTS gera waveform com prosódia natural
Etapa 5
Cenas Manim
animação matemática com persona Claudio
Etapa 6
Sincronização
timeline de cenas alinhada à narração
Etapa 7
Render final
ffmpeg compõe MP4 1080p · ~8MB
Por que OmniVoice e não TTS genérico: voz neutra de TTS soa institucional. Voz clonada com prosódia natural cria atenção emocional — diferença entre o vídeo ser pulado ou assistido em apresentação de 3 minutos.

Stack de produção: OmniVoice (clone de voz) → script narrado em pt-BR → Manim Community Edition (animação) → ffmpeg (composição) → MP4 H.264 1080p.