Background

Pernahkah kalian bayangkan, ketika toko langganan anda mengadakan promosi bundling produk yang SESUAI dengan karakter berbelanja anda?

Atau, pernahkah kalian bayangkan dari sudut pandang pemilik toko, ketika anda dapat menemukan pola berbelanja pelanggan sehingga anda dapat memenuhi keinginan mereka dan meningkatkan penjualan baik dari sisi kuantitas maupun revenue? dan keuntungan lain seperti dapat menjual produk yang kurang laku dengan dibuat paket penjualan dengan barang yang terlaris?

Semua dapat dilakukan dengan menggunakan Market Basket Analysis yang akan membantu pelanggan mendapatkan promo yang cocok dan pemilik toko untuk meningkatkan penjualan mereka.

Preface

Pendahuluan

Market Basket Analysis (MBA) adalah teknik pengambilan dan pengolahan data yang digunakan untuk mengungkap pola perilaku belanja setiap pelanggan untuk kemudian menentukan penanganan seperti apa yang sesuai dengan karakter berbelanja mereka.

Analisa ini juga dapat membantu penjualan dengan melakukan cross-selling (pada contoh membundling produk yang kurang laku/ beda jenis dengan produk terlaris) dan upselling (meningkatkan revenue per transaksi dengan membuat bundling promo yang sesuai)

Seperti contoh anda suka membeli kopi bersamaan dengan keripik kentang, yang kemudian dengan diadakannya promo bundling, anda akan mendapatkan kedua produk tersebut dengan harga yang lebih murah, pasti tentunya anda akan lebih semangat untuk membeli produk tersebut.

MBA menggunakan Association Rule Mining (ARM) dalam melakukan analisa, dimana dapat melihat korelasi antar dua atau lebih produk yang dibeli, mencari pola yang sering muncul pada data transaksi dan informasi lainnya terkait popularitas sebuah produk. Association Rule Mining ditemukan pada ritel, clustering dan classification.

Dengan melakukannya ARM, kita akan mendapatkan beberapa insight dan strategi yaitu:

  • Menyesuaikan penataan produk di toko berdasarkan tren penjualan

  • Desain katalog

  • Cross-Selling pada toko online

  • Mengetahui produk yang sedang laris dibeli

  • Penulisan email yang lebih personal dengan add-on sales

Algoritma dibalik Market Basket Analysis adalah APRIORI

Libraries

Library pendukung

#Exploratory Data Analysis
library(tidyverse)

#Algoritma
library(arules)
library(arulesViz)

#Tampilan
library(RColorBrewer)
library(plotly)

Dataset

Sampel data pembelian

data<-list(c("roti","susu","daging","buah"),
           c("roti","popok","bir","daging"),
           c("sosis","bir","popok"),
           c("payung","bir","popok","sambal"),
           c("payung","bir","jus","buah"))

Terdapat 5 detail transaksi yang jika diperhatikan, pembelian popok bersamaan dengan bir muncul pada 3 transaksi, pembelian roti bersamaan dengan susu juga muncul pada 3 transaksi yang menjadia kedua pembelian ini menjadi hubungan yang sering muncul.

Kemudian, diubah menjadi data transaksi

data.tran <- as(data,"transactions")
data.tran
## transactions in sparse format with
##  5 transactions (rows) and
##  10 items (columns)

terlihat data sebanyak 5 transaksi dan terdiri dari 10 barang.

class(data.tran)
## [1] "transactions"
## attr(,"package")
## [1] "arules"

Item Frequency Plot

Digunakan untuk memeriksa daftar produk yang paling sering dibeli

itemFrequencyPlot(data.tran, topN = 10, type="absolute", col=brewer.pal(8,'Pastel2'), main="10 Highest Sold Product")

Dari plot diatas menunjukkan bahwa produk bir dan popok adalah produk-produk yang memiliki angka penjualan tertinggi pada setiap transaksinya,

jika ingin meningkatkan penjualan produk jus/ sambal/ sosis atau susu maka dapat dibuat paket penjualan dengan produk popok.

Generating Rules

Langkah selanjutnya adalah membuat rule dengan menggunakan algoritma APRIORI. Fungsi apriori() didapat dari library arules.

data.ap<-apriori(data.tran)
## 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: 0 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[10 item(s), 5 transaction(s)] done [0.00s].
## sorting and recoding items ... [10 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [70 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(head(sort(data.ap,by="support"),n=10))
##      lhs         rhs      support confidence coverage lift     count
## [1]  {}       => {bir}    0.8     0.8        1.0      1.000000 4    
## [2]  {popok}  => {bir}    0.6     1.0        0.6      1.250000 3    
## [3]  {daging} => {roti}   0.4     1.0        0.4      2.500000 2    
## [4]  {roti}   => {daging} 0.4     1.0        0.4      2.500000 2    
## [5]  {payung} => {bir}    0.4     1.0        0.4      1.250000 2    
## [6]  {sosis}  => {popok}  0.2     1.0        0.2      1.666667 1    
## [7]  {sosis}  => {bir}    0.2     1.0        0.2      1.250000 1    
## [8]  {susu}   => {daging} 0.2     1.0        0.2      2.500000 1    
## [9]  {susu}   => {roti}   0.2     1.0        0.2      2.500000 1    
## [10] {susu}   => {buah}   0.2     1.0        0.2      2.500000 1

Keterangan:

  • lhs = Left Hand Side

  • rhs = Right Hand Side

Sehingga cara membacanya adalah, Produk awal (lhs) yang dibeli kemudian dibeli lagi produk selanjutnya (rhs)

Contoh nomor 2:

  1. 60% dari seluruh transaksi menunjukkan bahwa popok dibeli bersamaan dengan bir

  2. 100% pelanggan yang membeli popok juga membeli bir

Untuk Lift,

  • Jika lift berada pada angka 1 maka Produk A dan B adalah independent dan tidak ada Association Rules yang dapat dibentuk darinya.

  • Jika lift > 1, maka produk A dan B memiliki ketergantungan satu sama lain dengan tingkatan berdasarkan besaran angka yang terbentuk.

  • Jika lift < 1, maka kehadiran produk A memiliki efek negatif terhadap produk B.

Pada beberapa kondisi, kita ingin melihat sebaliknya, seperti contoh, apa yang pelanggan beli sebelum membeli daging, dapat kita lakukan dengan cara:

daging.association.rules <- apriori(data.tran, appearance = list(default="lhs",rhs="daging"))
## 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: 0 
## 
## set item appearances ...[1 item(s)] done [0.00s].
## set transactions ...[10 item(s), 5 transaction(s)] done [0.00s].
## sorting and recoding items ... [10 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [9 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
inspect(daging.association.rules)
##     lhs                   rhs      support confidence coverage lift count
## [1] {susu}             => {daging} 0.2     1          0.2      2.5  1    
## [2] {roti}             => {daging} 0.4     1          0.4      2.5  2    
## [3] {buah, susu}       => {daging} 0.2     1          0.2      2.5  1    
## [4] {roti, susu}       => {daging} 0.2     1          0.2      2.5  1    
## [5] {buah, roti}       => {daging} 0.2     1          0.2      2.5  1    
## [6] {popok, roti}      => {daging} 0.2     1          0.2      2.5  1    
## [7] {bir, roti}        => {daging} 0.2     1          0.2      2.5  1    
## [8] {buah, roti, susu} => {daging} 0.2     1          0.2      2.5  1    
## [9] {bir, popok, roti} => {daging} 0.2     1          0.2      2.5  1

Terlihat beberapa produk yang muncul sebelum pelanggan membeli daging, diantaranya:

  • Untuk produk satuan: Susu, Roti

  • Untuk bundling produk: Buah + Susu, Roti + Susu, Buah + Roti dan seterusnya

Penjual kemudian dapat menemukan karakter pembeli dan menyesuaikan promo yang mereka inginkan.

Visualiasi Association Rules

Tahap ini digunakan untuk membantu pengguna dalam memahami pola transaksi yang muncul dengan dibantu oleh grafik visual.

Terdapat beberapa pilihan tampilan:

  1. Interactive Scatter-plot

  2. Individual Rule Representation

Interactive Scatter-plot

#Plot SubRules
plot(daging.association.rules, method="scatterplot", engine = "plotly")
## To reduce overplotting, jitter is added! Use jitter = 0 to prevent jitter.

Terbaca bahwa, rerata support berada pada angka 20% dengan tingkat confidence yang beragam

Graph-Based Visualizations

Teknik ini memvisualisasikan association rules dengan menggunakan simpul (simbol lingkaran) dan sudut, dimana simpul tersebut diberi nama produk dan bundling atau rules direpresentasikan sebagai simpul ke-dua. Antar produk terhubung dengan rules berdasarkan arah anak panah. Pada sisi ekor anak panah adalah produk di LHS, sedangkan tujuan dari anak panah adalah produk RHS. Ukuran dan warna dari simpul merepresentasikan pengukuran kekuatan hubungan

Metode ini baik untuk memvisualisasikan rules, tapi akan terlihat padat ketika jumlah rules yang terbentuk seakin meningkat, oleh karena itu ada baiknya difilter jumlahnya berdasarkan kebutuhan.

plot(daging.association.rules, method = "graph",  engine = "htmlwidget")

Individual Rule Representation

Representasi ini dapat disebut juga sebagai Parallel Coordinates Plot. Ini bertujuan untuk memvisualisasikan produk apa yang cenderung dibeli setelah produk awal dibeli sehingga terbentuk sales (atau transaksi)

RHS adalah informasi produk yang kemungkinan dibeli juga oleh pelanggan.

plot(daging.association.rules, method="paracoord")

Kesimpulan

Dari penjelasan sederhana tersebut di atas, diharapkan pembaca dapat memahami pemanfaatan Market Basket Analysis beserta cara penerapannya.

Semoga bermanfaat

Terima kasih


References:

https://datascienceplus.com/a-gentle-introduction-on-market-basket-analysis%E2%80%8A-%E2%80%8Aassociation-rules/

https://en.wikipedia.org/wiki/Sparse_matrix

https://cran.r-project.org/web/packages/arulesViz/vignettes/arulesViz.pdf