Project ini adalah salah satu project yang terdapat di DQLab dan merupakan bagian dari proses pembelajaran saya di platform DQLab. DQLab adalah salah satu platform kursus data science di Indonesia. Mentor dalam project ini adalah Xeratic.
Website DQLab: https://academy.dqlab.id/
DQLab.id Fashion adalah sebuah toko fashion yang menjual berbagai produk seperti jeans, kemeja, kosmetik, dan lain-lain. Walaupun cukup berkembang, namun dengan semakin banyaknya kompetitor dan banyak produk yang stoknya masih banyak tentunya membuat khawatir Pak Agus, manajer DQLab.id Fashion.
Salah satu solusi adalah membuat paket yang inovatif. Dimana produk yang sebelumnya tidak terlalu laku tapi punya pangsa pasar malah bisa dipaketkan dan laku.
Anda sebagai seorang data scientist, akan ditugaskan membantu Pak Agus untuk mengidentifikasi paket produk yang menarik untuk dipaketkan sehingga akhirnya bisa meningkatkan keuntungan dan loyalitas para pelanggan DQLab.id Fashion. Dan untuk wewujudkan ini, Anda akan menggunakan R dan algoritma aproriari dari paket arules di sepanjang project ini.
Untuk memulai project ini, Pak Agus meminta Pak Charlie, data engineer dari DQLab.id Fashion memberikan data transaksi 3 bulan kepada Anda dalam bentuk format TSV (Tab Separated Value) dengan nama transaksi_dqlab_retail.tsv dengan jumlah baris 33,669 baris data (3,450 kode transaksi).
Untuk menyelesaikan project, maka kita akan mengetikkan code yang perlu di-submit untuk dicek jawabannya benar atau salah. Berbeda dengan course, setiap code yang di-submit akan otomatis disimpan dan dimunculkan kondisi code terakhir setiap kali Anda buka soal terkait.
Project ini terdiri dari 3 soal, yaitu:
Cobalah jalankan code yang sudah ada pada code editor berikut di mana file dataset dibaca dan kemudian langsung ditulis menggunakan function write dari package arules.
library(arules)
## Loading required package: Matrix
##
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
transaksi_tabular <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)
write(transaksi_tabular, file="test_project_retail_1.txt", sep=",")
Tahap pertama sebenarnya yang diinginkan oleh Pak Agus adalah melihat apakah Anda mampu memberikan info top 10 dari dataset transaksi yang diberikan.
Buatlah script R untuk menghasilkan daftar tersebut, dan hasilnya disimpan ke dalam file top10_item_retail.txt
Gunakan dataset transaksi_dqlab_retail.tsv pada saat membaca data.
library(arules)
transaksi <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)
data_item <- itemFrequency(transaksi, type="absolute")
data_item <- sort(data_item, decreasing = TRUE)
data_item <- data_item[1:10]
data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=data_item, row.names=NULL)
print(data_item)
## Nama.Produk 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
write.csv(data_item, file="top10_item_retail.txt")
Tahap berikutnya adalah Anda harus bisa memberikan informasi bottom 10 dari dataset transaksi yang diberikan.
Tahap pertama sebenarnya yang diinginkan oleh Pak Agus adalah melihat apakah Anda mampu memberikan info top 10 dari dataset transaksi yang diberikan.
Buatlah script R untuk menghasilkan daftar tersebut, dan hasilnya disimpan ke dalam file bottom10_item_retail.txt.
Gunakan dataset transaksi_dqlab_retail.tsv pada saat membaca data.
library(arules)
nama_file <- "https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv"
transaksi_tabular <- read.transactions(file=nama_file, format="single", sep="\t", cols=c(1,2), skip=1)
itemurut <- sort(itemFrequency(transaksi_tabular, type="absolute"), decreasing = FALSE)[1:10]
sorteditem <- data.frame("Nama Produk"=names(itemurut), Jumlah=itemurut, row.names=NULL)
sorteditem
## Nama.Produk 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
write.csv(sorteditem, file="bottom10_item_retail.txt")
Setelah yakin Anda dapat melakukannya Pak Agus ingin Anda mengirimkan file yang berisi daftar 10 paket kombinasi produk yang paling “menarik”.
Anda pertamanya bingung, apa sih definisi menarik versi Pak Agus ini. Setelah wawancara intensif, ternyata pengertiannya adalah sebagai berikut:
Memiliki asosiasi atau hubungan erat. Kombinasi produk minimal 2 item, dan maksimum 3 item. Kombinasi produk itu muncul setidaknya 10 dari dari seluruh transaksi. Memiliki tingkat confidence minimal 50 persen. Buatlah script R untuk menghasilkan daftar tersebut dan hasilnya disimpan ke dalam file kombinasi_retail.txt. Namun untuk menulis hasil dari rules yang akan tampak seperti di bawah ini, Anda tidak perlu melakukan konversi rules menjadi data.frame. Gunakan langsung fungsi write dengan syntax berikut:
write(variable_untuk_rules, file=“nama_file_yang_diinginkan.txt”)
Gunakan dataset transaksi_dqlab_retail.tsv pada saat membaca data.
library(arules)
nama_file <- "https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv"
transaksi_tabular <- read.transactions(file=nama_file, format="single", sep="\t", cols=c(1,2), skip=1)
apriori_rules <- apriori(transaksi_tabular,
parameter=list(supp=10/length(transaksi_tabular), conf=0.5, minlen=2, maxlen=3))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.002898551 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: 10
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[69 item(s), 3450 transaction(s)] done [0.00s].
## sorting and recoding items ... [68 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3
## Warning in apriori(transaksi_tabular, parameter = list(supp = 10/
## length(transaksi_tabular), : Mining stopped (maxlen reached). Only patterns up
## to a length of 3 returned!
## done [0.01s].
## writing ... [4637 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
apriori_rules <- head(sort(apriori_rules, by='lift', decreasing = T),n=10)
inspect(apriori_rules)
## lhs rhs support confidence coverage lift count
## [1] {Tas Makeup,
## Tas Pinggang Wanita} => {Baju Renang Anak Perempuan} 0.010434783 0.8780488 0.011884058 24.42958 36
## [2] {Tas Makeup,
## Tas Travel} => {Baju Renang Anak Perempuan} 0.010144928 0.8139535 0.012463768 22.64629 35
## [3] {Tas Makeup,
## Tas Ransel Mini} => {Baju Renang Anak Perempuan} 0.011304348 0.7358491 0.015362319 20.47322 39
## [4] {Sunblock Cream,
## Tas Pinggang Wanita} => {Kuas Makeup } 0.016231884 0.6913580 0.023478261 20.21343 56
## [5] {Baju Renang Anak Perempuan,
## Tas Pinggang Wanita} => {Tas Makeup} 0.010434783 0.8000000 0.013043478 19.57447 36
## [6] {Baju Renang Anak Perempuan,
## Tas Ransel Mini} => {Tas Makeup} 0.011304348 0.7959184 0.014202899 19.47460 39
## [7] {Baju Renang Anak Perempuan,
## Celana Pendek Green/Hijau} => {Tas Makeup} 0.010144928 0.7777778 0.013043478 19.03073 35
## [8] {Tas Makeup,
## Tas Waist Bag} => {Baju Renang Anak Perempuan} 0.004347826 0.6818182 0.006376812 18.96994 15
## [9] {Celana Pendek Green/Hijau,
## Tas Makeup} => {Baju Renang Anak Perempuan} 0.010144928 0.6730769 0.015072464 18.72674 35
## [10] {Dompet Flip Cover,
## Sunblock Cream} => {Kuas Makeup } 0.016231884 0.6292135 0.025797101 18.39650 56
write(apriori_rules, file="kombinasi_retail.txt")
Slow-moving item adalah produk yang pergerakan penjualannya lambat atau kurang cepat. Ini akan bermasalah apabila item produk tersebut masih menumpuk.
Kadang kala item ini belum tentu tidak laku, hanya saja mungkin harganya tidak bagus dan jarang dibutuhkan jika dijual satuan. Nah, jika tidak dijual satuan kita perlu cari asosiasi kuat dari item produk ini dengan produk lain sehingga jika dipaketkan akan menjadi lebih menarik.
Pak Agus juga meyakini hal ini, dan ingin agar Anda membantu mengidentifikasi dua item produk yang menurut dia stoknya masih banyak dan perlu dicari pasangan item untuk pemaketannya.
Dua item produk tersebut adalah “Tas Makeup” dan “Baju Renang Pria Anak-anak”. Pak Agus ingin meminta kombinasi yang bisa dipaketkan dengan kedua produk tersebut.
Masing-masing produk tersebut dikeluarkan 3 rules yang asosiasinya paling kuat, sehingga total ada 6 rules. Persyaratan-persyaratan asosiasi kuat ini masih sama dengan yang telah disebutkan Pak Agus sebelumnya, kecuali tingkat confidence dicoba pada tingkat minimal 0.1.
Buatlah script R untuk menghasilkan daftar tersebut dan hasilnya disimpan ke dalam file kombinasi_retail_slow_moving.txt. Dan untuk menghasilkan file ini, rules tidak usah dikonversi menjadi data frame dan bisa langsung ditulis dengan write seperti syntax berikut.
write(variable_untuk_rules, file=“nama_file_yang_diinginkan.txt”)
Gunakan dataset transaksi_dqlab_retail.tsv pada saat membaca data.
library(arules)
nama_file <- "https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv"
transaksi_tabular <- read.transactions(file=nama_file, format="single", sep="\t", cols=c(1,2), skip=1)
jumlah_transaksi<-length(transaksi_tabular)
jumlah_kemunculan_minimal <- 10
apriori_rules <- apriori(
transaksi_tabular,
parameter= list(supp=jumlah_kemunculan_minimal/jumlah_transaksi,
conf=0.1, minlen=2, maxlen=3))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.1 0.1 1 none FALSE TRUE 5 0.002898551 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: 10
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[69 item(s), 3450 transaction(s)] done [0.00s].
## sorting and recoding items ... [68 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3
## Warning in apriori(transaksi_tabular, parameter = list(supp =
## jumlah_kemunculan_minimal/jumlah_transaksi, : Mining stopped (maxlen reached).
## Only patterns up to a length of 3 returned!
## done [0.01s].
## writing ... [39832 rule(s)] done [0.01s].
## creating S4 object ... done [0.02s].
# Filter
apriori_rules1 <- subset(apriori_rules, lift > 1 & rhs %in% "Tas Makeup")
apriori_rules1 <- sort(apriori_rules1, by='lift', decreasing = T)[1:3]
apriori_rules2 <- subset(apriori_rules, lift > 1 & rhs %in% "Baju Renang Pria Anak-anak")
apriori_rules2 <- sort(apriori_rules2, by='lift', decreasing = T)[1:3]
apriori_rules <- c(apriori_rules1, apriori_rules2)
inspect(apriori_rules)
## lhs rhs support confidence coverage lift count
## [1] {Baju Renang Anak Perempuan,
## Tas Pinggang Wanita} => {Tas Makeup} 0.010434783 0.8000000 0.01304348 19.57447 36
## [2] {Baju Renang Anak Perempuan,
## Tas Ransel Mini} => {Tas Makeup} 0.011304348 0.7959184 0.01420290 19.47460 39
## [3] {Baju Renang Anak Perempuan,
## Celana Pendek Green/Hijau} => {Tas Makeup} 0.010144928 0.7777778 0.01304348 19.03073 35
## [4] {Gembok Koper,
## Tas Waist Bag} => {Baju Renang Pria Anak-anak} 0.004057971 0.2745098 0.01478261 29.59559 14
## [5] {Flat Shoes Ballerina,
## Gembok Koper} => {Baju Renang Pria Anak-anak} 0.004057971 0.1866667 0.02173913 20.12500 14
## [6] {Celana Jeans Sobek Wanita,
## Jeans Jumbo} => {Baju Renang Pria Anak-anak} 0.005507246 0.1210191 0.04550725 13.04737 19
write(apriori_rules,file="kombinasi_retail_slow_moving.txt")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tentang saya, silakan kunjungi: