Project Machine Learning for Retail with R: Product Packaging

Nicholas Razali

Deskripsi

Project ini merupakan project yang terdapat pada website DQLab dan merupakan salah satu bagian dari proses pembelajaran saya di DQLab.

Website DQLab: https://academy.dqlab.id/

Tujuan

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

Tujuan dari projek ini adalah untuk mengidentifikasi paket produk yang menarik untuk dipaketkan sehingga akhirnya bisa meningkatkan keuntungan dan loyalitas para pelanggan DQLab.id Fashion.

Data

Data yang digunakan merupakan data transaksi selama 3 bulan dengan jumlah baris 33,669 baris data (3,450 kode transaksi). Data transaksi ini telah dirapikan untuk Anda dengan hanya mengandung dua variabel, yaitu Kode transaksi dan Nama barang.

Analisis Data

Melakukan pemanggilan library yang digunakan

library(arules)

Berikut adalah data yang digunakan

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)
head(transaksi_tabular)
## transactions in sparse format with
##  6 transactions (rows) and
##  69 items (columns)

Menampilkan top 10 dari data transaksi

Tahap pertama yang diinginkan adalah melihat informasi mengenai top 10 dari dataset transaksi yang diberikan.

retail <- itemFrequency(transaksi_tabular, type="absolute")
retail <- sort(retail, decreasing = TRUE)
retail <- retail[1:10]
retail <- data.frame("Nama.Produk" = names(retail), "Jumlah" = retail, row.names = NULL)
retail
##                  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

Apabila hasil informasi ingin disimpan ke dalam file txt maka dapat dilakukan dengan

write.csv(retail, file="top10_item_retail.txt")

Menampilkan bottom 10 dari data transaksi

Tahap berikutnya adalah melihat informasi bottom 10 dari dataset transaksi yang diberikan.

retail <- itemFrequency(transaksi_tabular, type="absolute")
retail <- sort(retail, decreasing = FALSE)
retail <- retail[1:10]
retail <- data.frame("Nama.Produk" = names(retail), "Jumlah" = retail, row.names = NULL)

Apabila hasil informasi ingin disimpan ke dalam file txt maka dapat dilakukan dengan

write.csv(retail, file="bottom10_item_retail.txt")

Mendapatkan kombinasi produk yang menarik

Tahap selanjutnya adalah membuat kombinasi produk yang menarik, yaitu produk yang memiliki syarat 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.
mba <- apriori(data=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 done [0.00s].
## writing ... [4637 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
mba <- sort(mba, decreasing=TRUE, by="lift")[1:10]
inspect(mba)
##      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

Apabila hasil informasi ingin disimpan ke dalam file txt maka dapat dilakukan dengan

write(mba, file="kombinasi_retail.txt")

Mencari Paket Produk yang bisa dipasangkan dengan Item Slow-Moving

Tahap terkakhir adalah mencari paket produk untuk dipasangkan dengan Item Slow-Moving. Slow-moving item adalah produk yang pergerakan penjualannya lambat atau kurang cepat. Hal ini akan bermasalah apabila item produk tersebut masih menumpuk.

Pada data ini produk yang termasuk sebagai item slow-moving yaitu “Tas Makeup” dan “Baju Renang Pria Anak-anak”. Masing-masing produk tersebut akan dikeluarkan 3 rules yang asosiasinya paling kuat, sehingga total ada 6 rules.

Persyaratan-persyaratan asosiasi kuat ini masih sama dengan yang telah disebutkan sebelumnya, kecuali tingkat confidence dicoba pada tingkat minimal 0.1.’

mba <- apriori(data=transaksi_tabular, parameter=list(supp=10/length(transaksi_tabular), 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.01s].
## sorting and recoding items ... [68 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [39832 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
rules1 <- subset(mba, rhs %in% "Tas Makeup")
rules1 <- sort(rules1, decreasing=TRUE, by="lift")[1:3]
inspect(rules1)
##     lhs                              rhs             support confidence   coverage     lift count
## [1] {Baju Renang Anak Perempuan,                                                                 
##      Tas Pinggang Wanita}         => {Tas Makeup} 0.01043478  0.8000000 0.01304348 19.57447    36
## [2] {Baju Renang Anak Perempuan,                                                                 
##      Tas Ransel Mini}             => {Tas Makeup} 0.01130435  0.7959184 0.01420290 19.47460    39
## [3] {Baju Renang Anak Perempuan,                                                                 
##      Celana Pendek Green/Hijau}   => {Tas Makeup} 0.01014493  0.7777778 0.01304348 19.03073    35
rules2 <- subset(mba, rhs %in% "Baju Renang Pria Anak-anak")
rules2 <- sort(rules2, decreasing=TRUE, by="lift")[1:3]
inspect(rules2)
##     lhs                             rhs                              support confidence   coverage     lift count
## [1] {Gembok Koper,                                                                                               
##      Tas Waist Bag}              => {Baju Renang Pria Anak-anak} 0.004057971  0.2745098 0.01478261 29.59559    14
## [2] {Flat Shoes Ballerina,                                                                                       
##      Gembok Koper}               => {Baju Renang Pria Anak-anak} 0.004057971  0.1866667 0.02173913 20.12500    14
## [3] {Celana Jeans Sobek Wanita,                                                                                  
##      Jeans Jumbo}                => {Baju Renang Pria Anak-anak} 0.005507246  0.1210191 0.04550725 13.04737    19
rules <- c(rules1, rules2)
inspect(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

Apabila hasil informasi ingin disimpan ke dalam file txt maka dapat dilakukan dengan

write(rules, file="kombinasi_retail_slow_moving.txt")