1 Market Basket Analysis dan Algoritma Apriori

1.1 Market Basket Analysis di R

Penggunaan Market Basket Analysis (MBA) dan algoritma Apriori di R – yang merupakan salah satu algoritma terpopuler di area machine learning - terdapat pada package arules. Arules sendiri adalah singkatan dari association rules - kategori machine learning. Untuk menjalankan algoritma ini diperlukan dibutukan dua data, yaitu data produk dan data transaksi.

File dataset dapat diunduh di sini.

*Untuk menyimpan file .txt dari URL cukup buka URL nya dan klik “Save As” makan akan tersimpan.

1.2 Contoh Kode Market Basket Analysis di R

# Menggunakan library arules
library(arules)

# Membaca transaksi dari file data_transaksi.txt
transaksi <- read.transactions(file = "data_transaksi.txt",
                               format = "single",
                               sep = "\t",
                               cols = c(1,2),
                               skip = 1)

# Menampilkan data transaksi dengan print dan inspect 
inspect(transaksi)
##      items                      transactionID
## [1]  {Pet Food,Sirup,Teh Celup} #01          
## [2]  {Gula,Teh Celup}           #02          
## [3]  {Pet Food,Sirup}           #03          
## [4]  {Sirup,Teh Celup}          #04          
## [5]  {Gula,Sirup,Teh Celup}     #05          
## [6]  {Pet Food,Teh Celup}       #06          
## [7]  {Pet Food,Sirup,Teh Celup} #07          
## [8]  {Teh Celup}                #08          
## [9]  {Gula,Teh Celup}           #09          
## [10] {Gula,Pet Food,Sirup}      #10
# Menghasilkan model Market Basket Analysis
mba <- apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
# Menampilkan paket produk
inspect(subset(mba, lift > 1))
##     lhs                     rhs        support confidence coverage lift    
## [1] {Pet Food}           => {Sirup}    0.4     0.8000000  0.5      1.333333
## [2] {Sirup}              => {Pet Food} 0.4     0.6666667  0.6      1.333333
## [3] {Gula,Pet Food}      => {Sirup}    0.1     1.0000000  0.1      1.666667
## [4] {Pet Food,Teh Celup} => {Sirup}    0.2     0.6666667  0.3      1.111111
##     count
## [1] 4    
## [2] 4    
## [3] 1    
## [4] 2

1.3 Hasil Akhir

Market Basket Analysis (MBA) adalah teknik analisa yang digunakan oleh bisnis di bidang ritel untuk mencari asosiasi produk yang kuat, atau dengan kata lain menemukan paket produk yang bisa berdampak besar pada penjualan.

Algoritma yang bisa digunakan di R untuk melakukan MBA ini adalah apriori dari package arules. Data yang diperlukan hanya dua, yaitu data transaksi dan data produk.

1.4 Algoritma Apriori dan Association Rules

Sebagai gambaran buat Anda, jika terdapat 1.000 item, maka kemungkinan terdapat jutaan kombinasi yang harus diproses. Jumlah sebesar ini tentunya tidak bisa manual dan butuh bantuan algoritma komputer untuk memprosesnya.

Dan algoritma yang bisa kita gunakan adalah algoritma apriori yang merupakan algoritma di kategori association rules pada literatur machine learning. Algoritma ini akan menghasilkan kombinasi-kombinasi yang kemudian disusun dalam bentuk rule “Jika membeli ini…. maka akan juga membeli…”.

Ada cukup banyak penerapan dari association rules, seperti di dunia cyber security untuk mendeteksi intrusi jaringan, di bidang sales marketing untuk pemaketan produk, mencari pola pemakaian web, dan lain-lain.

1.5 Menampilkan Kombinasi dari Contoh Transaksi “Kecil”

# Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada
inspect(apriori(transaksi, parameter = list(support = .1, minlen = 2, target = 'frequent itemsets')))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##          NA    0.1    1 none FALSE            TRUE       5     0.1      2
##  maxlen            target  ext
##      10 frequent itemsets TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## sorting transactions ... done [0.00s].
## writing ... [9 set(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
##     items                      support transIdenticalToItemsets count
## [1] {Gula,Pet Food}            0.1     0.0                      1    
## [2] {Gula,Sirup}               0.2     0.0                      2    
## [3] {Gula,Teh Celup}           0.3     0.2                      3    
## [4] {Pet Food,Sirup}           0.4     0.1                      4    
## [5] {Pet Food,Teh Celup}       0.3     0.1                      3    
## [6] {Sirup,Teh Celup}          0.4     0.1                      4    
## [7] {Gula,Pet Food,Sirup}      0.1     0.1                      1    
## [8] {Gula,Sirup,Teh Celup}     0.1     0.1                      1    
## [9] {Pet Food,Sirup,Teh Celup} 0.2     0.2                      2

Terlihat ada sembilan kombinasi produk dengan nilai support adalah rasio dari kombinasi tersebut terhadap keseluruhan transaksi.

Sebagai contoh, kombinasi {Pet Food, Sirup} memiliki support 0.4 yang artinya kombinasi ini terdapat di 4 dari 10 transaksi yang tercatat.

1.6 Menampilkan Kombinasi dari Transaksi “Besar”

Contoh sebuah data dengan jumlah 100 transaksi:

Keseluruhan transaksi ini merupakan kombinasi dari 70 item produk. Dan kalau dianalisa dengan syarat support 0.03 (minimal muncul 30 kali dari 1000 transaksi) maka jumlah kombinasi yang dihasilkan adalah 1248. Semakin kecil support yang kita masukkan akan semakin banyak kombinasi yang muncul. Seperti berikut:

Dengan jumlah kombinasi yang sedemikian besar untuk dianalisa, akan sulit bagi kita jika ingin lakukan secara manual. Inilah alasan kenapa proses ini perlu diotomatisasi dengan bantuan algoritma.

#Menampilkan jumlah kombinasi dari produk yang terdapat pada daftar transaksi yang ada
mba <- apriori(transaksi, parameter = list(support = .03, minlen = 2, target = 'frequent itemsets')) 
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##          NA    0.1    1 none FALSE            TRUE       5    0.03      2
##  maxlen            target  ext
##      10 frequent itemsets TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 0 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## sorting transactions ... done [0.00s].
## writing ... [9 set(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(head(mba))
##     items                support transIdenticalToItemsets count
## [1] {Gula,Pet Food}      0.1     0.0                      1    
## [2] {Gula,Sirup}         0.2     0.0                      2    
## [3] {Gula,Teh Celup}     0.3     0.2                      3    
## [4] {Pet Food,Sirup}     0.4     0.1                      4    
## [5] {Pet Food,Teh Celup} 0.3     0.1                      3    
## [6] {Sirup,Teh Celup}    0.4     0.1                      4

1.7 Kesimpulan

Algoritma apriori adalah salah satu algoritma yang merupakan penerapan praktis dari Market Basket Analysis (MBA). Algoritma ini digunakan untuk menganalisa banyaknya kombinasi produk yang terjadi di dalam transaksi ritel, yang akan sulit dan lama jika dilakukan secara manual.

Secara teknis, algoritma apriori akan mencari tingkat asosiasi antar item di dalam banyak kombinasi kelompok data secara otomatis. Kombinasi ini juga bisa disusun dengan suatu aturan (rule) asosiasi “Jika membeli ini produk A maka akan membeli produk B”, sehingga algoritma ini dikategorikan sebagai Association Rules di ranah machine learning.

Dengan menemukan paket produk yang asosiasinya kuat, Anda sebagai seorang data scientist dapat menyarankan kepada bisnis dapat melakukan berbagai action item seperti membuat paket produk dengan penawaran khusus, mendekatkan produk-produk tersebut saling berdekatan dalam satu rak, mengeluarkan rekomendasi produk di sistem e-commerce, mengurangi masalah stok, dan lain-lain.

2 Item, Itemsets, dan Rules

2.1 Association Rules

Penjelasan tentang lhs (left hand side), rhs (right hand side), item seperti Pet Food, itemset seperti {Gula, Pet Food} dan rule seperti {Pet Food} => {Sirup}, dan lain-lain; tonton video di link berikut.

2.2 Kesimpulan

Penjelasan konsep dari gambar di bawah ini:

  • Item adalah produk tunggal yang terdapat dalam suatu transaksi. Contoh: Pet Food, Sirup, Gula, dan Teh Celup.
  • Itemset adalah kombinasi satu atau lebih item yang terdapat dalam satu transaksi. Contoh: {Pet Food}, {Gula, Pet Food}, {Sirup}, dan lain-lain.
  • Rule adalah pernyataan hubungan antar Itemset. Biasanya dapat diformulasikan menjadi “Jika membeli itemset A, maka akan membeli itemset B”. Contoh: {Pet Food} => {Sirup}, {Pet Food, Teh Celup} => {Sirup}, dan lain-lain.

3 Item dan Transaction

3.1 Membaca File Sebagai Dataframe

Import file dataset:

transaksi_tabular <- read.csv("data_transaksi.txt", sep = "\t")

