Transforme débito e crédito em valor
df["Valor"] = df["Débito"].where(
df["Débito"] > 0,
df["Crédito"]
)
df["Dia_Mes"] = df["Data"].dt.dayO modelo precisa de características que possam ser comparadas. Aqui criamos um valor único para lançamentos de débito ou crédito e adicionamos o dia do mês.
Compare cada valor com a própria conta
df["Mediana_Conta"] = (
df.groupby("Conta")["Valor"]
.transform("median")
)
df["Razao_Conta"] = (
df["Valor"] / df["Mediana_Conta"]
)R$ 20 mil pode ser normal em receita e muito estranho em material de escritório. A razão em relação à mediana da conta dá esse contexto ao modelo.
Transforme categorias em números
categorias = pd.get_dummies(
df[["Conta", "Centro de Custo", "Natureza"]],
dtype=float,
)O modelo não entende diretamente textos como “TI” ou “Logística”. O `get_dummies()` converte essas categorias em colunas numéricas.
Treine o IsolationForest
modelo = IsolationForest(
contamination=0.05,
random_state=42,
)
df["Predicao"] = modelo.fit_predict(X)
df["Score_Anomalia"] = -modelo.decision_function(X)Por que `contamination=0.05`?
Somente porque esta base didática foi preparada com aproximadamente 5% de registros atípicos. Em dados reais, esse parâmetro deve ser calibrado e validado — não copiado automaticamente.
Veja o que foi priorizado
| Conta | Centro de custo | Valor | Status |
|---|---|---|---|
| Software e licenças | Logística | R$ 27.500 | Revisar |
| Receita de vendas | Administrativo | R$ 950 | Revisar |
| Energia elétrica | Administrativo | R$ 28.900 | Revisar |
| Material de escritório | Administrativo | R$ 15.400 | Revisar |
| Combustível | TI | R$ 9.800 | Revisar |
| Hospedagem | Comercial | R$ 12.500 | Revisar |
O que você acabou de construir?
Um fluxo de triagem: lê lançamentos, cria contexto, treina um modelo não supervisionado, calcula um score de anomalia e devolve um Excel em que a equipe pode começar pelos itens sinalizados.