Product Packaging

Baik sebelum melakukan analysis ada beberapa tahapan yang harus kita pahami yaitu 6 FASE ANALISIS DATA

  1. Bertanya/ ask kita melakukan dua hal yaitu mendefinisikan masalah yang harus dipecahkan dan kita memastikan bahwa kita memahami sepenuhnya harapan dari pemangku kepentingan/ stakeholder. Ini membantu anda tetap fokus pada masalah itu sendiri bukan hanya gejalanya. Pertanyaan 5 whys membantu pada tahap ini. Berkomunikasi dengan pemangku kepentingan anda adalah kunci untuk membuat anda tetap terlibat dan di jalur yang tepat selama pelaksanaan proyek. Mendefinisikan masalah berarti anda melihat keadaan saat ini dan mengidentifikasi keadaan dibandingkan dengan keadaan ideal. Berikut ini adalah beberapa pertanyaan yang sering diajukan Apa masalah yang kita coba selesaikan?, Apa tujuan dari analisis ini?, Apa pelajaran yang kita harapkan dari masalah itu?

  2. Mempersiapkan/ prepare Ini adalah langkah dimana data analyst mengumpulkan dan menyimpan data yang akan kita gunakan untuk proses analisis berikutnya. Mengidentifikasi jenis data apa yang paling berguna untuk memecahkan suatu masalah tertentu. data dan hasil analisis Anda yang objektif dan tidak bias adalah sangat penting. Dengan kata lain, setiap keputusan yang dibuat dari analisis Anda harus selalu didasarkan pada fakta dan kejujuran, serta tidak memihak

  3. Memproses/ process Hal yang dilakukan pada tahap ini adalah menemukan dan menghilangkan setiap kesalahan dan ketidakakuratan yang dapat menghambat perolehan hasil. Biasanya yang dilakukan adalah membersihkan data, mengubahnya menjadi format yang lebih berguna, menggabungkan dua atau lebih, untuk memperoleh informasi lebih lengkap dan menghilangkan data pencilan (outlier) yaitu data observasi yang dapat memberatkan ketimpangan informasi. Memeriksa data yang kita persiapkan untuk memastikan data yang lengkap dan benar. Tahap ini adalah tahap di mana kita harus memperoleh detail data dengan benar. Jadi Kita juga akan memperbaiki kesalahan ketik, inkonsistensi, atau data yang hilang dan tidak akurat. Untuk melengkapinya, kita juga menerapkan strategi untuk memverifikasi dan membagikan pembersihan data kita dengan pemangku kepentingan

  4. Menganalisis/ analyze Menganalisis data untuk menemukan pola, hubungan, dan tren. Diperlukan penggunaan alat untuk mengubah dan mengatur informasi sehingga Anda dapat menarik kesimpulan yang bermanfaat, membuat prediksi, serta memberi saran yang tepat untuk pengambilan keputusan. Misal menggunakan spreadshet, R, Python, SQL

  5. Membagikan/share Visualisasi Para analis membagikan temuan dan rekomendasi mereka kepada pihak yang memang berkepentingan. Bagaimana analis data menafsirkan hasil dan membagikannya dengan orang lain untuk membantu pemangku kepentingan membuat keputusan berdasarkan data secara efektif. Pada tahap berbagi, visualisasi adalah teman terbaik seorang analis data. visualisasi itu penting untuk membuat orang lain memahami apa yang data Anda katakan. Dengan visual yang tepat, fakta dan angka menjadi jauh lebih mudah untuk dilihat dan konsep yang kompleks menjadi lebih mudah dipahami.

  6. Bertindak/ act Hal ini berkaitan erat dengan menerapkan wawasan kita untuk menyelesaikan masalah, mengambil keputusan, membuat hal baru. Saat yang menyenangkan ketika suatu perusahaan menerima semua wawasan yang telah kita sediakan, sebagai data analyst, dan mengelola data tersebut sedemikian rupa untuk memecahkan asal masalah perusahaan tersebut


