Forensic Analytics dengan Pandas – The Largest Growth Test

The largest growth adalah variasi dari The largest subset test bedanya nilai moneter/transaksi pada masing-masing kelompok/subset dibagi menjadi beberapa periode waktu untuk kemudian dibandingkan perubahannya.

Kode Lima Detik

import pandas as pd

pd.options.display.float_format = '{:,.2f}'.format

sales = pd.read_csv('AW/Sales.SalesOrderHeader.csv', sep='\t')
customer = pd.read_csv('AW/Sales.Customer.csv', sep='\t')
person = pd.read_csv('AW/Person.Person.csv', sep='\t')

sm1 = sales[(sales['OrderDate'] >= '2012-01-01') & (sales['OrderDate'] <= '2012-06-30')]
sm2 = sales[(sales['OrderDate'] >= '2012-07-01') & (sales['OrderDate'] <= '2012-12-31')]

salessm1 = sm1[['CustomerID', 'SubTotal']].groupby('CustomerID', as_index=False).sum()
salessm1.rename(columns={'SubTotal': 'sm1'}, inplace=True)
salessm2 = sm2[['CustomerID', 'SubTotal']].groupby('CustomerID', as_index=False).sum()
salessm2.rename(columns={'SubTotal': 'sm2'}, inplace=True)

sales2periods = salessm1.merge(salessm2, on='CustomerID')
sales2periods['growth'] = sales2periods['sm1'] - sales2periods['sm2']
sales2periods['percentage'] = abs(sales2periods['growth'] / sales2periods['sm1'] * 100)

sales2periods = sales2periods.merge(customer[['CustomerID', 'PersonID']], on='CustomerID')
sales2periods = sales2periods.merge(person[['BusinessEntityID', 'FirstName', 'MiddleName', 'LastName']], left_on='PersonID', right_on='BusinessEntityID')
sales2periods['CustomerName'] = sales2periods['FirstName'] + ' ' + sales2periods['LastName']

sales2periods.sort_values(by='growth', ascending=False).head(20)[['CustomerName', 'sm1', 'sm2', 'growth']]
sales2periods.sort_values(by='growth').head(20)[['CustomerName', 'sm1', 'sm2', 'growth']]


The Largest Growth Test

Metode ini membandingkan perubahan nilai pada beberapa periode waktu. Jika terdapat perbedaan signifikan dapat terjadi karena sesuatu yang wajar (misal terdapat perubahan tren sehingga penjualan menjadi tinggi atau rendah), fraud atau terdapat kesalahan (misal personel penjualan salah memasukkan nilai transaksi).

Tujuan

Menggunakan data AdventureWorks kita akan menampilkan perbedaan nilai tranksasi masing-masing pelanggan pada semester I tahun 2012 dan semester II tahun yang sama.

Informasi yang akan kita hasilkan adalah seperti berikut. Pertama adalah peningkatan nilai transaksi tertinggi per masing-masing pelanggan.

Informasi selanjutnya adalah penurunan transaksi masing-masing pelanggan, diurutkan berdasarkan nilai.

Urgensi

Disadur dari Forensic Analytics halaman 197, jenis temuan yang dapat dihasilkan menggunakan metode ini adalah.

  • Terdapat peningkatan signifikan pada penukaran kupon pada salah satu toko. Investigasi lebih lanjut menemukan bahwa peningkatan tersebut ternyata merupakan fraud.
  • Jaringan restoran cepat saji menemukan penurunan drastis penjualan pada salah satu restorannya yang belakangan diketahui terjadi karena terdapat penjualan yang tidak dilaporkan.

Langkah Kerja

Data yang digunakan adalah data penjualan (sebelum pajak dan ongkos kirim) dari tabel Sales.SalesOrderHeader yang difilter hanya transaksi pada periode 1 Januari 2012 sampai 31 Desember 2012. Data kemudian dibagi menjadi dua semester dan dikelompokkan per masing-masing pelanggan.

Berdasarkan nilai transaksi dua semester tersebut, diambil selisih nilai dan kemudian diurutkan berdasarkan selisih positif dan selisih negatif terbesar.

