email             :
ntraktir          : https://trakteer.id/contekansial
nyawer          : https://saweria.co/contekansial
github            : https://bit.ly/origin-AL-GitHub
youtube         : https://bit.ly/origin-AL-youtube



1 Machine Learning for Retail

1.1 Membuat Penawaran Terbaik Berikutnya untuk Mendorong Pendapatan dan Loyalitas

AL. 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 pemilik toko.

Salah satu solusi adalah membuat paket yang inovatif. Dimana produk yang sebelumnya tidak terlalu laku tapi punya pangsa pasar malah bisa dipaketkan dan laku.

Kamu sebagai seorang data scientist, ditugaskan membantu mengidentifikasi paket produk yang menarik untuk dipaketkan sehingga akhirnya bisa meningkatkan keuntungan dan loyalitas para pelanggan AL. Fashion. Kamu akan menggunakan R dan algoritma apriori dari paket arules di sepanjang project ini.

1.2 Dataset Transaksi Penjualan AL. Fashion

Untuk memulai project ini, data engineer dari AL. Fashion memberikan data transaksi 3 bulan kepada kamu dalam bentuk format TSV (Tab Separated Value) dengan nama transaksi_dqlab_retail.tsv dengan jumlah baris 33,669 baris data (3,450 kode transaksi).

Berikut adalah tampilan datanya.

Kode Transaksi  Nama Barang
#1  Kaos
#1  Shampo Biasa
#1  Sepatu Sport merk Z
#1  Serum Vitamin
#1  Baju Renang Pria Dewasa
#1  Baju Renang Wanita Dewasa
#1  Baju Kaos Olahraga
#1  Celana Jogger Casual
#1  Dompet Card Holder
#2  Celana Jeans Sobek Wanita
#2  Blouse Denim
#2  Baju Batik Wanita
#2  Hair and Scalp
#2  Shampo Biasa
#2  Minyak Rambut
#2  Wedges Hitam
#2  Sepatu Sandal Anak
#2  Tas Sekolah Anak Perempuan
#2  Baju Kemeja Putih
#2  Dompet Flip Cover
#3  Shampo Biasa
#3  Hair Tonic

Data transaksi ini telah dirapikan untuk kamu dengan hanya mengandung dua variabel, yaitu:

  • Kode Transaksi
  • Nama Barang

Variabel lain seperti harga, tanggal, jumlah pembelian, dan lain-lain tidak dimasukkan dengan alasan dua variabel tersebut sudah cukup.

1.3 Petunjuk Penyelesaian Project

Project ini terdiri dari 3 permasalahan, yaitu:

  • Mendapatkan insight top 10 dan bottom 10 dari produk yang terjual.
  • Mendapatkan daftar seluruh kombinasi paket produk dengan korelasi yang kuat.
  • Mendapatkan daftar seluruh kombinasi paket produk dengan item tertentu.

Tiap permasalahan memerlukan input dataset yang telah dijelaskan pada sub-bab sebelumnya. Setelah diproses maka kamu perlu menuliskan dalam nama file sesuai petunjuk.

Coba code dimana file dataset dibaca dan kemudian langsung ditulis menggunakan fuction write dan package arules

Begini :

#set library yang dibutuhkan
library("arules")
library("Matrix")

#membuat variabel dataset
transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#mengubah ke file.txt
write(transaksi.AL, file="test_project_retail.txt", sep=",")

1.4 Output Awal: Statistik Top 10

Tahap pertama sebenarnya yang diinginkan oleh pemilik toko adalah melihat apakah kamu 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 !

Hint: Gunakan kombinasi function itemFrequency, names, sort, dan data.frame.

Begini :

#cara 1

#set library yang dibutuhkan
library("arules")
library("Matrix")

#membuat variabel dataset
transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#menggunakan fungsi sort dan itemFrequency
top.10 <- sort(itemFrequency(transaksi.AL,type='absolute'), decreasing=TRUE)[1:10]

#menggunakan fungsi data.frame dan names
top.10 <- data.frame("Nama.Produk"=names(top.10), "Jumlah"=top.10, row.names=NULL)

#menulis file
write.csv(top.10,file="top10 item retail.txt")
# cara 2

library("arules")
library("Matrix")

item <- sort(
    itemFrequency(
        read.transactions(
            file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", 
            format="single", 
            sep="\t", 
            cols=c(1,2), 
            skip=1
        ), 
    type="absolute"), 
    decreasing = TRUE
)[1:10]
    
write.csv(
    data.frame(
        "Nama.Produk"=names(item), 
        "Jumlah"=item, 
        row.names=NULL
    ), 
    file="top10 item retail 2.txt"
)

1.5 Output Awal: Statistik Bottom 10

Tahap berikutnya adalah kamu harus bisa memberikan informasi bottom 10 dari dataset transaksi yang diberikan.

