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.
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 .
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 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.
Kode selanjutnya adalah mengambil data duplikat pada 4 kolom (Date, InvNum, Amount dan VendorNum), kita namakan kelompok data/himpunan B.
Dalam bahasa agak formal, B adalah himpunan bagian dari A atau 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.
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
- https://www.nigrini.com/ForensicAnalytics.htm
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.duplicated.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.isin.html
Cover Image by Sasin Tipchai from Pixabay
One Reply to “Forensic Analytics dengan Pandas – The Same-Same-Different Test”