1 PENDAHULUAN

Dataset kali ini menggunakan dataset DQLab Fashion yang menjual 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 kuatir 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.

Tujuan dari project ini adalah membuat rekomendasi paket produk yang inovatif dan menarik untuk meningkatkan keuntungan.

2 DATA PREPARATION

2.1 Load Package

Pertama yang kita lakukan adalah install library yang dibutuhkan yaitu library arules untuk melakukan analisa data transaksi dan pola transaksinya dan library lainnya

library(arules)
library(arulesViz)
library(colorspace)
library(DT)
  • membaca file dengan salah satu fungsi yang ada di package arules
transaksi <- read.transactions("transaksi dqlab retail/transaksi_dqlab_retail.tsv"
                               , format="single",
                               sep="\t", cols=c(1,2), skip=1)

Kita juga dapat melihat visualisasinya dengan menggunakan histogram

itemFrequencyPlot(transaksi, topN=10, type="absolute") # menampilkan dalam bentuk histogram top 10 transaksi

2.2 Menampilkan Data top 10 transaksi

data_item <- itemFrequency(transaksi, type="absolute") # membuat variabel untuk melihat item yang sering muncul

names(data_item) # melihat nama kolom
##  [1] "Atasan Baju Belang"               "Atasan Kaos Putih"               
##  [3] "Baju Batik Wanita"                "Baju Kaos Anak - Karakter Kartun"
##  [5] "Baju Kaos Anak - Superheroes"     "Baju Kaos Olahraga"              
##  [7] "Baju Kemeja Putih"                "Baju Renang Anak Perempuan"      
##  [9] "Baju Renang Pria Anak-anak"       "Baju Renang Pria Dewasa"         
## [11] "Baju Renang Wanita Dewasa"        "Blouse Denim"                    
## [13] "Celana Jeans Sobek Pria"          "Celana Jeans Sobek Wanita"       
## [15] "Celana Jogger Casual"             "Celana Panjang Format Hitam"     
## [17] "Celana Pendek Casual"             "Celana Pendek Green/Hijau"       
## [19] "Celana Pendek Jeans"              "Celana Tactical "                
## [21] "Cover Koper"                      "Cream Whitening"                 
## [23] "Dompet Card Holder"               "Dompet Flip Cover"               
## [25] "Dompet Kulit Pria"                "Dompet STNK Gantungan"           
## [27] "Dompet Unisex"                    "Flat Shoes Ballerina"            
## [29] "Gembok Koper"                     "Hair and Scalp"                  
## [31] "Hair Dryer"                       "Hair Dye"                        
## [33] "Hair Tonic"                       "Jeans Jumbo"                     
## [35] "Kaos"                             "Koper Fiber"                     
## [37] "Kuas Makeup "                     "Mascara"                         
## [39] "Minyak Rambut"                    "Obat Penumbuh Rambut"            
## [41] "Pelembab"                         "Sepatu Kulit Casual"             
## [43] "Sepatu Sandal Anak"               "Sepatu Sekolah Hitam W"          
## [45] "Sepatu Sport merk Y"              "Sepatu Sport merk Z"             
## [47] "Serum Vitamin"                    "Shampo Anti Dandruff"            
## [49] "Shampo Biasa"                     "Stripe Pants"                    
## [51] "Sunblock Cream"                   "Sweater Top Panjang"             
## [53] "Tali Ban Ikat Pinggang"           "Tali Pinggang Anak"              
## [55] "Tali Pinggang Gesper Pria"        "Tank Top"                        
## [57] "Tas Kosmetik"                     "Tas Kulit Selempang"             
## [59] "Tas Makeup"                       "Tas Multifungsi"                 
## [61] "Tas Pinggang Wanita"              "Tas Ransel Mini"                 
## [63] "Tas Sekolah Anak Laki-laki"       "Tas Sekolah Anak Perempuan"      
## [65] "Tas Tangan"                       "Tas Travel"                      
## [67] "Tas Waist Bag"                    "Wedges Hitam"                    
## [69] "Woman Ripped Jeans "

Kita perlu melihat tipe data pada variable data_item menggunakan “class”

class(data_item)
## [1] "integer"

