01_business_understanding



NLP Triagem Inteligente Financeira - Data Science Project

Business Understanding & CRISP-DM+

Estruturar o problema de negócio, definir a abordagem metodológica do projeto
e estabelecer a camada inicial de entendimento de domínio por meio
de Ontologia, BLM (Business Language Model) e hipóteses semânticas.


Roberto SSoares - LfLngLrnng

in/roberto-dos-santos-soares
Portifólio: roberto-ssoares

" [+] Faturamento [-] Custo [+] Qualidade de vida "
"Mestre Bruno Jardim"

📌 Objetivo:

  • Ações realizadas neste notebook
    • Definição do contexto de negócio
    • Formulação do problema analítico
    • Estabelecimento de objetivos e critérios de sucesso
    • Estruturação do CRISP-DM+ Lean
    • Construção de uma ontologia mínima do domínio
    • Construção de um glossário BLM inicial
    • Formulação de hipóteses semânticas para NLP aplicado
  • Justificativa técnica
    • Em projetos de NLP aplicados ao negócio,
      • treinar um modelo sem antes reduzir ambiguidades do domínio tende a gerar classes mal definidas,
      • baixa interpretabilidade e dificuldade de adoção operacional.
    • Esta etapa busca alinhar linguagem de negócio, estrutura analítica e arquitetura futura da solução.
  • Resultados esperados
    • Escopo analítico bem definido
    • Camada inicial de entendimento do domínio formalizada
    • Base metodológica para EDA, preparação, modelagem e API

📌 1. Contexto do problema

  • Instituições financeiras lidam diariamente com grandes volumes de:
    • mensagens,
    • reclamações,
    • solicitações
    • e registros textuais oriundos de diferentes canais de atendimento.
  • Em muitos contextos, a triagem dessas mensagens ainda é parcialmente manual, o que gera:
    • aumento do tempo operacional
    • inconsistência de classificação
    • dificuldade de priorização
    • risco de roteamento incorreto
    • perda de capacidade analítica sobre temas recorrentes
  • Este projeto propõe a construção de uma solução de NLP para apoiar a triagem inteligente dessas demandas textuais.

📌 2. Pergunta central do projeto

  • Como automatizar a triagem de demandas textuais no contexto financeiro para apoiar classificação, priorização e encaminhamento operacional?
  • Objetivo de negócio
    • Reduzir tempo de triagem, melhorar consistência de categorização e apoiar a tomada de decisão operacional em fluxos de atendimento e tratamento de manifestações textuais.
  • Objetivo analítico
    • Desenvolver uma solução de NLP capaz de receber um texto livre e prever, ao menos:
        1. a categoria da demanda
        1. opcionalmente, a prioridade da demanda

📚 Instalando e Carregando os Pacotes¶

from pathlib import Path
import pandas as pd
pd.set_option('display.max_colwidth', None)                     # Não limitar a largura da coluna
pd.set_option('display.width', None)                            # Expandir a largura da exibição (evitar quebra de linha horizontal)

✔️ 3. Carregamento dos dados

PROJECT_ROOT = Path.cwd().resolve().parents[0]
DATA_DIR = PROJECT_ROOT / "data"
DOCS_DIR = PROJECT_ROOT / "docs"
ARTIFACTS_DIR = PROJECT_ROOT / "artifacts"

print("PROJECT_ROOT:", PROJECT_ROOT)
print("DATA_DIR:", DATA_DIR)
print("DOCS_DIR:", DOCS_DIR)
print("ARTIFACTS_DIR:", ARTIFACTS_DIR)
PROJECT_ROOT: D:\_DS-Projects\nlp-triagem-inteligente-financeira
DATA_DIR: D:\_DS-Projects\nlp-triagem-inteligente-financeira\data
DOCS_DIR: D:\_DS-Projects\nlp-triagem-inteligente-financeira\docs
ARTIFACTS_DIR: D:\_DS-Projects\nlp-triagem-inteligente-financeira\artifacts

📌 4. Abordagem metodológica

  • Este projeto utiliza uma adaptação do framework CRISP-DM+ Lean, incorporando uma etapa anterior ao fluxo clássico de modelagem:
  • Etapa 0 — Domain Understanding+
    • Ontologia mínima do domínio
    • BLM (Business Language Model)
    • Hipóteses semânticas iniciais
  • Etapa 1 — Business Understanding
    • definição do problema
    • definição de objetivos
    • critérios de sucesso
    • riscos e premissas
  • Etapas seguintes
    • Data Understanding
    • Data Preparation
    • Modeling
    • Evaluation
    • Deployment
    • Monitoring & Feedback

