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.

Kode Lima Detik

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.

Leave a Reply

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