STUDY CASE

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 membuat manajer toko kahwatir. Salah satu solusi adalah membuat paket yang inovatif. Dimana produk yang sebelumnya tidak terlalu laku tapi punya pangsa pasar malah bisa dipaketkan dan laku.Disini manager toko menyuruh kita untuk mengidentifikasi paket produk yang menarik untuk dipaketkan sehingga akhirnya bisa meningkatkan keuntungan dan loyalitas para pelanggan toko fashion. Dan untuk wewujudkan ini, saya menggunakan R dan algoritma aproriari dari paket arules di sepanjang project ini. Agar analisis lebih terarah maka kita bagi jadi 3 fokus yaitu :

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



Bertanya/ ask

Dari study case diatas dapat kita ketahui pemangku kepentingannya adalah manajer toko. Harapan dari manajer tersebut adalah agar kita mengidentifikasi paket produk yang menarik.Agar analisis lebih terarah kita bagi jadi 3 fokus seperti yang sudah disebutkan di study case diatas



Mempersiapkan/ prepare

Dalam case ini kita sudah disediakan data oleh pihak toko yang mana berisi 2 column saja yaitu kode_transaksi dan Nama_barang. Data yang disediakan dalam format tsv yang meiliki 33.669 baris dan 3.450 kode transaksi



Memproses/ process

Seperti yang sudah disinggung diatas disini saya menggunakan R dan algoritma aproriari dari paket arules. Algoritma aproriari merupakan salah satu algoritma klasik untuk mencari frequent item/itemset pada transactional database. Algoritma Apriori digunakan agar computer dapat mempelajari aturan asosiasi, mencari pola hubungan antar satu atau lebih item dalam suatu dataset.Dalam study case ini kita memiliki data transaksi/market basket sehingga kita dapat melakukan analisa terhadap kemungkinan membeli product yang lainnya.


Cek data isi data frame

#import dataset
dataset_raw = read.csv('transaksi_dqlab_retail.tsv', sep="\t")

#cek tipe data
class(dataset_raw)
## [1] "data.frame"
#tampilkan 6 data teratas
head(dataset_raw)
##   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


#Menyajikan informasi tiap kolom dataset dalam format yang compact
str(dataset_raw)
## 'data.frame':    33668 obs. of  2 variables:
##  $ Kode.Transaksi: chr  "#1" "#1" "#1" "#1" ...
##  $ Nama.Barang   : chr  "Kaos" "Shampo Biasa" "Sepatu Sport merk Z" "Serum Vitamin" ...

Dari data diatas dapat kita ketahui jumlah baris data ada 33.668 baris yang terdiri dari 2 column yaitu Kode.Transaksi dan Nama.Barang dengan tipe data nya chr


#Cek nilai null
is.null(dataset_raw)
## [1] FALSE

Dari hasil diatas kita dapat mengetahui bahwa dataset tidak memiliki nilai null




kita import libary arules

library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
## 
##     abbreviate, write


kita import libary dplyr

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:arules':
## 
##     intersect, recode, setdiff, setequal, union
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union


Pertama kita ubah format dari dataset transaksi_dqlab_retail.tsv menjadi format yang dapat digunakan oleh paket arules dengan cara dibawah ini

#rubah bentuk data frame
transaksi_tabular <- read.transactions(file="transaksi_dqlab_retail.tsv", format="single", sep="\t", cols=c(1,2), skip=1)

#simpan hasil konversi ke dalam file test_project_retail_1.txt
write(transaksi_tabular, file="test_project_retail_1.txt", sep=",")
#cek data transaksi_tabular
transaksi_tabular
## transactions in sparse format with
##  3450 transactions (rows) and
##  69 items (columns)

dapat kita lihat format datanya sudah berubah hal ini bisa kita lihat dari jumlah baris dan columnnya

#cek tipe datanya
class(transaksi_tabular)
## [1] "transactions"
## attr(,"package")
## [1] "arules"

jika kita cek tipe datanya maka bentuknya sudah bukan dataframe lagi melainkan dalam bentuk yang dapat diolah dengan algoritma arules

