Baik sebelum melakukan analysis ada beberapa tahapan yang harus kita pahami yaitu 6 FASE ANALISIS DATA
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?
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
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
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
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.
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
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.
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
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
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")