Capaian Pembelajaran
Setelah minggu ini kamu bisa:
- Menjelaskan market basket analysis dan manfaat bisnisnya.
- Menghitung support dan confidence secara manual.
- Menjelaskan prinsip Apriori (sifat anti-monoton) dan mengapa ia memangkas ruang pencarian.
- Menjalankan algoritma Apriori langkah demi langkah (join → prune → hitung → filter).
- Mengimplementasikan Apriori dari nol dan dengan pustaka
mlxtend.
1. Market Basket Analysis
Pertanyaan bisnis: "Produk apa yang sering dibeli bersamaan?"
Pemanfaatan:
| Bidang | Contoh aksi |
|---|---|
| Tata letak toko | Letakkan mentega dekat roti |
| Rekomendasi e-commerce | "Pelanggan yang membeli X juga membeli Y" |
| Promo bundling | Paket kopi + gula |
| Manajemen stok | Stok produk berpasangan dinaikkan bersamaan |
| Di luar ritel | Diagnosis (gejala yang muncul bersama), web usage mining, deteksi fraud |
2. Istilah Dasar
- Item: satu produk, mis.
roti. - Itemset: himpunan item, mis.
{roti, mentega}. k-itemset = itemset berisi k item. - Transaksi: satu keranjang belanja (sebuah itemset) dengan ID.
- Support count σ(X): jumlah transaksi yang memuat seluruh item di X.
- Support s(X) = σ(X) / N (N = jumlah transaksi).
- Frequent itemset: itemset dengan support ≥ minimum support (min_sup).
- Aturan asosiasi X ⇒ Y (X ∩ Y = ∅), misalnya
{roti} ⇒ {mentega}.- support(X ⇒ Y) = s(X ∪ Y)
- confidence(X ⇒ Y) = s(X ∪ Y) / s(X) = P(Y | X)
Contoh: 5 transaksi
| TID | Item |
|---|---|
| 1 | roti, susu |
| 2 | roti, mentega, telur |
| 3 | susu, mentega, kopi |
| 4 | roti, susu, mentega |
| 5 | roti, susu, kopi |
- s({roti}) = 4/5 = 0.8
- s({roti, susu}) = 3/5 = 0.6 (TID 1, 4, 5)
- confidence({roti} ⇒ {susu}) = 0.6 / 0.8 = 0.75
- confidence({susu} ⇒ {roti}) = 0.6 / 0.8 = 0.75 (kebetulan sama; umumnya berbeda)
Penambangan aturan asosiasi = dua langkah:
- Temukan semua frequent itemset (bagian yang mahal).
- Bangkitkan aturan kuat dari frequent itemset: confidence ≥ min_conf (Minggu 5).
3. Masalah Ledakan Kombinasi
Dengan d item terdapat 2ᵈ − 1 itemset tak kosong. Untuk d = 100 → ≈ 1.27 × 10³⁰ itemset. Mustahil dihitung satu per satu (brute force).
4. Prinsip Apriori
Jika sebuah itemset frequent, semua subset-nya juga frequent. Ekuivalen (kontrapositif): jika sebuah itemset tidak frequent, semua superset-nya juga tidak frequent.
Ini berlaku karena support bersifat anti-monoton: X ⊆ Y ⇒ s(X) ≥ s(Y). Menambah item ke keranjang tidak mungkin menambah jumlah transaksi yang memuatnya.
Akibatnya: begitu {kopi} ternyata tidak frequent, kita tidak perlu menghitung {kopi, roti}, {kopi, susu, roti}, dst. → ruang pencarian terpangkas besar.
5. Algoritma Apriori (level-wise, breadth-first)
L1 = {1-itemset frequent}
k = 2
while L(k-1) tidak kosong:
Ck = apriori_gen(L(k-1)) # JOIN + PRUNE
for setiap transaksi t: # SCAN database
tambah count kandidat c ∈ Ck yang c ⊆ t
Lk = {c ∈ Ck | count(c) ≥ min_sup}
k = k + 1
return ∪ Lk
apriori_gen:
- Join: gabungkan dua itemset di L(k−1) yang k−2 item pertamanya sama (setelah diurutkan) → kandidat berukuran k.
- Prune: buang kandidat yang memiliki subset (k−1) yang tidak ada di L(k−1).
6. Contoh Lengkap (Han & Kamber)
9 transaksi, min_sup count = 2 (≈ 22%):
| TID | Item | TID | Item | |
|---|---|---|---|---|
| T100 | I1, I2, I5 | T600 | I2, I3 | |
| T200 | I2, I4 | T700 | I1, I3 | |
| T300 | I2, I3 | T800 | I1, I2, I3, I5 | |
| T400 | I1, I2, I4 | T900 | I1, I2, I3 | |
| T500 | I1, I3 |
Iterasi 1 — C1 = L1 (semua ≥ 2):
| Itemset | Count |
|---|---|
| {I1} | 6 |
| {I2} | 7 |
| {I3} | 6 |
| {I4} | 2 |
| {I5} | 2 |
Iterasi 2 — C2 = semua pasangan dari L1 (10 kandidat):
| Itemset | Count | Frequent? |
|---|---|---|
| {I1,I2} | 4 | ✔ |
| {I1,I3} | 4 | ✔ |
| {I1,I4} | 1 | ✘ |
| {I1,I5} | 2 | ✔ |
| {I2,I3} | 4 | ✔ |
| {I2,I4} | 2 | ✔ |
| {I2,I5} | 2 | ✔ |
| {I3,I4} | 0 | ✘ |
| {I3,I5} | 1 | ✘ |
| {I4,I5} | 0 | ✘ |
L2 = 6 itemset.
Iterasi 3 — Join L2 (prefix sama):
{I1,I2}+{I1,I3} → {I1,I2,I3}, {I1,I2}+{I1,I5} → {I1,I2,I5}, {I1,I3}+{I1,I5} → {I1,I3,I5},
{I2,I3}+{I2,I4} → {I2,I3,I4}, {I2,I3}+{I2,I5} → {I2,I3,I5}, {I2,I4}+{I2,I5} → {I2,I4,I5}.
Prune:
- {I1,I3,I5}: subset {I3,I5} ∉ L2 → buang
- {I2,I3,I4}: {I3,I4} ∉ L2 → buang
- {I2,I3,I5}: {I3,I5} ∉ L2 → buang
- {I2,I4,I5}: {I4,I5} ∉ L2 → buang
C3 = {I1,I2,I3} (count 2), {I1,I2,I5} (count 2) → L3 = keduanya.
Iterasi 4 — Join L3 → {I1,I2,I3,I5}; prune: subset {I2,I3,I5} ∉ L3 → buang. C4 kosong → selesai.
Total frequent itemset = 5 + 6 + 2 = 13.
7. Kompleksitas & Kelemahan Apriori
- Banyak scan database (sebanyak panjang itemset terpanjang + 1).
- Kandidat bisa sangat banyak: 10⁴ item frequent → ≈ 10⁷ kandidat 2-itemset.
- Min_sup terlalu rendah → ledakan kandidat; terlalu tinggi → pola menarik (item jarang tapi bernilai tinggi) terlewat.
Perbaikan: hash-based counting, partitioning, sampling, dan FP-Growth (Minggu 5) yang tidak membangkitkan kandidat.
8. Representasi Ringkas: Closed & Maximal
- Maximal frequent itemset: frequent, dan tidak ada superset yang frequent.
- Closed itemset: tidak ada superset dengan support yang sama.
Hubungan: maximal ⊆ closed ⊆ frequent. Pada contoh di atas, maximal = {I1,I2,I3}, {I1,I2,I5}, {I2,I4}.
9. Format Data untuk Pustaka
mlxtend membutuhkan DataFrame one-hot boolean (baris = transaksi, kolom = item):
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
te = TransactionEncoder()
onehot = pd.DataFrame(te.fit(transaksi).transform(transaksi), columns=te.columns_)
fi = apriori(onehot, min_support=0.05, use_colnames=True)
Ringkasan
- support = proporsi transaksi yang memuat itemset; confidence = P(Y|X).
- Support anti-monoton → jika X tidak frequent, semua superset X tidak frequent.
- Apriori: level-wise; tiap level = join → prune → scan & hitung → filter min_sup.
- Kelemahan: banyak scan dan kandidat → motivasi FP-Growth.
Bacaan
- Han, Kamber & Pei — Bab 6 (Mining Frequent Patterns, Associations, and Correlations).
- Agrawal & Srikant (1994) — Fast Algorithms for Mining Association Rules.
Tugas Minggu Ini
- Kerjakan
lab.ipynbsampai selesai. - Kerjakan kuis (di web, atau baca
quiz.json). - Isi
exercise.py, lalu cek:python check.py 4