#Menyajikan informasi tiap kolom dataset dalam format yang compact
str(transaksi_tabular)
## Formal class 'transactions' [package "arules"] with 3 slots
##   ..@ data       :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
##   .. .. ..@ i       : int [1:33668] 5 9 10 14 22 34 45 46 48 2 ...
##   .. .. ..@ p       : int [1:3451] 0 9 20 31 42 54 61 74 89 105 ...
##   .. .. ..@ Dim     : int [1:2] 69 3450
##   .. .. ..@ Dimnames:List of 2
##   .. .. .. ..$ : NULL
##   .. .. .. ..$ : NULL
##   .. .. ..@ factors : list()
##   ..@ itemInfo   :'data.frame':  69 obs. of  1 variable:
##   .. ..$ labels: chr [1:69] "Atasan Baju Belang" "Atasan Kaos Putih" "Baju Batik Wanita" "Baju Kaos Anak - Karakter Kartun" ...
##   ..@ itemsetInfo:'data.frame':  3450 obs. of  1 variable:
##   .. ..$ transactionID: chr [1:3450] "#1" "#10" "#100" "#1000" ...

jika kita cek dengan fungsi str maka formatnya sudah bukan dalam bentuk dataframe lagi melainkan sudah berbentuk algoritma, sehingga kita tidak dapat melihat variable transaksi_tabular dalam bentuk dataframe


#lihat isi file test_project_retail_1.txt yang mana merupakan variable transaksi_tabular yang di sep ',' 
dataset_test_project_retail_1 = read.delim('test_project_retail_1.txt')