print(transaksi_tabular)
##    Kode.Transaksi      Item
## 1             #01 Teh Celup
## 2             #01     Sirup
## 3             #01  Pet Food
## 4             #02 Teh Celup
## 5             #02      Gula
## 6             #03     Sirup
## 7             #03  Pet Food
## 8             #04 Teh Celup
## 9             #04     Sirup
## 10            #05 Teh Celup
## 11            #05     Sirup
## 12            #05      Gula
## 13            #06 Teh Celup
## 14            #06  Pet Food
## 15            #07 Teh Celup
## 16            #07     Sirup
## 17            #07  Pet Food
## 18            #08 Teh Celup
## 19            #09 Teh Celup
## 20            #09      Gula
## 21            #10     Sirup
## 22            #10  Pet Food
## 23            #10      Gula

4 Membaca File Sebagai Transaction

Import file dataset dengan tipe data transactions:

read.transactions(file = "data_transaksi.txt",
                  format = "single",
                  sep = "\t",
                  cols = c(1,2),
                  skip = 1)
## transactions in sparse format with
##  10 transactions (rows) and
##  4 items (columns)

Penjelasan dari baris kode diatas

  • File: Parameter lokasi file yang bisa berasal dari url di web satau lokal. Pada contoh ini dibaca file data_transaksi.txt
  • data_transaksi.txt: lokasi dan nama file dataset. Jika lokasi file dan aplikasi R terdapat di komputer lokal Anda, maka gantilah dengan lokasi file di lokal. Misalkan c:_transaksi.txt
  • format: Format bisa “single” atau “basket”. “single” artinya tiap item transaksi dituliskan terpisah baris demi baris, dan ini cocok dengan format dari file yang digunakan. “basket” artinya seluruh item per transaksi ditulis per baris.
  • sep: separator character atau karakter pemisah antar kolom, untuk file ini karakter pemisahnya adalah tab atau dalam notasi di R ditulis dengan ".
  • cols: indeks dari kolom-kolom yang digunakan. Untuk format single maka kolom harus dua saja, kolom pertama adalah kode transaksi sedangkan kolom kedua menunjukkan item transaksi. Penulisan c(1,2) pada contoh kita artinya kolom pertama dan kedua yang kita gunakan.
  • skip: jumlah baris yang dilewati sebelum mulai membaca data. Untuk dataset kita, baris pertama adalah header dan tidak diperlukan, jadi kita masukkan 1 sebagai input.

Penjelasan dari output kode diatas:

  • transactions in sparse format: Ini artinya transaksi dalam bentuk sparse (tersebar). Ini mungkin akan lebih jelas ketika divisualiasikan dalam bentuk matriks.
  • 10 transactions (rows): dataset kita secara total memiliki 10 transaksi. Ada informasi rows atau baris disini, ini bukan berarti data kita ada 10 baris di file yang digunakan. Karena pada kenyataannya, file memiliki 23 baris data / distinct.
  • 4 items (columns): dataset secara total memiliki 4 item unik.

4.1 Menampilkan Daftar Item Transaksi

Item-item yang terdapat pada objek transactions dapat dilihat pada komponen itemInfo dengan didahului aksesor @ , jadi ditulis @iteminfo. Ini bermanfaat untuk melihat daftar unik item yang terdapat pada data transaksi yang sedang dianalisa.

transaksi@itemInfo
##      labels
## 1      Gula
## 2  Pet Food
## 3     Sirup
## 4 Teh Celup

4.2 Menampilkan Daftar Kode Transaksi

Sepuluh transaksi yang telah dibaca oleh read.transactions dapat dilihat detil kode-kodenya dengan menggunakan komponen itemsetInfo dengan aksesor @ , atau lengkapnya ditulis dengan @itemsetInfo. Daftar ini bisa bermanfaat sebagai basis untuk menganalisa atau melakukan validasi dengan data yang ada pada sistem ritel.

transaksi@itemsetInfo
##    transactionID
## 1            #01
## 2            #02
## 3            #03
## 4            #04
## 5            #05
## 6            #06
## 7            #07
## 8            #08
## 9            #09
## 10           #10

4.3 Tampilan Transaksi Dalam Bentuk Matrix

Ada kalanya kita ingin melihat sebaran item pada keseluruhan transaksi. Dengan menggunakan daftar output berupa teks akan terasa sangat panjang. Sebagai salah satu solusinya, bisa dengan menampilkan sebaran ini dalam bentuk matrix dua dimensi, dimana baris matrix urutan item dan pada kolom adalah item transaksi.

Matrix dari objek transaction dapat dilihat dari komponen data menggunakan aksesor @ , ditulis lengkap sebagai @data. Menyambung praktek sebelumnya, maka objek matrix pada variable transaksi ditulis sebagai berikut.

