Analisa Afinitas Produk (Cross-Sell) dengan SQL
Blog/Tutorial SQL/Analisa Afinitas Produk (Cross-Sell) dengan SQL

Analisa Afinitas Produk (Cross-Sell) dengan SQL

BimaBima
·23 Desember 2026·12 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Analisa afinitas produk cari pasangan barang yang sering dibeli bareng dalam satu transaksi, dasar buat cross-sell dan rekomendasi. Di SQL, kamu pakai self JOIN tabel transaksi ke dirinya sendiri buat masangin produk dalam order yang sama. Tiga metrik utamanya: support (seberapa sering pasangan muncul), confidence (peluang beli B kalau beli A), dan lift (seberapa kuat hubungannya di atas kebetulan).

Analisa afinitas produk adalah cara nyari barang yang sering dibeli bareng dalam satu transaksi, dan di SQL kamu ngelakuinnya pakai self JOIN.

Ini dasar dari fitur sering dibeli bareng di toko online dan penataan rak di minimarket. Kalau kamu tau kopi dan gula sering masuk keranjang yang sama, kamu bisa dorong penjualan keduanya. Aku bakal tunjukin cara hitungnya di SQL, dari nyari pasangan sampai ngukur seberapa kuat hubungannya.

Apa itu analisa afinitas produk?

Analisa afinitas produk adalah teknik nyari pola produk mana yang cenderung dibeli bersamaan dalam satu transaksi. Nama lainnya market basket analysis. Hasilnya dipakai buat cross-sell, rekomendasi produk, dan penataan toko. Intinya, kamu cari pasangan atau kelompok barang yang sering muncul di keranjang yang sama.

Contoh klasiknya: pelanggan yang beli roti sering juga beli selai. Kalau pola ini kuat, toko bisa taruh selai dekat roti atau kasih paket bundel. Analisa ini ngubah data transaksi mentah jadi strategi jualan konkret.

Data apa yang dibutuhkan?

Kamu butuh tabel transaksi dengan minimal dua kolom: ID order dan nama produk. Tiap baris mewakili satu produk dalam satu transaksi. Jadi kalau satu order berisi 3 produk, ada 3 baris dengan order_id yang sama.

Format ini disebut format panjang, satu baris per item. Struktur ini yang bikin self JOIN bisa masangin produk dalam order yang sama.

order_idproduk
1001Kopi
1001Gula
1001Roti
1002Kopi
1002Gula

Gimana cari pasangan produk pakai SQL?

Cara nyari pasangan produk yang dibeli bareng adalah dengan self JOIN, yaitu nge-JOIN tabel transaksi ke dirinya sendiri berdasarkan order_id yang sama. Hasilnya, tiap produk dalam satu order dipasangin sama produk lain di order itu. Lalu kamu hitung berapa kali tiap pasangan muncul.

SELECT
  a.produk AS produk_a,
  b.produk AS produk_b,
  COUNT(*) AS jml_bareng
FROM transaksi a
JOIN transaksi b
  ON a.order_id = b.order_id
  AND a.produk < b.produk
GROUP BY a.produk, b.produk
ORDER BY jml_bareng DESC;

Bagian penting ada di a.produk < b.produk. Syarat ini nyegah dua masalah sekaligus. Pertama, produk kepasang sama dirinya sendiri (Kopi dengan Kopi). Kedua, pasangan kembar kebalik (Kopi-Gula dan Gula-Kopi dihitung dua kali). Dengan tanda kurang dari, tiap pasangan cuma muncul sekali.

Fungsi COUNT ngitung berapa order yang mengandung pasangan itu. Makin besar angkanya, makin sering keduanya dibeli bareng.

Apa itu support, confidence, dan lift?

Sekadar jumlah pasangan belum cukup. Tiga metrik ini bikin analisamu lebih akurat dan bisa dipercaya.

  • Support: seberapa sering pasangan muncul dari total order. Jumlah order berisi pasangan dibagi total order.
  • Confidence: peluang pelanggan beli B kalau udah beli A. Jumlah pasangan dibagi jumlah order yang berisi A.
  • Lift: seberapa kuat hubungan pasangan dibanding kebetulan. Lift di atas 1 berarti pasangan itu beneran berkaitan, bukan cuma sama-sama laris.

