Pandas – Uji Harga Produk
Nilai penjualan yang rendah bisa jadi merupakan efek dari fraud atau sebab lainnya yang wajar. Karenanya kita perlu melakukan pengujian pada harga jual produk pada transaksi penjualan untuk meyakinkan nilai penjualan wajar/tidak wajar.
import pandas as pd pd.options.display.float_format = '{:,.2f}'.format salesdetail = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderDetail.csv', sep='\t') sales = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderHeader.csv', sep='\t') product = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Production.Product.csv', sep='\t') person = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Person.Person.csv', sep='\t') territory = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesTerritory.csv', sep='\t') # Penjualan per produk salesdetailgroup = salesdetail[['ProductID', 'LineTotal']].groupby('ProductID', as_index=False).sum() salesdetailgroup['Mean'] = salesdetailgroup['LineTotal'].mean() salesdetailgroup['Diff'] = salesdetailgroup['LineTotal'] - salesdetailgroup['LineTotal'].mean() # Penjualan per Tenaga Pemasar salesgroup = sales[['SalesPersonID', 'SubTotal']].groupby('SalesPersonID', as_index=False).sum() salesgroup['Mean'] = salesgroup['SubTotal'].mean() salesgroup['Diff'] = salesgroup['SubTotal'] - salesgroup['SubTotal'].mean() # Penjualan per Region salesgroup2 = sales[['TerritoryID', 'SubTotal']].groupby('TerritoryID', as_index=False).sum() salesgroup2['Mean'] = salesgroup2['SubTotal'].mean() salesgroup2['Diff'] = salesgroup2['SubTotal'] - salesgroup2['SubTotal'].mean()
Latar Belakang
Nilai penjualan yang rendah pada salah satu atau beberapa produk adalah wajar, namun kita perlu memiliki prosedur untuk menguji nilai penjualan tersebut terjadi bukan karena fraud.
Dalam pengujian nilai penjualan, prosedur yang akan kita lakukan ada tiga, yaitu:
- Membandingkan penjualan per produk dengan rata-rata penjualan semua produk
- Membandingkan penjualan oleh tenaga pemasar dengan rata-rata penjualan oleh semua tenaga pemasar
- Membandingkan penjualan per region
Dalam perspektif audit, prosedur di atas menguji asersi keberadaan dan keterjadian.
Langkah Kerja
Pengujian dilakukan menggunakan data penjualan AdventureWorks dalam format csv yang dapat diunduh di sini.
Langkah pertama adalah me-load library dan data yang akan digunakan. Jika tidak ingin mengetik kode di bawah ini, notebook dapat diakses di sini.
import pandas as pd pd.options.display.float_format = '{:,.2f}'.format salesdetail = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderDetail.csv', sep='\t') sales = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesOrderHeader.csv', sep='\t')
Penjualan per Produk v. Rata-Rata Penjualan Semua Produk
Nilai penjualan per produk ada dalam tebal SalesOrderDetail yang kita load pada variabel salesdetail.
Kelompokkan penjualan per produk
salesdetailgroup = salesdetail[['ProductID', 'LineTotal']].groupby('ProductID', as_index=False).sum()
Ada 266 produk yang telah terjual. Nilai penjualan per produk (diurutkan terbesar ke terkecil) adalah.
salesdetailgroup.sort_values(by='LineTotal', ascending=False)
Tambahkan kolom rata-rata penjualan dan kolom selisih
salesdetailgroup['Mean'] = salesdetailgroup['LineTotal'].mean() salesdetailgroup['Diff'] = salesdetailgroup['LineTotal'] - salesdetailgroup['LineTotal'].mean() salesdetailgroup.sort_values(by='LineTotal').head(10) salesdetailgroup.sort_values(by='LineTotal').tail(10)
Produk dengan ProductID 911 memiliki jumlah penjualan paling kecil, yaitu 162,72, nilai tersebut selisih 412.793,60 dari rata-rata penjualan semua produk (412.956,32). Sedang produk paling laris adalah ProductID 782 dengan nilai penjualan 4.400.592,80.
Perlu dilaksanakan investigasi lebih lanjut mengenai produk-produk dengan nilai penjualan yang rendah apakah karena sebab yang wajar (misal produk tidak populer) atau karena fraud. Pun karena sebab yang wajar, temuan ini tetap menarik karena dapat menjadi pijakan untuk banyak pertanyaan, misal apakah manajemen keliru saat melakukan riset pemasaran produk tersebut? Apakah metode pemasaran yang digunakan tidak tepat? Apakah biaya penyimpanan sediaan barang dagang tersebut lebih besar ketimbang nilai penjualannya? Dan pelbagai pertanyaan lain yang relevan.
Tambahkan kolom nama produk
Agar lebih informatif kita dapat menambahkan nama produk pada data di atas. Pertama load data produk pada tabel Production.Product.
product = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Production.Product.csv', sep='\t')
Kita hanya akan menggunakan kolom ProductID dan Name sehingga kode untuk menggabungkan data tersebut dengan data penjualan adalah.
salesdetailgroup = salesdetailgroup.merge(product[['ProductID', 'Name']], on='ProductID')
Penjualan per Tenaga Pemasar v. Rata-Rata Penjualan Semua Tenaga Pemasar
Tabel yang berisi data penjualan dan tenaga pemasar adalah tabel SalesOrderHeader yang kita load sebagai variabel sales.
Kelompokkan penjualan per tenaga pemasar
salesgroup = sales[['SalesPersonID', 'SubTotal']].groupby('SalesPersonID', as_index=False).sum()
Terdapat 17 tenaga pemasar pada data kita, yang jika diurutkan seperti ini.
salesgroup.sort_values(by='SubTotal', ascending=False)
Tambahkan kolom rata-rata penjualan dan kolom selisih
salesgroup['Mean'] = salesgroup['SubTotal'].mean() salesgroup['Diff'] = salesgroup['SubTotal'] - salesgroup['SubTotal'].mean()
Tambahkan kolom nama tenaga pemasar
Informasi tenaga pemasar ada dalam tabel Person.Person sehingga kita perlu me-load data tersebut.
person = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Person.Person.csv', sep='\t')
Kolom yang dipakai hanya BusinessEntityID, FirstName dan LastName.
salesgroup = salesgroup.merge(person[['BusinessEntityID', 'FirstName', 'LastName']], left_on='SalesPersonID', right_on='BusinessEntityID')
Pemeriksaan lebih lanjut perlu dilakukan pada tenaga pemasar dengan penjualan kecil apakah murni karena kurangnya performa atau sebab lain yang melanggar hukum, meski tidak terdapat personil yang steril dari kemungkinan pelanggaran hukum. Berdasar perspektif lain, Linda Mitchell sebagai pemasar “terbaik” dapat menjadi mentor bagi Syed Abbas untuk meningkatkan kinerja.
Penjualan per Region v. Rata-Rata Penjualan Semua Region
Data region (wilayah) ada pada kolom TerritoryID dalam tabel SalesOrderHeader.
Kelompokkan penjualan per region
salesgroup2 = sales[['TerritoryID', 'SubTotal']].groupby('TerritoryID', as_index=False).sum()
Hanya terdapat sepuluh region dengan nilai penjualan, diurutkan terbesar ke terkecil.
salesgroup2.sort_values(by='SubTotal', ascending=False)
Tambahkan kolom rata-rata penjualan dan kolom selisih
salesgroup2['Mean'] = salesgroup2['SubTotal'].mean() salesgroup2['Diff'] = salesgroup2['SubTotal'] - salesgroup2['SubTotal'].mean()
Tambahkan kolom nama region
Data wilayah ada di tabel Sales.SalesTerritory.
territory = pd.read_csv('https://github.com/aansubarkah/basangdata_pandas/raw/master/AW/Sales.SalesTerritory.csv', sep='\t')
salesgroup2 = salesgroup2.merge(territory[['TerritoryID', 'Name']], on='TerritoryID')
Penjualan di Jerman menjadi yang terkecil, secara umum di eropa produk AdventureWorks tidak sepopuler di Australia atau Kanada. Yang cukup aneh adalah daerah Northeast yang nilai penjualannya cukup kecil. Jika menentukan sampel audit, penjualan pada Jerman dan Northeast dapat menjadi prioritas.
Dalam kacamata manajerial patut dipertimbangkan penyegaran personil kunci di Jerman dan Northeast
Referensi
Cover Image by GregMontani on Pixabay.