Produk yang sering dibeli bersamaan dapat memberikan gambaran mengenai pola pembelian pelanggan. Informasi ini dapat membantu bisnis melihat kombinasi produk yang memiliki hubungan dalam satu transaksi, misalnya sebagai bahan pertimbangan untuk cross-selling, product bundling, atau rekomendasi produk.
Data transaksi yang hanya menunjukkan daftar barang secara terpisah akan sulit digunakan untuk melihat hubungan tersebut. Dengan mengelompokkan produk berdasarkan transaksi, kita dapat mengetahui pasangan produk yang paling sering muncul bersama. SQL dapat digunakan untuk melakukan proses tersebut tanpa harus memeriksa transaksi satu per satu.
Mengapa Produk yang Dibeli Bersamaan Perlu Dianalisis?
Pelanggan sering membeli lebih dari satu produk dalam satu transaksi. Ketika pola tersebut terjadi berulang kali, data dapat menunjukkan kombinasi produk yang cukup sering muncul bersama.
Sebagai contoh, jika bread dan milk berkali-kali berada dalam transaksi yang sama, kombinasi tersebut dapat menjadi informasi tambahan bagi bisnis. Namun, frekuensi pembelian bersama tidak berarti bahwa pembelian satu produk menyebabkan pembelian produk lainnya.
Analisis ini juga berbeda dari mencari produk terlaris. Produk terlaris berfokus pada jumlah penjualan suatu produk, sedangkan analisis ini berfokus pada hubungan antarproduk dalam transaksi yang sama.
Dataset yang Digunakan
Dataset yang digunakan adalah Groceries – Groceries, yang berisi data transaksi pembelian bahan kebutuhan sehari-hari.
Struktur dataset memiliki satu baris untuk setiap transaksi. Produk dalam transaksi tersebut disimpan pada beberapa kolom seperti Item 1, Item 2, Item 3, dan seterusnya.
Contoh sederhananya:
| 3 | tropical fruit | yogurt | coffee |
| 2 | twhole milk | pastry | |
| 4 | sausage | whole milk | rolls/buns |
Kolom Item(s) menunjukkan jumlah item dalam transaksi, sedangkan kolom Item 1 sampai kolom item berikutnya berisi produk yang dibeli.
Format seperti ini cocok untuk menunjukkan konsep market basket analysis, tetapi perlu diubah terlebih dahulu agar produk berada dalam satu kolom sebelum dianalisis dengan SQL.
Bagaimana Mengubah Struktur Data?
Karena satu transaksi tersebar pada banyak kolom, langkah pertama adalah membuat tabel transaksi dan memindahkan setiap item menjadi satu baris.
Misalnya data awal:
| Transaction ID | Item 1 | Item 2 | Item 3 |
|---|---|---|---|
| 1 | bread | milk | coffee |
| 2 | bread | butter | |
| 3 | milk | coffee | sugar |
Setelah diubah, bentuk datanya menjadi:
| Transaction ID | Product |
|---|---|
| 1 | bread |
| 1 | milk |
| 1 | coffee |
| 2 | bread |
| 2 | butter |
| 3 | milk |
| 3 | coffee |
| 3 | sugar |
Format kedua lebih mudah digunakan untuk mencari pasangan produk dengan SQL.
Bagaimana Menyiapkan Tabel untuk SQL?
Setelah data diubah menjadi format transaksi dan produk, kita dapat menggunakan tabel seperti berikut:
- Buat database terlebih dahulu

- Gunakan database yang sudah dibuat lalu impor dataset groceries-groceries.csv ke database