project_charter = {
    "project_name": "NLP Triagem Inteligente Financeira",
    "problem_type": "Classificação textual com apoio à priorização e encaminhamento",
    "primary_input": "Texto livre de reclamação, chamado ou manifestação",
    "primary_output": "Categoria da demanda",
    "secondary_output": "Prioridade da demanda (opcional no MVP)",
    "methodology": "CRISP-DM+ Lean",
    "business_goal": "Apoiar automação da triagem textual no setor financeiro",
    "technical_goal": "Construir pipeline end-to-end com baseline, transformer, API e monitoramento inicial"
}

pd.DataFrame([project_charter]).T.rename(columns={0: "valor"})
valor
project_name NLP Triagem Inteligente Financeira
problem_type Classificação textual com apoio à priorização e encaminhamento
primary_input Texto livre de reclamação, chamado ou manifestação
primary_output Categoria da demanda
secondary_output Prioridade da demanda (opcional no MVP)
methodology CRISP-DM+ Lean
business_goal Apoiar automação da triagem textual no setor financeiro
technical_goal Construir pipeline end-to-end com baseline, transformer, API e monitoramento inicial

📌 5. Critérios de sucesso

  • Critérios de sucesso de negócio
    • reduzir o esforço manual de triagem
    • aumentar consistência da categorização
    • permitir priorização mais rápida das demandas
    • apoiar visão analítica sobre temas recorrentes
  • Critérios de sucesso analítico
    • estabelecer classes semanticamente coerentes
    • construir um baseline robusto
    • comparar baseline com modelo avançado
    • disponibilizar inferência por API REST
    • registrar logs mínimos para monitoramento inicial

success_metrics = pd.DataFrame(
    [
        ["Negócio", "Tempo médio de triagem", "Redução do tempo operacional"],
        ["Negócio", "Consistência de classificação", "Menor variabilidade entre atendentes/processos"],
        ["Analítico", "Macro F1", "Avaliar desempenho geral entre classes"],
        ["Analítico", "Recall em classes críticas", "Reduzir perda de casos sensíveis"],
        ["Operacional", "Latência de inferência", "Viabilidade de uso em fluxo real"],
        ["Operacional", "Logging de predição", "Rastreabilidade inicial do uso do modelo"],
    ],
    columns=["dimensao", "metrica", "objetivo"]
)

success_metrics
dimensao metrica objetivo
0 Negócio Tempo médio de triagem Redução do tempo operacional
1 Negócio Consistência de classificação Menor variabilidade entre atendentes/processos
2 Analítico Macro F1 Avaliar desempenho geral entre classes
3 Analítico Recall em classes críticas Reduzir perda de casos sensíveis
4 Operacional Latência de inferência Viabilidade de uso em fluxo real
5 Operacional Logging de predição Rastreabilidade inicial do uso do modelo

📌 6. Ontologia mínima do domínio

  • A ontologia mínima deste projeto não busca representar exaustivamente todo o domínio financeiro.
    • Seu papel aqui é organizar semanticamente os principais elementos envolvidos na triagem textual.
  • Entidades principais
    • Cliente
    • Demanda
    • Produto
    • Canal
    • Categoria
    • Prioridade
    • Atendimento
    • Encaminhamento
  • Função da ontologia no projeto
    • reduzir ambiguidade de negócio
    • orientar definição de classes
    • apoiar leitura de erros do modelo
    • fortalecer documentação e interpretabilidade

ontology_entities = pd.DataFrame(
    [
        ["Cliente", "Pessoa que origina a manifestação, reclamação ou solicitação"],
        ["Demanda", "Texto livre contendo a necessidade, problema ou dúvida"],
        ["Produto", "Serviço ou produto financeiro ao qual a demanda se refere"],
        ["Canal", "Origem da demanda, como app, telefone, e-mail ou chat"],
        ["Categoria", "Classe principal atribuída à demanda"],
        ["Prioridade", "Nível de urgência operacional da demanda"],
        ["Atendimento", "Fluxo humano ou automatizado de tratamento da demanda"],
        ["Encaminhamento", "Destino operacional responsável pela tratativa"],
    ],
    columns=["entidade", "descricao"]
)

