Market Basket Analysis SQL: Produk Apa yang Sering Dibeli Bareng
Blog/Tutorial SQL/Market Basket Analysis SQL: Produk Apa yang Sering Dibeli Bareng

Market Basket Analysis SQL: Produk Apa yang Sering Dibeli Bareng

BimaBima
·23 Mei 2026·9 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Market basket analysis adalah analisis buat nemuin produk apa yang sering dibeli bareng dalam satu transaksi. Di SQL, caranya gabungin tabel item transaksi ke dirinya sendiri (self-join), hitung berapa kali tiap pasangan produk muncul, lalu ukur kekuatannya pakai support, confidence, dan lift. Pasangan dengan lift di atas 1 artinya hubungannya nyata, bukan kebetulan.

Market basket analysis adalah analisis buat nemuin produk apa yang sering dibeli bareng dalam satu transaksi. Kamu nggak butuh Python atau library khusus — SQL biasa udah cukup buat pasangan dua produk.

Toko kelontong, minimarket, sampai e-commerce pakai ini buat nentuin produk mana yang dipajang bersebelahan dan bundling apa yang layak dibikin.

Di artikel ini kamu dapat query lengkapnya, cara baca angka support/confidence/lift, dan hasil nyata dari dataset toko_berkah punya Ngulik Data.

Gimana Cara Kerja Market Basket Analysis?

Intinya satu: hitung berapa kali dua produk muncul di struk yang sama, lalu cek apakah angka itu lebih besar dari yang seharusnya terjadi secara kebetulan.

Data yang kamu butuh cuma satu tabel dengan dua kolom penting: transaksi_id dan produk. Satu baris = satu produk di satu struk.

transaksi_id | produk
-------------|------------------
TRX-001      | Kopi Sachet
TRX-001      | Gula Pasir 1kg
TRX-001      | Roti Tawar
TRX-002      | Minyak Goreng 2L
TRX-002      | Telur 1kg

Struktur kayak gini namanya long format. Kalau data kamu masih satu baris per transaksi dengan kolom produk1, produk2, produk3, kamu harus unpivot dulu.

Kenapa Harus Pakai Self-Join?

Buat bikin pasangan produk, kamu gabungin tabel transaksi_item ke dirinya sendiri lewat transaksi_id yang sama. Ini yang disebut self-join.

Hasilnya: setiap kombinasi produk dalam satu struk jadi satu baris.

SELECT
    a.produk AS produk_a,
    b.produk AS produk_b,
    COUNT(*) AS jumlah_transaksi
FROM transaksi_item a
JOIN transaksi_item b
    ON a.transaksi_id = b.transaksi_id
    AND a.produk < b.produk
GROUP BY a.produk, b.produk
HAVING COUNT(*) >= 30
ORDER BY jumlah_transaksi DESC;

Bagian a.produk < b.produk itu kuncinya. Tanpa baris ini, kamu bakal dapat tiga masalah sekaligus.

  1. Produk dipasangkan sama dirinya sendiri (Kopi–Kopi).
  2. Pasangan kebalik muncul dua kali (Kopi–Gula dan Gula–Kopi).
  3. Jumlah barisnya membengkak, query jadi lambat.

Perbandingan string bikin urutannya konsisten — cuma satu arah yang lolos. Mau belajar lebih dalam soal mekanisme penggabungan tabel? Cek glossary JOIN dan fungsi GROUP BY.

Apa Arti Support, Confidence, dan Lift?

Tiga angka ini yang bikin market basket analysis berguna. Tanpa ketiganya, kamu cuma punya daftar pasangan produk laris — dan produk laris memang sering ketemu sama semua produk.

MetrikRumusArtinya
Supporttransaksi berisi A dan B ÷ total transaksiSeberapa sering pasangan ini muncul
Confidencetransaksi berisi A dan B ÷ transaksi berisi AKalau A dibeli, berapa peluang B ikut dibeli
Liftsupport ÷ (peluang A × peluang B)Hubungannya nyata atau cuma kebetulan

Lift yang paling penting. Angka 1 artinya dua produk itu ketemu persis sesering yang diprediksi kalau mereka nggak berhubungan sama sekali.

Lift 2,4 artinya pasangan itu muncul 2,4 kali lebih sering dari perkiraan acak. Itu sinyal beneran.

Lift 0,6 juga menarik — artinya dua produk itu justru jarang dibeli bareng. Biasanya karena mereka substitusi, kayak dua merek sabun cuci yang saling gantiin.

Query Lengkap Market Basket Analysis di SQL

Ini query yang aku pakai. Struktur CTE bikin tiap bagian gampang dicek satu-satu.

WITH total AS (
    SELECT COUNT(DISTINCT transaksi_id) AS n FROM transaksi_item
),
frekuensi_produk AS (
    SELECT produk, COUNT(DISTINCT transaksi_id) AS n_produk
    FROM transaksi_item
    GROUP BY produk
),
pasangan AS (
    SELECT a.produk AS produk_a, b.produk AS produk_b,
           COUNT(DISTINCT a.transaksi_id) AS n_pasangan
    FROM transaksi_item a
    JOIN transaksi_item b
        ON a.transaksi_id = b.transaksi_id
        AND a.produk < b.produk
    GROUP BY a.produk, b.produk
)
SELECT
    p.produk_a,
    p.produk_b,
    p.n_pasangan,
    ROUND(1.0 * p.n_pasangan / t.n, 4) AS support,
    ROUND(1.0 * p.n_pasangan / fa.n_produk, 3) AS confidence_a_ke_b,
    ROUND((1.0 * p.n_pasangan / t.n) /
          ((1.0 * fa.n_produk / t.n) * (1.0 * fb.n_produk / t.n)), 2) AS lift
FROM pasangan p
CROSS JOIN total t
JOIN frekuensi_produk fa ON fa.produk = p.produk_a
JOIN frekuensi_produk fb ON fb.produk = p.produk_b
WHERE p.n_pasangan >= 30
ORDER BY lift DESC
LIMIT 20;

Tiga hal yang perlu kamu perhatiin di query ini.

1.0 * di depan pembagian itu wajib di PostgreSQL dan SQLite. Tanpa itu, pembagian integer bakal ngasih hasil 0. Detailnya ada di dokumentasi operator matematika PostgreSQL.

COUNT(DISTINCT transaksi_id) dipakai supaya pelanggan yang beli 3 kopi dalam satu struk cuma dihitung sekali.

WHERE p.n_pasangan >= 30 nyaring pasangan langka. Ini yang paling sering dilupain orang, dan hasilnya bisa bikin kamu ambil keputusan salah.

Contoh Kasus: Toko Berkah, 8.400 Transaksi

Dataset toko_berkah punya Ngulik Data isinya 8.400 struk dari warung kelontong di Semarang, periode Januari sampai Maret. Ada 142 produk unik.

Setelah query di atas dijalanin, ini 5 pasangan dengan lift tertinggi yang jumlah transaksinya di atas 30.

Produk AProduk BTransaksiConfidenceLift
Kopi SachetGula Pasir 1kg6120,583,10
Mie Instan GorengTelur 1kg4870,412,44
Popok BayiSusu Formula1630,492,88
Minyak Goreng 2LTepung Terigu2980,331,92
Sabun Cuci PiringSpons Cuci1410,444,05

Yang bikin aku kaget: sabun cuci piring + spons punya lift 4,05 — tertinggi di seluruh dataset. Tapi cuma muncul di 141 transaksi.

Artinya orang jarang beli spons. Tapi kalau beli, hampir pasti barengan sabun cuci piring.

Waktu aku cek layout warungnya, spons ditaruh di rak paling belakang deket alat kebersihan. Sabunnya di rak depan.

Sementara kopi sachet + gula yang muncul di 612 transaksi punya lift 3,10 — lebih rendah, tapi volumenya 4x lipat. Ini pasangan yang paling layak dijadiin bundling karena dampak rupiahnya paling besar.

Pelajaran dari sini: jangan urut hasil cuma pakai lift. Selalu lihat kolom jumlah transaksi barengan.

Kesalahan Umum Waktu Bikin Market Basket Analysis

Lupa filter jumlah minimum. Pasangan yang cuma muncul 3 kali bisa punya lift 15. Itu bukan pola, itu kebetulan. Pasang HAVING COUNT(*) >= 30 dari awal.

Nggak pakai kondisi a.produk < b.produk. Hasilnya duplikat dan query bengkak. Di dataset 8.400 transaksi, tanpa kondisi ini jumlah barisnya naik 2x lipat plus pasangan produk-sama-dirinya.

Pakai COUNT(*) padahal harusnya COUNT(DISTINCT transaksi_id). Kalau satu struk berisi 2 baris kopi (misal beda rasa), pasangannya kehitung dobel.

Baca confidence tanpa lift. Beras dibeli di 60% transaksi. Jadi hampir semua produk punya confidence tinggi ke beras. Itu bukan asosiasi, itu cuma beras yang laris. Lift yang ngoreksi hal ini.