Dari hasil tersebut kita perlu mengubah tipe datanya menjadi dataframe, tapi sebelumnya kita urutkan terlebih dulu dari yang tertinggi ke terendah

data_item <- sort(data_item, decreasing = TRUE) # mengurutkan variabel dari terkecil atau terendah
data_item <- data_item[1:10]
data_item <- data.frame("Nama Produk"=names(data_item), "Jumlah"=unname(data_item), row.names=NULL)


print(data_item) # melihat isi dari 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

2.3 Menampilkan Data Bottom 10

Top 10 data telah kita dapatkan dan kemudian kita perlu mengetahui bottom 10 dari data transaksi, fungsi yang digunakan masih sama

data_item2 <- itemFrequency(transaksi, type="absolute")
names(data_item2)
##  [1] "Atasan Baju Belang"               "Atasan Kaos Putih"               
##  [3] "Baju Batik Wanita"                "Baju Kaos Anak - Karakter Kartun"
##  [5] "Baju Kaos Anak - Superheroes"     "Baju Kaos Olahraga"              
##  [7] "Baju Kemeja Putih"                "Baju Renang Anak Perempuan"      
##  [9] "Baju Renang Pria Anak-anak"       "Baju Renang Pria Dewasa"         
## [11] "Baju Renang Wanita Dewasa"        "Blouse Denim"                    
## [13] "Celana Jeans Sobek Pria"          "Celana Jeans Sobek Wanita"       
## [15] "Celana Jogger Casual"             "Celana Panjang Format Hitam"     
## [17] "Celana Pendek Casual"             "Celana Pendek Green/Hijau"       
## [19] "Celana Pendek Jeans"              "Celana Tactical "                
## [21] "Cover Koper"                      "Cream Whitening"                 
## [23] "Dompet Card Holder"               "Dompet Flip Cover"               
## [25] "Dompet Kulit Pria"                "Dompet STNK Gantungan"           
## [27] "Dompet Unisex"                    "Flat Shoes Ballerina"            
## [29] "Gembok Koper"                     "Hair and Scalp"                  
## [31] "Hair Dryer"                       "Hair Dye"                        
## [33] "Hair Tonic"                       "Jeans Jumbo"                     
## [35] "Kaos"                             "Koper Fiber"                     
## [37] "Kuas Makeup "                     "Mascara"                         
## [39] "Minyak Rambut"                    "Obat Penumbuh Rambut"            
## [41] "Pelembab"                         "Sepatu Kulit Casual"             
## [43] "Sepatu Sandal Anak"               "Sepatu Sekolah Hitam W"          
## [45] "Sepatu Sport merk Y"              "Sepatu Sport merk Z"             
## [47] "Serum Vitamin"                    "Shampo Anti Dandruff"            
## [49] "Shampo Biasa"                     "Stripe Pants"                    
## [51] "Sunblock Cream"                   "Sweater Top Panjang"             
## [53] "Tali Ban Ikat Pinggang"           "Tali Pinggang Anak"              
## [55] "Tali Pinggang Gesper Pria"        "Tank Top"                        
## [57] "Tas Kosmetik"                     "Tas Kulit Selempang"             
## [59] "Tas Makeup"                       "Tas Multifungsi"                 
## [61] "Tas Pinggang Wanita"              "Tas Ransel Mini"                 
## [63] "Tas Sekolah Anak Laki-laki"       "Tas Sekolah Anak Perempuan"      
## [65] "Tas Tangan"                       "Tas Travel"                      
## [67] "Tas Waist Bag"                    "Wedges Hitam"                    
## [69] "Woman Ripped Jeans "
data_item2 <- sort(data_item2, decreasing = FALSE)
data_item2 <- data_item2[1:10]
data_item2 <- data.frame("Nama Produk"=names(data_item2),
                         "Jumlah"=unname(data_item2),
                         row.names=NULL)

print(data_item2)
##                   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

3 MEMBUAT KOMBINASI PRODUK

3.1 Mendapatkan Kombinasi Produk yang Menarik

Dengan menggunakan fungsi apriori kita akan membuat rekomendasi produk berdasarkan barang yang dibeli secara bersamaan