#cek 6 data teratas
head(dataset_test_project_retail_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                                                           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
## 2                                          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
## 3                                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
## 4 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
## 5                                                                                                                                          Blouse Denim,Hair Dryer,Mascara,Sepatu Sandal Anak,Sepatu Sekolah Hitam W,Serum Vitamin,Shampo Biasa
## 6                                               Baju Batik Wanita,Baju Kemeja Putih,Celana Pendek Casual,Celana Pendek Jeans,Dompet Card Holder,Hair Dryer,Jeans Jumbo,Kaos,Sepatu Sandal Anak,Shampo Biasa,Tank Top,Tas Makeup,Tas Ransel Mini
#cek tipe data 
class(dataset_test_project_retail_1)
## [1] "data.frame"

dari data diatas kita dapat mengetahui bahwa tipe datanya sekarang sudah menjadi data.frame

#Menyajikan informasi tiap kolom dataset dalam format yang compact
str(dataset_test_project_retail_1)
## 'data.frame':    3449 obs. of  1 variable:
##  $ 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: chr  "Baju Batik Wanita,Baju Kemeja Putih,Celana Jogger Casual,Celana Pendek Jeans,Dompet Card Holder,Dompet STNK Gan"| __truncated__ "Baju Renang Wanita Dewasa,Celana Jogger Casual,Dompet Card Holder,Dompet Flip Cover,Hair Dryer,Hair Tonic,Sepat"| __truncated__ "Baju Batik Wanita,Baju Renang Pria Dewasa,Celana Jeans Sobek Wanita,Celana Pendek Casual,Celana Pendek Jeans,Fl"| __truncated__ "Baju Renang Pria Dewasa,Baju Renang Wanita Dewasa,Celana Jogger Casual,Celana Pendek Green/Hijau,Dompet Kulit P"| __truncated__ ...

jika kita cek file txt dari variable transaksi_tabular yang di sep ‘,’ terdiri dari 3.449 baris dengan 1 column


Output Awal: Statistik Top 10

#rubah bentuk data frame kebentuk tabular seperti variable transaksi_tabular diatas 
data <- read.transactions(file ="transaksi_dqlab_retail.tsv", format = "single", sep = "\t", cols = c(1,2), skip=1)

#select top 10
#decreasing true artinya diurutkan dari besar ke kecil, false dari kecil ke besar
top_10 <- sort(itemFrequency(data, type="absolute"), decreasing = TRUE)[1:10] #menggunakan cara slicing
#tampilkan isinya
top_10
##              Shampo Biasa             Serum Vitamin         Baju Batik Wanita 
##                      2075                      1685                      1312 
##         Baju Kemeja Putih      Celana Jogger Casual               Cover Koper 
##                      1255                      1136                      1086 
##        Sepatu Sandal Anak Tali Pinggang Gesper Pria       Sepatu Sport merk Z 
##                      1062                      1003                       888 
##              Wedges Hitam 
##                       849
#cek tipe data top_10
class(top_10)
## [1] "integer"
#jika kita cek top_10 dengan str
str(top_10)
##  Named int [1:10] 2075 1685 1312 1255 1136 1086 1062 1003 888 849
##  - attr(*, "names")= chr [1:10] "Shampo Biasa" "Serum Vitamin" "Baju Batik Wanita" "Baju Kemeja Putih" ...
#create to data.frame
hasil <- data.frame("Nama Produk" = names(top_10), "Jumlah" = top_10, row.names = NULL)
#simpan hasilnya kedalam file top10_item_retail.tx
write.csv(hasil, file="top10_item_retail.txt")
#cara lain mengambil data
#menggunakan dplyr / library(dplyr)
#sort() masi dari default r, tapi mulai dari itemFrequency sudah punya arules
dpl <- sort(itemFrequency(data, type="absolute"), decreasing = TRUE)
dpl %>%
  head(10)#default head nya adalah 6 
##              Shampo Biasa             Serum Vitamin         Baju Batik Wanita 
##                      2075                      1685                      1312 
##         Baju Kemeja Putih      Celana Jogger Casual               Cover Koper 
##                      1255                      1136                      1086 
##        Sepatu Sandal Anak Tali Pinggang Gesper Pria       Sepatu Sport merk Z 
##                      1062                      1003                       888 
##              Wedges Hitam 
##                       849
#Kita juga bisa tampilkan dalam bentuk data frame
#nanti otomatis tipe datanya juga jadi "data.frame"
data.frame("Nama Product"=names(top_10), "Jumlah"=top_10, row.names = NULL)
##                 Nama.Product 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

Output Awal: Statistik Bottom 10

#rubah bentuk data frame kebentuk tabular seperti variable transaksi_tabular diatas 
data <- read.transactions(file ="transaksi_dqlab_retail.tsv", format = "single", sep = "\t", cols = c(1,2), skip=1)

#select top 10
#decreasing true artinya diurutkan dari besar ke kecil, false dari kecil ke besar
bottom_10 <- sort(itemFrequency(data, type="absolute"), decreasing = FALSE)[1:10] #menggunakan cara slicing
#tampilkan isinya
bottom_10
##    Celana Jeans Sobek Pria               Tas Kosmetik 
##                          9                         11 
##               Stripe Pants                   Pelembab 
##                         19                         24 
##     Tali Ban Ikat Pinggang Baju Renang Pria Anak-anak 
##                         27                         32 
##                   Hair Dye         Atasan Baju Belang 
##                         46                         56 
## Tas Sekolah Anak Perempuan              Dompet Unisex 
##                         71                         75
#cek tipe data bottom_10
class(bottom_10)
## [1] "integer"
#jika kita cek bottom_10 dengan str
str(bottom_10)
##  Named int [1:10] 9 11 19 24 27 32 46 56 71 75
##  - attr(*, "names")= chr [1:10] "Celana Jeans Sobek Pria" "Tas Kosmetik" "Stripe Pants" "Pelembab" ...
#create to data.frame
hasil <- data.frame("Nama Produk" = names(top_10), "Jumlah" = bottom_10, row.names = NULL)
write.csv(hasil, file="bottom10_item_retail.txt")
#Kita juga bisa tampilkan dalam bentuk data frame
#nanti otomatis tipe datanya juga jadi "data.frame"
data.frame("Nama Product"=names(bottom_10), "Jumlah"=bottom_10, row.names = NULL)
##                  Nama.Product 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


Apa itu Algoritma Apriori?
Baik sebelum melanjutkan ke langkah selanjutnya kita bahas lebih dalam terlebih dahulu apa itu algoritma apriori, association, dan juga mengenai nilai Support, Confidence dan Lift yang mana ketiga nilai ini digunakan dalam algoritma appriori.

Association
pengelompokkan hal yang biasanya terjadi bersamaan, misalnya 10 orang membeli susu kental manis, 5 orang dari 10 orang tersebut membeli keju lalu disimpulkan bahwa jika pelanggan membeli susu kental manis ia juga akan membeli keju.

Algoritma Apriori
Merupakan salah satu algoritma klasik untuk mencari frequent item/itemset pada transactional database. Algoritma Apriori digunakan agar computer dapat mempelajari aturan asosiasi, mencari pola hubungan antar satu atau lebih item dalam suatu dataset. Dengan memiliki data transaksi/market basket, Kita dapat melakukan Analisa terhadap kemungkinan membeli product yang lainnya. Berbagai algorithma yang digunakan dalam ‘association rule mining’ meliputi algorithma Apriori yang sangat terkenal (dimana sekumpulan item yang sering muncul diidentifikasi).

Support
Parameter yang digunakan, Nilai Support (nilai penunjang) yaitu nilai persentase kombinasi item tersebut dalam database. Support menunjukkan popularitas rata-rata produk atau item dalam database. Kita bisa mendapatkan nilai support dengan membagi jumlah total transaksi yang mengandung produk itu dengan jumlah total transaksi.

Support case
Misalkan kita ingin menghitung nilai support dari produk kopi sachet,maka rumusnya
Support(kopi) = jumlah transaksi kopi / total transaksi semua produk
Support(kopi) = 200/2000 = 0.1 = 10%
Selanjutnya untuk menghitung nilai support dari produk minyak goreng adalah:
Support(minyak) = jumlah transaksi minyak / total transaksi semua produk
Support(minyak) = 500 / 2000 = 0.25 = 25%
Terakhir nilai support dari kombinasi keduanya yaitu:
Support(kopi dan minyak) = jumlah transaksi kombinasi kopi dan minyak / total transaksi semua produk
Support(kopi dan minyak) = 100 / 2000 = 0.05 = 5%



Confidence
Paramenter yang digunakan, nilai confidence (nilai kepastian) yaitu kuatnya hubungan antar item dalam aturan assosiatif.
Aturan assosiatif:
Dalam bentuk : {roti, mentega} -> {susu} (support = 40%, confidence = 50%)

Confidence case
Confidence mengacu pada kemungkinan seorang pelanggan membeli kopi sachet dan minyak goreng secara bersamaan

Untuk menghitung nilai confidence kita perlu membagi jumlah transaksi kombinasi kopi sachet dan minyak goreng dengan jumlah total transaksi kopi
Rumusnya:
Confidence = jumlah transaksi kombinasi kopi dan minyak / total transaksi kopi
Confidence = 100/200 = 0.5 = 50%



Lift Case
Lift adalah peningkatan rasio penjualan kopi saat kita menjual minyak goreng. Untuk mendapatkan nilai lift kita dapat menggunakan perhitungan berikut
Rumusnya:
Lift = support(kopi dan minyak) / (support(kopi) * support(minyak))
Lift = 0.05 / (0.1 * 0.25) = 2 Artinya ketika kita menjual kopi sachet bersama-sama dengan minyak goreng, kemungkinan seseorang membeli keduanya adalah 2 kali dibandingkan membeli secara terpisah.
Apabila nilai lift di bawah satu, maka menandakan bahwa pelanggan jarang membeli kedua barang tersebut secara bersamaan.
Sebaliknya, semakin besar nilainya, maka semakin baik kombinasinya dan pelanggan sering membelinya secara bersamaan.

cosine similarity python
Jika kita menggunakan bahasa pemrogramman python untuk melakukan association rule mining kita bisa menggunakan cosine similarity python, yang mana dapat outputnya juga sama mencari similarity dari masing masingnya. bedanya adalah cosine similarity python bergantung pada attributenya bukan membaca database secara keseluruhan seperti algorithma Apriori yang mana jika jumlah datanya teramat sangat besar akan menghabiskan resource dan waktu. Jadi dengan cosine similarity python yang kita hitung adalah variable2 dari product tersebut. Misalnya produk kacamata variable2nya adalah warna, bentuk, ukuran lebar frame, tebal frame yang mana spesifikasi tst bisa kita tuangkan sebagai attribute level yang mana dapat digunakan untuk mencari kesaamaanya dengan produk kacamata yang lain. jadi dengan algoritma cosine similarity python kita tidak perlu membaca trac record dari customer database, yang kita baca hanya attribute dari spesifikasi produk kacamata tersebut dan ketika ada orang yang perna membeli kacamata itu, jadi kita bisa rekomendasikan dengan kacamata yang kita sudah cari kemiripannya



Mendapatkan Kombinasi Produk yang menarik

Pada tahap ini kita akan membuat daftar 10 paket kombinasi produk yang memenuhi syarat dibawah ini:
1. Memiliki asosiasi atau hubungan erat.
2. Kombinasi produk minimal 2 item, dan maksimum 3 item.
3. Kombinasi produk itu muncul setidaknya 10 dari dari seluruh transaksi.
4. Memiliki tingkat confidence minimal 50 persen.


#kode sebelumnya
nama_file <- "transaksi_dqlab_retail.tsv"
transaksi_tabular <- read.transactions(file=nama_file, format="single", sep="\t", cols=c(1,2), skip=1)

# syarat kombinasi diatas diterapkan disini
# supp = poin no 3
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.00s].
## writing ... [4637 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
print(apriori_rules)
## set of 4637 rules

Bisa kita lihat jumlah rules nya ada 4637

#n = 10 paket kombinasi produk yang memenuhi syarat
#Kemudian kita sort berdasarkan nilai lift terbesar
apriori_rules <- head(sort(apriori_rules, by='lift', decreasing = T),n=10)
print(apriori_rules)
## set of 10 rules

Kemudian kita sort berdasarkan 10 nilai lift terbesar. Kita memilih nilai lift karena Lift adalah peningkatan rasio penjualan suatu produk saat kita menjual produk lain

# menampilkan hasilnya
print(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
## NULL
#Hasilnya disimpan ke file kombinasi_retail.txt
write(apriori_rules, file="kombinasi_retail.txt")


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.

Menurut manajer toko ada 2 produk slow-moving di tokonya adalah “Tas Makeup” dan “Baju Renang Pria Anak-anak”. Manajer toko 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 (kenapa ada 6 hal itu karena minnya 2 maxnya 3 itu dikalikan hasilnya 6 untuk kemungkinannya). Persyaratan-persyaratan asosiasi kuat ini masih sama dengan yang telah disebutkan manajer toko sebelumnya, kecuali tingkat confidence dicoba pada tingkat minimal 0.1.

Jika lupa bisa cek dibawah ini untuk syaratnya
1. Memiliki asosiasi atau hubungan erat.
2. Kombinasi produk minimal 2 item, dan maksimum 3 item.
3. Kombinasi produk itu muncul setidaknya 10 dari dari seluruh transaksi.
4. Memiliki tingkat confidence minimal 10 persen.




nama_file <- "transaksi_dqlab_retail.tsv"
#rubah bentuk data frame menjadi tabular
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

#Menerapkan apriori rulesnya 
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.00s].
## writing ... [39832 rule(s)] done [0.01s].
## creating S4 object  ... done [0.01s].
#cek jumlah rules yang dihasilkan
apriori_rules
## set of 39832 rules
#membuat subset atau melakukan filter, yang mana dari 39.832 rules dari variable apriori_rules diatas kita pilih yang lift>1 dan rhs mengandung "Tas Makeup"
apriori_rules1 <- subset(apriori_rules, lift > 1 & rhs %in% "Tas Makeup")

