Pandas – Uji Urutan Waktu Transaksi
Penyalahgunaan aset masih merupakan salah satu skema fraud paling populer di tahun 2020 ini. Pada tulisan ini kita akan belajar mendeteksi skimming kas dari ACFE Fraud Tree, yaitu dengan menguji urutan kode penjualan (sales id).
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt sales = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderHeader.csv', sep='\t', parse_dates=True) sales = sales.set_index('OrderDate') a4_dims = (11.7, 8.27) plt.figure(figsize=a4_dims) sns.set_style("whitegrid") sales['SalesOrderID'].plot(linewidth=0.5);
Latar Belakang
Idealnya dokumen transaksi diberi nomor urut yang nilainya akan makin besar seiring dengan waktu. Jika terdapat nomor yang tidak ditemukan maka terdapat kemungkinan ada penjualan yang tidak tercatat, misal karena sengaja dihapus oleh pelaku fraud. Atau jika nomor pada dokumen transaksi tidak urut sesuai waktu (tanggal) maka tentu menerbitkan kecurigaan.
Pada tulisan sebelumnya kita telah dapat mendeteksi nomor transksi yang hilang menggunakan pandas. Kali ini kita akan menguji apakah nomor transaksi berbanding lurus dengan waktu.
Pengujian dalam bentuk membuat grafik waktu dan nomor transaksi. Gambar mempunyai keunggulan yaitu mudah dicerna sehingga kita dapat dengan cepat memahami situasi yang kita hadapi.
Data yang digunakan adalah data penjualan AdventureWorks pada tabel Sales.SalesOrderHeader.
Langkah Kerja
Load library dan data
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt sales = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderHeader.csv', sep='\t', parse_dates=True)
Ubah kolom OrderDate menjadi index
Langkah ini untuk memudahkan saat membuat grafik waktu.
sales = sales.set_index('OrderDate')
Uji kolom SalesOrderID
Kolom ini berisi urutan id penjualan, sepertinya dibuat secara elektronik oleh sistem penjualan. Namun tetap kita uji untuk memastikan kolom tersebut urut sesuai waktu.
a4_dims = (11.7, 8.27) plt.figure(figsize=a4_dims) sns.set_style("whitegrid") sales['SalesOrderID'].plot(linewidth=0.5);
Grafik mengindikasikan kolom SalesOrderID telah urut sesuai waktu karena nilainya makin besar seiring waktu.
Uji kolom SalesOrderNumber
Selain kolom SalesOrderID terdapat kolom lain yang mengindikasikan nomor dokumen penjualan, yaitu SalesOrderNumber. Karena kolom SalesOrderNumber menggunakan kombinasi huruf dan angka (misal SO43659) maka kita perlu membuat sebuah kolom baru bernama SONumber yang berisi hanya angka dari kolom SalesOrderNumber. Kemudian kolom tersebut yang kita gambarkan pada grafik.
sales['SONumber'] = sales['SalesOrderNumber'].str.extract('(\d+)').astype('int64') a4_dims = (11.7, 8.27) plt.figure(figsize=a4_dims) sns.set_style("whitegrid") sales['SONumber'].plot(linewidth=0.5);
Hasilnya masih konsisten dengan pengujian sebelumnya, yaitu nomor dokumen penjualan urut sesuai waktu. Grafik juga mengindikasikan bahwa sistem pencatatan yang digunakan tidak me-reset (kembali ke angka 1) nomor transaksi penjualan per periode tertentu seperti bulanan atau tahunan.
Uji kolom PurchaseOrderNumber
Data yang kita gunakan sebagian memuat keterangan pembelian dalam kolom PurchaseOrderNumber, kita akan menguji kolom tersebut apakah urut sesuai waktu. Karena sebagian data tidak memuat PurchaseOrderNumber maka kita perlu membuat sebuah variabel baru berisi data penjualan yang memuat PurchaseOrderNumber.
sales2 = sales[sales['PurchaseOrderNumber'].notnull()].copy() sales2['PONumber'] = sales2['PurchaseOrderNumber'].str.extract('(\d+)').astype('int64') a4_dims = (11.7, 8.27) plt.figure(figsize=a4_dims) sns.set_style("whitegrid") sales2['PONumber'].plot(linewidth=0.5);
Berbeda dengan hasil pengujian pada kolom SalesOrderID dan SalesOrderNumber, kolom PurchaseOrderNumber tidak menunjukkan garis lurus yang melulu menanjak. Nomor pembelian naik dan turun sepanjang waktu yang menandakan pembelian hari ini belum tentu terjual besok namun bisa jadi baru lusa, bulan depan atau waktu yang lebih lama.
Temuan ini akan menjadi menarik saat audit yang dilakukan adalah audit kinerja dimana kita sedang, misalnya, melakukan pengujian mengenai efisiensi pengadaan persediaan barang dagang. Makin lama barang tidak terjual tentu makin banyak biaya yang harus disediakan atau makin turun nilai barang tersebut.
2 Replies to “Pandas – Uji Urutan Waktu Transaksi”