kombinasi <- apriori(transaksi,
                     parameter=list(supp=10/length(transaksi),
                                    confidence=0.5,
                                    minlen=2, maxlen=3))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime     support
##         0.5    0.1    1 none FALSE            TRUE       5 0.002898551
##  minlen maxlen target  ext
##       2      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].
kombinasi <- head(sort(kombinasi, by="lift",decreasing=TRUE), n=10)

Kita perlu melihat pola aturan dari barang yang terbeli

options(digits = 1)
inspectDT(head(sort(kombinasi, by = "support"),n = 10))

3.2 Mencari Paket Produk

Dari variabel kombinasi dapat kita lihat fungsi nya masih sama dengan sebelumnya dan yang berbeda hanya tingkat confidence minimal 0.1

rules <- apriori(transaksi,
                 parameter=list(supp=10/length(transaksi),
                                minlen=2,maxlen=3,
                                confidence=0.1))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.1    0.1    1 none FALSE            TRUE       5   0.003      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.01s].
## writing ... [39832 rule(s)] done [0.01s].
## creating S4 object  ... done [0.01s].
summary(rules)
## set of 39832 rules
## 
## rule length distribution (lhs + rhs):sizes
##     2     3 
##  2267 37565 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     2.0     3.0     3.0     2.9     3.0     3.0 
## 
## summary of quality measures:
##     support      confidence     coverage        lift        count     
##  Min.   :0.0   Min.   :0.1   Min.   :0.0   Min.   : 0   Min.   :  10  
##  1st Qu.:0.0   1st Qu.:0.2   1st Qu.:0.0   1st Qu.: 1   1st Qu.:  15  
##  Median :0.0   Median :0.2   Median :0.0   Median : 1   Median :  25  
##  Mean   :0.0   Mean   :0.3   Mean   :0.0   Mean   : 1   Mean   :  40  
##  3rd Qu.:0.0   3rd Qu.:0.4   3rd Qu.:0.1   3rd Qu.: 1   3rd Qu.:  45  
##  Max.   :0.3   Max.   :1.0   Max.   :0.6   Max.   :30   Max.   :1091  
## 
## mining info:
##       data ntransactions support confidence
##  transaksi          3450   0.003        0.1
options(digits = 2)
inspectDT(head(sort(rules,by = "support"),n = 10))

Menampilkan scatter plot dari rules yang telah dibuat

plot(rules, 
     control = list(col=sequential_hcl(100)),
     jitter = 0)

3.3 Menentukan Item Slow Moving

Kita mengambil contoh item yang masih banyak stoknya yang kemudian dapat kita pasangkan dengan item lainnya. Item yang akan kita ambil adalah “Tas Makeup” dan “Baju Renang Pria Anak-anak”. Kedua item tersebut kita subset dan pada association rules dimasukkan pada rhs(right hand side)

  • subset “Tas Makeup”
subset1<- subset(rules,rhs %in% "Tas Makeup")
subset1<- head(sort(subset1,by='lift',decreasing=TRUE),n=3)
  • subset “Baju Renang Pria Anak-anak”
subset2<- subset(rules,rhs %in% "Baju Renang Pria Anak-anak")
subset2<- head(sort(subset2,by='lift',decreasing=TRUE),n=3)
  • menggabungkan 2 subset dengan concenate (c)
completeset <- c(subset1,subset2)

options(digits = 2)
inspectDT(head(sort(completeset,by = "support"),n = 10))
  • Visualisasi dengan “graph” untuk melihat kombinasi produk
plot(completeset, method = "graph", interactive = FALSE, shading = NA,
     data = NULL, control =list(engine = "igraph"))

4 KESIMPULAN

  • Tas Makeup yang termasuk slow moving dapat dikombinasikan dengan Baju renang anak perempuan dan Tas Pinggang Wanita.
  • Baju Renang Pria Anak-anak yang termasuk slow moving dapat dikombinasikan dengan Celana Jeans Sobek Wanita dan Jeans Jumbo.
  • Dari rekomendasi tersebut target konsumen dapat disimpulkan adalah Ibu Rumah Tangga sehingga dapat menargetkan promosi ke konsumen yang tepat.