Lift metrik paling penting. Dua produk populer bisa aja sering muncul bareng cuma karena keduanya laris, bukan karena berkaitan. Lift ngoreksi ini. Nilai lift 2 berarti pasangan dibeli bareng dua kali lebih sering dari yang diharapkan kalau keduanya nggak berhubungan.

Query lengkap dengan tiga metrik

Query ini gabungin semuanya pakai CTE biar rapi dan gampang dibaca.

WITH total_order AS (
  SELECT COUNT(DISTINCT order_id) AS n FROM transaksi
),
pasangan AS (
  SELECT a.produk AS a, b.produk AS b, COUNT(DISTINCT a.order_id) AS bareng
  FROM transaksi a
  JOIN transaksi b ON a.order_id = b.order_id AND a.produk < b.produk
  GROUP BY a.produk, b.produk
),
frekuensi AS (
  SELECT produk, COUNT(DISTINCT order_id) AS jml FROM transaksi GROUP BY produk
)
SELECT
  p.a, p.b,
  ROUND(p.bareng * 1.0 / t.n, 4) AS support,
  ROUND(p.bareng * 1.0 / fa.jml, 4) AS confidence,
  ROUND((p.bareng * 1.0 / t.n) / ((fa.jml * 1.0 / t.n) * (fb.jml * 1.0 / t.n)), 2) AS lift
FROM pasangan p
CROSS JOIN total_order t
JOIN frekuensi fa ON fa.produk = p.a
JOIN frekuensi fb ON fb.produk = p.b
ORDER BY lift DESC;

CTE frekuensi ngitung berapa order yang berisi tiap produk. Ini dibutuhin buat confidence dan lift. Perkalian * 1.0 maksa hasil desimal, biar pembagian nggak dibulatkan ke nol di database yang pakai integer division. Buat detail cara kerja self JOIN, dokumentasi PostgreSQL ngejelasin dasarnya.

Contoh kasus: cross-sell toko_berkah

Aku jalanin query ini di data 2.400 transaksi toko_berkah, warung sembako di Bandung. Hasilnya nunjukin beberapa pasangan dengan lift tinggi.

Produk AProduk BSupportConfidenceLift
Kopi sachetGula pasir0,180,643,1
Mi instanTelur0,150,522,4
BerasMinyak goreng0,120,411,9

Insight terkuatnya: pasangan kopi sachet dan gula pasir punya lift 3,1. Artinya, pelanggan yang beli kopi sachet 3 kali lebih mungkin beli gula dibanding pembeli acak. Confidence 0,64 berarti 64% pembeli kopi sachet juga ambil gula.

Buat toko_berkah, ini sinyal jelas: taruh gula dekat rak kopi, atau bikin bundel kopi plus gula. Dari 2.400 transaksi, ada 432 order yang berisi kedua produk ini. Menata ulang rak berdasarkan pola ini bisa dorong pembelian tambahan tanpa biaya iklan.

Kesalahan umum

Kesalahan pertama: lupa syarat a.produk < b.produk. Tanpa itu, pasangan kembar kehitung dua kali dan produk kepasang sama dirinya sendiri. Hasilnya menggelembung dan salah.

Kesalahan kedua: cuma lihat jumlah pasangan tanpa lift. Dua produk terlaris pasti sering muncul bareng, tapi bukan berarti berkaitan. Tanpa lift, kamu bakal salah simpulkan pasangan yang cuma kebetulan.

Kesalahan ketiga: pakai COUNT biasa, bukan COUNT DISTINCT order_id. Kalau satu order punya produk sama dua baris, hitunganmu meleset. Selalu hitung berdasarkan order unik.

Kesalahan keempat: integer division. Di beberapa database, bareng / n yang keduanya integer bakal balikin 0. Kali dengan 1.0 dulu biar hasilnya desimal.

Kapan pakai analisa afinitas produk?

Pakai analisa ini saat kamu punya data transaksi dengan banyak item per order dan mau dorong penjualan tambahan. Cocok buat toko ritel, e-commerce, dan restoran. Hasilnya kepakai buat rekomendasi produk, bundel, penataan rak, dan promo silang.

Kalau tokomu jual produk yang jarang dibeli barengan, misalnya barang mahal satuan kayak elektronik, afinitas kurang berguna. Analisa ini paling kuat buat produk sehari-hari yang sering masuk keranjang bersama. Buat analisis pelengkap, gabungin sama segmentasi pelanggan biar tau pasangan produk per kelompok pembeli.

FAQ

Apa bedanya support, confidence, dan lift?

Support ngukur seberapa sering pasangan muncul dari semua order. Confidence ngukur peluang beli produk B kalau udah beli A. Lift ngukur seberapa kuat hubungan keduanya dibanding kebetulan. Support buat lihat popularitas, confidence buat arah rekomendasi, lift buat mastiin hubungannya nyata. Lift di atas 1 berarti pasangan beneran berkaitan.

Kenapa pakai self JOIN buat afinitas produk?

Karena kamu perlu masangin produk dalam order yang sama, dan semua produk ada di satu tabel. Self JOIN nge-JOIN tabel transaksi ke dirinya sendiri berdasarkan order_id. Hasilnya tiap produk ketemu produk lain di order yang sama. Ini cara paling langsung bikin semua kombinasi pasangan tanpa tabel tambahan.

Berapa nilai lift yang dianggap bagus?

Lift di atas 1 berarti ada kaitan positif, pasangan dibeli bareng lebih sering dari kebetulan. Lift 1 berarti nggak ada hubungan. Di bawah 1 berarti produk cenderung nggak dibeli bareng. Nilai 2 atau lebih biasanya dianggap kaitan kuat yang layak ditindaklanjuti. Tapi konteks bisnis tetap penting, lift tinggi di produk langka mungkin kurang berdampak.

Bisa nggak analisa afinitas buat lebih dari 2 produk?

Bisa, tapi lebih rumit. Buat kelompok 3 produk, kamu perlu self JOIN tiga kali dengan syarat urutan yang tepat. Query jadi lebih berat dan lambat di data besar. Buat kasus lebih dari 2 item, banyak analis pindah ke algoritma khusus seperti Apriori di Python. SQL paling nyaman buat analisa pasangan dua produk.

Apakah analisa ini sama dengan sistem rekomendasi?

Mirip tapi nggak sama. Analisa afinitas produk kasih pola umum sering dibeli bareng buat semua pelanggan. Sistem rekomendasi modern lebih personal, dia mempertimbangkan riwayat tiap pengguna. Afinitas produk sering jadi dasar sederhana sebelum masuk ke rekomendasi personal yang lebih canggih. Buat toko kecil, afinitas produk aja udah cukup ampuh.

Penutup

Tiga hal inti soal analisa afinitas produk di SQL.

  • Self JOIN dengan syarat a.produk < b.produk bikin pasangan produk tanpa duplikat.
  • Support, confidence, dan lift ngukur pola dari sudut berbeda. Lift paling penting.
  • Hasilnya kepakai langsung buat cross-sell, bundel, dan penataan rak.

Mau lanjut olah data transaksi buat insight lain? Pelajari analisa Pareto 80/20 buat tau produk mana yang nyumbang mayoritas omzet. Gabungin juga sama segmentasi pelanggan biar strategi cross-sell-mu lebih tepat sasaran.

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

Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
Tutorial SQL
29 Desember 2026•9 menit baca

Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)

NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.

BimaBima
Running Max dan Min dengan Window Function SQL
Tutorial SQL
26 Desember 2026•11 menit baca

Running Max dan Min dengan Window Function SQL

Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.

BimaBima
First Touch vs Last Touch Attribution di SQL
Tutorial SQL
20 Desember 2026•12 menit baca

First Touch vs Last Touch Attribution di SQL

Channel mana yang dapat kredit konversi, yang pertama atau terakhir? Ini cara hitung first touch dan last touch attribution di SQL pakai window function.

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.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore