Algoritma Apriori: Market Basket Analysis Data Transaksi Warung
TL;DR
Algoritma Apriori adalah metode data mining yang nyari kombinasi barang yang sering dibeli bareng dalam satu transaksi. Dia bekerja bertahap: cari barang populer dulu, baru bentuk pasangan dari barang-barang itu, terus naik ke kombinasi tiga barang. Hasilnya berupa aturan asosiasi yang dinilai lewat tiga angka, yaitu support, confidence, dan lift.
Algoritma Apriori adalah metode data mining yang nyari kombinasi barang yang sering dibeli bareng dalam satu transaksi.
Hasilnya dipakai buat nentuin paket bundling, tata letak rak, dan rekomendasi "sering dibeli bersama" di aplikasi belanja.
Aku bawa 10 transaksi dari warung sembako, hitung manual sampai ketemu aturan dengan lift 1,67, lalu buktiin hasilnya pakai Python.
Apa itu market basket analysis?
Market basket analysis adalah teknik nyari pola barang yang muncul bareng di satu struk belanja. Outputnya berupa aturan asosiasi, misalnya "kalau orang beli telur, dia juga beli mi instan". Algoritma Apriori adalah cara paling umum buat nemuin aturan-aturan itu tanpa harus ngecek semua kombinasi barang satu per satu.
Bedanya sama analisis penjualan biasa: kamu nggak nanya barang apa yang laku, tapi barang apa yang laku bareng.
Dua pertanyaan itu ngasih keputusan yang beda. Yang pertama nentuin stok, yang kedua nentuin promo.
Gimana cara kerja algoritma Apriori?
Apriori bekerja bertahap dari kombinasi kecil ke besar. Dia hitung dulu barang tunggal yang cukup sering muncul, buang yang jarang, lalu bentuk pasangan cuma dari barang yang lolos. Prinsipnya: kalau satu barang jarang, semua kombinasi yang memuat barang itu pasti lebih jarang lagi, jadi nggak perlu dihitung.
Pemangkasan ini yang bikin Apriori bisa jalan di data besar. Sepuluh jenis barang aja udah punya 1.023 kemungkinan kombinasi. Seratus jenis barang jumlahnya jadi angka yang nggak masuk akal buat dihitung semua.
Tiga angka yang harus kamu pahami
| Ukuran | Rumus | Artinya |
|---|---|---|
| Support | transaksi yang memuat A dan B / total transaksi | Seberapa sering kombinasi ini muncul |
| Confidence | support(A dan B) / support(A) | Kalau A dibeli, seberapa sering B ikut |
| Lift | confidence(A ke B) / support(B) | Hubungannya nyata atau cuma kebetulan |
Lift adalah angka yang paling sering diabaikan pemula, dan justru dia yang paling nentuin. Lift 1 berarti dua barang itu bebas satu sama lain. Lift 1,67 berarti peluang B kebeli naik 67% kalau A ada di keranjang.
Contoh kasus: 10 transaksi Warung Bu Sari
Ini data kasir Warung Bu Sari, warung sembako di kompleks perumahan. Sepuluh struk berturut-turut di jam pagi.
| Struk | Isi belanja |
|---|---|
| T1 | indomie, telur |
| T2 | indomie, telur, kopi |
| T3 | indomie, kopi |
| T4 | kopi, gula |
| T5 | indomie, telur, kopi |
| T6 | roti, susu |
| T7 | indomie, telur |
| T8 | kopi, gula, roti |
| T9 | indomie, telur, kopi |
| T10 | roti, susu, gula |
Aku pasang minimum support 0,3. Artinya kombinasi harus muncul minimal di 3 dari 10 struk biar dianggap layak.
Langkah 1: hitung support tiap barang
| Barang | Jumlah struk | Support | Lolos? |
|---|---|---|---|
| indomie | 6 | 0,6 | Ya |
| kopi | 6 | 0,6 | Ya |
| telur | 5 | 0,5 | Ya |
| gula | 3 | 0,3 | Ya |
| roti | 3 | 0,3 | Ya |
| susu | 2 | 0,2 | Nggak |
Susu gugur di putaran pertama. Semua kombinasi yang memuat susu langsung dicoret tanpa dihitung, dan itu inti prinsip Apriori.
Langkah 2: bentuk pasangan dari barang yang lolos
Lima barang yang lolos bikin 10 pasangan. Aku hitung support tiap pasangan.
| Pasangan | Jumlah struk | Support | Lolos? |
|---|---|---|---|
| indomie + telur | 5 | 0,5 | Ya |
| indomie + kopi | 4 | 0,4 | Ya |
| telur + kopi | 3 | 0,3 | Ya |
| kopi + gula | 2 | 0,2 | Nggak |
| gula + roti | 2 | 0,2 | Nggak |
| kopi + roti | 1 | 0,1 | Nggak |
| indomie + gula | 0 | 0 | Nggak |
| indomie + roti | 0 | 0 | Nggak |
| telur + gula | 0 | 0 | Nggak |
| telur + roti | 0 | 0 | Nggak |
Tiga pasangan lolos. Sisanya dibuang.
Langkah 3: naik ke kombinasi tiga barang
Kandidat tiga barang cuma boleh dibentuk dari pasangan yang lolos. Cuma satu yang memenuhi syarat: indomie + telur + kopi.
Kombinasi ini muncul di T2, T5, dan T9. Support 0,3, jadi lolos.
Nggak ada kandidat empat barang, jadi pencarian berhenti di sini.
Langkah 4: bikin aturan dan hitung confidence plus lift
| Aturan | Support | Confidence | Lift |
|---|---|---|---|
| telur → indomie | 0,5 | 5/5 = 1,00 | 1,00 / 0,6 = 1,67 |
| indomie → telur | 0,5 | 5/6 = 0,83 | 0,83 / 0,5 = 1,67 |
| {telur, kopi} → indomie | 0,3 | 3/3 = 1,00 | 1,00 / 0,6 = 1,67 |
| {indomie, kopi} → telur | 0,3 | 3/4 = 0,75 | 0,75 / 0,5 = 1,50 |
| indomie → kopi | 0,4 | 4/6 = 0,67 | 0,67 / 0,6 = 1,11 |
| telur → kopi | 0,3 | 3/5 = 0,60 | 0,60 / 0,6 = 1,00 |
Baris terakhir itu pelajaran paling mahal di tabel ini. Confidence 0,60 kelihatan lumayan, tapi lift-nya pas 1,00.
Artinya orang yang beli telur punya peluang beli kopi sama persis dengan orang acak di warung itu. Kopi emang laku, itu doang. Nggak ada hubungan khusus sama telur.
Kalau Bu Sari bikin paket "telur + kopi" berdasarkan confidence 60% tadi, dia bakal ngasih diskon buat pembelian yang tetap terjadi tanpa diskon.
Apa artinya buat warungnya?
Aturan terkuat: telur → indomie dengan confidence 100% dan lift 1,67. Lima struk yang ada telurnya, kelimanya juga ada indomie.
Dari data itu, ada tiga aksi yang masuk akal.
Pertama, taruh rak telur bersebelahan sama rak mi instan. Nol biaya, dan orang nggak perlu muter.
Kedua, bikin paket "Sarapan Hemat" isi 5 indomie plus 6 butir telur. Kalau harga eceran totalnya Rp 24.500 dan paketnya dijual Rp 22.900, marginnya turun sekitar Rp 1.600 per paket tapi ukuran keranjang naik.
Ketiga, jangan bikin paket telur plus kopi. Lift-nya 1,00, jadi diskonnya kebuang.
Catatan penting: 10 transaksi terlalu sedikit buat keputusan beneran. Angka lift 1,67 dari 10 struk itu latihan, bukan bukti. Buat toko asli, kumpulin minimal seribu struk dulu.
Gimana cara jalanin Apriori di Python?
Library yang paling sering dipakai buat ini adalah mlxtend. Kodenya pendek.
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
transaksi = [
["indomie", "telur"],
["indomie", "telur", "kopi"],
["indomie", "kopi"],
["kopi", "gula"],
["indomie", "telur", "kopi"],
["roti", "susu"],
["indomie", "telur"],
["kopi", "gula", "roti"],
["indomie", "telur", "kopi"],
["roti", "susu", "gula"],
]
te = TransactionEncoder()
matriks = te.fit(transaksi).transform(transaksi)
df = pd.DataFrame(matriks, columns=te.columns_)
sering = apriori(df, min_support=0.3, use_colnames=True)
aturan = association_rules(sering, metric="lift", min_threshold=1.0)
print(aturan[["antecedents", "consequents", "support", "confidence", "lift"]]
.sort_values("lift", ascending=False)
.round(3))
Angka yang keluar sama persis dengan tabel hitung manual di atas. Aturan telur ke indomie muncul dengan confidence 1,0 dan lift 1,667.
Satu catatan versi: di mlxtend rilis baru, fungsi association_rules minta argumen tambahan num_itemsets. Kalau kodemu error, tambahin num_itemsets=len(df). Rinciannya ada di dokumentasi resmi mlxtend.
Cara nyiapin data kasir jadi format transaksi
Data kasir biasanya datang dalam bentuk panjang: satu baris per item, dengan kolom nomor struk. Ubah dulu jadi daftar per struk.
transaksi = (df_kasir
.groupby("no_struk")["nama_barang"]
.apply(list)
.tolist())
Fungsi groupby di pandas ngerjain pengelompokan ini dalam satu baris. Kalau kamu belum akrab sama konsepnya, baca dulu soal aggregate function dan dokumentasi groupby pandas.
Gimana cara hitung support pasangan di Excel?
Buat data kecil, kamu nggak butuh Python. Susun dulu tabel biner: satu baris per struk, satu kolom per barang, isinya 1 kalau barang itu dibeli.
Support pasangan tinggal ngitung berapa baris yang punya 1 di dua kolom sekaligus.
=SUMPRODUCT(B2:B11, C2:C11) / COUNT(B2:B11)
Kolom B itu indomie, kolom C itu telur. SUMPRODUCT ngaliin tiap pasang nilai lalu jumlahin hasilnya, jadi cuma baris yang dua-duanya 1 yang kehitung.
Buat support barang tunggal, COUNTIF lebih pas dan lebih gampang dibaca.
Cara ini mentok di kombinasi tiga barang, karena jumlah kolom bantunya naik cepat. Tapi buat ngerti mekanismenya, ini paling jelas.
Kesalahan umum waktu pakai Apriori
- Cuma baca confidence. Barang yang laku banget bakal punya confidence tinggi di hampir semua aturan. Selalu cek lift.
- Minimum support kekecilan. Set 0,001 di data ribuan transaksi bikin ribuan aturan keluar dan nggak ada yang sempat kamu baca.
- Ngitung barang, bukan struk. Kalau satu struk beli 3 indomie, itu tetap satu kemunculan. Buang duplikat dalam struk sebelum ngitung.
- Nyampur periode promo dan non-promo. Pola belanja waktu diskon beda jauh. Pisahkan periodenya atau aturanmu bakal nyeritain promo, bukan perilaku asli.
- Nganggap asosiasi sebagai sebab-akibat. Telur dan indomie muncul bareng bukan berarti telur nyebabin orang beli indomie. Dua-duanya bahan sarapan yang sama.
Sebelum semua itu, cek dulu kondisi datanya. Nama barang yang ditulis "Indomie", "indomie", dan "INDOMIE GORENG" bakal dihitung sebagai tiga barang berbeda, dan itu urusan data quality yang harus beres duluan.
FAQ
Apa bedanya support, confidence, dan lift?
Support ngukur seberapa sering kombinasi barang muncul dari seluruh transaksi. Confidence ngukur seberapa sering barang B ikut kebeli kalau barang A dibeli. Lift ngebandingin confidence tadi sama peluang B kebeli secara acak. Lift di atas 1 berarti hubungannya nyata, lift sekitar 1 berarti dua barang itu bebas satu sama lain.
Berapa minimum support yang bagus?
Nggak ada angka baku, dan itu tergantung jumlah transaksimu. Buat data kecil di bawah 100 transaksi, mulai dari 0,2 sampai 0,3. Buat data ribuan transaksi, 0,01 aja udah lumayan karena satu persen dari 50 ribu transaksi itu 500 kejadian. Turunin pelan-pelan sampai jumlah aturannya masih bisa kamu baca.
Kenapa algoritmanya disebut Apriori?
Namanya datang dari prinsip yang dia pakai: kalau satu kombinasi barang jarang muncul, semua kombinasi lebih besar yang memuatnya pasti lebih jarang lagi. Pengetahuan awal ini dipakai buat mangkas kandidat sebelum dihitung. Tanpa pemangkasan itu, jumlah kombinasi yang harus dicek naik meledak.
Apriori bisa jalan di Excel nggak?
Bisa buat data kecil, misalnya di bawah 200 transaksi dan 10 jenis barang. Kamu susun tabel biner dengan 1 dan 0 per barang, lalu hitung support pasangan pakai SUMPRODUCT. Yang berat itu kombinasi tiga barang ke atas. Buat data kasir asli yang ribuan baris, pindah ke Python jauh lebih hemat waktu.
Aturan dengan confidence 100% pasti berguna?
Belum tentu. Confidence 100% bisa muncul dari barang yang cuma kebeli tiga kali dan kebetulan selalu bareng. Cek dulu support-nya. Baca ketiga angka bareng-bareng, dan kasih perhatian ekstra ke lift karena dia yang ngasih tau hubungannya nyata atau cuma efek barang populer.
Rangkuman
Apriori nyaring kombinasi bertahap: barang populer dulu, baru pasangan, baru trio. Yang jarang dibuang sejak awal biar hitungannya ringan.
Support, confidence, dan lift harus dibaca bertiga. Lift yang mepet 1 itu tanda kamu lagi ngeliat barang laku, bukan pola belanja.
Coba pakai data kasir tempatmu kerja atau data penjualan latihan. Sepuluh menit ngitung support bisa ngubah cara toko nyusun raknya.
Mau lanjut ke teknik klasifikasi? Baca algoritma Naive Bayes dan contoh hitung manualnya, atau latihan narik data transaksi per struk di NgulikSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.