Logo
AfbeeldingThe AuditBuilder

Process mining in de praktijk: betalingen vóór ontvangst herkennen met Python

5 minutenAudit leadAudit data-analist
Process mining wordt vaak gezien als complexe technologie met dure licenties, maar de kern is verrassend simpel: kijken naar volgorde. In dit artikel laten we de theorie varen en duiken we de praktijk in. Hoe gebruik je een eenvoudige dataset om een concreet riscio bloot te leggen?

Process mining voorbeeld

Stel je voor: je controleert een handelsonderneming. De inkoopprocedure is helder:

  1. Er wordt besteld (Purchase Order).
  2. De goederen komen binnen (Goods Receipt).
  3. De factuur wordt geboekt (Invoice).
  4. Pas als die drie matchen, volgt de betaling (Payment).

Het management verzekert je dat het systeem dit afdwingt, maar de IT auditors hebben al vastgesteld dat je achteraf in het systeem nog wijzigingen kan doorvoeren. En betalingen kunnen ook los aangemaakt worden. Wel is er betrouwbare logging beschikbaar.

Je hebt een export gekregen van 50.000 transacties uit het ERP, waarmee we aan de slag kunnen.

Norm bepalen

Voordat we in de techniek duiken, schetsen we wat we willen zien. We zijn niet op zoek naar een mooi plaatje van het hele proces. We zijn op zoek naar afwijkingen van onze norm.

Onze norm is simpel: PO -> GR -> INVOICE -> PAYMENT.

Alles wat hiervan afwijkt, is een potentieel risico. We willen een lijstje dat er zo uitziet:

Case IDVolgordeOordeel
PO-1001PO -> GR -> INV -> PAYVolgens norm
PO-1002PO -> INV -> PAYGeen ontvangst!
PO-1003PO -> INV -> PAY -> GRBetaald vóór ontvangst!

Hoe doe je dit?

Je hebt hier geen gespecialiseerde process mining software voor nodig. Met een beetje logica en een standaard script (in bijvoorbeeld Python) kom je er al.

De truc is om je data eerst goed te organiseren. Een computer begrijpt het "proces" niet, maar hij begrijpt wel "tijd" en "sorteren".

Stap 1: De data voorbereiden

We hebben een simpele tabel nodig met drie kolommen:

  1. Case ID: Wat hoort bij elkaar? (bv. Inkoopordernummer)
  2. Activiteit: Wat gebeurde er? (bv. 'Goederen Ontvangst')
  3. Tijdstip: Wanneer gebeurde het?

Stap 2: De logica

Hieronder zie je hoe je dit in Python aanpakt (meer over python vind je hier). Laat je niet afschrikken door de code; lees de comments om de logica te volgen.

import pandas as pd

# 1. Lees de data in
df = pd.read_csv("inkoop_data.csv")

# Zorg dat het script snapt dat 'Timestamp' een datum is
df["Timestamp"] = pd.to_datetime(df["Timestamp"])

# 2. Sorteer alles: Eerst per Inkooporder, dan op Tijd
df_sorted = df.sort_values(["CaseID", "Timestamp"])

# 3. Maak per Inkooporder een 'ketting' van activiteiten
# Dit maakt van losse regels één leesbare zin per order
proces_paden = (
    df_sorted.groupby("CaseID")["Activity"]
    .apply(list)  # Maak een lijstje van alle stappen
    .reset_index(name="UitgevoerdPad")
)

# Maak er een leesbare tekst van, bijvoorbeeld "PO -> GR -> INV"
proces_paden["Pad_Tekst"] = proces_paden["UitgevoerdPad"].apply(lambda x: " -> ".join(x))

print(proces_paden.head())

Met dit kleine stukje code heb je voor elke van de 50.000 orders het exacte verloop in kaart gebracht.

Stap 3: Afwijkingen bepalen

Nu kunnen we de vraag stellen waar het echt om gaat: Welke orders wijken af van onze norm?

# Definieer wat we verwachten (De Norm)
NORM_PAD = "PO_CREATED -> GOODS_RECEIPT -> INVOICE_POSTED -> PAYMENT"

# Filter de gevallen die NIET aan de norm voldoen
afwijkingen = proces_paden[proces_paden["Pad_Tekst"] != NORM_PAD].copy()

print(f"Aantal afwijkingen gevonden: {len(afwijkingen)}")
print("Meest voorkomende afwijkende patronen:")
print(afwijkingen["Pad_Tekst"].value_counts().head(5))

Opvolging

Stel, het script draait en spuugt uit dat er 450 gevallen zijn die afwijken. Wat nu?

Je ziet bijvoorbeeld:

  1. 150x PO -> INV -> PAY: Facturen betaald zonder goederenontvangst.
    • Mogelijke actie: Is dit diensteninkoop (huur, consultancy)? Dan is het logisch. Is het inkoop van laptops? Dan heb je een groot intern beheersingsprobleem.
  2. 20x PO -> INV -> PAY -> GR: Goederen kwamen pas ná betaling.
    • Mogelijke actie: Waren dit vooruitbetalingen? Toegestaan volgens procedure? Of is de administratie gewoon traag met inboeken?
  3. 5x INV -> PAY: Geen PO gezien.
    • Mogelijke actie: Dit zijn 'maverick buying' gevallen of spookfacturen. Deze 5 pak je eruit voor integraal detailonderzoek.

Conclusie

Process mining in de audit hoeft niet abstract te zijn. Door procesvolgordes expliciet te maken, verplaatst je aandacht van "bestaat de procedure?" naar "wordt de procedure nageleefd?". Handig, toch?

Process mining Als je strikt bent, passen we geen volledige process-mining toe in dit artikel, maar een auditgerichte procesvolgorde-analyse: een lichte vorm van process mining waarbij we concreet testen of een bepaalde volgorde in het process plaatsvindt. Strikt genomen is process mining breder en worden daar alle mogelijke processen in kaart gebracht, waardoor je ook gelijk inzichtelijk hebt of er nog andere belangrijke zijstromen hebt; dit vraagt echter veel meer capaciteit en is voor veel kleinere controleklanten overbodig. In dit artikel ligt de focus dus meer op naleving in plaats van procesontdekking.

Help ons The Audit Analytics verbeteren

Was dit artikel nuttig?

Laat ons weten of deze pagina nuttig is zodat we blijven verbeteren.

Feedback van lezersNog geen feedback