- Lalu cek struktur tabel
DESCRIBE groceries_groceries;
Artinya, satu baris mewakili satu transaksi, sedangkan produk-produk dalam transaksi tersebut tersebar di Item 1 sampai Item 32.
- Tambahkan ID transaksi untuk tabel groceries_groceries
ALTER TABLE groceries_groceries
ADD COLUMN transaction_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
- Setelah itu cek
SELECT transaction_id, `Item 1`, `Item 2`, `Item 3`
FROM groceries_groceries
LIMIT 10;
- Buat tabel baru
DROP TABLE IF EXISTS grocery_items;
CREATE TABLE grocery_items (
transaction_id INT NOT NULL,
product VARCHAR(100) NOT NULL
);
- Masukkan data data product ke tabel grocery_items
Kemudian Item 1 sampai Item 32 dimasukkan ke tabel tersebut menggunakan UNION ALL
INSERT INTO grocery_items (transaction_id, product)
SELECT transaction_id, TRIM(`Item 1`)
FROM groceries_groceries
WHERE `Item 1` IS NOT NULL AND TRIM(`Item 1`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 2`)
FROM groceries_groceries
WHERE `Item 2` IS NOT NULL AND TRIM(`Item 2`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 3`)
FROM groceries_groceries
WHERE `Item 3` IS NOT NULL AND TRIM(`Item 3`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 4`)
FROM groceries_groceries
WHERE `Item 4` IS NOT NULL AND TRIM(`Item 4`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 5`)
FROM groceries_groceries
WHERE `Item 5` IS NOT NULL AND TRIM(`Item 5`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 6`)
FROM groceries_groceries
WHERE `Item 6` IS NOT NULL AND TRIM(`Item 6`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 7`)
FROM groceries_groceries
WHERE `Item 7` IS NOT NULL AND TRIM(`Item 7`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 8`)
FROM groceries_groceries
WHERE `Item 8` IS NOT NULL AND TRIM(`Item 8`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 9`)
FROM groceries_groceries
WHERE `Item 9` IS NOT NULL AND TRIM(`Item 9`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 10`)
FROM groceries_groceries
WHERE `Item 10` IS NOT NULL AND TRIM(`Item 10`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 11`)
FROM groceries_groceries
WHERE `Item 11` IS NOT NULL AND TRIM(`Item 11`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 12`)
FROM groceries_groceries
WHERE `Item 12` IS NOT NULL AND TRIM(`Item 12`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 13`)
FROM groceries_groceries
WHERE `Item 13` IS NOT NULL AND TRIM(`Item 13`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 14`)
FROM groceries_groceries
WHERE `Item 14` IS NOT NULL AND TRIM(`Item 14`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 15`)
FROM groceries_groceries
WHERE `Item 15` IS NOT NULL AND TRIM(`Item 15`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 16`)
FROM groceries_groceries
WHERE `Item 16` IS NOT NULL AND TRIM(`Item 16`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 17`)
FROM groceries_groceries
WHERE `Item 17` IS NOT NULL AND TRIM(`Item 17`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 18`)
FROM groceries_groceries
WHERE `Item 18` IS NOT NULL AND TRIM(`Item 18`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 19`)
FROM groceries_groceries
WHERE `Item 19` IS NOT NULL AND TRIM(`Item 19`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 20`)
FROM groceries_groceries
WHERE `Item 20` IS NOT NULL AND TRIM(`Item 20`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 21`)
FROM groceries_groceries
WHERE `Item 21` IS NOT NULL AND TRIM(`Item 21`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 22`)
FROM groceries_groceries
WHERE `Item 22` IS NOT NULL AND TRIM(`Item 22`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 23`)
FROM groceries_groceries
WHERE `Item 23` IS NOT NULL AND TRIM(`Item 23`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 24`)
FROM groceries_groceries
WHERE `Item 24` IS NOT NULL AND TRIM(`Item 24`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 25`)
FROM groceries_groceries
WHERE `Item 25` IS NOT NULL AND TRIM(`Item 25`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 26`)
FROM groceries_groceries
WHERE `Item 26` IS NOT NULL AND TRIM(`Item 26`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 27`)
FROM groceries_groceries
WHERE `Item 27` IS NOT NULL AND TRIM(`Item 27`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 28`)
FROM groceries_groceries
WHERE `Item 28` IS NOT NULL AND TRIM(`Item 28`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 29`)
FROM groceries_groceries
WHERE `Item 29` IS NOT NULL AND TRIM(`Item 29`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 30`)
FROM groceries_groceries
WHERE `Item 30` IS NOT NULL AND TRIM(`Item 30`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 31`)
FROM groceries_groceries
WHERE `Item 31` IS NOT NULL AND TRIM(`Item 31`) <> ''
UNION ALL
SELECT transaction_id, TRIM(`Item 32`)
FROM groceries_groceries
WHERE `Item 32` IS NOT NULL AND TRIM(`Item 32`) <> '';
- Cek hasilnya
SELECT *
FROM grocery_items
LIMIT 20;
Bagaimana Mencari Produk yang Dibeli Bersamaan?
Setelah data berada dalam format transaction_id dan product, langkah berikutnya adalah mencari pasangan produk yang muncul dalam transaksi yang sama. Untuk melakukan hal tersebut, SQL dapat menggunakan self JOIN, yaitu menggabungkan sebuah tabel dengan tabel itu sendiri.
Pada analisis ini, satu tabel digunakan sebagai a dan salinannya sebagai b. Keduanya kemudian dicocokkan berdasarkan transaction_id sehingga produk yang berasal dari transaksi yang sama dapat dibandingkan.
Gunakan query berikut:
SELECT a.product AS product_1, b.product AS product_2, COUNT(DISTINCT a.transaction_id) AS jumlah_transaksi FROM grocery_items a JOIN grocery_items b ON a.transaction_id = b.transaction_id AND atransaksi DESC LIMIT 10;
Query tersebut menghasilkan daftar pasangan produk yang paling sering muncul dalam transaksi yang sama.
Mengapa Menggunakan Self JOIN?
Bagian:
FROM grocery_items a
JOIN grocery_items bdigunakan untuk membandingkan produk dengan produk lainnya dalam tabel yang sama. Tabel diberi alias a dan b agar setiap baris produk dapat dibandingkan dengan baris produk lainnya.
Kondisi:
ON a.transaction_id = b.transaction_idmemastikan bahwa kedua produk berasal dari transaksi yang sama.
Kemudian terdapat kondisi:
AND a.product < b.productKondisi tersebut digunakan untuk menghindari pasangan yang sama muncul dua kali. Misalnya, pasangan bread dan whole milk cukup ditampilkan sekali dan tidak perlu muncul kembali sebagai whole milk dan bread.
Sementara itu:
ORDER BY jumlah_transaksi DESC
Mau Kuasai Mencari Produk yang Sering Dibeli Bersamaan Menggunakan SQL Sampai Bisa Praktik Langsung?
Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.
Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →
sehingga pasangan dengan jumlah kemunculan tertinggi berada di bagian atas. LIMIT 10 kemudian membatasi hasil menjadi 10 pasangan produk.
Bagaimana Membaca Hasil Analisis?
Query sebelumnya menghasilkan 10 pasangan produk yang paling sering muncul dalam transaksi yang sama. Hasil aktual dari dataset Groceries adalah sebagai berikut:
| Produk 1 | Produk 2 | Jumlah Transaksi |
|---|---|---|
| other vegetables | whole milk | 736 |
| rolls/buns | whole milk | 557 |
| whole milk | yogurt | 551 |
| root vegetables | whole milk | 481 |
| other vegetables | root vegetables | 466 |
| other vegetables | yogurt | 427 |
| other vegetables | rolls/buns | 419 |
| tropical fruit | whole milk | 416 |
| soda | whole milk | 394 |
| rolls/buns | soda | 377 |
Hasil tersebut menunjukkan bahwa other vegetables dan whole milk merupakan pasangan yang paling sering muncul secara bersamaan dalam dataset, dengan 736 transaksi.
Pasangan berikutnya adalah rolls/buns dan whole milk dengan 557 transaksi, kemudian whole milk dan yogurt dengan 551 transaksi. Beberapa pasangan lainnya juga memiliki frekuensi kemunculan yang cukup tinggi, seperti root vegetables dan whole milk sebanyak 481 transaksi serta other vegetables dan root vegetables sebanyak 466 transaksi.
Dari hasil tersebut terlihat bahwa whole milk muncul pada beberapa pasangan dengan jumlah transaksi yang tinggi. Hal ini menunjukkan bahwa produk tersebut sering ditemukan bersama berbagai produk lain dalam transaksi pada dataset.
Namun, hasil ini tidak berarti bahwa whole milk menyebabkan pelanggan membeli produk-produk tersebut. Analisis yang dilakukan hanya menghitung kemunculan dua produk dalam transaksi yang sama.
Apa Perbedaan Hasil Ini dengan Analisis Produk Terlaris?
Analisis produk terlaris dan analisis produk yang dibeli bersamaan memiliki tujuan yang berbeda.
Analisis produk terlaris mencari produk berdasarkan jumlah penjualan secara individual. Sementara itu, query yang digunakan pada bagian ini mencari pasangan produk berdasarkan jumlah transaksi yang mengandung keduanya.
Sebagai contoh, hasil menunjukkan pasangan other vegetables dan whole milk sebanyak 736 transaksi. Angka tersebut bukan jumlah penjualan salah satu produk, tetapi jumlah transaksi yang mengandung kedua produk tersebut.
Perbedaan ini membuat analisis pasangan produk dapat memberikan sudut pandang tambahan bagi bisnis. Jika analisis produk terlaris menjawab pertanyaan “Produk apa yang paling banyak terjual?”, maka analisis ini membantu menjawab “Produk apa yang sering muncul bersama dalam satu transaksi?”.
Apa yang Bisa Dilakukan dengan Hasil Analisis?
Pola pembelian bersama dapat digunakan sebagai salah satu sumber informasi dalam pengambilan keputusan bisnis. Beberapa penerapannya antara lain:
Cross-Selling
Pasangan produk yang sering muncul bersama dapat digunakan sebagai referensi untuk menawarkan produk tambahan kepada pelanggan.
Sebagai contoh, pola antara whole milk dan other vegetables dapat menjadi salah satu data yang dipertimbangkan ketika sistem menawarkan produk tambahan kepada pelanggan yang sedang memilih salah satu dari kedua produk tersebut.
Product Bundling
Data transaksi juga dapat membantu bisnis menemukan kandidat kombinasi produk untuk dibuat menjadi paket. Pasangan dengan frekuensi kemunculan tinggi dapat dianalisis lebih lanjut sebelum digunakan sebagai dasar pembuatan bundling.
Rekomendasi Produk
Pola pembelian bersama dapat menjadi salah satu sumber data untuk sistem rekomendasi. Ketika pelanggan memilih suatu produk, sistem dapat menggunakan riwayat transaksi untuk menemukan produk lain yang sering muncul bersamanya.
Analisis Penempatan Produk
Pada toko fisik maupun katalog digital, informasi mengenai produk yang sering dibeli bersama dapat menjadi pertimbangan dalam mengatur penempatan atau pengelompokan produk.
Apa yang Perlu Diperhatikan?
Frekuensi transaksi belum cukup untuk menyimpulkan bahwa dua produk memiliki hubungan yang kuat. Produk dengan jumlah transaksi tinggi dapat muncul bersama hanya karena produk tersebut memang populer atau sering dibeli secara umum.
Oleh karena itu, analisis dapat dikembangkan menggunakan metrik Market Basket Analysis, seperti support, confidence, dan lift. Metrik tersebut dapat memberikan informasi yang lebih mendalam mengenai seberapa kuat hubungan antara dua produk.
Pada analisis ini, hasil yang diperoleh masih berfokus pada frekuensi kemunculan pasangan produk dalam transaksi. Dengan demikian, hasil tersebut lebih tepat digunakan sebagai langkah awal untuk menemukan pola yang menarik sebelum dilakukan analisis lanjutan.
Kesimpulan
SQL dapat digunakan tidak hanya untuk mengetahui produk yang paling banyak terjual, tetapi juga untuk menemukan pola produk yang sering muncul dalam transaksi yang sama. Pada dataset Groceries, struktur data Item 1 sampai Item 32 terlebih dahulu diubah menjadi format transaction_id dan product agar dapat dianalisis menggunakan self JOIN.
Berdasarkan hasil aktual, pasangan other vegetables dan whole milk muncul bersama dalam 736 transaksi, disusul rolls/buns dan whole milk dengan 557 transaksi, serta whole milk dan yogurt dengan 551 transaksi.
Hasil tersebut menunjukkan adanya pola kemunculan bersama antarproduk yang dapat menjadi informasi tambahan bagi bisnis. Data tersebut dapat digunakan sebagai dasar untuk mengeksplorasi peluang cross-selling, product bundling, rekomendasi produk, maupun pengelompokan produk.
Namun, frekuensi kemunculan bersama belum menunjukkan kekuatan hubungan antarproduk secara keseluruhan. Untuk mendapatkan analisis yang lebih mendalam, proses berikutnya dapat dikembangkan menggunakan support, confidence, dan lift dalam Market Basket Analysis.
Sumber Dataset: Kaggle
Penulis:
Mau Kuasai Mencari Produk yang Sering Dibeli Bersamaan Menggunakan SQL Sampai Bisa Praktik Langsung?
Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.
Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →
