Logo
Afbeelding

Controle op dubbele Bankrekeningen

Geschreven door The Audit Analytics | 5 minuten

Een veelvoorkomend risico is dat eenzelfde begunstigde meerdere bankrekeningen gebruikt; dat kán voorkomen, maar het kan ook wijzen op inefficiënties, administratieve fouten of zelfs frauduleuze activiteiten. Door middel van een data-analyse met Python en een CAMT-bestand zullen we deze onregelmatigheden in dit artikel detecteren.

Dubbele Bankrekeningen

CAMT-bestand

CAMT-bestanden zijn XML-bestanden die door banken worden gebruikt om transacties te rapporteren. We zullen een CAMT.053 bestand gebruiken, dat rekeningafschriften bevat.

Relevante velden:

  • Naam begunstigde (<Nm>)
  • IBAN (<IBAN>)
  • Bedrag (<Amt>)
  • Datum (<BookgDt>)

Voor een oefenbestand om deze analyse zelf uit te voeren, kun je dit test-CAMT-bestand downloaden.

Meer informatie over het CAMT.053-formaat en de specificaties ervan kun je vinden op deze externe pagina.

Data-analyse in Python

Om deze analyse uit te voeren, hebben we de volgende Python-packages nodig:

  • pandas voor datamanipulatie
  • xml.etree.ElementTree voor het parseren van XML-bestanden. Deze zit standaard in python.

Als je dat nog niet eerder gedaan hebt, kun je pandas installeren met het volgende commando:

pip install pandas

Hieronder laten we stap voor stap zien hoe we een CAMT-bestand inlezen en dubbele IBANs detecteren.

1. CAMT-bestand inlezen

We gebruiken xml.etree.ElementTree om het XML-bestand te parseren en relevante velden te extraheren.

# inladen van ElemenTree wat we nodig hebben om de XML in te lezen. 
import xml.etree.ElementTree as ET
import pandas as pd

# Het ontleden van de CAMT 053 met een leesbaar df als resultaat
def parse_camt053(file_path):
    tree = ET.parse(file_path)
    root = tree.getroot()
    ns = {'ns': 'urn:iso:std:iso:20022:tech:xsd:camt.053.001.02'}

    transactions = []
    
    # Loop over alle entries heen
    for entry in root.findall('.//ns:Ntry', ns):
        try:
            # Als er geen bedrag gevonden wordt voor de entry, wordt deze op 0,0 gezet. 
            amount = float(entry.find('ns:Amt', ns).text) if entry.find('ns:Amt', ns) is not None else 0.0
        except ValueError:
            amount = 0.0  # Fallback bij conversiefouten
        
        # Hieronder zoekt hij de betreffende velden en koppelt hij ze aan de variabele voor ons overzicht. 
        currency = entry.find('ns:Amt', ns).attrib.get('Ccy', 'N/A') if entry.find('ns:Amt', ns) is not None else 'N/A'
        date = entry.find('.//ns:BookgDt/ns:Dt', ns).text if entry.find('.//ns:BookgDt/ns:Dt', ns) is not None else '-'
        debtor = entry.find('.//ns:Dbtr/ns:Nm', ns).text if entry.find('.//ns:Dbtr/ns:Nm', ns) is not None else '-'
        debtor_iban = entry.find('.//ns:DbtrAcct/ns:Id/ns:IBAN', ns).text if entry.find('.//ns:DbtrAcct/ns:Id/ns:IBAN', ns) is not None else '-'
        creditor = entry.find('.//ns:Cdtr/ns:Nm', ns).text if entry.find('.//ns:Cdtr/ns:Nm', ns) is not None else '-'
        creditor_iban_element = entry.find('.//ns:CdtrAcct/ns:Id/ns:IBAN', ns)
        creditor_iban = creditor_iban_element.text if creditor_iban_element is not None else '-'

        # Koppelt de entry als regel aan ons DataFrame
        transactions.append({
            "Datum": date,
            "Debiteur": debtor,
            "Debiteur IBAN": debtor_iban,
            "Crediteur": creditor,
            "Crediteur IBAN": creditor_iban,
            "Bedrag": amount,
            "Munteenheid": currency
        })
    
    return pd.DataFrame(transactions)

# Laad het CAMT.053-bestand
file_path = "camt053_dummy.xml"
df = parse_camt053(file_path)

# Toon de bovenste rijen
print(df.head())

2. Duplicaten analyseren

We groeperen op begunstigde en tellen het aantal unieke IBANs.

# Groeperen en tellen van unieke IBANs per begunstigde
duplicates = df.groupby('Crediteur')['Crediteur IBAN'].nunique().reset_index()
duplicates = duplicates[duplicates['Crediteur IBAN'] > 1]  # Filter alleen begunstigden met meerdere IBANs

# Resultaten tonen
print("Begunstigden met meerdere IBANs:")
print(duplicates)

2.1 Analyse van IBANs met meerdere begunstigden

Naast het identificeren van begunstigden met meerdere IBANs, kunnen we ook analyseren of een IBAN aan meerdere begunstigden is gekoppeld. Dit kan wijzen op gezamenlijke rekeningen of verdachte transacties.

# Groeperen en tellen van unieke begunstigden per IBAN
iban_duplicates = df.groupby('Crediteur IBAN')['Crediteur'].nunique().reset_index()
iban_duplicates = iban_duplicates[iban_duplicates['Crediteur'] > 1]  # Filter alleen IBANs met meerdere begunstigden

# Resultaten tonen
print("IBANs die aan meerdere begunstigden zijn gekoppeld:")
print(iban_duplicates)

3. Resultaten visualiseren

We kunnen de resultaten in een tabel weergeven en exporteren naar Excel.

# Exporteren van de resultaten naar een Excel-bestand
duplicates.to_excel("liquide_middelen_dubbele_iban.xlsx", index=False)
iban_duplicates.to_excel("liquide_middelen_dubbele_begunstigden.xlsx", index=False)

Conclusie

Hopelijk heeft deze analyse je een beetje verder geholpen!