Ketika sedang berbelanja di suatu retail konsumen yang membeli suatu produk seringkali ditawarkan produk lainnya untuk dibeli juga oleh penjual, kegiatan tersebut disebut cross selling. Ada banyak keuntungan ketika melakukan cross selling seperti meningkatkan penjualan, meningkatkan tingkat kepuasan konsumen, serta bisa mengenalkan produk baru kepada konsumen. Ada berbagai macam cara untuk mengetahui barang apa yang ditawarkan kepada consumen salah satunya adalah market basket analysis.
Market Basket Analysis atau sering juga disebut dengan Association Rules merupakan kegiatan mencari aturan (rules) asosiasi yang menunjukkan hubungan antar item dalam sebuah transaksi. Sebagai contoh seorang konsumen membeli roti tawar, ketika konsumen membeli roti ada kecendrungan membeli selai juga, atau ketika membei membeli sikat gigi ada kecendrungan membeli pasta giginya. Pola-pola data transaksi ini sangat bermanfaat dalam industri retail seperti penetapan diskon produk, promo, penjualan dalam bentuk paket, rekomendasi produk, serta penentuan lokasi item produk.
library(dplyr) # data wrangling
library(arules) # Association Rules
library(arulesViz) # visualisasiData yang digunakan merupakan data transaksi retail yang diambil dari UCI Machine Learning. Dari Data set ini kita akan mencari tau barang apa yang akan direkomendasikan kepada customer berdasarkan produk yang dia beli.
retail <- read.csv("data/OnlineRetail.csv")
str(retail)## 'data.frame': 541909 obs. of 8 variables:
## $ InvoiceNo : chr "536365" "536365" "536365" "536365" ...
## $ StockCode : chr "85123A" "71053" "84406B" "84029G" ...
## $ Description: chr "white hanging heart t-light holder" "white metal lantern" "cream cupid hearts coat hanger" "knitted union flag hot water bottle" ...
## $ Quantity : int 6 6 8 6 6 2 6 6 6 32 ...
## $ InvoiceDate: chr "12/1/2010 8:26" "12/1/2010 8:26" "12/1/2010 8:26" "12/1/2010 8:26" ...
## $ UnitPrice : num 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
## $ CustomerID : int 17850 17850 17850 17850 17850 17850 17850 17850 17850 13047 ...
## $ Country : chr "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
Dari output di atas, bisa diketahui bahwa terdapat 541 ribu observasi dengan 8 kolom/variabel. Berikut penjelasan untuk setiap kolom :
Bila di cek pada data,terdapat nilai negatif pada barang yang terjual (Quantity), hal ini menujukkan bahwa barang tersebut dibeli dalam kondisi promo. Kita tidak ingin menggunakan data tersebut karena kita tidak ingin melihat pengaruh diskon pada rules yang terbentuk nanti.
summary(retail$Quantity)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -80995.00 1.00 3.00 9.55 10.00 80995.00
Proses selanjutnya kita bisa mengambil data yang memiliki nilai Quantity diatas 0 dan mengambil kolom InvoiceNo, Description saja.
retail_clean <- retail %>%
filter(Quantity > 0) %>%
select(InvoiceNo, Description)
head(retail_clean)Sebelum membuat association rules data perlu dilakukan transaformasi dari yang semula data frame menjadi data transaksi. Format data transaksi akan menggabungkan beberapa barang pada ID transaksi yang sama.
retail_transaction <- split(retail_clean$Description, retail_clean$InvoiceNo) %>%
as("transactions")
retail_transaction %>%
head(3) %>%
inspect()## items transactionID
## [1] {cream cupid hearts coat hanger,
## glass star frosted t-light holder,
## knitted union flag hot water bottle,
## red woolly hottie white heart.,
## set 7 babushka nesting boxes,
## white hanging heart t-light holder,
## white metal lantern} 536365
## [2] {hand warmer red polka dot,
## hand warmer union jack} 536366
## [3] {assorted colour bird ornament,
## box of 6 assorted colour teaspoons,
## box of vintage alphabet blocks,
## box of vintage jigsaw blocks ,
## doormat new england,
## feltcraft princess charlotte doll,
## home building block word,
## ivory knitted mug cosy ,
## love building block word,
## poppy's playhouse bedroom ,
## poppy's playhouse kitchen,
## recipe box with metal heart} 536367
Untuk membuat association rules kita perlu mendefinisikan batasan nilai support dan nilai confidence. support 1% (0.01) artinya item atau kombinasi item harus ada minimal 1% transaksi dari total keseluruhan transaksi. sedangkan confidence 70% berarti seberapa besarnya kemungkinan seseorang akan membeli item B jika terdapat item A. Range nilai support dan confidence adalah dari 1 hingga 0, semakin tinggi nilai tersebut maka probabilitas rules yang didapatkan semakin tinggi, namun jumalh rules yang didapatkan semakin sedikit. Nilai ini bisa diatur sesuai kebutuhan.
retail_rules <- apriori(data = retail_transaction, parameter = list(supp = 0.01, conf = 0.7))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.7 0.1 1 none FALSE TRUE 5 0.01 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: 207
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[4073 item(s), 20728 transaction(s)] done [0.29s].
## sorting and recoding items ... [781 item(s)] done [0.01s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 2 3 4 5 done [0.05s].
## writing ... [218 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
Fungsi apriori di atas menghasilkan 218 rules,dibawah ini merupakan 5 rules teratas berdasarkan nilai confidence tertinggi
rules_conf <- head(retail_rules, 5, by = "confidence")
inspect(rules_conf)## lhs rhs support confidence coverage lift count
## [1] {jam making set printed,
## suki shoulder bag} => {dotcom postage} 0.01008298 0.9587156 0.01051717 28.06816 209
## [2] {regency tea plate pink,
## regency tea plate roses } => {regency tea plate green } 0.01230220 0.9479554 0.01297761 51.57275 255
## [3] {herb marker thyme} => {herb marker rosemary} 0.01066191 0.9324895 0.01143381 80.53601 221
## [4] {wooden heart christmas scandinavian,
## wooden tree christmas scandinavian} => {wooden star christmas scandinavian} 0.01114435 0.9277108 0.01201274 37.55779 231
## [5] {herb marker rosemary} => {herb marker thyme} 0.01066191 0.9208333 0.01157854 80.53601 221
Nilai Confidence yang tinggi menunjukkan seberapa besar peluang membeli item lainnya jika kita telah membeli suatu item. Rules dengan Confidence tertinggi adalah {jam making set printed, suki shoulder bag} => {dotcom postage}, artinya ketika seorang pelanggan membeli 2 item tersebut, kemungkinan besar pelanggan juga akan membeli dotcom postage karena dari seluruh transaksi yang berisi 2 item pertama yang dibeli, 0.958 atau 95.8% pembelian juga terdapat item dotcom postage.
Dari rules yang dihasilkan dapat dilihat juga hubungan antar rules dengan menggunakan graph atau network, dengan tiap lingkaran atau titik adalah rules dan panah sebagai hubungan antara rules dengan item barangnya.
plot(retail_rules,
method = "graph",
measure = "lift",
engine = "htmlwidget" # membuat grafik interaktif
)Pada grafik yang dihasilkan di atas, terdapat beberapa cluster atau kelompok rules yang saling berinteraksi satu sama lain. Salah satu yang terbesar adalah cluster yang berisi charlotte bag yang saling terhubung. Cluster lainnya yang berisi banyak rules yang saling terkoneksi adalah clusterherb marker.
Kita ambil contoh cluster charlotte bag, yang hanya terdiri dari 5 item/produk, yakni woodland charlotte bag, strawberry charlotte bag, red retrospot charlotte bag, charlotte bag pink polkadot, charlotte bag suki design. Berdasarkan interaksi 5 item tersebut, dihasilkan puluhan rules/aturan yang berbeda. Apabila diperhatikan ke 5 item tersebut saling terhubung, maka hal ini menunjukkan adanya hubungan keterkaitan antara rules satu dengan lainnya. Oleh karena kita meyakini adanya hubungan keterkaitan yang kuat antara item satu dengan lainnya di dalam cluster tersebut, maka kita bisa membuat sebuah promo dalam bentuk Bundle Package; yakni paket lengkap yang berisi 5 item tersebut.