marcitarcampos commited on
Commit
52cd86c
·
verified ·
1 Parent(s): 87775e0

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +75 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ import seaborn as sns
4
+ import gradio as gr
5
+
6
+ def simular_monitoramento_pld(taxa_media_diaria, limiar_alerta, periodo_simulacao=365):
7
+ """
8
+ Executa a simulação de Monte Carlo para o monitoramento de PLD.
9
+ """
10
+ # Gera o número de operações suspeitas para cada dia usando a distribuição de Poisson [cite: 58, 59, 60]
11
+ operacoes_diarias = np.random.poisson(taxa_media_diaria, periodo_simulacao)
12
+
13
+ # Cálculo determinístico: compara as operações diárias com o limiar [cite: 61]
14
+ alertas_gerados = np.sum(operacoes_diarias >= limiar_alerta)
15
+
16
+ # Um "verdadeiro positivo" é qualquer dia em que um alerta foi corretamente disparado [cite: 62]
17
+ verdadeiros_positivos = alertas_gerados
18
+
19
+ # Um "falso negativo" é um dia com atividade ilícita que não atingiu o limiar [cite: 63, 67]
20
+ dias_com_atividade_real = np.sum(operacoes_diarias > 0)
21
+ falsos_negativos = np.sum((operacoes_diarias > 0) & (operacoes_diarias < limiar_alerta))
22
+
23
+ # Calcula métricas de eficácia [cite: 68]
24
+ taxa_deteccao = (verdadeiros_positivos / dias_com_atividade_real) * 100 if dias_com_atividade_real > 0 else 0
25
+
26
+ resultados = {
27
+ "Total de Alertas": alertas_gerados,
28
+ "Total de Dias com Atividade Suspeita": dias_com_atividade_real,
29
+ "Dias com Alerta (Verdadeiros Positivos)": verdadeiros_positivos,
30
+ "Dias com Atividade Não Detectada (Falsos Negativos)": falsos_negativos,
31
+ "Taxa de Detecção (%)": f'~{taxa_deteccao:.2f}%'
32
+ }
33
+
34
+ return resultados, plotar_resultados(operacoes_diarias, limiar_alerta, taxa_media_diaria)
35
+
36
+ def plotar_resultados(operacoes_diarias, limiar_alerta, taxa_media_diaria):
37
+ """
38
+ Gera o gráfico de resultados.
39
+ """
40
+ plt.style.use('seaborn-v0_8-whitegrid')
41
+ fig, ax = plt.subplots(figsize=(10, 5))
42
+ sns.histplot(operacoes_diarias, bins=range(0, max(operacoes_diarias) + 2), ax=ax, kde=False, stat="count", discrete=True)
43
+ ax.axvline(x=taxa_media_diaria, color='yellow', linestyle='--', linewidth=2, label=f'Taxa Média (λ={taxa_media_diaria})')
44
+ ax.axvline(x=limiar_alerta - 0.5, color='red', linestyle='-', linewidth=2, label=f'Limiar de Alerta ({limiar_alerta} operações)')
45
+ ax.set_title('Distribuição Diária de Operações Suspeitas (Simulação de 365 Dias)', fontsize=14)
46
+ ax.set_xlabel('Número de Operações Suspeitas em um Dia', fontsize=10)
47
+ ax.set_ylabel('Número de Dias', fontsize=10)
48
+ ax.legend()
49
+ ax.grid(True)
50
+ plt.tight_layout()
51
+ return fig
52
+
53
+ # Define a interface do Gradio
54
+ with gr.Blocks() as iface:
55
+ gr.Markdown("# Simulação de Monte Carlo para Análise de Eficácia de Sistemas de Monitoramento de PLD")
56
+ gr.Markdown("Esta ferramenta utiliza a Simulação de Monte Carlo para avaliar a eficácia de um sistema de monitoramento de transações financeiras no contexto da Prevenção à Lavagem de Dinheiro (PLD).")
57
+
58
+ with gr.Row():
59
+ with gr.Column():
60
+ taxa_media_diaria = gr.Slider(minimum=0.1, maximum=10.0, value=3.0, step=0.1, label="Taxa Média Diária de Operações Suspeitas (λ)")
61
+ limiar_alerta = gr.Slider(minimum=1, maximum=20, value=6, step=1, label="Limiar de Alerta para Investigação")
62
+ run_button = gr.Button("Executar Simulação")
63
+ with gr.Column():
64
+ output_text = gr.JSON(label="Resultados da Simulação")
65
+
66
+ output_plot = gr.Plot(label="Distribuição das Operações Suspeitas")
67
+
68
+ run_button.click(
69
+ fn=simular_monitoramento_pld,
70
+ inputs=[taxa_media_diaria, limiar_alerta],
71
+ outputs=[output_text, output_plot]
72
+ )
73
+
74
+ if __name__ == "__main__":
75
+ iface.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ numpy
2
+ matplotlib
3
+ seaborn
4
+ gradio