Skip to main content

Studi Kasus: Dot Product

Pada materi sebelumnya kita telah mempelajari dot product, aturan dimensi matriks, transpose, serta perbedaan antara element-wise multiplication dan matrix multiplication.

Sekarang kita akan menerapkan konsep tersebut pada sebuah studi kasus sederhana:

Menghitung total pendapatan penjualan Nut Butter berdasarkan jumlah produk yang terjual dan harga setiap produk.

Studi kasus ini akan membantu kita memahami bagaimana dot product dapat digunakan untuk menyelesaikan masalah yang lebih nyata.

Dalam kasus ini kita memiliki tiga jenis produk:

  • Almond Butter
  • Peanut Butter
  • Cashew Butter

Data jumlah penjualan akan dikalikan dengan harga masing-masing produk untuk mendapatkan total pendapatan setiap hari.


Studi Kasus Penjualan Nut Butter​

Bayangkan sebuah toko menjual tiga jenis Nut Butter:

ProdukHarga per Jar
Almond Butter$10
Peanut Butter$8
Cashew Butter$12

Toko tersebut mencatat jumlah jar yang terjual selama lima hari:

HariAlmondPeanutCashew
Monday203015
Tuesday253520
Wednesday302518
Thursday224025
Friday354530

Pertanyaannya:

Berapa total pendapatan toko pada setiap hari?


Menyiapkan NumPy​

Kita akan menggunakan NumPy untuk melakukan perhitungan.

import numpy as np

Kemudian buat data penjualan:

weekly_sales = np.array([
[20, 30, 15],
[25, 35, 20],
[30, 25, 18],
[22, 40, 25],
[35, 45, 30]
])

Periksa shape:

print(weekly_sales.shape)

Output:

(5, 3)

Artinya:

  • 5 baris → 5 hari.
  • 3 kolom → 3 jenis produk.

Data Harga Produk​

Selanjutnya kita buat array yang berisi harga setiap produk.

butter_prices = np.array([
[10, 8, 12]
])

Periksa shape:

print(butter_prices.shape)

Output:

(1, 3)

Artinya:

  • 1 baris.
  • 3 kolom.
  • Setiap kolom merepresentasikan harga satu jenis produk.

Susunannya:

[Almond, Peanut, Cashew]

[10, 8, 12]

Memahami Shape Kedua Array​

Sekarang kita memiliki:

weekly_sales → (5, 3)

butter_prices → (1, 3)

Secara konsep:

weekly_sales:

Almond Peanut Cashew
Monday 20 30 15
Tuesday 25 35 20
Wednesday 30 25 18
Thursday 22 40 25
Friday 35 45 30

dan:

butter_prices:

Almond Peanut Cashew
10 8 12

Kita ingin mengalikan setiap jumlah penjualan dengan harga produk yang sesuai.


Mengapa Menggunakan Dot Product?​

Perhitungan pendapatan untuk satu hari dapat ditulis sebagai:

Jumlah Almond × Harga Almond
+
Jumlah Peanut × Harga Peanut
+
Jumlah Cashew × Harga Cashew

Misalnya hari Senin:

(20 × 10) + (30 × 8) + (15 × 12)

Hasil:

200 + 240 + 180 = 620

Jadi pendapatan hari Senin adalah:

$620

Perhitungan seperti ini merupakan bentuk dot product.


Masalah Shape Mismatch​

Kita mungkin mencoba melakukan:

np.dot(weekly_sales, butter_prices)

Namun operasi tersebut akan menghasilkan error.

Mengapa?

Karena shape kedua array adalah:

weekly_sales → (5, 3)
butter_prices → (1, 3)

Aturan perkalian matriks:

(m, n) × (n, p)

Dimensi bagian dalam harus sama.

Pada kasus ini:

(5, 3) × (1, 3)
↑ ↑
3 1

Dimensi dalam:

3 ≠ 1

Sehingga operasi tidak dapat dilakukan sebagai matrix multiplication.


Memeriksa Shape Sebelum Operasi​

Sebelum melakukan dot product, biasakan memeriksa shape:

print("Weekly sales:", weekly_sales.shape)
print("Butter prices:", butter_prices.shape)

Output:

Weekly sales: (5, 3)
Butter prices: (1, 3)

Dari sini kita dapat melihat bahwa dimensi dalam belum cocok.


Solusi dengan Transpose​

Kita dapat melakukan transpose pada butter_prices.

butter_prices.T

Periksa shape:

print(butter_prices.T.shape)

Output:

(3, 1)

Shape berubah:

Sebelum:

(1, 3)

↓

Sesudah transpose:

(3, 1)

Mengapa Transpose Menyelesaikan Masalah?​

Sekarang kita memiliki:

weekly_sales → (5, 3)