transaksi@data
## 4 x 10 sparse Matrix of class "ngCMatrix"
##                         
## [1,] . | . . | . . . | |
## [2,] | . | . . | | . . |
## [3,] | . | | | . | . . |
## [4,] | | . | | | | | | .

Penjelasan dari output baris kode diatas:

  • 4 x 10 : artinya terdapat 4 item dan 10 transaksi.
  • [1,] s/d [4,] : artinya index yang mewakili tiap item dalam transaksi.
  • Simbol tanda titik . menunjukkan item tidak ada di transaksi.
  • Simbol garis lurus | menunjukkan bahwa item ada di transaksi.

Kali ini garis-garis pada transaksi item ke-1 (Gula) yaitu [1,], bahwa ada transaksi di baris 2, 5, 9, dan 10. Cek dengan baris kode ini:

transaksi@itemInfo
##      labels
## 1      Gula
## 2  Pet Food
## 3     Sirup
## 4 Teh Celup

Terlihat bahwa baris ke-1 satu adalah gula. Maka dicek, di baris mana saja ada transaksi gula.

4.4 Item Frequency

Mengetahui item dengan jumlah kemunculannnya pada keseluruhan transaksi. Informasi ini disebut sebagai item frequency.

Untuk menghasilkan informasi ini kita gunakan fungsi itemFrequency dengan input objek transaction, dan hasilnya berupa named vector atau vektor yang bisa diakses dengan nama.

itemFrequency(transaksi)
##      Gula  Pet Food     Sirup Teh Celup 
##       0.4       0.5       0.6       0.8

Hasil diatas menunjukkan bahwa frekuensi kemunculan Gula adalah 0.4 atau 40 persen dari porsi seluruh transaksi yang ada, Pet Food menempati 50 persen, dan seterusnya.

Lalu bagaimana jika bukan persentase yang ingin kita tampilkan, tapi jumlah item dalam angka sebenarnya?

Tentunya bisa dilakukan. Caranya adalah menambahkan parameter type=“absolute” ke dalam fungsi itemFrequency() sebagai berikut:

itemFrequency(transaksi, type = "absolute")
##      Gula  Pet Food     Sirup Teh Celup 
##         4         5         6         8

Hasil diatas artinya Gula memiliki kemunculan 4 kali dari seluruh transaksi yang ada, Pet Food muncul sebanyak 5 kali, Sirup sebanyak 6 kali, dan Teh Celup sebanyak 8 kali.

Fungsi itemFrequency ini sangat penting untuk membantu kita menganalisa transaksi yang lebih kompleks dimana item yang terlibat lebih banyak dan transaksi yang terjadi lebih besar dari contoh kita saat ini.

4.5 Statistik Top 3

Statistik sederhana untuk menjawab pertanyaaan seperti “Mana 3 item yang memiliki jumlah terbanyak di seluruh transaksi?” tidak bisa langsung dilakukan dengan satu fungsi di R, tapi perlu penggabungan beberapa perintah dimana salah satunya adalah fungsi sort.

data_item <- itemFrequency(transaksi, type = "absolute")

#Melakukan sorting pada data_item
data_item <- sort(data_item, decreasing = T)

#Mengambil 3 item pertama, atau bisa dengan data_item[1:3]
head(data_item, 3)
## Teh Celup     Sirup  Pet Food 
##         8         6         5
#Konversi data_item menjadi data frame dengan kolom Nama_Produk dan Jumlah.
data_item <- data.frame("Nama Produk" = names(data_item),
                        "Jumlah" = data_item,
                        row.names = NULL)

print(data_item)
##   Nama.Produk Jumlah
## 1   Teh Celup      8
## 2       Sirup      6
## 3    Pet Food      5
## 4        Gula      4

Penjelasan dari fungsi data.frame() diatas:

  • data.frame: fungsi untuk membuat suatu data frame.
  • “Nama Produk” <- names(data_item): adalah nama kolom pertama (“Nama Produk”) yang diisi dengan nama atau label dari vector data_item (Teh Celup, Sirup, Pet Food)
  • “Jumlah” <- data_item: adalah nama kolom kedua (“Jumlah”) yang diisi dengan nilai-nilai vektor data_item (8, 6, 5)
  • row.names = NULL: artinya tidak memerlukan label pada tiap baris data frame

4.6 Output Statistik Top 3 Sebagai File

Disini akan dipraktekkan bagaimana membuat file output untuk statistik top 3.

Dari hasil sebelumnya, kita sudah mendapatkan statistik top 3 dari jumlah item terbanyak dalam bentuk data frame. Ini bisa kita tuliskan langsung menggunakan fungsi write.csv, selengkapnya adalah sebagai berikut:

