Forensic Analytics dengan Pandas – The Same-Same-Different Test

salah satu dari dua transaksi berbeda, namun mirip, sangat mungkin merupakan kesalahan atau berpotensi merupakan fraud. Menggunakan The Same-Same-Different Test (The SSD Test) kita dapat mendeteksi transaksi-transaksi “perlu perhatian” tersebut.

Kode Lima Detik

import pandas as pd

pd.options.display.float_format = '{:,.2f}'.format
df = pd.read_excel('https://www.nigrini.com/ForensicAnalytics/Chapter4_Figure4pt4_DataOnly.xlsx')

datum = df[df['Amount'] >= 100]
dup3cols = datum[datum.duplicated(subset=['Date', 'InvNum', 'Amount'], keep=False)]
dup4cols = datum[datum.duplicated(subset=['Date', 'InvNum', 'Amount', 'VendorNum'], keep=False)]
dup = dup3cols[~dup3cols['ID'].isin(dup4cols['ID'])]

dup.sort_values(by=['Amount', 'VendorNum'], ascending=False).head(22)[['Date', 'InvNum', 'Amount', 'VendorNum']]

The Same-Same-Different Test

Metode ini menguji seberapa miripnya data berdasarkan banyaknya kolom (kriteria/parameter) yang sama. Asumsinya adalah salah satu data yang mirip salah diinput pada kelompok yang berbeda.

Misalnya pada data invoices paid terdapat kolom berikut:

  • VendorNum (kode penyedia)
  • Date (tanggal transaksi)
  • InvNum (nomor invoice)
  • Amount (nilai transaksi)

Jika data pada kolom Date, InvNum dan Amount sama, yang berbeda hanya data pada kolom VendorNum, bisa jadi salah satu itu transaksi salah diinput, seharusnya dengan penyedia B namun tercatat sebagai transaksi dengan penyedia A, atau bisa juga merupakan praktik fraud.

Tujuan

Kita akan menguji data duplikat pada kombinasi kolom Date, InvNum dan Amount pada data invoices paid dari buku Forensic Analytics.

Pada gambar di atas terlihat kolom Date, InvNum dan Amount bernilai sama pada dua baris (baris 2 dan 3, baris 4 dan 5 dan seterusnya). Pada baris-baris tersebut kolom VendorNum bernilai berbeda.

Urgensi

Pengujian ini sebaiknya dilakukan pada setiap penugasan forensil analitik (Pak Nigrini di Forensic Analytics halaman 235). Data yang sama persis (semua kolom berisi data yang sama) mungkin sulit ditemui, apalagi jika data dibuat oleh sebuah sistem komputer. Namun data yang hampir mirip masih kerap kita temukan. Menggunakan The SSD Test kita dapat meyakinkan apakah terdapat kesalahan atau fraud pada data yang mirip tersebut.


Langkah Kerja

Data yang digunakan adalah invoiced paid dari Buku Forensic Analytics yang dapat diunduh di sini. Data yang diuji adalah data yang duplikat pada kolom Date, InvNum dan Amount kemudian ditampilkan jika data VendorNum berbeda. Hanya digunakan data dengan nilai Amount \geq 100.

Kita akan memanfaatkan kode dari tulisan sebelum ini untuk mendapatkan data duplikat pada 4 kolom (Date, InvNum, Amount dan VendorNum).

Jika tidak ingin mengetik, notebook tulisan ini dapat diakses di sini.

Kode

Load library dan data

import pandas as pd

pd.options.display.float_format = '{:,.2f}'.format
df = pd.read_excel('https://www.nigrini.com/ForensicAnalytics/Chapter4_Figure4pt4_DataOnly.xlsx')

Gunakan hanya Amount \geq 100

datum = df[df['Amount'] >= 100]

Ambil data duplikat pada 3 kolom

dup3cols = datum[datum.duplicated(subset=['Date', 'InvNum', 'Amount'], keep=False)]

Ambil data duplikat pada 4 kolom

dup4cols = datum[datum.duplicated(subset=['Date', 'InvNum', 'Amount', 'VendorNum'], keep=False)]

Ambil data duplikat

dup = dup3cols[~dup3cols['ID'].isin(dup4cols['ID'])]

Pada kode sebelumnya kita mengambil data yang duplikat pada 3 kolom (Date, InvNum dan Amount), untuk kepentingan ilustrasi anggap saja langkah tersebut menghasilkan kelompok data/himpunan A seperti ini.

A = \{apel, jeruk, pisang, mangga, rambutan, jambu\}

Kode selanjutnya adalah mengambil data duplikat pada 4 kolom (Date, InvNum, Amount dan VendorNum), kita namakan kelompok data/himpunan B.

B = \{apel, jeruk, pisang\}

Dalam bahasa agak formal, B adalah himpunan bagian dari A atau B \subseteq A karena semua data B ada di A. Hubungan antara data 3 kolom (himpunan A) dan data 4 kolom (himpunan B) dapat digambarkan seperti ini.

Yang kita perlukan adalah data yang memiliki kesamaan pada 3 kolom (Date, InvNum dan Amount) namun berbeda VendorNumnya. Karena itu, berdasar gambar dua bulatan di atas, yang kita perlu dapatkan adalah data pada bulatan hijau yang bukan bagian dari bulatan merah. Atau dapat disebut himpunan C.

C = {mangga, rambutan, jambu}

Untuk mendapatkannya, pada kode terakhir kita menggunakan fungsi isin untuk mendapatkan data himpunan B (4 kolom), lalu kemudian menggunakan simbol ~ (negasi/bukan) untuk mendapatkan himpunan C.

Urutkan data duplikat

dup.sort_values(by=['Amount', 'VendorNum'], ascending=False).head(22)[['Date', 'InvNum', 'Amount', 'VendorNum']]

Selanjutnya

Data yang mirip di atas perlu mendapat perhatian, kemiripannya terlihat kurang wajar untuk sebuah “kebetulan”.

Dalam kasus spesifik di dunia nyata, kita perlu imajinasi (menempatkan diri sebagai pelaku fraud) saat memilih kombinasi kolom yang akan diuji kemiripannya agar The SSD Test sukses dijalankan.


Referensi


Cover Image by Sasin Tipchai from Pixabay

Leave a Reply

Your email address will not be published. Required fields are marked *