Mapa da aula
Aula 21 publicada. Mapa, exemplo, EX061.
flowchart TD
N0["21.1 A verificação"]
N1["Laboratório — Códigos de loja em 2.000 linhas sintét"]
N2["21.2 Resultados"]
N3["21.3 Causas"]
N4["21.4 Correções na origem"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX061"]
Desenho lógico
flowchart LR
N0["21.1 A verificação"]
N1["Laboratório — Códigos de loja em 2.000 linhas sintét"]
N2["21.2 Resultados"]
N3["21.3 Causas"]
N4["21.4 Correções na origem"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX061"]
[21.1 A verificação]
|
v
[Laboratório — Códigos de loja em 2.000 linhas sintét]
|
v
[21.2 Resultados]
|
v
[21.3 Causas]
|
v
[21.4 Correções na origem]
|
v
[Exemplo resolvido] --> [Exercício EX061]
Objetivos de aprendizagem
Você vai (1) validar códigos contra uma lista de referência; (2) classificar os códigos inválidos pela causa; (3) projetar correções na origem.
21.1 A verificação
Depois que a área de operações assume a titularidade da lista de lojas, Amara confere os dados de vendas com ela. Cada linha de venda traz um código de loja, e os códigos válidos vão de S01 a S40. Ela escreve um script que compara cada código com a lista oficial e conta os códigos inválidos por valor. Ela explica que agrupar os códigos inválidos por valor é mais útil do que uma contagem única de erros, porque valores inválidos diferentes costumam ter causas diferentes e pessoas diferentes que podem corrigi-los. O script roda depois de cada carga noturna.
Laboratório — Códigos de loja em 2.000 linhas sintéticas de vendas conferidos com uma lista de referência
"""Check store codes in 2,000 synthetic sales rows against a reference list (stdlib only)."""
import random, collections
random.seed(3)
ref = {f"S{i:02d}" for i in range(1, 41)}
pool = sorted(ref) + ["S41", "s07", "S7", "S00"]
w = [1]*40 + [0.6, 0.5, 0.4, 0.3]
rows = random.choices(pool, weights=w, k=2000)
bad = collections.Counter(c for c in rows if c not in ref)
print(f"rows {len(rows)}; invalid codes {sum(bad.values())} ({100*sum(bad.values())/len(rows):.1f}%)")
print("by code:", dict(sorted(bad.items())))
Execute com python3 lab_codes.py. Saída verificada:
rows 2000; invalid codes 89 (4.5%)
by code: {'S00': 11, 'S41': 32, 'S7': 16, 's07': 30}
21.2 Resultados
O laboratório confere duas mil linhas de vendas. Oitenta e nove linhas trazem códigos inválidos, 4,5 por cento. Os valores inválidos são S41 em 32 linhas, s07 em 30 linhas, S7 em 16 linhas e S00 em 11 linhas. Amara observa que o resultado não é um problema, mas quatro, e que o maior grupo isolado, S41, é um código que ainda não existe na lista de referência, o que sugere uma falha de processo, e não digitação descuidada nas lojas. Amara compartilha a decomposição no mesmo dia com a área de operações, a TI e os gerentes das lojas envolvidas.
21.3 Causas
Amara investiga cada valor. S41 pertence a uma loja nova que abriu antes de a área de operações incluí-la na lista. O s07 em minúscula e o S7 abreviado vêm ambos de um sistema de loja que aceita texto livre nos lançamentos manuais. S00 é um valor padrão usado por um caixa de teste que nunca foi retirado da rede de produção. Cada causa tem um dono diferente: a área de operações para os códigos novos, a TI para a validação da entrada e o gerente da loja para o caixa de teste. Cada dono confirma a causa.
21.4 Correções na origem
Amara recomenda que os códigos de lojas novas entrem na lista antes da inauguração, como uma etapa da lista de verificação de abertura de loja; que o sistema da loja aceite apenas códigos de uma lista suspensa; e que o caixa de teste seja retirado. Mapear S7 e s07 para S07 no data warehouse corrige os dados passados, mas não impediria novos erros. O Dr. Lindqvist observa que corrigir as causas na origem evita um trabalho permanente de limpeza mais adiante. As três correções na origem ficam prontas em um mês, e os códigos inválidos novos deixam de aparecer.
Exemplo resolvido
Amara encontra 89 códigos inválidos em 2.000 linhas (4,5 por cento), divididos entre S41, s07, S7 e S00, rastreia cada um até uma causa e um dono diferentes e recomenda correções na origem.
Caso sintético. Os códigos são sintéticos; as saídas vêm de lab_codes.py.
Erros e limites
Mapear códigos errados mais adiante sem corrigir as origens cria uma limpeza sem fim.
Exercícios
- EX061 — Parcela inválida. Que parcela das linhas tinha códigos inválidos?
Mostrar critérios de avaliação
Rubrica: 3 = 4,5% (89 de 2.000);; 2 = parcialmente correto;; 1 = parcial;; 0 = nenhuma. - EX062 — Causa do S41. Por que o S41 apareceu?
Mostrar critérios de avaliação
Rubrica: 3 = uma loja nova abriu antes de entrar na lista;; 2 = parcialmente correto;; 1 = vago;; 0 = nenhuma. - EX063 — Causa do S00. O que produziu o S00?
Mostrar critérios de avaliação
Rubrica: 3 = um caixa de teste deixado na rede de produção;; 2 = parcialmente correto;; 1 = vago;; 0 = nenhuma.