write.csv(data_item, file = "top3_item_retail.txt", eol = "\r\n")

Disini kita menulis variable data_item ke dalam file bernama “top_3_item.retail.txt” yang diisikan ke dalam parameter file. Terdapat tambahan parameter eol = “”, yang berguna untuk menghasilkan file yang bisa ditampilkan di Windows dengan baik.

Gambar isi dari file top3_item_retail.txt:

Note: file .txt akan tersimpan di folder yang sama dengan lokasi file R.

4.7 Grafik Item Frequency

Selain tampilan transaksi dalam bentuk matriks, kita bisa juga melihat distribusi transaksi dari tiap item dalam bentuk grafik dengan menggunakan fungsi itemFrequencyPlot.

Perintahnya sederhana, seperti terlihat pada contoh berikut dimana kita plot distribusi dari dataset kita;

itemFrequencyPlot(transaksi)

Terlihat bahwa item Teh Celup paling laku dan Gula paling sedikit transaksinya.

5 Itemset dan Rules

Pada bagian ini, “Item, Itemset and Rules” telah dijelaskan dengan gamblang mengenai apa yang dimaksud dengan item, itemset yang terdiri dari beberapa item, dan rules yang menjelaskan hubungan antar itemset yang terdiri dari lhs (left hand side) dan rhs (right hand side).

Kita akan masuk ke inti dari algoritma apriori, yaitu bagaimana menghasilkan dan mengelola kombinasi itemset dan rules yang besar dengan R. Tentunya masih menggunakan dataset sederhana yang sudah kita perkenalkan dari awal.

5.1 Melihat Itemset per Transaksi dengan Inspect

Tiap transaksi terdiri atas beberapa item atau itemset. Pada praktek sebelumnya, kita baru melihat visualisasi dan sebaran matrix dari tiap transaksi namun masih sulit dicerna.

Untuk melihat notasi itemset yang lebih baik dan mudah dimengerti kita bisa menggunakan fungsi inspect().

Penggunaan function ini juga sederhana. Seperti terlihat pada contoh berikut dimana kita inspeksi variabe; transaksi kita.

inspect(transaksi)
##      items                      transactionID
## [1]  {Pet Food,Sirup,Teh Celup} #01          
## [2]  {Gula,Teh Celup}           #02          
## [3]  {Pet Food,Sirup}           #03          
## [4]  {Sirup,Teh Celup}          #04          
## [5]  {Gula,Sirup,Teh Celup}     #05          
## [6]  {Pet Food,Teh Celup}       #06          
## [7]  {Pet Food,Sirup,Teh Celup} #07          
## [8]  {Teh Celup}                #08          
## [9]  {Gula,Teh Celup}           #09          
## [10] {Gula,Pet Food,Sirup}      #10

Tersebut merupakan daftar itemset dari sepuluh transaksi kita. Kolom items berisi item-item yang terjadi pada transaksi, dan transactionID berisi kode transaksi. Sebagai contoh, pada kode transaksi #01 terdapat itemset yang terdiri dari Pet Food, Sirup dan Teh Celup.

Format penulisan tiap itemset terdiri dari notasi kurung kurawal pembuka dan penutup, yang di dalamnya terdapat daftar item yang dipisahkan tanda koma untuk tiap itemnya.

5.2 Menghasilkan Rules dengan Apriori

Rule adalah formula yang menyatakan kombinasi dari dua itemset. Satu itemset ada di bagian kiri rule (left hand side) dan satunya di bagian kanan (right hand side).

# Menghasilkan associaton rules
apriori(transaksi)
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [3 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
## set of 3 rules

Banyak sekali informasi dari output yang dihasilkan. Namun untuk saat ini, perhatikan baris terakhir dimana tertulis “set of 3 rules”. Ini artinya dengan fungsi apriori ini, kita mendapatkan tiga rules.

5.3 Melihat Rules dengan Fungsi Inspect

Hasil eksekusi apriori berupa rules sudah disimpan dalam variable bernama “mba”. Jadi untuk menampilkan isi rules pada variabel ini kita gunakan perintah berikut.

# Melihat isi dari rules dengan menggunakan fungsi inspect
inspect(mba)
##     items                      support transIdenticalToItemsets count
## [1] {Gula,Pet Food}            0.1     0.0                      1    
## [2] {Gula,Sirup}               0.2     0.0                      2    
## [3] {Gula,Teh Celup}           0.3     0.2                      3    
## [4] {Pet Food,Sirup}           0.4     0.1                      4    
## [5] {Pet Food,Teh Celup}       0.3     0.1                      3    
## [6] {Sirup,Teh Celup}          0.4     0.1                      4    
## [7] {Gula,Pet Food,Sirup}      0.1     0.1                      1    
## [8] {Gula,Sirup,Teh Celup}     0.1     0.1                      1    
## [9] {Pet Food,Sirup,Teh Celup} 0.2     0.2                      2

Terlihat kalau variable mba menyimpan tiga rules dengan kolom-kolom berikut:

  • lhs: itemset di bagian kiri (left hand side)
  • rhs: itemset di bagian kanan (right hand side)
  • support, confidence dan lift: metrik-metrik yang digunakan untuk menilai kualitas dari rule. Umumnya semakin besar semakin baik. Detil dari metrik-metrik ini akan dibahas selanjutnya.

Kalau fokus kita kembali ke itemset lhs dan rhs untuk product packaging, terlihat rule kedua yaitu {Pet Food} => {Sirup} cukup menarik.

Kenapa bisa dikatakan menarik?

Karena support 0.4 menunjukkan bahwa kombinasi ini terdapat di 40 persen poulasi - berarti 4 dari 10 transaksi untuk dataset kita. Nilai lift juga di atas 1, yang artinya rule ini memiliki asosiasi tinggi antar itemset yang terdapat di rule ini.

Sedangkan {} => {Teh Celup} tidak menarik karena hanya berisi satu item. Rule sisanya, {Gula, Peta Food} = > {Sirup} terlalu unik - ini ditunjukkan dengan support 0.1 (10%) yang artinya hanya terdapat di 1 dari 10 transaksi.

Apa makna dari rule jika ingin kita aplikasikan?

Artinya ada beberapa opsi action item yang bisa kita lakukan:

  • rekomendasikan kepada setiap pelanggan yang membeli Pet Food untuk membeli Sirup.
  • rak display Pet Food dan Sirup bisa didekatkan.
  • Pet Food dan Sirup dipaketkan bersama dan dijual dengan harga khusus.

5.4 Filter RHS

Dari hasil inspect objek mba yang bertipe association rules di praktek sebelumnya, kita sekarang mengerti bahwa objek tersebut mengandung banyak informasi termasuk itemset yang terdapat di left hand side dan right hand side.

Ini penting untuk bisnis, misalkan untuk inventory. Kita ingin menjawab, adakah item yang kurang laku sebelumnya ada di dalam itemset dari rules yang dihasilkan oleh apriori? Jika ada, mungkin saya bisa paketkan bersama sehingga kemungkinan besar terjual lebih banyak.

Untuk melakukan ini kita akan melakukan filter atau subsetting dari rules. Banyak cara, salah satunya adalah dengan menggunakan gabungan function inspect, subset dan operator %in% dengan format berikut:

inspect(subset(rules, rhs %in% teks_atau_vector_teks_yang_mewakili_item))

Kita langsung contohkan saja dengan kasus kita. Misalkan kita ingin mengambil rules yang kolom rhs-nya mengandung Sirup, maka perintahnya adalah sebagai berikut.

mba <- apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
# Filter rhs dengan item "Sirup" dan tampilkan
inspect(subset(mba, rhs %in% "Sirup"))
##     lhs                     rhs     support confidence coverage lift      count
## [1] {}                   => {Sirup} 0.6     0.6000000  1.0      1.0000000 6    
## [2] {Gula}               => {Sirup} 0.2     0.5000000  0.4      0.8333333 2    
## [3] {Pet Food}           => {Sirup} 0.4     0.8000000  0.5      1.3333333 4    
## [4] {Teh Celup}          => {Sirup} 0.4     0.5000000  0.8      0.8333333 4    
## [5] {Gula,Pet Food}      => {Sirup} 0.1     1.0000000  0.1      1.6666667 1    
## [6] {Pet Food,Teh Celup} => {Sirup} 0.2     0.6666667  0.3      1.1111111 2

5.5 Filter LHS

Contoh untuk memfilter bagian kiri atau left hand side;

mba <- apriori(transaksi)
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [3 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(subset(mba, lhs %in% "Gula"))
##     lhs                rhs     support confidence coverage lift     count
## [1] {Gula,Pet Food} => {Sirup} 0.1     1          0.1      1.666667 1

5.6 Filter LHS dan RHS (1)

Kita sebenarnya bisa melakukan filter untuk kedua sisi dengan menggunakan operator “&” untuk AND dan operator “|” untuk OR.

Berikut adalah contoh perintah inspect untuk filter lhs dengan item Pet Food dan rhs dengan item Sirup.

inspect(subset(mba, lhs %in% "Pet Food" & rhs %in% "Sirup"))
##     lhs                rhs     support confidence coverage lift     count
## [1] {Pet Food}      => {Sirup} 0.4     0.8        0.5      1.333333 4    
## [2] {Gula,Pet Food} => {Sirup} 0.1     1.0        0.1      1.666667 1

5.7 Kesimpulan

Pada latihan sebelumnya. “Item, Itemset dan Rules” telah dijelaskan dengan gamblang mengenai apa yang dimaksud dengan item, itemset yang terdiri dari beberapa item, dan rules yang menjelaskan hubungan antar itemset yang terdiri dari lhs (left hand side) dan rhs (right hand side).

6 Scoring and Evaluation: Support, Confidence, and Lift

6.1 Menghasilkan Rules dengan Parameter Support dan Confidence

Kita menghasilkan tiga rules dengan function apriori secara default* tanpa parameter apapun. Padahal sebenarnya kita bisa memasukkan parameter tambahan berupa support dan confidence.

Tanpa parameter tambahan tersebut, maka nilai minimum support adalah 0.1 dan minimum confidence adalah 0.8 sebagai filter dari fungsi “apriori”.

Berikut adalah perintah untuk menghasilkan kembali association rules dengan function apriori, tapi kali ini dengan tambahan parameter minimum support dan confidence masing-masing bernilai 0.1 dan 0.5.

Berikut contohnya:

apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
## set of 16 rules

Baris kode diatas menghasilkan 16 rules dengan tingkat support minimum 0.1 dan minimum confidence 0.5.

Untuk melihat rules apa saja yang terdapat di dalam 16 rules tersebut, maka kita harus menggunakan fungsi inspect(), bisa dengan menyimpan association rules ke dalam variabel atau langsung dengan menggunakan fungsi,

inspect(apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5)))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
##      lhs                     rhs         support confidence coverage lift     
## [1]  {}                   => {Pet Food}  0.5     0.5000000  1.0      1.0000000
## [2]  {}                   => {Sirup}     0.6     0.6000000  1.0      1.0000000
## [3]  {}                   => {Teh Celup} 0.8     0.8000000  1.0      1.0000000
## [4]  {Gula}               => {Sirup}     0.2     0.5000000  0.4      0.8333333
## [5]  {Gula}               => {Teh Celup} 0.3     0.7500000  0.4      0.9375000
## [6]  {Pet Food}           => {Sirup}     0.4     0.8000000  0.5      1.3333333
## [7]  {Sirup}              => {Pet Food}  0.4     0.6666667  0.6      1.3333333
## [8]  {Pet Food}           => {Teh Celup} 0.3     0.6000000  0.5      0.7500000
## [9]  {Sirup}              => {Teh Celup} 0.4     0.6666667  0.6      0.8333333
## [10] {Teh Celup}          => {Sirup}     0.4     0.5000000  0.8      0.8333333
## [11] {Gula,Pet Food}      => {Sirup}     0.1     1.0000000  0.1      1.6666667
## [12] {Gula,Sirup}         => {Pet Food}  0.1     0.5000000  0.2      1.0000000
## [13] {Gula,Sirup}         => {Teh Celup} 0.1     0.5000000  0.2      0.6250000
## [14] {Pet Food,Sirup}     => {Teh Celup} 0.2     0.5000000  0.4      0.6250000
## [15] {Pet Food,Teh Celup} => {Sirup}     0.2     0.6666667  0.3      1.1111111
## [16] {Sirup,Teh Celup}    => {Pet Food}  0.2     0.5000000  0.4      1.0000000
##      count
## [1]  5    
## [2]  6    
## [3]  8    
## [4]  2    
## [5]  3    
## [6]  4    
## [7]  4    
## [8]  3    
## [9]  4    
## [10] 4    
## [11] 1    
## [12] 1    
## [13] 1    
## [14] 2    
## [15] 2    
## [16] 2

6.2 Filter LHS dan RHS (2)

Dengan 16 rules yang dihasilkan, kita bisa memiliki lebih banyak pilihan untuk melakukan filter lhs dan rhs seperti yang telah ditunjukkan bagian (1) diatas.

Fungsi “subset” di bawah ini berguna untuk melakukan filter berdasarkan lhs atau rhs yang memiliki item Teh Celup.

inspect(subset(mba, lhs %in% "Teh Celup" | rhs %in% "Teh Celup"))
##     lhs    rhs         support confidence coverage lift count
## [1] {}  => {Teh Celup} 0.8     0.8        1        1    8

Terdapat 9 rules sebagai hasil filter dan jika kita gunakan informasi support, confidence dan lift… maka kandidat yang bagus mungkin hanya rule ke 8 dimana nilai lift lebih dari 1 ({Pet Food, Teh Celup} => {Sirup}).

6.3 Filter Berdasarkan Lift

Kita bisa melakukan filter terhadap metrik kualitas dari association rules: support, confidence dan lift dengan function subset. Function yang sama untuk melakukan filter terhadap lhs dan rhs.

Bedanya adalah karena angka, maka untuk ketiga metrik tersebut kita gunakan operator perbandingan angka.

Sebagai contoh, untuk melakukan filter terhadap objek mba dengan kondisi berikut:

  • lhs atau rhs memiliki Teh Celup
  • lift di atas 1

maka perintahnya adalah sebagai berikut:

subset(mba, (lhs %in% "Teh Celup" | rhs %in% "Teh Celup") & lift > 1)
## set of 0 rules

Perhatikan untuk ekspresi lhs dan rhs ditutup dengan kurung sebelum digabungkan dengan kondisi lift.

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(subset(mba, (lhs %in% "Teh Celup" | rhs %in% "Teh Celup") & lift > 1))
##     lhs                     rhs     support confidence coverage lift     count
## [1] {Pet Food,Teh Celup} => {Sirup} 0.2     0.6666667  0.3      1.111111 2

6.4 Rekomendasi - Filter dengan %ain%

Operator %in% yang sebelumnya kita gunakan sudah efektif. Namun operator ini tidak cocok jika kita ingin melakukan filter itemset dengan logika AND. Artinya seluruh item harus muncul dalam itemset yang terpilih. Untuk keperluan tersebut, gunakan operator %ain%.

Contoh subset yang menggunakan “%ain%” adalah sebagai berikut:

subset(mba, (lhs %ain% c("Pet Food", "Gula")))
## set of 1 rules

Dan ekspresi inilah menjadi kunci untuk membuat rekomendasi.

mba <- apriori(transaksi,parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(subset(mba, (lhs %ain% c("Pet Food", "Gula"))))
##     lhs                rhs     support confidence coverage lift     count
## [1] {Gula,Pet Food} => {Sirup} 0.1     1          0.1      1.666667 1

6.5 Visualisasi Rules dengan Graph

Sejauh ini Anda telah menghasilkan rules dan mengerti bagaimana metrik kualitas dapat digunakan sebagai basis pemilihan rule.

Namun ketika item semakin banyak, maka proses memilih berdasarkan angka-angka saja cukup merepotkan. Kadangkala visualisasi bisa sangat membantu analisa di proses ini.

Jenis visualisasi cukup banyak, namun kita akan gunakan visualisasi bertipe graph yang terdapat pada package arulesViz – suatu package dengan visualisasi khusus untuk association rules.

Berikut adalah contoh visualisasi yang kita hasilkan dari rules yang telah kita filter dengan lift di atas nilai 1.1:

Lingkaran disini adalah titik pertemuan (asosiasi) dari item-item yang ada, dimana terdapat tanda panah sebagai garis penghubungnya. Tiap Item disini berupa teks.

Besarnya bulatan menunjukkan popularitas, dan intensitas warna menunjukkan lift. Terlihat disini Gula ke Sirup, dan Pet Food ke Sirup memiliki lift yang relatif tinggi tapi supportnya tidak terlalu besar.

library(arules)
library(arulesViz)
## Loading required package: grid
transaksi <- read.transactions(file = "data_transaksi.txt",
                               format = "single", 
                               sep = "\t",
                               cols = c(1,2),
                               skip = 1)

mba <- apriori(transaksi, parameter = list(supp = 0.1, confidence = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5     0.1      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 1 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4 item(s), 10 transaction(s)] done [0.00s].
## sorting and recoding items ... [4 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
plot(subset(mba, lift > 1.1), method = "graph")

Grafik di atas dihasilkan oleh fungsi baris plot().

Perhatikan fungsi plot ini merupakan pengembangan dari package “arules”. Metode graph menunjukkan bahwa plot ini harus menghasilkan visualisasi dengan tipe jaringan. Ada banyak method yang bisa digunakan, lebih lengkapnya bisa baca di sini.

6.6 Kesimpulan

Dengan rangkaian praktek yang telah dilakukan sejauh ini, kita telah menyelesaikan dasar penggunaan algoritma apriori untuk membantu di bidang retail.

Sepanjang praktek ini juga telah mendapatkan beberapa keterampilan hal berikut:

  • persiapan data transaksi, dengan membaca file dalam bentuk csv dalam format data.frame dan transaction.
  • menganalisa statistik yang terkait dengan item dan itemset.
  • menghasilkan rule dan mencari itemset terbaik di rule - ini menjadi model untuk paket produk yang baik.

Tiga keterampilan penting ini siap menjadi modal sebagai data scientist untuk berkontribusi meningkatkan omset penjualan di perusahaan ritel.