Buatlah script R untuk menghasilkan daftar tersebut, dan hasilnya disimpan ke dalam file bottom10 item retail.txt !

Hint: Gunakan kombinasi function itemFrequency, names, sort, dan data.frame.

Begini :

#cara 1

#set library yang dibutuhkan
library("arules")
library("Matrix")

#membuat variabel dataset
transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#menggunakan fungsi sort dan itemFrequency
bottom.10 <- sort(itemFrequency(transaksi.AL,type='absolute'), decreasing=FALSE)[1:10]

#menggunakan fungsi data.frame dan names
bottom.10 <- data.frame("Nama.Produk"=names(bottom.10), "Jumlah"=bottom.10, row.names=NULL)

#menulis file
write.csv(bottom.10,file="bottom10 item retail.txt")
# cara 2

library("arules")
library("Matrix")

item <- sort(
    itemFrequency(
        read.transactions(
            file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", 
            format="single", 
            sep="\t", 
            cols=c(1,2), 
            skip=1
        ), 
    type="absolute"), 
    decreasing = FALSE
)[1:10]
    
write.csv(
    data.frame(
        "Nama.Produk"=names(item), 
        "Jumlah"=item, 
        row.names=NULL
    ), 
    file="bottom10 item retail 2.txt"
)

1.6 Mendapatkan Kombinasi Produk yang menarik

Setelah yakin kamu dapat melakukannya, pemilik toko ingin kamu mengirimkan file yang berisi daftar 10 paket kombinasi produk yang paling menarik.

Kamu pertamanya bingung, apa sih definisi menarik versi pemilik toko 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, kamu 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")

Begini :

#set library yang dibutuhkan
library("arules")
library("Matrix")

#membuat variabel dataset
transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#membuat kombinasi min 2 item, maks 3 item, conf 50%
rules <- apriori(transaksi.AL, parameter = list(supp=10/length(transaksi.AL), 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].
#mencari kombinasi min 10 dari semua transaksi
apriori_rules <- c(head(sort(rules, by="lift"), n=10))

#menulis file
write(apriori_rules, file="kombinasi retail.txt")

1.7 Mencari Paket Produk yang bisa dipasangkan dengan Item Slow-Moving

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.

Pemilik toko juga meyakini hal ini, dan ingin agar kamu 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”. Pemilik toko ingin meminta kombinasi yang bisa dipaketkan dengan kedua produk tersebut.

Masing-masing produk tersebut dikeluarkan 3 rules yang asosiasi nya paling kuat, sehingga total ada 6 rules. Persyaratan-persyaratan asosiasi kuat ini masih sama dengan yang telah disebutkan pemilik toko 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")

Hint: Pada association rules, item “Tas Makeup” dan “Baju Renang Pria Anak-anak” tersebut kita masukkan di rhs (right hand side). Gabungkan kedua subset rules yang dengan function c sebelum dituliskan ke file.

Begini :

# cara 1

#set library yang dibutuhkan
library("arules")
library("Matrix")

#membuat variabel dataset
transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#membuat kombinasi min 2 item, maks 3 item, conf 10%
rules <- apriori(transaksi.AL, parameter = list(minlen = 2, maxlen = 3, conf = 0.1,
support=10/length(transaksi.AL)))
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 done [0.00s].
writing ... [39832 rule(s)] done [0.00s].
creating S4 object  ... done [0.01s].
#mencari kombinasi produk yang bisa dipaketkan
A <- subset(rules,rhs %in% "Tas Makeup")
L <- subset(rules,rhs %in% "Baju Renang Pria Anak-anak")

#melihat 3 rules yang memiliki asosiasi kuat
A <- head(sort(A, by="lift", decreasing=TRUE), n=3L)
L <- head(sort(L, by="lift", decreasing=TRUE), n=3L)

#menggabungkan subset rules
AL <- c(A,L)

inspect(AL)
    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
#menulis file
write(AL, file="kombinasi retail slow moving.txt")
# cara 2

library("arules")
library("Matrix")

transaksi.AL <- read.transactions(file="https://storage.googleapis.com/dqlab-dataset/transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

rules <- apriori(transaksi.AL, parameter = list(minlen = 2, maxlen = 3, conf = 0.1,
support=10/length(transaksi.AL)))
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 done [0.00s].
writing ... [39832 rule(s)] done [0.00s].
creating S4 object  ... done [0.01s].
apriori_rules1 <- subset(rules,rhs %in% "Tas Makeup")
apriori_rules2 <- subset(rules,rhs %in% "Baju Renang Pria Anak-anak")

apriori_rules1 <- sort(apriori_rules1, by="lift") [1:3]
apriori_rules2 <- sort(apriori_rules2, by="lift") [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 2.txt")