🏪 Classificador de lojas · Gestão por pares
Enquadra uma loja em um dos cinco grupos de lojas comparáveis da rede e devolve o que vem junto com o grupo: com quem ela deve ser comparada, quão firme é esse enquadramento, o benchmark dos pares e a meta sugerida. O modelo roda aqui, no seu navegador — nenhum dado que você digitar ou enviar sai desta página.
📚 Como as lojas estão classificadas — os cinco grupos
A rede tinha uma meta única de +5% para as 1.115 lojas. O projeto trocou a régua: cada loja é comparada com as lojas parecidas com ela — mesmo porte, mesmo padrão de compra, mesma resposta a promoção, mesmo ritmo ao longo do ano e mesma pressão de concorrência. Esses grupos saíram de um K-Means com k = 5, escolhido por critérios de negócio e de estabilidade, não só pela métrica.
Como uma loja cai num grupo. Os seis indicadores passam por
log1p, são padronizados com a média e o desvio aprendidos nas 1.115 lojas do
treino, e a loja vai para o grupo de centroide mais próximo. O modelo não é
reajustado: uma loja nova não muda os grupos nem os benchmarks.
O que acompanha o grupo:
- Status — menos de 12 meses de histórico: não classifica; 12 a 23 meses: provisória; 24 meses ou mais: definitiva. Com 24 meses, o grupo bate com o do histórico completo em 96% das lojas; com 12, em 87% a 88%.
- Margem — quanto o grupo escolhido está mais perto que o segundo mais próximo, de 0 a 1. Abaixo de 0,10 a loja recebe o alerta de fronteira: o enquadramento é frágil e deve ser revisto com o gestor.
- Perfil atípico — a loja está mais longe do centroide do que 99% das lojas do próprio grupo no treino.
- Meta sugerida — a mesma regra do plano de metas da rede: 2% de manutenção, mais 25% da distância até a mediana do grupo, multiplicado pelo fator de calibração 1,2202 e limitado a 20%.
A construção completa — escolha de k, estabilidade, comparação com o cadastro — está na série de 9 artigos.
🧾 Quais atributos o modelo precisa para classificar uma loja nova
Seis indicadores e o tempo de histórico. Todos são calculados só sobre dias de operação — loja aberta e com faturamento —, porque dia fechado zera a média e mede funcionamento, não capacidade de venda.
| Indicador | O que mede | Como calcular a partir do histórico diário |
|---|---|---|
venda_media_dia | Porte | Média do faturamento nos dias de operação (R$) |
ticket_medio | Padrão de compra | Venda média ÷ clientes médios por dia (razão de médias) |
efeito_promo | Resposta à promoção | Venda média nos dias com promoção ÷ venda média nos dias sem promoção − 1 |
volatilidade | Oscilação diária | Desvio-padrão da venda diária ÷ venda média |
sazonalidade | Variação ao longo do ano | Venda média de cada mês ÷ média do próprio ano; desvio entre os 12 meses do calendário |
distancia_concorrente | Contexto competitivo | Do cadastro. Se vier vazia, por decisão de negócio a loja é classificada com a mediana da rede (2.325), com aviso no resultado |
meses_historico | Confiabilidade | Meses distintos com ao menos um dia de operação |
Você não precisa calcular nada à mão. Na aba de arquivo, dá para enviar o histórico diário (uma linha por loja por dia) e a página calcula os seis indicadores com as mesmas regras do treino. Tipo de loja e sortimento não entram: eram o baseline que o modelo precisava superar.
⚙️ Como o modelo foi parar dentro de uma página estática
No projeto, o classificador é um pacote Python que carrega um .joblib com o
pipeline log1p → StandardScaler → K-Means e as regras de uso. Para trazê-lo
ao navegador não foi preciso nenhuma biblioteca: o que o modelo aprendeu cabe em
seis médias, seis desvios e cinco centroides. O artefato tem 5 KB.
- indicadores — os seis indicadores a partir do histórico diário, linha a
linha igual ao
codigo/indicadores.py; - classificação — validação de domínio, padronização, distância aos cinco
centroides, alertas e meta, igual ao
codigo/classificador.py.
Como a portabilidade foi conferida, contra o pacote em Python:
| Conferência | Lojas | Resultado |
|---|
A barra verde no topo da página repete a conferência a cada carregamento: a loja de referência tem que devolver as mesmas cinco distâncias do Python; se não devolver, a classificação fica bloqueada.
📋 Indicadores da loja
Os seis indicadores e o tempo de histórico. Os atalhos abaixo carregam a loja típica de cada grupo e as lojas de exemplo do projeto.
📂 Enviar uma base de lojas
Dois formatos aceitos, reconhecidos pelas colunas. O arquivo é lido no seu navegador e não é enviado para nenhum servidor.
| Coluna | Tipo | Faixa aceita |
|---|---|---|
loja | identificador | qualquer |
venda_media_dia | decimal | maior que 0 |
ticket_medio | decimal | maior que 0 |
efeito_promo | decimal | maior que −1 (0,40 = +40%) |
volatilidade | decimal | 0 ou mais |
sazonalidade | decimal | 0 ou mais |
distancia_concorrente | decimal | 0 ou mais; pode ficar vazia (usa a mediana da rede, 2.325, com aviso) |
meses_historico | inteiro | 12 ou mais para classificar |
| Coluna | Tipo | Observação |
|---|---|---|
loja | identificador | — |
data | data | 2015-07-31 ou 31/07/2015 |
faturamento | decimal | venda do dia em R$ |
clientes | inteiro | clientes do dia |
aberta | 0 ou 1 | dias fechados são ignorados no cálculo |
promo | 0 ou 1 | promoção ativa no dia |
distancia_concorrente | decimal | opcional — ou envie junto um cadastro com loja e distancia_concorrente |
Regras que evitam erro de leitura: separador ; ou
, (detectado sozinho) · decimal com ponto ou vírgula · colunas extras são
ignoradas — o vendas.csv do projeto entra como está · no formato B você pode
soltar dois arquivos de uma vez, o histórico e o cadastro
(loja.csv), como no pacote em Python.
CSV de indicadores, ou histórico diário (até alguns milhões de linhas) com o cadastro opcional.
O case completo está na série de 9 artigos, no carrossel em PDF e no repositório no GitHub ↗.
Base pública de vendas diárias, rede de varejo fictícia, finalidade de portfólio. Os grupos refletem o histórico de 2013 a 2015 e precisariam de retreino antes de qualquer uso real.