""" MODULE ALGORITHM - FRAUD DETECTION (DETAIL MAXIMAL) =================================================== Détecte les anomalies et retourne un rapport détaillé pour l'IA. """ import networkx as nx import pandas as pd def detect_fraud_logic(G: nx.DiGraph): risk_nodes = [] fraud_report = [] # Seuils de tolérance (Règles Métier) suspicious_types = { "Telephone": 1, "Email": 1, "ID_Officiel": 1, "Numero_Fiscal": 1, "Reseau_sociaux": 1, "Reference_Externe": 1, "Adresse": 3 # Tolérance plus élevée pour adresse (coloc/famille) } for node, data in G.nodes(data=True): group = data.get("group") if group in suspicious_types: threshold = suspicious_types[group] # On regarde qui est connecté à ce nœud (Entrant + Sortant) neighbors = list(G.neighbors(node)) + list(G.predecessors(node)) # On filtre pour ne garder que les entités "Humaines" (Clients/Garants) connected_entities = [] for n in neighbors: role = G.nodes[n].get("group") if role in ["Client", "Garant"]: connected_entities.append(n) # Dédoublonnage via ID Officiel si dispo, sinon ID système unique_people = set(connected_entities) if len(unique_people) > threshold: # --- ACTION : MARQUAGE ROUGE --- G.nodes[node]['color'] = "#FF0000" G.nodes[node]['shape'] = "star" G.nodes[node]['size'] = 40 G.nodes[node]['title'] = f"🚨 FRAUDE : Partagé par {len(unique_people)} personnes !" risk_nodes.append(node) # --- RAPPORT DÉTAILLÉ POUR L'IA --- clean_value = node.split(":", 1)[1] if ":" in node else node connected_names = [G.nodes[n].get('label', n) for n in list(unique_people)[:5]] # Top 5 noms fraud_report.append({ "Type": group, "Valeur": clean_value, "NB Identités": len(unique_people), "Motif": f"Partagé par : {', '.join(connected_names)}", "Détails": f"Seuil autorisé: {threshold}, Trouvé: {len(unique_people)}" }) df_fraud = pd.DataFrame(fraud_report) return G, risk_nodes, df_fraud