Data dalam bentuk csv dapat diakses di sini, notebook di sini.

Kode

Load library dan data

import pandas as pd

pd.options.display.float_format = '{:,.2f}'.format

sales = pd.read_csv('AW/Sales.SalesOrderHeader.csv', sep='\t')

Dapatkan rentang waktu transaksi yang ada dalam data

Proses ini adalah bagian dari eksplorasi data, untuk mengetahui pada data yang kita miliki mengandung penjualan periode kapan saja. Berdasarkan hasil dari proses ini, kita akan menentukan periode mana saja yang akan dibandingkan, dalam tulisan ini penulis memilih 2 periode yaitu semester 1 dan semester 2 tahun 2012.

sales['OrderDate'].min(), sales['OrderDate'].max()

Ambil data 2 semester

sm1 = sales[(sales['OrderDate'] >= '2012-01-01') & (sales['OrderDate'] <= '2012-06-30')]

sm2 = sales[(sales['OrderDate'] >= '2012-07-01') & (sales['OrderDate'] <= '2012-12-31')]

Menggunakan fungsi shape kita tahu jumlah transaksi semester 2 lebih banyak ketimbang semester 1, yaitu 2.104 dan 1.811 transaksi.

Kelompokkan data semesteran berdasarkan pelanggan

salessm1 = sm1[['CustomerID', 'SubTotal']].groupby('CustomerID', as_index=False).sum()
salessm1.rename(columns={'SubTotal': 'sm1'}, inplace=True)

salessm2 = sm2[['CustomerID', 'SubTotal']].groupby('CustomerID', as_index=False).sum()
salessm2.rename(columns={'SubTotal': 'sm2'}, inplace=True)

Kolom SubTotal pada kedua kode di atas diubah namanya agar mudah dikenali saat kedua data tersebut digabungkan.

Menggabungkan data semesteran

sales2periods = salessm1.merge(salessm2, on='CustomerID')

Menambah kolom selisih

sales2periods['growth'] = sales2periods['sm1'] - sales2periods['sm2']

Sampai di sini kita sudah dapat melihat peningkatan dan penurunan transaksi per semester.

Namun untuk mengurangi kesulitan mencerna informasi tersebut, kita tambahkan nama pelanggan, dengan langkah yang kurang lebih sama seperti pada tulisan sebelumnya.

Kolom Nama Customer

customer = pd.read_csv('AW/Sales.Customer.csv', sep='\t')
person = pd.read_csv('AW/Person.Person.csv', sep='\t')

sales2periods = sales2periods.merge(customer[['CustomerID', 'PersonID']], on='CustomerID')
sales2periods = sales2periods.merge(person[['BusinessEntityID', 'FirstName', 'MiddleName', 'LastName']], left_on='PersonID', right_on='BusinessEntityID')
sales2periods['CustomerName'] = sales2periods['FirstName'] + ' ' + sales2periods['LastName']

Kemudian data dapat ditampilkan, urut berdasarkan peningkatan maupun penurunan.

sales2periods.sort_values(by='growth', ascending=False).head(20)[['CustomerName', 'sm1', 'sm2', 'growth']]
sales2periods.sort_values(by='growth').head(20)[['CustomerName', 'sm1', 'sm2', 'growth']]

Selanjutnya

Informasi di atas menarik sejak baris pertama. Phyllis Allen menurun pembeliannya di semester menjadi sekitar seperempat saja, apakah ada masalah dengan bisnisnya, atau ia telah mendapat supplier baru, atau malah ada penjualan yang tidak dilaporkan oleh personel AdventureWorks? Yang manapun tetap akan menjadi bahan berharga untuk investigasi lebih lanjut.

Selain menggunakan selisih dari kedua nilai, dapat pula ditambahkan kolom persentase peningkatan/penurunan.

Peningkatan penjualan sampai 13ribu persen seperti yang terjadi pada Mike Hines tentu sangat menarik, apakah transaksi tersebut asli?


Referensi


Sila tinggalkan komentar di bawah ini untuk mengoreksi/melengkapi tulisan ini.

Cover Image by Free-Photos from Pixabay

Leave a Reply

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