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).

Kode Lima Detik

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.


Referensi

2 Replies to “Pandas – Uji Urutan Waktu Transaksi”

  1. Pingback: Bar Chart Race

Leave a Reply

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