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.
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
Library pendukung
#Exploratory Data Analysis
library(tidyverse)
#Algoritma
library(arules)
library(arulesViz)
#Tampilan
library(RColorBrewer)
library(plotly)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"
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.
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:
60% dari seluruh transaksi menunjukkan bahwa popok dibeli bersamaan dengan bir
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.
Tahap ini digunakan untuk membantu pengguna dalam memahami pola transaksi yang muncul dengan dibantu oleh grafik visual.
Terdapat beberapa pilihan tampilan:
Interactive Scatter-plot
Individual Rule Representation
#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
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")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")Dari penjelasan sederhana tersebut di atas, diharapkan pembaca dapat memahami pemanfaatan Market Basket Analysis beserta cara penerapannya.
Semoga bermanfaat
Terima kasih
References:
https://en.wikipedia.org/wiki/Sparse_matrix
https://cran.r-project.org/web/packages/arulesViz/vignettes/arulesViz.pdf