anderson-ufrj
docs(agents): document Production tier agents (5 complete)
f01b97b
# 📊 Anita Garibaldi - A Analista de Padrões
**Status**: ✅ **100% Completo** (Produção - Pronto para uso)
**Arquivo**: `src/agents/anita.py`
**Tamanho**: 61KB (1405 linhas - MAIOR AGENTE!)
**Métodos Implementados**: ~23
**Testes**: ✅ Sim (`tests/unit/agents/test_anita.py`)
**TODOs**: 0
**NotImplementedError**: 0
**Última Atualização**: 2025-10-03 10:15:00 -03:00
---
## 🎯 Missão
Detecção avançada de padrões e correlações em dados governamentais. Análise de tendências temporais, comportamento de fornecedores, padrões sazonais, análise espectral (FFT), comparação organizacional e modelagem preditiva para identificar insights estratégicos em gastos públicos.
**Inspiração Cultural**: Ana Maria de Jesus Ribeiro (1821-1849), conhecida como Anita Garibaldi, heroína da Revolução Farroupilha e das guerras de unificação italiana. Estrategista militar brilhante, reconhecida por sua capacidade de identificar padrões em batalhas e antecipar movimentos inimigos.
---
## 🧠 Capacidades Principais
### ✅ Análise de Tendências
- Spending trends over time (gastos ao longo do tempo)
- Trend detection window (6 meses configurável)
- Direção de tendência: increasing/decreasing/stable
- Modelagem preditiva de gastos futuros
### ✅ Padrões Organizacionais
- Comparação entre organizações
- Eficiência comparativa
- Benchmarking de desempenho
- Identificação de outliers
### ✅ Comportamento de Fornecedores
- Análise de market share
- Detecção de concentração de mercado
- Padrões de pricing por fornecedor
- Evolução temporal de participação
### ✅ Padrões Sazonais
- Detecção de sazonalidade em gastos
- Identificação de ciclos (mensal, trimestral, anual)
- Picos e vales de contratação
- Análise de final de exercício fiscal
### ✅ Análise Espectral (FFT)
- Transformada Rápida de Fourier (Fast Fourier Transform)
- Detecção de periodicidades ocultas
- Identificação de frequências dominantes
- Cross-spectral analysis (correlação espectral)
- Análise de coerência entre séries temporais
### ✅ Distribuição de Valores
- Histogramas e distribuições
- Detecção de outliers estatísticos
- Análise de concentração de valores
- Comparação com distribuições esperadas
### ✅ Correlação Multivariada
- Pearson correlation coefficient
- P-value e significância estatística
- Interpretação de negócios
- Identificação de variáveis correlacionadas
### ✅ Métricas de Eficiência
- Cost per capita
- Execution rate (taxa de execução orçamentária)
- Time to contract (tempo médio de contratação)
- Contract size distribution
---
## 📊 Estruturas de Dados
### PatternResult (Resultado de Padrão)
```python
@dataclass
class PatternResult:
pattern_type: str # Tipo: spending_trend, seasonal, vendor_behavior, etc
description: str # Descrição em linguagem natural
significance: float # 0.0-1.0 (quão significativo é o padrão)
confidence: float # 0.0-1.0 (quão confiante estamos)
insights: List[str] # Lista de insights gerados
evidence: Dict[str, Any] # Evidências (dados, estatísticas)
recommendations: List[str] # Recomendações de ação
entities_involved: List[Dict] # Entidades envolvidas (orgs, fornecedores)
trend_direction: Optional[str] # "increasing", "decreasing", "stable"
correlation_strength: Optional[float] # Se aplicável
```
---
### CorrelationResult (Resultado de Correlação)
```python
@dataclass
class CorrelationResult:
correlation_type: str # "pearson", "spearman", "cross_spectral"
variables: List[str] # Variáveis correlacionadas
correlation_coefficient: float # -1.0 a +1.0
p_value: Optional[float] # Significância estatística
significance_level: str # "high", "medium", "low"
description: str # Descrição técnica
business_interpretation: str # Interpretação de negócio
evidence: Dict[str, Any] # Evidências estatísticas
recommendations: List[str] # Ações recomendadas
```
---
### AnalysisRequest (Solicitação de Análise)
```python
class AnalysisRequest(BaseModel):
query: str # Query em linguagem natural
analysis_types: Optional[List[str]] # Tipos específicos de análise
time_period: str = "12_months" # Período: 1_month, 3_months, 6_months, 12_months
organization_codes: Optional[List] # Códigos de organizações
focus_areas: Optional[List[str]] # Áreas de foco
comparison_mode: bool = False # Habilitar comparação entre entidades
max_records: int = 200 # Máximo de registros
```
---
## 🔬 Métodos de Análise
Anita possui **9 tipos de análise** diferentes:
### 1. Spending Trends (Tendências de Gastos)
```python
async def _analyze_spending_trends(self, data, context) -> List[PatternResult]:
"""
Analisa tendências de gastos ao longo do tempo.
Algoritmo:
1. Agrupa gastos por mês
2. Calcula média móvel (rolling average)
3. Detecta direção de tendência (regressão linear)
4. Identifica pontos de inflexão
Outputs:
- Tendência geral: increasing/decreasing/stable
- Taxa de crescimento/decrescimento mensal
- Projeção para próximos 3 meses
- Anomalias na tendência
"""
```
**Exemplo de Resultado**:
```python
PatternResult(
pattern_type="spending_trend",
description="Gastos crescendo 12% ao mês nos últimos 6 meses",
significance=0.85,
confidence=0.92,
trend_direction="increasing",
insights=[
"Aceleração de gastos detectada a partir de março/2024",
"Projeção indica R$ 85M em outubro/2024 se tendência continuar"
],
recommendations=[
"Investigar causas do crescimento acelerado",
"Revisar planejamento orçamentário para Q4"
]
)
```
---
### 2. Organizational Patterns (Padrões Organizacionais)
```python
async def _analyze_organizational_patterns(self, data, context) -> List[PatternResult]:
"""
Compara padrões de gastos entre organizações.
Análises:
- Gasto médio por organização
- Variação de gastos (desvio padrão)
- Eficiência relativa
- Outliers organizacionais
Detecção:
- Organizações com gastos >2σ acima da média
- Organizações com alta variabilidade
- Padrões de contratação distintos
"""
```
---
### 3. Vendor Behavior (Comportamento de Fornecedores)
```python
async def _analyze_vendor_behavior(self, data, context) -> List[PatternResult]:
"""
Analisa padrões de comportamento de fornecedores.
Métricas:
- Market share por fornecedor
- Concentração de mercado (índice Herfindahl)
- Evolução temporal de participação
- Pricing patterns (preços consistentes vs variáveis)
Detecções:
- Fornecedores com >30% de market share
- Mudanças súbitas em participação de mercado
- Preços inconsistentes do mesmo fornecedor
"""
```
---
### 4. Seasonal Patterns (Padrões Sazonais)
```python
async def _analyze_seasonal_patterns(self, data, context) -> List[PatternResult]:
"""
Detecta sazonalidade em gastos públicos.
Padrões comuns:
- Picos em dezembro (final de exercício fiscal)
- Baixa em janeiro-fevereiro (início de ano)
- Ciclos trimestrais
Algoritmo:
- Decomposição de séries temporais
- Autocorrelation Function (ACF)
- Detecção de ciclos com FFT
"""
```
**Padrões Detectáveis**:
- **End-of-year rush**: Aceleração de gastos em novembro-dezembro
- **Post-holiday lull**: Queda em janeiro-fevereiro
- **Quarterly cycles**: Picos ao final de cada trimestre
- **Election cycles**: Variações em anos eleitorais
---
### 5. Spectral Patterns (Análise Espectral FFT)
```python
async def _analyze_spectral_patterns(self, data, context) -> List[PatternResult]:
"""
Usa FFT para detectar periodicidades ocultas.
Processo:
1. Converte série temporal em sinal
2. Aplica Fast Fourier Transform (FFT)
3. Identifica frequências dominantes
4. Interpreta períodos detectados
Detecções:
- Ciclos ocultos não óbvios visualmente
- Periodicidades compostas (múltiplas frequências)
- Harmônicos (múltiplos de frequências base)
"""
```
**Exemplo de Saída**:
```python
SpectralFeatures(
dominant_frequencies=[0.083, 0.25, 1.0], # 12 meses, 4 meses, 1 mês
power_spectrum=[120.5, 45.2, 18.7],
snr=15.8, # Signal-to-noise ratio
periodic_patterns=[
PeriodicPattern(
period=12, # meses
amplitude=120.5,
confidence=0.95,
description="Ciclo anual forte detectado"
)
]
)
```
---
### 6. Cross-Spectral Analysis (Análise Espectral Cruzada)
```python
async def _perform_cross_spectral_analysis(self, data, context) -> List[PatternResult]:
"""
Correlação espectral entre séries temporais de diferentes entidades.
Uso:
- Detectar sincronização entre organizações
- Identificar dependências temporais
- Descobrir influências ocultas
Algoritmo:
1. FFT de cada série temporal
2. Cross-power spectrum
3. Coherence function
4. Phase lag analysis
"""
```
**Aplicação Prática**:
- Ministério A e B sempre gastam juntos? (coerência alta)
- Há defasagem temporal? (phase lag)
- Sincronização indica coordenação ou independência?
---
### 7. Value Distribution (Distribuição de Valores)
```python
async def _analyze_value_distribution(self, data, context) -> List[PatternResult]:
"""
Analisa distribuição estatística de valores de contratos.
Análises:
- Histograma de valores
- Estatísticas descritivas (mean, median, std, skew, kurtosis)
- Outliers (valores >3σ da média)
- Comparação com distribuição normal/log-normal
Detecções:
- Distribuição heavy-tailed (muitos outliers)
- Bimodal distribution (2 picos)
- Concentração em faixas específicas
"""
```
---
### 8. Correlation Analysis (Análise de Correlação)
```python
async def _perform_correlation_analysis(self, data, context) -> List[CorrelationResult]:
"""
Correlação multivariada entre métricas.
Correlações testadas:
- Gasto total vs número de contratos
- Valor médio vs organização
- Gasto vs tempo (tendências)
- Fornecedor vs preço
Estatísticas:
- Pearson correlation coefficient (r)
- P-value (significância)
- Confidence interval (95%)
"""
```
**Interpretação de Coeficientes**:
- **r > 0.7**: Correlação forte positiva
- **r 0.3-0.7**: Correlação moderada
- **r < 0.3**: Correlação fraca
- **r < 0**: Correlação negativa (inversa)
---
### 9. Efficiency Metrics (Métricas de Eficiência)
```python
async def _calculate_efficiency_metrics(self, data, context) -> List[PatternResult]:
"""
Calcula métricas de eficiência operacional.
Métricas:
- Budget execution rate: (executado / planejado) * 100
- Cost per beneficiary: valor total / população atendida
- Time to contract: dias médios para formalização
- Contract size: valor médio por contrato
- Vendor diversity: número de fornecedores únicos
Benchmarking:
- Comparação entre organizações
- Ranking de eficiência
- Identificação de best practices
"""
```
---
## 🎯 Thresholds e Configuração
### Parâmetros do Agente
```python
anita = AnalystAgent(
min_correlation_threshold=0.3, # Mínimo r para reportar correlação
significance_threshold=0.05, # P-value máximo (95% confiança)
trend_detection_window=6 # Janela de 6 meses para trends
)
```
### Interpretação de Thresholds
**Correlation Threshold (0.3)**:
- r < 0.3: Não reporta (ruído)
- r >= 0.3: Reporta como correlação fraca a forte
**Significance Threshold (0.05)**:
- p > 0.05: Não estatisticamente significante (pode ser chance)
- p <= 0.05: Estatisticamente significante (95% confiança)
**Trend Window (6 meses)**:
- Muito curto (1-2 meses): Sensível a ruído
- Ideal (3-6 meses): Captura tendências reais
- Muito longo (>12 meses): Perde mudanças recentes
---
## 💻 Exemplos de Uso
### Exemplo 1: Análise Completa de Tendências
```python
from src.agents.anita import AnalystAgent, AnalysisRequest
anita = AnalystAgent()
# Request completo
request = AnalysisRequest(
query="Analisar tendências de gastos no Ministério da Saúde em 2024",
analysis_types=["spending_trends", "seasonal_patterns", "spectral_patterns"],
time_period="12_months",
organization_codes=["26000"], # Ministério da Saúde
max_records=200
)
# Processar
message = AgentMessage(action="analyze", payload=request.model_dump())
response = await anita.process(message, context)
# Resultados
patterns = response.result["patterns"]
for pattern in patterns:
print(f"Padrão: {pattern['pattern_type']}")
print(f"Significância: {pattern['significance']:.2f}")
print(f"Descrição: {pattern['description']}")
print(f"Insights: {', '.join(pattern['insights'])}")
print("---")
```
---
### Exemplo 2: Comparação entre Organizações
```python
request = AnalysisRequest(
query="Comparar eficiência de gastos entre Saúde, Educação e Defesa",
analysis_types=["organizational_patterns", "efficiency_metrics"],
organization_codes=["26000", "25000", "36000"], # Saúde, Educação, Defesa
comparison_mode=True,
max_records=300
)
response = await anita.process(
AgentMessage(action="analyze", payload=request.model_dump()),
context
)
# Ranking de eficiência
summary = response.result["summary"]
print(summary["efficiency_ranking"])
# [
# {"org": "Ministério da Educação", "efficiency_score": 0.85},
# {"org": "Ministério da Saúde", "efficiency_score": 0.72},
# {"org": "Ministério da Defesa", "efficiency_score": 0.68}
# ]
```
---
### Exemplo 3: Análise de Fornecedores
```python
request = AnalysisRequest(
query="Identificar fornecedores com comportamento suspeito",
analysis_types=["vendor_behavior"],
max_records=500
)
response = await anita.process(
AgentMessage(action="analyze", payload=request.model_dump()),
context
)
# Fornecedores concentrados
patterns = response.result["patterns"]
concentrated_vendors = [
p for p in patterns
if p["pattern_type"] == "vendor_concentration"
and p["significance"] > 0.7
]
for vendor_pattern in concentrated_vendors:
print(f"Fornecedor: {vendor_pattern['entities_involved'][0]['name']}")
print(f"Market share: {vendor_pattern['evidence']['market_share']:.1%}")
print(f"Recomendações: {vendor_pattern['recommendations']}")
```
---
### Exemplo 4: Detecção de Sazonalidade com FFT
```python
request = AnalysisRequest(
query="Detectar padrões sazonais e ciclos ocultos em gastos de 2024",
analysis_types=["seasonal_patterns", "spectral_patterns"],
time_period="12_months",
max_records=200
)
response = await anita.process(
AgentMessage(action="analyze", payload=request.model_dump()),
context
)
# Padrões espectrais
spectral_patterns = [
p for p in response.result["patterns"]
if p["pattern_type"] == "spectral_pattern"
]
for sp in spectral_patterns:
print(f"Período detectado: {sp['evidence']['period']} meses")
print(f"Amplitude: {sp['evidence']['amplitude']:.2f}")
print(f"Confiança: {sp['confidence']:.2%}")
print(f"Descrição: {sp['description']}")
```
---
### Exemplo 5: Correlação Multivariada
```python
request = AnalysisRequest(
query="Encontrar correlações entre variáveis de gastos",
analysis_types=["correlation_analysis"],
max_records=300
)
response = await anita.process(
AgentMessage(action="analyze", payload=request.model_dump()),
context
)
# Correlações significantes
correlations = response.result["correlations"]
significant = [
c for c in correlations
if c["significance_level"] in ["high", "medium"]
]
for corr in significant:
print(f"Variáveis: {' vs '.join(corr['variables'])}")
print(f"Coeficiente: {corr['correlation_coefficient']:.3f}")
print(f"P-value: {corr['p_value']:.4f}")
print(f"Interpretação: {corr['business_interpretation']}")
print("---")
```
---
## 📊 Análise Espectral (FFT) em Detalhe
### Por que usar FFT?
FFT (Fast Fourier Transform) transforma série temporal do **domínio do tempo** para **domínio da frequência**.
**Benefícios**:
1. Detecta ciclos não óbvios visualmente
2. Separa sinal de ruído
3. Identifica múltiplas periodicidades simultaneamente
4. Quantifica força de cada ciclo
### Como funciona
```python
# 1. Série temporal de gastos mensais
time_series = [45M, 52M, 48M, 55M, 50M, 58M, 53M, 60M, 56M, 65M, 70M, 95M]
# Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez
# 2. Aplicar FFT
fft_result = np.fft.fft(time_series)
frequencies = np.fft.fftfreq(len(time_series))
# 3. Power spectrum (força de cada frequência)
power = np.abs(fft_result) ** 2
# 4. Identificar frequências dominantes
dominant_freq = frequencies[np.argmax(power[1:])] # Ignora freq=0 (média)
# 5. Converter para período
period = 1 / dominant_freq # Em meses
# Ex: period = 12 → Ciclo anual
# Ex: period = 4 → Ciclo trimestral
# Ex: period = 1 → Ciclo mensal
```
### Interpretação de Resultados
```python
SpectralFeatures(
dominant_frequencies=[0.083, 0.25],
# 0.083 Hz → 1/0.083 = 12 meses (ciclo anual)
# 0.25 Hz → 1/0.25 = 4 meses (ciclo trimestral)
power_spectrum=[145.2, 38.7],
# 145.2 → Ciclo anual FORTE
# 38.7 → Ciclo trimestral MODERADO
snr=18.5, # Signal-to-noise ratio
# SNR > 10 → Sinal forte, confiável
# SNR < 5 → Muito ruído, baixa confiança
)
```
---
## 🧪 Testes
### Cobertura
- ✅ Testes unitários: `tests/unit/agents/test_anita.py`
- ✅ Todas as 9 análises testadas
- ✅ Edge cases (dados vazios, outliers extremos)
- ✅ Validação de thresholds
- ✅ Performance com grandes volumes
### Cenários Testados
1. **Spending Trends**
- Tendência crescente detectada corretamente
- Tendência decrescente identificada
- Estabilidade reconhecida
2. **Seasonal Patterns**
- Pico de dezembro detectado
- Sazonalidade trimestral identificada
3. **Spectral Analysis (FFT)**
- Ciclo anual de 12 meses detectado
- Múltiplas frequências separadas
- SNR calculado corretamente
4. **Vendor Behavior**
- Concentração >70% flagged
- Market share calculado corretamente
5. **Correlation Analysis**
- Pearson r calculado
- P-value correto
- Significance level adequado
6. **Efficiency Metrics**
- Budget execution rate preciso
- Ranking de eficiência correto
---
## 🔀 Integração com Outros Agentes
### Fluxo de Análise
```
Zumbi (Anomalias) + Anita (Padrões)
Insights Combinados
┌───────┴───────┐
↓ ↓
Bonifácio Tiradentes
(Avaliação) (Relatório)
```
### Agentes que Consomem Anita
1. **Abaporu (Orquestrador)**
- Combina anomalias de Zumbi com padrões de Anita
- Gera investigações contextualizadas
2. **Tiradentes (Relatórios)**
- Inclui análises de padrões em relatórios
- Visualiza tendências e correlações
3. **Bonifácio (Políticas)**
- Usa tendências para avaliar eficácia de políticas
- Correlaciona gastos com resultados
4. **Nanã (Memória)**
- Armazena padrões históricos
- Compara padrões ao longo do tempo
---
## 📊 Métricas Prometheus
```python
# Análises executadas
anita_analyses_total{type="spending_trends|seasonal|vendor|spectral"}
# Padrões detectados
anita_patterns_detected_total{type="trend|seasonal|vendor|correlation"}
# Tempo de análise
anita_analysis_time_seconds{type="spending_trends|fft"}
# Registros analisados
anita_records_analyzed_total
# Taxa de sucesso
anita_analysis_success_rate
# Significance média
anita_avg_pattern_significance
# Correlações fortes encontradas
anita_strong_correlations_total{threshold="0.7"}
```
---
## 🚀 Performance
### Benchmarks
- **Spending trends**: 200-500ms (200 records)
- **FFT spectral analysis**: 100-300ms
- **Correlation analysis**: 300-800ms (múltiplas variáveis)
- **Vendor behavior**: 150-400ms
- **Análise completa (todas)**: 2-4 segundos
### Otimizações
1. **Vectorização NumPy**
- Operações em arrays ao invés de loops
- 10-100x mais rápido
2. **Caching de FFT**
- Reutiliza transformadas já calculadas
- Evita recomputação
3. **Parallel Processing**
- Múltiplas análises em paralelo
- asyncio.gather()
4. **Data Sampling**
- Limita a max_records para performance
- Amostragem representativa
---
## ⚙️ Configuração
### Variáveis de Ambiente
```bash
# Thresholds
ANITA_MIN_CORRELATION=0.3 # Correlação mínima
ANITA_SIGNIFICANCE=0.05 # P-value máximo
ANITA_TREND_WINDOW=6 # Meses para tendências
# Performance
ANITA_MAX_RECORDS=500 # Máximo de registros
ANITA_ENABLE_FFT=true # Habilitar análise espectral
ANITA_PARALLEL_ANALYSES=true # Executar em paralelo
```
---
## 🏁 Diferenciais
### Por que Anita é Essencial
1. **✅ Análise Espectral (FFT)** - Única com detecção de periodicidades ocultas
2. **📊 9 Tipos de Análise** - Cobertura completa de padrões
3. **🔬 Rigor Estatístico** - P-values, confidence intervals, significance
4. **⏱️ Análise Temporal** - Tendências, sazonalidade, ciclos
5. **🤝 Correlações Multivariadas** - Descobre relações não óbvias
6. **⚡ Alta Performance** - NumPy vectorization, parallel processing
7. **📈 Modelagem Preditiva** - Projeções de gastos futuros
### Comparação com Análise Manual
| Aspecto | Anita (Automatizada) | Análise Manual |
|---------|---------------------|----------------|
| **Tempo** | ⚡ 2-4 segundos | 🐌 Dias/semanas |
| **Tipos de Análise** | ✅ 9 simultâneas | ⚠️ Geralmente 1-2 |
| **FFT Spectral** | ✅ Automático | ❌ Raramente feito |
| **Correlações** | ✅ Todas testadas | ⚠️ Apenas suspeitas |
| **Estatística** | ✅ Rigorosa (p-values) | ⚠️ Varia |
| **Escalabilidade** | ✅ 500+ records | ❌ <50 típico |
| **Custo** | 💰 Baixíssimo | 💸 Alto (analista sênior) |
---
## 📚 Referências
### Cultural
- **Ana Maria de Jesus Ribeiro** (1821-1849), Anita Garibaldi
- **Revolução Farroupilha**: Guerra no Rio Grande do Sul (1835-1845)
- **Unificação Italiana**: Batalhas ao lado de Giuseppe Garibaldi
- **Legado**: Estrategista militar, reconhecida por identificar padrões em combate
### Estatísticas
- **Pearson Correlation**: Correlação linear entre variáveis
- **P-value**: Probabilidade de resultado ao acaso
- **Trend Detection**: Regressão linear, média móvel
- **Time Series Analysis**: Decomposição, autocorrelação
### Signal Processing
- **FFT (Fast Fourier Transform)**: Análise de frequências
- **Power Spectrum**: Energia por frequência
- **SNR (Signal-to-Noise Ratio)**: Qualidade do sinal
- **Cross-Spectral Analysis**: Correlação espectral entre séries
---
## ✅ Status de Produção
**Deploy**: ✅ 100% Pronto para produção
**Testes**: ✅ 100% das 9 análises cobertas
**Performance**: ✅ 2-4s análise completa, <500ms análises individuais
**Algoritmos**: ✅ FFT, correlação, tendências, sazonalidade, eficiência
**Aprovado para uso em**:
- ✅ Análise de tendências de gastos públicos
- ✅ Detecção de padrões sazonais
- ✅ Análise espectral (FFT) de séries temporais
- ✅ Correlação multivariada
- ✅ Benchmarking organizacional
- ✅ Análise de comportamento de fornecedores
- ✅ Métricas de eficiência operacional
- ✅ Modelagem preditiva de gastos
---
**Autor**: Anderson Henrique da Silva
**Manutenção**: Ativa
**Versão**: 1.0 (Produção)
**License**: Proprietary