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

The Same-Same-Same Test (The S3 Test) berguna untuk mengidentifikasi duplikasi data yang berpotensi terjadi karena kesalahan maupun fraud.

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][['VendorNum', 'Date', 'InvNum', 'Amount']]
dup = datum[datum.duplicated(keep=False)]

# pivot_table
tabl = dup.pivot_table(index=['VendorNum', 'Date', 'InvNum', 'Amount'], aggfunc='size').reset_index()
tabl.rename(columns={0: 'CountofAmount'}, inplace=True)
tabl.sort_values(by=['CountofAmount', 'Amount'], ascending=False).head(22)

# groupby
tabl2 = dup.groupby(dup.columns.tolist(), as_index=False).size()
tabll2 = tabl2.reset_index()
tabll2.rename(columns={0: 'CountofAmount'}, inplace=True)
tabll2.sort_values(by=['CountofAmount', 'Amount'], ascending=False).head(22)

The Same-Same-Same Test

Duplikasi dapat saja terjadi namun kita patut mewaspadai duplikasi yang terjadi karena kesalahan atau fraud. Mengantisipasi hal tersebut kita perlu melakukan pengujian terhadap duplikasi data untuk meyakinkan bahwa tidak terdapat duplikasi yang terjadi karena dua sebab di atas (error dan fraud).

Transaksi penjualan dengan nominal sama tentu masih wajar, namun jika nominal, kode pembeli dan waktu sama kita patut curiga pada transaksi tersebut. Kita perlu menentukan kolom (parameter/feature) mana yang akan digunakan dalam pengujian. Dalam Forensic Analytics (halaman 234) pak Nigrini mencontohkan beberapa diantaranya, yaitu.

  • Dalam data pelanggan penerbangan (frequent-flyer) dapat berupa nomor pelanggan yang mendapat jumlah mileage sama dalam tanggal yang sama.
  • Pada data transaksi kartu pelanggan hotel berupa nomor pelanggan yang sama digunakan pada hotel yang berbeda di tanggal yang sama.
  • Di data transaksi servis gratis kendaraan dapat berupa nomor kendaraan sama dengan nilai kilometer sama pada dua tanggal yang berbeda.

Tujuan

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

Gambar sebelah kiri adalah hasil yang didapatkan jika kita melakukan pengujian menggunakan Excel (sesuai Figure 12.20 pada Forensic Analytics halaman 251). Gambar sebelah kanan adalah hasil pengujian menggunakan pandas.

Urgensi

Pengujian duplikasi menggunakan The S3 Test tetap perlu dilakukan meski manajemen mengklaim sistem yang digunakan telah memiliki prosedur pengujian duplikasi (Forensic Analytics halaman 234). Duplikasi dapat terjadi terutama saat awal tahun fiskal atau terjadi perubahan sistem.


Langkah Kerja

Data digunakan adalah invoices paid yang dapat diunduh di sini. Data yang diuji adalah data yang memiliki duplikat pada kombinasi kolom VendorNum, Date, InvNum dan Amount. Selain itu data yang digunakan adalah data dengan kolom Amount bernilai \geq 100.

Jika tidak ingin mengetik kode, notebook dapat diunduh 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')

Ambil hanya kolom tertentu

datum = df[df['Amount'] >= 100][['VendorNum', 'Date', 'InvNum', 'Amount']]

Ambil hanya data yang memiliki duplikat

Kita menggunakan fungsi duplicated dari pandas. Fungsi ini akan menguji duplikasi pada kombinasi semua kolom, artinya jika terdapat data yang sama persis pada kolom VendorNum, Date, InvNum dan Amount maka data tersebut akan ditandai sebagai duplikat. Parameter keep diisi dengan False agar semua data duplikat ditandai sebagai duplikat (dan diikutsertakan dalam variabel dup).

dup = datum[datum.duplicated(keep=False)]

Hitung banyak duplikat

Terdapat setidaknya dua metode untuk ini, yaitu menggunakan fungsi pivot_table dan fungsi groupby.

pivot_table
tabl = dup.pivot_table(index=['VendorNum', 'Date', 'InvNum', 'Amount'], aggfunc='size')

Perlu sedikit kode agar tampak seperti dataframe yang biasa kita gunakan, dengan nama kolom yang informatif dan urut berdasarkan banyaknya duplikat.

tabll = tabl.reset_index()
tabll.rename(columns={0: 'CountofAmount'}, inplace=True)
tabll.sort_values(by=['CountofAmount', 'Amount'], ascending=False).head(22)
groupby
tabl2 = dup.groupby(dup.columns.tolist(), as_index=False).size()
tabll2 = tabl2.reset_index()
tabll2.rename(columns={0: 'CountofAmount'}, inplace=True)
tabll2.sort_values(by=['CountofAmount', 'Amount'], ascending=False).head(22)

Selanjutnya

Pemeriksaan lebih lanjut pada kombinasi VendorNum, Date, InvNum dan Amount yang memiliki duplikat perlu dilakukan untuk mengetahui apakah hal tersebut terjadi karena sebab yang normal, kesalahan seperti personel yang berbeda memproses transaksi yang sama atau karena terjadi fraud.


Referensi


Cover Image by Sasin Tipchai from Pixabay

2 Replies to “Forensic Analytics dengan Pandas – The Same-Same-Same Test”

Leave a Reply

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