Langsung eksekusi 20 pasangan sekaligus. Ambil 3 teratas dulu, ubah tata letak rak, ukur 2 minggu. Baru lanjut.

FAQ

Apa itu market basket analysis?

Market basket analysis adalah analisis buat cari tau produk apa yang sering muncul bareng dalam satu struk belanja. Hasilnya berupa aturan asosiasi, misalnya "orang yang beli kopi sachet biasanya juga beli gula pasir". Toko pakai hasil ini buat nentuin tata letak rak, bikin paket bundling, dan nyusun rekomendasi produk di halaman checkout.

Apa bedanya support, confidence, dan lift?

Support ngukur seberapa sering pasangan produk muncul dari semua transaksi. Confidence ngukur peluang produk B dibeli kalau produk A udah masuk keranjang. Lift ngebandingin confidence itu sama peluang alami produk B dibeli sendirian. Lift di atas 1 artinya hubungan pasangan itu nyata. Lift sekitar 1 artinya cuma kebetulan karena dua-duanya memang laris.

Perlu Python atau algoritma Apriori buat market basket analysis?

Nggak wajib. Kalau kamu cuma butuh pasangan dua produk, SQL biasa udah cukup: self-join tabel item transaksi, GROUP BY pasangan, hitung metriknya. Apriori di Python baru kepakai kalau kamu mau kombinasi tiga produk atau lebih, karena jumlah kombinasinya meledak dan SQL jadi lambat.

Berapa transaksi minimal biar hasilnya bisa dipercaya?

Nggak ada angka baku, tapi patokan aman: satu pasangan produk minimal muncul di 30 transaksi sebelum kamu ambil keputusan dari situ. Kalau pasangan cuma muncul 4 kali dari 5.000 transaksi, lift-nya bisa kelihatan tinggi banget padahal itu cuma noise. Selalu tampilkan kolom jumlah transaksi di samping lift.

Gimana cara pakai hasil market basket analysis di toko kecil?

Tiga pemakaian yang paling gampang: pindahkan dua produk berpasangan ke rak yang berdekatan, bikin paket bundling dengan diskon tipis, dan tawarin produk pasangannya waktu kasir lagi input belanjaan. Mulai dari 3 pasangan dengan lift tertinggi yang jumlah transaksinya juga besar, jangan langsung 20 pasangan sekaligus.

Penutup

Tiga hal yang perlu kamu bawa pulang dari artikel ini.

Self-join dengan kondisi a.produk < b.produk adalah inti dari market basket analysis di SQL. Sisanya cuma hitung-hitungan.

Lift ngasih tau hubungannya nyata atau kebetulan, tapi jumlah transaksi yang nentuin pasangan itu layak dieksekusi atau nggak.

Di toko_berkah, pasangan dengan lift tertinggi (sabun + spons, 4,05) justru bukan yang paling menguntungkan buat digarap — kopi + gula dengan 612 transaksi jauh lebih berdampak.

Query di atas bisa langsung kamu tempel dan coba di NgulikSQL. Kalau self-join-nya masih bikin pusing, mulai dari artikel dasar JOIN dulu, baru balik ke sini.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel Terkait

SQLite untuk Pemula: Database Ringan buat Latihan Query
Tutorial SQL
22 Juni 2026•11 menit baca

SQLite untuk Pemula: Database Ringan buat Latihan Query

SQLite itu database yang isinya cuma satu file, gak perlu install server. Ini cara bikin database toko_berkah sendiri dan latihan query dari nol.

BimaBima
Regex di SQL: Pola Teks buat Bersihin Data Kotor
Tutorial SQL
10 Juni 2026•11 menit baca

Regex di SQL: Pola Teks buat Bersihin Data Kotor

Regex di SQL bikin kamu bisa cari, validasi, dan ganti teks berdasarkan pola. Nomor HP campur aduk, email typo, alamat berantakan — semuanya bisa dirapikan pakai satu query.

BimaBima
Cara Menghapus Data Duplikat di SQL: 3 Teknik Andalan
Tutorial SQL
29 Mei 2026•11 menit baca

Cara Menghapus Data Duplikat di SQL: 3 Teknik Andalan

Data duplikat bikin omzet kelihatan lebih gede dari aslinya. Ini 3 teknik hapus duplikat di SQL - DISTINCT, GROUP BY, dan ROW_NUMBER - plus kapan pakai yang mana.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

Copyright © 2026 - All rights reserved

LINKS
SupportPricingDatasetBlogAffiliates
LEGAL
Terms of servicesPrivacy policy
Ngulik Data
DatasetLeaderboardBlogStore