Projek ini akan memnggunakan studi kasus dari 33.000 data transaksi sebuah perusahaan barang-barang konsumsi. Kita diminta untuk menjawab empat pertanyaan di bawah ini
1. 10 Item apa saja yang terlaris?
2. 10 item apa saja yang paling tidak laku?
3. Barang-barang apa yang memiliki hubungan asosiasi terkuat?
4. Paket penjualan seperti apa yang dapat meningkatkan penjualan slow-moving item?
Tugas kali ini sudah menyediakan dataset yang lengkap dan memadai. Dataset tersebut bisa dibaca di : ‘https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv’
Dalam projek ini, kita akan melakukan menyelesaikan dalam dua metode. Meskipun disebut berbeda,yang kita lakukan sebenarnya hanyalah mentranslate data ke tipe transactions dengan 2 cara yang berbeda; untuk penerapan algortime apriori sendiri, tidak akan ada perbedaan. Metode pertama adalah dengan membaca data menggunakan fungsi read.transactions(), dan metode kedua adalah mengoversi dataset melalui binary matrix secara manual.
# dataset dengan read.transactions()
trans_data_direct <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single",sep="\t",cols=c(1,2),skip=1)
# dataset dengan binary matrix
trans_data_binary <- read.csv(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", sep="\t")
trans_data_binary2 <- trans_data_binary %>%
group_by(Kode.Transaksi,Nama.Barang) %>%
mutate(jumlah.barang = n()) %>%
pivot_wider(names_from = Nama.Barang, values_from = jumlah.barang, values_fill = NA)
#Menghilangkan variabel Kode.Transaksi karena sudah tidak diperlukan kembali
trans_data_binary2 <- trans_data_binary2[,-1]
#Konvert seluruh nilai trans_data_binary2 menjadi boolean logika
trans_data_binary2 <- apply(trans_data_binary2,2,as.logical)
# Konvert semua nilai yang NA menjadi FALSE
trans_data_binary2[(is.na(trans_data_binary2))] <- FALSE
# binary matrix sudah jadi
# dari binary matrix ini kemudian kita bisa konversi menjadi data tipe transaksi
trans_data_binary_final <- as(trans_data_binary2,"transactions")
Sekarang kita cek masing-masing data
# Cek data dari direct method
inspect(trans_data_direct[1:5])
## items transactionID
## [1] {Baju Kaos Olahraga,
## Baju Renang Pria Dewasa,
## Baju Renang Wanita Dewasa,
## Celana Jogger Casual,
## Dompet Card Holder,
## Kaos,
## Sepatu Sport merk Z,
## Serum Vitamin,
## Shampo Biasa} #1
## [2] {Baju Batik Wanita,
## Baju Kemeja Putih,
## Celana Jogger Casual,
## Celana Pendek Jeans,
## Dompet Card Holder,
## Dompet STNK Gantungan,
## Flat Shoes Ballerina,
## Hair Dryer,
## Jeans Jumbo,
## Kaos,
## Wedges Hitam} #10
## [3] {Baju Renang Wanita Dewasa,
## Celana Jogger Casual,
## Dompet Card Holder,
## Dompet Flip Cover,
## Hair Dryer,
## Hair Tonic,
## Sepatu Sandal Anak,
## Sepatu Sport merk Y,
## Sepatu Sport merk Z,
## Shampo Biasa,
## Tali Pinggang Anak} #100
## [4] {Baju Batik Wanita,
## Baju Renang Pria Dewasa,
## Celana Jeans Sobek Wanita,
## Celana Pendek Casual,
## Celana Pendek Jeans,
## Flat Shoes Ballerina,
## Kaos,
## Serum Vitamin,
## Shampo Biasa,
## Tali Pinggang Anak,
## Tali Pinggang Gesper Pria} #1000
## [5] {Baju Renang Pria Dewasa,
## Baju Renang Wanita Dewasa,
## Celana Jogger Casual,
## Celana Pendek Green/Hijau,
## Dompet Kulit Pria,
## Hair Dryer,
## Sepatu Sport merk Z,
## Sunblock Cream,
## Tali Pinggang Gesper Pria,
## Tas Sekolah Anak Laki-laki,
## Tas Travel,
## Wedges Hitam} #1001
inspect(trans_data_binary_final[1:5])
## items
## [1] {Kaos,
## Shampo Biasa,
## Sepatu Sport merk Z,
## Serum Vitamin,
## Baju Renang Pria Dewasa,
## Baju Renang Wanita Dewasa,
## Baju Kaos Olahraga,
## Celana Jogger Casual,
## Dompet Card Holder}
## [2] {Shampo Biasa,
## Celana Jeans Sobek Wanita,
## Blouse Denim,
## Baju Batik Wanita,
## Hair and Scalp,
## Minyak Rambut,
## Wedges Hitam,
## Sepatu Sandal Anak,
## Tas Sekolah Anak Perempuan,
## Baju Kemeja Putih,
## Dompet Flip Cover}
## [3] {Shampo Biasa,
## Serum Vitamin,
## Dompet Card Holder,
## Sepatu Sandal Anak,
## Baju Kemeja Putih,
## Hair Tonic,
## Baju Kaos Anak - Superheroes,
## Celana Pendek Casual}
## [4] {Shampo Biasa,
## Serum Vitamin,
## Dompet Card Holder,
## Celana Jeans Sobek Wanita,
## Blouse Denim,
## Baju Batik Wanita,
## Sepatu Sandal Anak,
## Dompet Flip Cover,
## Celana Pendek Casual,
## Jeans Jumbo,
## Celana Pendek Jeans,
## Sepatu Sekolah Hitam W,
## Tas Ransel Mini,
## Dompet Kulit Pria}
## [5] {Shampo Biasa,
## Sepatu Sport merk Z,
## Serum Vitamin,
## Hair Dryer,
## Flat Shoes Ballerina,
## Tas Sekolah Anak Laki-laki,
## Cover Koper,
## Gembok Koper}
Output dari dua pendekatan di atas terdapat sedikit perbadaan, di mana pada ‘trans_data_direct’ kita masih memiliki kolom ‘Transaction.ID’, sedangkan pada ‘trans_data_binary_final’ tidak hanya ada list untuk item.
Jika keduanya memiliki hasil keseluruhan yang sama, kenapa kita perlu repot-repot menjalankan metode binary matrix. Hal ini karena tidak semua data yang kita perolah nantinya sudah siap pakai seperti contoh di atas. kebanyakan kita akan memperoleh data transaksi mentah yang jika di read langsung dengan read.transactions, akan menghasilkan struktur yang kacau. Oleh karena itu, akan lebih baik jika kita punya beberapa metode untuk menghasilkan data transaksi.
Untuk kasus ini sendiri kita juga bisa melakukannya dengan 2 atau lebih metode. Metode yang lebih cepat pertama adalah, menghitungnya dari data class transactions yang sudah kita peroleh. Jangan lupa untuk menyajikannya dalam bentuk dataframe
# Menghitung variabel jumlah.transaksi
jumlah.trans <-sort(itemFrequency(trans_data_direct, type = "absolute"),decreasing = TRUE)[1:10]
# Mendapatkan item
item <- names(jumlah.trans)
top10_direct <- data.frame(item = item, jumlah = jumlah.trans, row.names = NULL)
top10_direct
## item jumlah
## 1 Shampo Biasa 2075
## 2 Serum Vitamin 1685
## 3 Baju Batik Wanita 1312
## 4 Baju Kemeja Putih 1255
## 5 Celana Jogger Casual 1136
## 6 Cover Koper 1086
## 7 Sepatu Sandal Anak 1062
## 8 Tali Pinggang Gesper Pria 1003
## 9 Sepatu Sport merk Z 888
## 10 Wedges Hitam 849
Cara kedua bisa kita gunakan dalam kondisi, misalkan, kita belum mengubah data menjadi tipe transactions, dan kita ingin menganalisa dengan kondisi awal data (dalam kasus ini, tersimpan dalam objek ‘trans_data_binary’)
# Ligat trsuktur data awal
head(trans_data_binary)
## Kode.Transaksi Nama.Barang
## 1 #1 Kaos
## 2 #1 Shampo Biasa
## 3 #1 Sepatu Sport merk Z
## 4 #1 Serum Vitamin
## 5 #1 Baju Renang Pria Dewasa
## 6 #1 Baju Renang Wanita Dewasa
top10_binary <- trans_data_binary %>%
group_by(Nama.Barang) %>%
mutate(Jumlah = n()) %>%
distinct(Jumlah) %>%
arrange(desc(Jumlah)) %>%
head(10)
top10_binary
## # A tibble: 10 x 2
## # Groups: Nama.Barang [10]
## Nama.Barang Jumlah
## <chr> <int>
## 1 Shampo Biasa 2075
## 2 Serum Vitamin 1685
## 3 Baju Batik Wanita 1312
## 4 Baju Kemeja Putih 1255
## 5 Celana Jogger Casual 1136
## 6 Cover Koper 1086
## 7 Sepatu Sandal Anak 1062
## 8 Tali Pinggang Gesper Pria 1003
## 9 Sepatu Sport merk Z 888
## 10 Wedges Hitam 849
Kita bisa melakukan plot untuk memberikan tampilan visual pada nilai di atas
ggplot(top10_binary) +
geom_col(aes(x = reorder(Nama.Barang,-Jumlah),y = Jumlah, fill = Nama.Barang)) +
theme(axis.text.x = element_blank()) +
scale_fill_discrete(breaks=levels(with(top10_binary,reorder(Nama.Barang,-Jumlah)))) +
labs(x = "Nama Barang", y = "Jumlah")
Barang-barang di atas adalah 10 item dengan jumlah transaksi tertinggi. Kita bisa menyimpannya untuk kemudian dijadikan file tersendiri.
write.table(top10_binary, "top10.txt", sep=",")
Untuk tugas ini, kita bisa menggunakan dua pendekatan seperti yang di atas.
# Menemukan 10 item dengan transaksi terendah melalui itemFrequenxy()
jumlah.trans.2 <- sort(itemFrequency(trans_data_direct, type="absolute"))[1:10]
item.2 <- names(jumlah.trans.2)
bottom10_direct <- data.frame(item = item.2, jumlah = jumlah.trans.2, row.names = NULL)
bottom10_direct
## item jumlah
## 1 Celana Jeans Sobek Pria 9
## 2 Tas Kosmetik 11
## 3 Stripe Pants 19
## 4 Pelembab 24
## 5 Tali Ban Ikat Pinggang 27
## 6 Baju Renang Pria Anak-anak 32
## 7 Hair Dye 46
## 8 Atasan Baju Belang 56
## 9 Tas Sekolah Anak Perempuan 71
## 10 Dompet Unisex 75
# Menemukan 10 item dengan transaksi terendah melalui data asli
bottom10 <- trans_data_binary %>%
group_by(Nama.Barang) %>%
mutate(Jumlah = n()) %>%
distinct(Jumlah) %>%
arrange(Jumlah) %>%
head(10)
bottom10
## # A tibble: 10 x 2
## # Groups: Nama.Barang [10]
## Nama.Barang Jumlah
## <chr> <int>
## 1 Celana Jeans Sobek Pria 9
## 2 Tas Kosmetik 11
## 3 Stripe Pants 19
## 4 Pelembab 24
## 5 Tali Ban Ikat Pinggang 27
## 6 Baju Renang Pria Anak-anak 32
## 7 Hair Dye 46
## 8 Atasan Baju Belang 56
## 9 Tas Sekolah Anak Perempuan 71
## 10 Dompet Unisex 75
Seperti pada top10, kita simpan output dari kode ini, dalam file terpisah
write.table(bottom10, "bottom10.txt", sep=",")
Tugas 3 : Menemukan daftar produk dengan hubungan asosiasi yang kuat
Untuk tugas ini, kita anggap saja sedang mencari 10 kombinasi barang dengan asosiasi terkuat.
# Menganalisa asosiasi product
product_asrule <- apriori(trans_data_binary_final, parameter = list(supp = 0.1, conf = 0.2,
minlen = 2, maxlen =3))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.2 0.1 1 none FALSE TRUE 5 0.1 2
## maxlen target ext
## 3 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 345
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[69 item(s), 3450 transaction(s)] done [0.01s].
## sorting and recoding items ... [40 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3
## Warning in apriori(trans_data_binary_final, parameter = list(supp = 0.1, :
## Mining stopped (maxlen reached). Only patterns up to a length of 3 returned!
## done [0.00s].
## writing ... [126 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
inspect(head(product_asrule))
## lhs rhs support confidence coverage
## [1] {Tali Pinggang Anak} => {Serum Vitamin} 0.1037681 0.6884615 0.1507246
## [2] {Serum Vitamin} => {Tali Pinggang Anak} 0.1037681 0.2124629 0.4884058
## [3] {Tas Waist Bag} => {Serum Vitamin} 0.1298551 0.8057554 0.1611594
## [4] {Serum Vitamin} => {Tas Waist Bag} 0.1298551 0.2658754 0.4884058
## [5] {Tas Ransel Mini} => {Shampo Biasa} 0.1037681 0.6392857 0.1623188
## [6] {Tank Top} => {Shampo Biasa} 0.1002899 0.5844595 0.1715942
## lift count
## [1] 1.4096097 358
## [2] 1.4096097 358
## [3] 1.6497662 448
## [4] 1.6497662 448
## [5] 1.0629088 358
## [6] 0.9717519 346
Kita sudah punya rule asosiasi dari data. Sekarang, kita bisa lanjutkan dengan menganalisa kombinasi apa yang memiliki hubungan asosiasi paling tinggi. Indikator yang kita pakai untuk menentukan kekuatan asosiasi adalah nilai ‘lift’ dari masing-masing kombinasi. Karena lift adalah nilai yang menunjukkan peningkatan probabilitas barang di ‘rhs’ akan dibeli jika barang di ‘lhs’ dibeli.
top10_combi <- sort(product_asrule, by = "lift", decreasing = TRUE)[1:10]
inspect(head(top10_combi,10))
## lhs rhs support confidence coverage lift count
## [1] {Shampo Biasa,
## Tali Pinggang Gesper Pria} => {Celana Jeans Sobek Wanita} 0.1052174 0.5500000 0.1913043 2.275180 363
## [2] {Shampo Biasa,
## Celana Jeans Sobek Wanita} => {Tali Pinggang Gesper Pria} 0.1052174 0.5105485 0.2060870 1.756124 363
## [3] {Shampo Biasa,
## Serum Vitamin} => {Sepatu Sandal Anak} 0.1692754 0.5352887 0.3162319 1.738932 584
## [4] {Celana Jeans Sobek Wanita} => {Tali Pinggang Gesper Pria} 0.1182609 0.4892086 0.2417391 1.682722 408
## [5] {Tali Pinggang Gesper Pria} => {Celana Jeans Sobek Wanita} 0.1182609 0.4067797 0.2907246 1.682722 408
## [6] {Serum Vitamin,
## Baju Batik Wanita} => {Sepatu Sandal Anak} 0.1046377 0.5120567 0.2043478 1.663461 361
## [7] {Baju Batik Wanita,
## Sepatu Sandal Anak} => {Serum Vitamin} 0.1046377 0.8058036 0.1298551 1.649865 361
## [8] {Tas Waist Bag} => {Serum Vitamin} 0.1298551 0.8057554 0.1611594 1.649766 448
## [9] {Serum Vitamin} => {Tas Waist Bag} 0.1298551 0.2658754 0.4884058 1.649766 448
## [10] {Shampo Biasa,
## Sepatu Sandal Anak} => {Serum Vitamin} 0.1692754 0.7564767 0.2237681 1.548869 584
write(top10_combi,"top 10 combi.txt", sep = ",")
Dengan aturan atau konstrain yang ada (min support 0.1, min confidence 0.2, minimal panjang item set 2 item, dan maksimal item set 3), kita punya 10 kombinasi atau item set dengan nilai lift tertinggi seperti di atas. Kita bisa bilang nilai lift ini tinggi karena lift > 1.
Untuk memudahkan pemahaman, kita bisa memvisualisasikan hasil apriori di atas.
# load library arulesViz
library(arulesViz)
## Warning: package 'arulesViz' was built under R version 4.1.2
plot(top10_combi, method = "graph")
Hal menarik dari output di atas adalah, kemungkinan besar toko ini memiliki banyak pelanggan dengan karakter remaja wanita yang trendi atau mungkin sedikit tomboy. Bisa kita lihat kuatnya asosiasi antara tali pinggang gesper pria dengan celana jeans sobek wanita. Pelanggan terbanyak lainnya adalah pria/wanita yang sering berpergian ke acara dengan membawa anaknya (dilihat dari asosiasi kuat antara tas waist bag, sepatu sandal anak, dan serum vitamin).
Kita tidak bisa bilang hanya ‘wanita’ saja karena secara ‘count’ baju batik wanita yang mengindikasikan hal tersebut lebih rendah dari kombinasi tas waist bag, serum, dan sepatu sandal anak.
Berdasarkan pada output tersebut, kita bisa mempackage produk sebagai berikut :
Slow-moving product adalah item yang transaksinya jarang, atau dalam kasus toko ini, kita sebut saja tidak terlalu laku. Untuk menemukan kombinasi yang bisa digunakan untuk meningkatkan penjualan item seperti ini, kita bisa tetap menggunakan output dari ‘product asrule’ tapi hanya menampilkan item-item tidak laris, yang terdapat pada objek ‘bottom10’ atau ‘bottom10_direct’
# objek untuk slow moving item
slow_item <- bottom10$Nama.Barang
slow_product_arules <- apriori(trans_data_binary_final, parameter =
list(supp = 0.0001, conf = 0.2),
appearance = list(default="lhs", rhs=slow_item))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.2 0.1 1 none FALSE TRUE 5 1e-04 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 ...[10 item(s)] done [0.00s].
## set transactions ...[69 item(s), 3450 transaction(s)] done [0.01s].
## sorting and recoding items ... [69 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 7
## Warning in apriori(trans_data_binary_final, parameter = list(supp = 1e-04, :
## Mining stopped (time limit reached). Only patterns up to a length of 7 returned!
## done [13.34s].
## writing ... [716047 rule(s)] done [2.19s].
## creating S4 object ... done [2.92s].
inspect(head(slow_product_arules))
## lhs rhs support confidence coverage lift count
## [1] {Woman Ripped Jeans ,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 0.2000000 0.0014492754 62.72727 1
## [2] {Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 0.3333333 0.0008695652 60.52632 1
## [3] {Sepatu Sekolah Hitam W,
## Mascara} => {Stripe Pants} 0.0002898551 0.2000000 0.0014492754 36.31579 1
## [4] {Woman Ripped Jeans ,
## Tas Kulit Selempang} => {Stripe Pants} 0.0002898551 0.2500000 0.0011594203 45.39474 1
## [5] {Sepatu Sekolah Hitam W,
## Tas Kulit Selempang} => {Stripe Pants} 0.0002898551 0.3333333 0.0008695652 60.52632 1
## [6] {Sepatu Kulit Casual,
## Tas Kulit Selempang} => {Stripe Pants} 0.0002898551 0.2500000 0.0011594203 45.39474 1
Kita perlu menulis ulang algoritma apriori untuk memastikan item slow moving bisa menembus parameter support. (di product_arules support minimal 0.1, yang artinya 10 persen dari total transaksi).
Setelah memastikan seluruh produk slow moving sudah masuk dalam algoritma, kita tinggal mencari urutannya berdasar lift.
force_combi <- sort(slow_product_arules, by = "lift", decreasing =TRUE)
Sekarang, jika saya melakukan inspect secara langsung, kita mungkin akan mendapat output yang sedikit rumit, karena tidak tertata secara per item dalam slow_moving
Oleh karena itu, saya akan akan mengispect force combi dengan menggunakan subset, untuk mendapat gambaran kombinasi untuk tiap item dalam slow_moving
# Kombinasi untuk Celana Jeans Sobek Pria
inspect(head(subset(force_combi, rhs %in% "Celana Jeans Sobek Pria")))
## lhs rhs support confidence coverage lift count
## [1] {Baju Renang Pria Dewasa,
## Tas Kulit Selempang,
## Celana Panjang Format Hitam} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
## [2] {Celana Tactical ,
## Tas Kulit Selempang,
## Celana Panjang Format Hitam} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
## [3] {Baju Renang Pria Dewasa,
## Cream Whitening,
## Tas Kulit Selempang} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
## [4] {Cream Whitening,
## Celana Tactical ,
## Tas Kulit Selempang} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
## [5] {Baju Renang Pria Dewasa,
## Celana Tactical ,
## Tas Kulit Selempang} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
## [6] {Baju Renang Pria Dewasa,
## Sweater Top Panjang,
## Celana Panjang Format Hitam} => {Celana Jeans Sobek Pria} 0.0002898551 1 0.0002898551 383.3333 1
# Kombinasi terbaik untuk Pelembab
inspect(head(subset(force_combi, rhs %in% "Pelembab")))
## lhs rhs support confidence coverage lift count
## [1] {Dompet Kulit Pria,
## Woman Ripped Jeans ,
## Tali Pinggang Gesper Pria} => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
## [2] {Hair Tonic,
## Tali Pinggang Anak,
## Sunblock Cream} => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
## [3] {Sepatu Sport merk Z,
## Hair Tonic,
## Sunblock Cream} => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
## [4] {Dompet Card Holder,
## Koper Fiber,
## Obat Penumbuh Rambut} => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
## [5] {Blouse Denim,
## Dompet Kulit Pria,
## Dompet STNK Gantungan,
## Woman Ripped Jeans } => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
## [6] {Dompet Kulit Pria,
## Dompet STNK Gantungan,
## Woman Ripped Jeans ,
## Tas Travel} => {Pelembab} 0.0002898551 1 0.0002898551 143.75 1
inspect(head(subset(force_combi, rhs %in% "Hair Dye")))
## lhs rhs support confidence coverage lift count
## [1] {Minyak Rambut,
## Celana Pendek Jeans,
## Tas Kulit Selempang} => {Hair Dye} 0.0002898551 1 0.0002898551 75 1
## [2] {Baju Renang Wanita Dewasa,
## Gembok Koper,
## Tas Kulit Selempang} => {Hair Dye} 0.0002898551 1 0.0002898551 75 1
## [3] {Tali Pinggang Anak,
## Tas Waist Bag,
## Tas Kulit Selempang} => {Hair Dye} 0.0002898551 1 0.0002898551 75 1
## [4] {Flat Shoes Ballerina,
## Tas Waist Bag,
## Tas Kulit Selempang} => {Hair Dye} 0.0005797101 1 0.0005797101 75 2
## [5] {Woman Ripped Jeans ,
## Tas Waist Bag,
## Tas Multifungsi} => {Hair Dye} 0.0002898551 1 0.0002898551 75 1
## [6] {Tas Ransel Mini,
## Koper Fiber,
## Kuas Makeup } => {Hair Dye} 0.0002898551 1 0.0002898551 75 1
inspect(head(subset(force_combi, rhs %in% "Dompet Unisex")))
## lhs rhs support confidence coverage lift count
## [1] {Woman Ripped Jeans ,
## Tali Pinggang Anak,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
## [2] {Baju Batik Wanita,
## Woman Ripped Jeans ,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
## [3] {Dompet Flip Cover,
## Baju Renang Anak Perempuan,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
## [4] {Celana Pendek Jeans,
## Baju Renang Anak Perempuan,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
## [5] {Wedges Hitam,
## Baju Renang Anak Perempuan,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
## [6] {Sepatu Sandal Anak,
## Baju Renang Anak Perempuan,
## Mascara} => {Dompet Unisex} 0.0002898551 1 0.0002898551 46 1
inspect(head(subset(force_combi, rhs %in% "Tas Kosmetik")))
## lhs rhs support confidence coverage lift count
## [1] {Kaos,
## Woman Ripped Jeans ,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
## [2] {Woman Ripped Jeans ,
## Tas Waist Bag,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
## [3] {Flat Shoes Ballerina,
## Woman Ripped Jeans ,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
## [4] {Hair Dryer,
## Woman Ripped Jeans ,
## Tas Waist Bag} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
## [5] {Kaos,
## Sepatu Sport merk Y,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
## [6] {Kaos,
## Shampo Anti Dandruff,
## Celana Panjang Format Hitam} => {Tas Kosmetik} 0.0002898551 1 0.0002898551 313.6364 1
inspect(head(subset(force_combi, rhs %in% "Stripe Pants")))
## lhs rhs support confidence coverage lift count
## [1] {Woman Ripped Jeans ,
## Sunblock Cream,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
## [2] {Sepatu Sekolah Hitam W,
## Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
## [3] {Flat Shoes Ballerina,
## Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
## [4] {Celana Pendek Casual,
## Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
## [5] {Blouse Denim,
## Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
## [6] {Hair and Scalp,
## Woman Ripped Jeans ,
## Mascara} => {Stripe Pants} 0.0002898551 1 0.0002898551 181.5789 1
inspect(head(subset(force_combi, rhs %in% "Tali Ban Ikat Pinggang")))
## lhs rhs support confidence coverage lift count
## [1] {Kaos,
## Tali Pinggang Anak,
## Tas Kulit Selempang} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
## [2] {Kaos,
## Tas Ransel Mini,
## Tas Kulit Selempang} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
## [3] {Kaos,
## Wedges Hitam,
## Tas Kulit Selempang} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
## [4] {Tali Pinggang Gesper Pria,
## Obat Penumbuh Rambut,
## Sunblock Cream} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
## [5] {Jeans Jumbo,
## Sepatu Sekolah Hitam W,
## Sweater Top Panjang} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
## [6] {Baju Renang Pria Dewasa,
## Tas Pinggang Wanita,
## Koper Fiber} => {Tali Ban Ikat Pinggang} 0.0002898551 1 0.0002898551 127.7778 1
inspect(head(subset(force_combi, rhs %in% "Baju Renang Pria Anak-anak")))
## lhs rhs support confidence coverage lift count
## [1] {Gembok Koper,
## Koper Fiber,
## Mascara} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
## [2] {Koper Fiber,
## Tas Waist Bag,
## Mascara} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
## [3] {Gembok Koper,
## Tas Waist Bag,
## Mascara} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
## [4] {Flat Shoes Ballerina,
## Gembok Koper,
## Mascara} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
## [5] {Jeans Jumbo,
## Flat Shoes Ballerina,
## Tas Kulit Selempang} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
## [6] {Hair Tonic,
## Gembok Koper,
## Koper Fiber} => {Baju Renang Pria Anak-anak} 0.0002898551 1 0.0002898551 107.8125 1
inspect(head(subset(force_combi, rhs %in% "Atasan Baju Belang")))
## lhs rhs support confidence coverage lift count
## [1] {Tas Pinggang Wanita,
## Tas Tangan,
## Obat Penumbuh Rambut} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
## [2] {Tas Ransel Mini,
## Tas Tangan,
## Obat Penumbuh Rambut} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
## [3] {Wedges Hitam,
## Tas Tangan,
## Obat Penumbuh Rambut} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
## [4] {Wedges Hitam,
## Tas Pinggang Wanita,
## Tas Tangan} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
## [5] {Tali Pinggang Anak,
## Tas Makeup,
## Tas Multifungsi} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
## [6] {Tali Pinggang Anak,
## Baju Kaos Anak - Karakter Kartun,
## Tas Makeup} => {Atasan Baju Belang} 0.0002898551 1 0.0002898551 61.60714 1
inspect(head(subset(force_combi, rhs %in% "Tas Sekolah Anak Perempuan")))
## lhs rhs support confidence coverage lift count
## [1] {Dompet Flip Cover,
## Jeans Jumbo,
## Mascara} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
## [2] {Tali Pinggang Anak,
## Tas Tangan,
## Tas Kulit Selempang} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
## [3] {Tas Ransel Mini,
## Tas Tangan,
## Tas Kulit Selempang} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
## [4] {Hair and Scalp,
## Tas Tangan,
## Tas Kulit Selempang} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
## [5] {Hair Dryer,
## Tas Tangan,
## Tas Kulit Selempang} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
## [6] {Sepatu Sport merk Z,
## Tas Tangan,
## Tas Kulit Selempang} => {Tas Sekolah Anak Perempuan} 0.0002898551 1 0.0002898551 48.59155 1
Ada alasan lain, selain untuk memperjelas output apriori per item, kenapa kita melakukan inspect untuk masing-masing slow moving item seperti di atas. Pertama, dengan analisa individual seperti ini, kita bisa benar-benar memastikan upaya packaging product dilakukan pada item yang bisa yang masih bisa ‘diselamatkan’.
Seperti kita lihat, dengan analisa di atas, pengambil keputusan bisa melihat pada nilai liftnya, dan menggunakan judgement berdasarkan nilai tersebut, untuk melihat kelayakan produk. Dari kasus di atas, kita bisa mengambil keputusan bahwa ‘celana jeans sobek pria’, ‘pelembab’, ‘tas kosmetik’, ‘stripe pants’, ‘tali ban ikat pinggang’, dan ‘baju renang pria anak-anak’ mungkin masih layak diperjuangkan dengan langkah pemaketan produk, karena lift nya di atas 100.
Dengan membandingkan antara produk yang paling laris dengan produk yang paling tidak laris, lalu menganalisa asosiasi antar produk menggunakan algoritma apriori, setidaknya ada 5 rekomendasi paket produk yang bisa kita buat untuk meningkatkan penjualan item slow moving. diantaranya :
1. Tali Pinggang Gesper Pria + Celana Jeans Sobek Wanita ---> Pelembab
2. Sepatu Sport Merk Z --- > Pelembab
3. Tali Pinggang Gesper Pria + Tali Ban Ikat Pinggang
4. Wedges Hitam + Tali Ban Ikat Pinggang
5. Wedges Hitam + atasan baju belang
Rekomendasi ini dibuat berdasarkan nilai lift dalam asosiasi antar item, yang kemudian dicocokkan mana item top 10 yang memiliki asosiasi kuat dengan item di bottom 10.