ontology_relations = pd.DataFrame(
    [
        ["Cliente", "abre", "Demanda"],
        ["Demanda", "refere-se a", "Produto"],
        ["Demanda", "chega por", "Canal"],
        ["Demanda", "recebe", "Categoria"],
        ["Demanda", "recebe", "Prioridade"],
        ["Demanda", "é tratada em", "Atendimento"],
        ["Demanda", "é encaminhada para", "Encaminhamento"],
    ],
    columns=["origem", "relacao", "destino"]
)

print("Entidades da ontologia:")
display(ontology_entities)

print("\nRelações da ontologia:")
display(ontology_relations)
Entidades da ontologia:
entidade descricao
0 Cliente Pessoa que origina a manifestação, reclamação ou solicitação
1 Demanda Texto livre contendo a necessidade, problema ou dúvida
2 Produto Serviço ou produto financeiro ao qual a demanda se refere
3 Canal Origem da demanda, como app, telefone, e-mail ou chat
4 Categoria Classe principal atribuída à demanda
5 Prioridade Nível de urgência operacional da demanda
6 Atendimento Fluxo humano ou automatizado de tratamento da demanda
7 Encaminhamento Destino operacional responsável pela tratativa
Relações da ontologia:
origem relacao destino
0 Cliente abre Demanda
1 Demanda refere-se a Produto
2 Demanda chega por Canal
3 Demanda recebe Categoria
4 Demanda recebe Prioridade
5 Demanda é tratada em Atendimento
6 Demanda é encaminhada para Encaminhamento

📌 7. BLM — Business Language Model

  • O BLM representa a linguagem do negócio presente nas manifestações textuais.
    • Ele ajuda a mapear termos operacionais, expressões recorrentes e sentidos que precisam ser preservados durante a análise.
  • Papel do BLM neste projeto
    • traduzir a linguagem do negócio para a linguagem analítica
    • apoiar a definição das classes-alvo
    • orientar inspeção de termos ambíguos
    • melhorar a comunicação entre técnica e operação

blm_glossary = pd.DataFrame(
    [
        ["fatura", "Documento de cobrança relacionado ao produto financeiro"],
        ["limite", "Valor disponível ou teto operacional do produto"],
        ["contestação", "Pedido de revisão de cobrança, compra ou transação"],
        ["fraude", "Indício de uso indevido, transação não reconhecida ou comportamento suspeito"],
        ["bloqueio", "Impedimento temporário ou definitivo de uso do produto ou conta"],
        ["cobrança indevida", "Valor cobrado que o cliente considera incorreto"],
        ["renegociação", "Pedido de revisão de condições de pagamento ou dívida"],
        ["atraso", "Situação de não pagamento dentro do prazo esperado"],
        ["atendimento", "Interação operacional com canal, agente ou processo"],
        ["cancelamento", "Solicitação de encerramento de produto, serviço ou operação"],
    ],
    columns=["termo", "significado_de_negocio"]
)

blm_glossary
termo significado_de_negocio
0 fatura Documento de cobrança relacionado ao produto financeiro
1 limite Valor disponível ou teto operacional do produto
2 contestação Pedido de revisão de cobrança, compra ou transação
3 fraude Indício de uso indevido, transação não reconhecida ou comportamento suspeito
4 bloqueio Impedimento temporário ou definitivo de uso do produto ou conta
5 cobrança indevida Valor cobrado que o cliente considera incorreto
6 renegociação Pedido de revisão de condições de pagamento ou dívida
7 atraso Situação de não pagamento dentro do prazo esperado
8 atendimento Interação operacional com canal, agente ou processo
9 cancelamento Solicitação de encerramento de produto, serviço ou operação

📌 8. Hipóteses semânticas iniciais

  • Antes de iniciar a modelagem, é importante registrar hipóteses sobre a estrutura semântica do problema.
  • Essas hipóteses serão testadas e refinadas na etapa de Data Understanding.