butter_prices.T → (3, 1)

Perhatikan dimensinya:

(5, 3) × (3, 1)

Dimensi dalam:

3 = 3

sehingga operasi valid.

Shape hasil:

(5, 1)

Aturannya:

(5, 3) × (3, 1) → (5, 1)

Melakukan Dot Product​

Sekarang kita dapat melakukan:

total_sales = np.dot(
weekly_sales,
butter_prices.T
)

print(total_sales)

Hasilnya:

[[ 620]
[ 770]
[ 740]
[ 840]
[ 980]]

Artinya:

HariTotal Pendapatan
Monday$620
Tuesday$770
Wednesday$740
Thursday$840
Friday$980

Memahami Perhitungan Setiap Hari​

Dot product secara otomatis melakukan perhitungan seperti berikut.

Monday​

(20 × 10) + (30 × 8) + (15 × 12)

= 200 + 240 + 180

= 620

Tuesday​

(25 × 10) + (35 × 8) + (20 × 12)

= 250 + 280 + 240

= 770

Wednesday​

(30 × 10) + (25 × 8) + (18 × 12)

= 300 + 200 + 216

= 716

Thursday​

(22 × 10) + (40 × 8) + (25 × 12)

= 220 + 320 + 300

= 840

Friday​

(35 × 10) + (45 × 8) + (30 × 12)

= 350 + 360 + 360

= 1070

Jadi, jika dihitung secara manual, hasilnya adalah:

Monday → 620
Tuesday → 770
Wednesday → 716
Thursday → 840
Friday → 1070

Dot product memungkinkan seluruh perhitungan tersebut dilakukan sekaligus.


Memeriksa Hasil dengan NumPy​

Kita dapat memeriksa hasil secara langsung:

total_sales = weekly_sales @ butter_prices.T

print(total_sales)

Output:

[[ 620]
[ 770]
[ 716]
[ 840]
[1070]]

Perhatikan bahwa hasil berbentuk:

(5, 1)

bukan:

(5,)

Hal ini karena hasil perkalian matriks mempertahankan bentuk dua dimensi.


Mengubah Hasil Menjadi Satu Dimensi​

Jika kita ingin mendapatkan array satu dimensi, kita dapat menggunakan reshape() atau ravel().

Contohnya menggunakan reshape():

total_sales = (
weekly_sales @ butter_prices.T
).reshape(-1)

print(total_sales)

Output:

[ 620 770 716 840 1070]

Kita sekarang memiliki shape:

print(total_sales.shape)

Output:

(5,)

Alternatif lainnya:

total_sales = (
weekly_sales @ butter_prices.T
).ravel()

Kedua pendekatan tersebut dapat digunakan untuk mengubah hasil (5, 1) menjadi array satu dimensi (5,).


Menggunakan DataFrame​

Dalam praktik Data Science, data penjualan biasanya lebih nyaman disimpan dalam Pandas DataFrame.

Kita dapat menggunakan:

import pandas as pd

Kemudian membuat DataFrame:

weekly_sales = pd.DataFrame(
[
[20, 30, 15],
[25, 35, 20],
[30, 25, 18],
[22, 40, 25],
[35, 45, 30]
],
index=[
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
columns=[
"Almond",
"Peanut",
"Cashew"
]
)

weekly_sales

Hasilnya:

AlmondPeanutCashew
Monday203015
Tuesday253520
Wednesday302518
Thursday224025
Friday354530

Data Harga sebagai DataFrame​

Kita juga dapat membuat DataFrame harga:

butter_prices = pd.DataFrame(
[[10, 8, 12]],
columns=[
"Almond",
"Peanut",
"Cashew"
]
)

butter_prices

Hasil:

AlmondPeanutCashew
010812

Menggunakan NumPy pada DataFrame​

Kita dapat mengambil nilai NumPy dari DataFrame menggunakan .to_numpy().

sales_array = weekly_sales.to_numpy()
price_array = butter_prices.to_numpy()

Periksa shape:

print(sales_array.shape)
print(price_array.shape)

Output:

(5, 3)
(1, 3)

Kemudian transpose harga:

price_array.T

Shape:

(3, 1)

Menghitung Total Pendapatan​

Sekarang lakukan dot product:

total_sales = sales_array @ price_array.T

print(total_sales)

Output:

[[ 620]
[ 770]
[ 716]
[ 840]
[1070]]

Ubah menjadi satu dimensi:

total_sales = total_sales.ravel()

Hasil:

[ 620 770 716 840 1070]

Menambahkan Hasil ke DataFrame​

Sekarang kita dapat menambahkan hasil tersebut sebagai kolom baru.

weekly_sales["Total ($)"] = total_sales

Tampilkan DataFrame:

weekly_sales

Hasil:

AlmondPeanutCashewTotal ($)
Monday203015620
Tuesday253520770
Wednesday302518716
Thursday224025840
Friday3545301070

Sekarang DataFrame tidak hanya berisi jumlah penjualan, tetapi juga total pendapatan setiap hari.


Contoh Lengkap​

Berikut keseluruhan proses dari awal sampai akhir:

import numpy as np
import pandas as pd

# Data jumlah penjualan
weekly_sales = pd.DataFrame(
[
[20, 30, 15],
[25, 35, 20],
[30, 25, 18],
[22, 40, 25],
[35, 45, 30]
],
index=[
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
columns=[
"Almond",
"Peanut",
"Cashew"
]
)

# Data harga
butter_prices = pd.DataFrame(
[[10, 8, 12]],
columns=[
"Almond",
"Peanut",
"Cashew"
]
)

# Konversi menjadi NumPy array
sales_array = weekly_sales.to_numpy()
price_array = butter_prices.to_numpy()

# Dot product
total_sales = sales_array @ price_array.T

# Ubah menjadi 1D array
total_sales = total_sales.ravel()

# Tambahkan ke DataFrame
weekly_sales["Total ($)"] = total_sales

print(weekly_sales)

Memahami Alur Perhitungan​

Studi kasus ini dapat diringkas menjadi:

Data Penjualan
↓
(5, 3)
↓
Jumlah Produk Terjual
×
Harga Produk
↓
Transpose Harga
↓
(3, 1)
↓
Dot Product
↓
(5, 1)
↓
Total Pendapatan per Hari
↓
Tambahkan ke DataFrame

Secara matematis:

(5, 3) × (3, 1) = (5, 1)

Mengapa Tidak Menggunakan Perulangan?​

Kita sebenarnya dapat menghitung total pendapatan menggunakan loop.

Contohnya secara konsep:

for day in weekly_sales:
...

Namun, untuk operasi numerik seperti perkalian matriks, NumPy memungkinkan kita melakukan perhitungan secara vectorized.

Dengan:

sales_array @ price_array.T

seluruh perhitungan dapat dilakukan sekaligus.

Keuntungannya:

  • Kode lebih ringkas.
  • Operasi numerik lebih sesuai dengan struktur array.
  • Dapat memanfaatkan optimasi NumPy.
  • Lebih mudah diperluas ketika jumlah data bertambah.

Dot Product sebagai Weighted Sum​

Studi kasus ini juga dapat dipahami sebagai weighted sum.

Setiap produk memiliki harga sebagai bobot:

Almond → 10
Peanut → 8
Cashew → 12

Jumlah penjualan merupakan nilai yang dikalikan dengan bobot tersebut.

Secara umum:

Total =

Almond Sales × Almond Price
+
Peanut Sales × Peanut Price
+
Cashew Sales × Cashew Price

Bentuk ini sangat mirip dengan konsep yang digunakan dalam berbagai algoritma Machine Learning.


Hubungan dengan Machine Learning​

Konsep pada studi kasus ini memiliki hubungan langsung dengan Machine Learning.

Dalam Machine Learning, kita sering memiliki:

Features
×
Weights
↓
Weighted Sum
↓
Prediction

Contohnya:

Feature 1 × Weight 1
+
Feature 2 × Weight 2
+
Feature 3 × Weight 3

yang secara matematis merupakan bentuk dot product.

Pada studi kasus Nut Butter:

Jumlah Penjualan
×
Harga
↓
Total Pendapatan

Sedangkan pada Machine Learning:

Feature
×
Weight
↓
Prediksi

Strukturnya serupa, walaupun tujuan dan konteksnya berbeda.


Shape sebagai Alat Debugging​

Studi kasus ini menunjukkan mengapa memahami shape sangat penting.

Awalnya:

weekly_sales → (5, 3)
butter_prices → (1, 3)

Tidak valid:

(5, 3) × (1, 3)

Setelah transpose:

weekly_sales → (5, 3)
butter_prices → (3, 1)

Valid:

(5, 3) × (3, 1)

Hasil:

(5, 1)

Jadi ketika menemukan error dalam operasi matriks, jangan hanya melihat pesan error.

Periksa juga:

array.shape

Kesalahan yang Sering Terjadi​

Lupa Melakukan Transpose​

Jika harga memiliki shape:

(1, 3)

maka:

weekly_sales @ butter_prices

tidak kompatibel dengan:

weekly_sales → (5, 3)

Kita membutuhkan:

(3, 1)

yang diperoleh melalui:

butter_prices.T

Menggunakan Element-Wise Multiplication​

Jika menggunakan:

weekly_sales * butter_prices

operasi tersebut merupakan element-wise multiplication, bukan dot product.

Tujuannya berbeda.

Untuk mendapatkan total pendapatan per hari, kita membutuhkan perkalian dan penjumlahan antarproduk, sehingga dot product lebih sesuai.


Tidak Memeriksa Shape Hasil​

Dot product menghasilkan:

(5, 1)

bukan:

(5,)

Jika kita ingin memasukkan hasil sebagai kolom DataFrame, kita dapat mengubahnya menjadi satu dimensi:

total_sales = total_sales.ravel()

Mengubah Shape Hanya Agar Error Hilang​

Transpose dilakukan karena struktur data memang sesuai dengan operasi yang ingin dilakukan.

Jangan mengubah shape secara sembarangan.

Selalu pahami:

  • Apa arti setiap baris.
  • Apa arti setiap kolom.
  • Apa yang direpresentasikan oleh setiap dimensi.
  • Bentuk output yang diinginkan.

Workflow Studi Kasus​

Workflow yang dapat digunakan untuk kasus serupa:

1. Identifikasi Data
↓
2. Tentukan Operasi Matematika
↓
3. Periksa Shape
↓
4. Pastikan Dimensi Kompatibel
↓
5. Gunakan Transpose jika Diperlukan
↓
6. Lakukan Dot Product
↓
7. Periksa Shape Hasil
↓
8. Sesuaikan Shape Jika Diperlukan
↓
9. Gabungkan dengan Dataset
↓
10. Interpretasikan Hasil

Workflow ini dapat digunakan tidak hanya untuk penjualan, tetapi juga berbagai permasalahan numerik lainnya.


Ringkasan​

Pada studi kasus ini kita telah menerapkan konsep dot product pada masalah penjualan nyata.

Hal-hal penting yang perlu diingat:

  • weekly_sales menyimpan jumlah produk yang terjual.
  • butter_prices menyimpan harga masing-masing produk.
  • weekly_sales memiliki shape (5, 3).
  • butter_prices memiliki shape (1, 3).
  • Kedua array tersebut tidak dapat langsung dikalikan menggunakan matrix multiplication.
  • Transpose mengubah butter_prices dari (1, 3) menjadi (3, 1).
  • (5, 3) × (3, 1) menghasilkan (5, 1).
  • Dot product menghitung jumlah perkalian antara jumlah penjualan dan harga.
  • Hasilnya merupakan total pendapatan untuk setiap hari.
  • Hasil dot product dapat diubah menjadi array satu dimensi menggunakan ravel() atau reshape(-1).
  • Hasil tersebut dapat ditambahkan sebagai kolom baru pada DataFrame.
  • Studi kasus ini menunjukkan hubungan antara dot product dan konsep weighted sum dalam Machine Learning.

Checklist Pembelajaran​

Pastikan Anda sudah memahami:

  • Apa tujuan studi kasus penjualan Nut Butter.
  • Cara merepresentasikan data penjualan dalam NumPy.
  • Cara merepresentasikan harga produk dalam NumPy.
  • Cara memeriksa shape kedua array.
  • Mengapa (5, 3) × (1, 3) tidak valid.
  • Cara menggunakan .T.
  • Mengapa transpose menghasilkan (3, 1).
  • Mengapa (5, 3) × (3, 1) valid.
  • Cara melakukan dot product menggunakan @.
  • Cara melakukan dot product menggunakan np.dot().
  • Cara menginterpretasikan hasil dot product.
  • Cara mengubah hasil (5, 1) menjadi (5,).
  • Cara menambahkan hasil ke DataFrame.
  • Hubungan dot product dengan weighted sum.
  • Hubungan dot product dengan Machine Learning.
  • Pentingnya shape dalam debugging.

Latihan​

Buat sebuah studi kasus penjualan dengan tiga produk:

Almond → $12
Peanut → $9
Cashew → $15

Kemudian buat data penjualan selama lima hari:

weekly_sales = np.array([
[10, 20, 15],
[12, 25, 18],
[15, 22, 20],
[18, 30, 25],
[20, 35, 28]
])

Buat array harga:

butter_prices = np.array([
[12, 9, 15]
])

Kemudian:

  1. Periksa shape weekly_sales.
  2. Periksa shape butter_prices.
  3. Coba lakukan dot product secara langsung.
  4. Amati mengapa operasi tersebut gagal.
  5. Gunakan transpose pada butter_prices.
  6. Periksa shape setelah transpose.
  7. Hitung dot product.
  8. Periksa shape hasil.
  9. Ubah hasil menjadi array satu dimensi.
  10. Buat DataFrame dengan index Monday sampai Friday.
  11. Tambahkan hasil dot product sebagai kolom Total ($).
  12. Verifikasi salah satu hasil dengan perhitungan manual.

Sebagai tantangan tambahan, tambahkan produk keempat dan hitung kembali total pendapatan menggunakan dot product.