#cek jumlah rules yang dihasilkan
apriori_rules1
## set of 53 rules
#melakukan sorting dari 53 rules yang dihasilkan berdasarkan lift dan diambil nilai lift 3 terbanyak
apriori_rules1 <- sort(apriori_rules1, by='lift', decreasing = T)[1:3]

#cek jumlah rules setelah di sort
apriori_rules1
## set of 3 rules
#membuat subset atau melakukan filter, yang mana dari 39.832 rules dari variable apriori_rules diatas kita pilih yang lift>1 dan rhs mengandung "Baju Renang Pria Anak-anak" 
apriori_rules2 <- subset(apriori_rules, lift > 1 & rhs %in% "Baju Renang Pria Anak-anak")

#cek jumlah rulesnya
apriori_rules2
## set of 6 rules
# pmelakukan sorting dari 6 rules yang dihasilkan berdasarkan lift dan diambil nilai lift 3 terbanyak
apriori_rules2 <- sort(apriori_rules2, by='lift', decreasing = T)[1:3]

#gabungkan hasil rulesnya
apriori_rules <- c(apriori_rules1, apriori_rules2)

#Cek jumlah rules gabungan
apriori_rules
## set of 6 rules
#Tampilkan rulesnya
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

Dari data diatas dapat kita lihat kombinasi yang bisa dipaketkan dengan kedua produk slow-moving di toko yaitu produk “Tas Makeup” dan “Baju Renang Pria Anak-anak”

#simpan hasilnya di file kombinasi_retail_slow_moving.txt
write(apriori_rules, file="kombinasi_retail_slow_moving.txt")