semantic_hypotheses = pd.DataFrame(
    [
        ["H1", "Termos relacionados a cobrança, fatura e vencimento tendem a formar grupos semânticos próximos."],
        ["H2", "Mensagens de fraude e transação não reconhecida devem apresentar vocabulário distintivo."],
        ["H3", "Categorias operacionais podem ter sobreposição semântica parcial, exigindo revisão de labels."],
        ["H4", "Mensagens muito curtas podem reduzir a capacidade discriminativa do modelo."],
        ["H5", "Há potencial para priorização adicional com base em palavras de urgência e contexto de risco."],
    ],
    columns=["hipotese", "descricao"]
)

semantic_hypotheses
hipotese descricao
0 H1 Termos relacionados a cobrança, fatura e vencimento tendem a formar grupos semânticos próximos.
1 H2 Mensagens de fraude e transação não reconhecida devem apresentar vocabulário distintivo.
2 H3 Categorias operacionais podem ter sobreposição semântica parcial, exigindo revisão de labels.
3 H4 Mensagens muito curtas podem reduzir a capacidade discriminativa do modelo.
4 H5 Há potencial para priorização adicional com base em palavras de urgência e contexto de risco.

📌 9. Premissas, riscos e limitações

  • Premissas
    • o dataset conterá uma coluna textual principal utilizável
    • será possível definir classes de negócio coerentes
    • o volume de dados permitirá ao menos um baseline confiável
  • Riscos
    • classes excessivamente sobrepostas
    • forte desbalanceamento entre categorias
    • textos curtos, ruidosos ou muito heterogêneos
    • qualidade irregular dos rótulos
    • escopo excessivo para o tempo disponível do sprint
  • Estratégia de mitigação
    • começar com uma tarefa principal de classificação
    • usar baseline forte antes do modelo avançado
    • documentar decisões de simplificação do MVP

risk_register = pd.DataFrame(
    [
        ["Classes sobrepostas", "Alta", "Alta", "Revisar labels e agrupar categorias quando necessário"],
        ["Desbalanceamento severo", "Alta", "Média", "Monitorar distribuição e usar métricas adequadas"],
        ["Texto muito curto", "Média", "Média", "Inspecionar comprimento e avaliar impacto por classe"],
        ["Baixa qualidade de rótulo", "Média", "Alta", "Criar amostra de revisão manual"],
        ["Escopo excessivo", "Alta", "Alta", "Manter foco em classificação principal no MVP"],
    ],
    columns=["risco", "probabilidade", "impacto", "mitigacao"]
)

risk_register
risco probabilidade impacto mitigacao
0 Classes sobrepostas Alta Alta Revisar labels e agrupar categorias quando necessário
1 Desbalanceamento severo Alta Média Monitorar distribuição e usar métricas adequadas
2 Texto muito curto Média Média Inspecionar comprimento e avaliar impacto por classe
3 Baixa qualidade de rótulo Média Alta Criar amostra de revisão manual
4 Escopo excessivo Alta Alta Manter foco em classificação principal no MVP

📌 10. Próximos passos

  • A continuidade do projeto seguirá a estrutura:
  1. Notebook 02 — Data Understanding
    • leitura do dataset
    • EDA textual
    • distribuição das classes
    • qualidade dos textos
  1. Notebook 03 — Data Preparation
    • limpeza textual
    • revisão de labels
    • splits
    • exportação para camadas tratadas
  1. Notebook 04 — Baseline
    • TF-IDF + Logistic Regression
  1. Notebook 05 — Modelo Avançado
    • transformer pré-treinado
  1. Notebook 06 — Evaluation
    • leitura técnica e de negócio
  1. Notebook 07 — Deployment & Monitoring
    • API REST
    • logging
    • simulação de uso operacional

DOCS_DIR.mkdir(parents=True, exist_ok=True)

ontology_entities.to_csv(DOCS_DIR / "ontology_entities.csv", index=False)
ontology_relations.to_csv(DOCS_DIR / "ontology_relations.csv", index=False)
blm_glossary.to_csv(DOCS_DIR / "blm_glossary.csv", index=False)
semantic_hypotheses.to_csv(DOCS_DIR / "semantic_hypotheses.csv", index=False)
risk_register.to_csv(DOCS_DIR / "risk_register.csv", index=False)

print("Arquivos auxiliares exportados para a pasta docs/.")
Arquivos auxiliares exportados para a pasta docs/.

Fim

#!uv pip install nbconvert -U -q
!jupyter nbconvert --to html --template-file my-template-html-v10.tpl 01_business_understanding.ipynb