Pendahuluan
Pertumbuhan industri digital di Indonesia terus melaju dengan cepat. Istilah perusahaan startup muncul dengan artian perusahaan rintisan baru yang belum lama beroperasi. Selain itu juga perusahaan startup merupakan suatu perusahaan yang menggabungkan unsur sosial dengan ekonomi, atau perusahaan yang memberikan jawaban dari permasalahan di dalam masyarakat (sosial) dengan solusi yang menghasilkan profit (ekonomi). Berdasarkan hasil laporan Digital Creative Industry Society yang dirangkum oleh Indonesia Baik pada tahun 2019, tercatat bahwa terdapat 992 perusahaan startup yang tersebar di berbagai wilayah Indonesia.
Dari hasil laporan tersebut tercatat ada 522 startup di Jabodetabek, 30 startup di Jawa Tengah, 54 startup di Yogyakarta, 44 startup di Jawa Barat , 113 startup di Jawa Timur, 32 startup di Bali dan NTB, 24 startup di Kalimantan, 34 startup di Sulawesi, dan domisili tidak diketahui sebanyak 24 startup.Untuk bidang perusahaannya, perusahaan startup di Indonesia memiliki berbagai macam jenis dan bidangnya seperti jual beli, transportasi, edukasi, dan lain-lain. Berdasarkan dari hasil laporan Digital Creative Industry Society juga didapatkan bidang usaha perusahaan startup di Indonesia dengan dominasi bidang lainnya dengan 532 startup sebesar 53,63%. Kemudian, bidang e-commerce dengan 352 startup atau sebesar 35,38%. Ketiga, bidang game dengan 55 startup sebesar 5,54%. Terakhir, bidang fintech dengan 53 startup sebesar 5,34%.
Seperti yang kita rasakan sekitar awal tahun 2020 Indonesia sedang dilanda pandemi Covid-19. Selain dampak buruk yang diterima, dampak baik juga diterima khususnya perusahaan startup yang bergerak dibidang jual beli. Disaat orang ingin membeli kebutuhan rumah tangga ataupun barang konsumsi lainnya yang mereka inginkan tapi tidak bisa keluar rumah ataupun tidak ingin keluar rumah, mereka memanfaatkan aplikasi perusahaan startup yang bergerak dibidang jual beli. Dari keadaan itulah perusahaan startup jual beli bisa mempunyai potensi mendapatkan profit yang lebih banyak dari sebelumnya.
Salah satu metode yang bisa digunakan untuk memaksimalkan potensi itu adalah dengan menganalisa produk-produk yang dibeli oleh customer hingga mendapat produk yang diinginkan oleh customer, dengan begitu frekuensi aktifitas pembelian dapat meningkat serta penjual yang menjual barang dapat cepat laku. Dari metode inilah masing-masing orang yang terlibat bisa mendapatkan keuntungan, baik dari sisi pembeli yang tidak perlu susah mencari produk yang mereka inginkan, dari sisi penjual yang barangnya bisa cepat laku dan dari sisi perusahaan yang tingkat frekuensi jual beli semakin meningkat.
Dengan meningkatnya daya beli masyarakat melalui aplikasi jual beli online, membuka peluang bagi perusahaan e-commerce untuk dapat meningkatkan profitnya. Tetapi beberapa perusahaan masih belum bisa memaksimalkan peluang itu. Salah satu langkah yang bisa digunakan oleh perusahaan e-commerce adalah dengan meningkatkan jumlah frekuensi pembelian dari customer, dengan cara menganalisis produk-produk apa saja yang dibeli oleh customer. Jadi dengan hasil analisis tersebut perusaahan dapat menawarkan produk-produk yang memiliki potensi besar untuk dapat dibeli oleh customer.
Memaksimalkan potensi pembelian produk oleh customer dengan memberikan rekomendasi produk-produk yang diinginkan oleh customer. Oleh karena itu, pada project ini akan dikembangkan sebuah model yang dapat memberikan produk yang memiliki potensi untuk dibeli berdasarkan pola hubungan produk-produk yang dibeli oleh customer.
Pada project ini akan digunakan sebuah data online retail yang diambil dari situs UCI. Informasi dari dataset yang akan saya gunakan untuk menganalisis adalah:
InvoiceNo : Nomor Invoice
StockCode : Kode Produk
Description : Nama Produk
Quantity : Jumlah Pembelian
InvoiceDate : Tanggal dan Waktu Pembelian
UnitPrice : Harga Barang
CustomerID : ID Customer
Country : Nama Negara
Selanjutnya, kebutuhan pembuatan model machine learning untuk menganalisis dibuat dengan metode market basket analysis yaitu mempelajari dan mencari hubungan antar satu atau lebih item dalam suatu dataset, dengan tujuan untuk mengetahui produk-produk yang mungkin akan dibeli secara bersamaan.
Output dari project ini berupa dashboard analisis yang menampilkan Exploratory Data serta menunjukan hubungan antar produk, dan juga menampilkan produk-produk yang mempunyai keterikatan tinggi, sehingga user bisa melihat produk-produk yang memiliki potensi besar untuk dapat dibeli oleh cutomer. Selain itu, user juga dapat menginputkan sebuah produk dan nanti dashboard akan menampilkan produk yang mempunyai hubungan tinggi dengan produk yang diinputkan user.
Dengan mengetahui produk yang akan dibeli customer, maka perusahaan akan mendapat beberapa keuntungan yaitu:
Lebih efisien daripada mass marketing
Menargetkan produk kepada segmen tertentu
Dapat mengenal pelanggannya dengan lebih baik
Dapat memfokuskan strategi perusahaan
Mengoptimalkan posisi penempatan produk
Membuat bundle produk baru yang sesuai
Memberikan penawaran khusus pada beberapa produk
Background : Indonesia Baik
Dataset : UCI - Online Retail
Mengaktifkan library yang akan dipakai
library(tidyverse)
library(dplyr)
library(readxl)
library(lubridate)
library(plyr) #data transaction
library(scales)
library(arules)
library(arulesViz)
library(plotly)
library(glue)
library(tidytext)
library(stringr)
library(janitor)
Import data yang akan digunakan
online_retail <- read_excel("Online Retail.xlsx")
online_retail
colSums(is.na(online_retail))
## InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice
## 0 0 1454 0 0 0
## CustomerID Country
## 135080 0
Berdasarkan dari hasil pengecekan, terdapat ada beberapa data yang missing yaitu Description dan CustomerID. Untuk mempermudah dalam pengolahan data, data yang missing tersebut akan dihilangkan dengan cara menghilangkan baris yang terdapat missing value.
#menghapus missing value
online_retail <- na.omit(online_retail)
#cek missing value
colSums(is.na(online_retail))
## InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice
## 0 0 0 0 0 0
## CustomerID Country
## 0 0
Data sudah tidak ada lagi missing value dan siap untuk dilakukan langkah selanjutnya.
Pengecekan tipe data ini bertujuan untuk mengetahui apakah setiap variabel sudah mempunyai tipe data yang sesuai. Berikut adalah beberapa jenis dari tipe data:
glimpse(online_retail)
## Rows: 406,829
## Columns: 8
## $ InvoiceNo <chr> "536365", "536365", "536365", "536365", "536365", "536365"~
## $ StockCode <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752", ~
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTERN~
## $ Quantity <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3, ~
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:2~
## $ UnitPrice <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.69~
## $ CustomerID <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17~
## $ Country <chr> "United Kingdom", "United Kingdom", "United Kingdom", "Uni~
Dari hasil pengecekan tipe data diatas, terdapat beberapa variabel yang tipe datanya belum sesuai. Untuk itu perlu dirubah tipe datanya.
#mengubah beberapa tipe data chracter ke factor
online_retail <-
online_retail %>%
mutate_at(vars(InvoiceNo, StockCode, Description, CustomerID, Country),funs(as.factor))
Mengecek variabel setelah tipe data dirubah
glimpse(online_retail)
## Rows: 406,829
## Columns: 8
## $ InvoiceNo <fct> 536365, 536365, 536365, 536365, 536365, 536365, 536365, 53~
## $ StockCode <fct> 85123A, 71053, 84406B, 84029G, 84029E, 22752, 21730, 22633~
## $ Description <fct> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTERN~
## $ Quantity <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3, ~
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:2~
## $ UnitPrice <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.69~
## $ CustomerID <fct> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17~
## $ Country <fct> United Kingdom, United Kingdom, United Kingdom, United Kin~
Tipe data untuk semua variabel sudah sesuai
online_retail <-
online_retail %>%
filter(Quantity > 0)
online_retail$Date <- as.Date(online_retail$InvoiceDate)
online_retail$Time <- as.factor(format(online_retail$InvoiceDate,"%H:%M:%S"))
online_retail <- online_retail[order(online_retail$Description),]
online_retail
#save model to rds
saveRDS(online_retail, file = "online_retail.rds")
summary(online_retail)
## InvoiceNo StockCode Description
## 576339 : 542 85123A : 1965 WHITE HANGING HEART T-LIGHT HOLDER: 1965
## 579196 : 533 22423 : 1668 REGENCY CAKESTAND 3 TIER : 1668
## 578270 : 442 85099B : 1569 JUMBO BAG RED RETROSPOT : 1569
## 573576 : 435 47566 : 1377 PARTY BUNTING : 1377
## 567656 : 421 84879 : 1360 ASSORTED COLOUR BIRD ORNAMENT : 1360
## 567183 : 399 20725 : 1275 LUNCH BAG RED RETROSPOT : 1274
## (Other):375428 (Other):368986 (Other) :368987
## Quantity InvoiceDate UnitPrice
## Min. : 1 Min. :2010-12-01 08:26:00 Min. : 0.0
## 1st Qu.: 2 1st Qu.:2011-04-01 09:21:00 1st Qu.: 1.2
## Median : 6 Median :2011-07-20 11:38:00 Median : 2.0
## Mean : 13 Mean :2011-07-03 08:22:59 Mean : 3.1
## 3rd Qu.: 12 3rd Qu.:2011-10-11 14:51:15 3rd Qu.: 3.8
## Max. :74215 Max. :2011-11-29 16:45:00 Max. :8142.8
##
## CustomerID Country Date
## 17841 : 7218 United Kingdom:336469 Min. :2010-12-01
## 14911 : 5331 Germany : 8709 1st Qu.:2011-04-01
## 14096 : 4582 France : 7878 Median :2011-07-20
## 12748 : 4220 EIRE : 6861 Mean :2011-07-02
## 14606 : 2562 Spain : 2420 3rd Qu.:2011-10-11
## 15311 : 2309 Netherlands : 2273 Max. :2011-11-29
## (Other):351978 (Other) : 13590
## Time
## 13:35:00: 1774
## 12:36:00: 1700
## 12:25:00: 1571
## 12:41:00: 1560
## 12:53:00: 1477
## 12:45:00: 1473
## (Other) :368645
Total Sales
sum(online_retail$UnitPrice)
## [1] 1186106
Total Customer
online_retail$CustomerID %>% unique() %>% length()
## [1] 4292
Total Transaction
online_retail$InvoiceNo %>% unique() %>% length()
## [1] 17651
Total Country
online_retail$Country %>% unique() %>% length()
## [1] 37
Performa Penjualan
data0 <- as.data.frame(table(online_retail$Date))
data0$Var1 <- ymd(data0$Var1)
data0 <- data0 %>%
mutate(Month = format(Var1, "%Y-%m")) %>%
group_by(Month) %>%
summarise(Quantity = sum(Freq))
data0$Month <- as.factor(data0$Month)
data0 <-
ggplot(data0, aes(x=Month, y=Quantity, group=1)) +
geom_area(fill="#FFB21F",position = position_dodge(0),alpha = 0.6) +
geom_line(color = "#FFB21F", size = 1.2) +
geom_point(color = "#A44512", size = 2)+
scale_y_continuous(breaks = seq(0,80000,10000),
labels = comma) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none") +
labs(title = "Sales Performance",
x = "Date",
y = "")
ggplotly(data0)
Top 10 produk yang paling banyak dibeli
data1 <- as.data.frame(table(online_retail$Description))
data1 <- data1[order(data1$Freq,decreasing = T),]
data1 <- setNames(data1,c("Product","Quantity"))
data1 <- data1 %>%
mutate(label=glue(
"Product: {Product}
Quantity: {Quantity}"))
data1 <-
data1 %>%
head(10) %>%
ggplot(aes(y = reorder(Product, Quantity), x = Quantity,text=label)) +
geom_col(aes(fill = Quantity))+
scale_fill_gradient(low = "#A44512",high = "#FFB21F")+
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))+
labs(title = "Top 10 Best Seller Product",
x = "Quantity",
y = "")
ggplotly(data1,tooltip = "text")
Top 10 pembeli dengan pembelian terbanyak
data2 <- as.data.frame(table(online_retail$CustomerID))
data2 <- data2[order(data2$Freq,decreasing = T),]
data2 <- setNames(data2,c("CustomerID","Quantity"))
data2 <- data2 %>%
mutate(label=glue(
"CustomerID: {CustomerID}
Quantity: {Quantity}"))
data2 <-
data2 %>%
head(10) %>%
ggplot(aes(y = reorder(CustomerID, Quantity), x = Quantity,text=label)) +
geom_col(aes(fill = Quantity))+
scale_fill_gradient(low = "#A44512",high = "#FFB21F")+
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))+
labs(title = "Top 10 Best Customer",
x = "Quantity",
y = "")
ggplotly(data2,tooltip = "text")
Trasaksi per Jam
online_retail$InvoiceHour <- hour(online_retail$InvoiceDate)
data3 <- as.data.frame(table(online_retail$InvoiceHour))
data3 <- setNames(data3,c("Hour","Quantity"))
data3 <- data3 %>%
mutate(label=glue(
"Hour: {Hour}
Quantity: {comma(Quantity)}"))
data3 <-
data3 %>%
ggplot(aes(x = Hour, Quantity,text=label))+
geom_col(aes(fill = Quantity))+
scale_fill_gradient(low = "#A44512",high = "#FFB21F")+
scale_y_continuous(labels = comma)+
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))+
labs(title = "Transaction per Hour",
x = "Hours",
y = "")
ggplotly(data3,tooltip = "text")
Trasaksi per Weekday
online_retail$InvoiceDay <- wday(online_retail$InvoiceDate,label=T,abbr = T)
data4 <- as.data.frame(table(online_retail$InvoiceDay))
data4 <- setNames(data4,c("Day","Quantity"))
data4 <- data4 %>%
mutate(label=glue(
"Day: {Day}
Quantity: {comma(Quantity)}"))
data4 <-
data4 %>%
filter (Quantity > 0) %>%
ggplot(aes(x = Day, Quantity,text=label))+
geom_col(aes(fill = Quantity))+
scale_fill_gradient(low = "#A44512",high = "#FFB21F")+
scale_y_continuous(labels = comma)+
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))+
labs(title = "Transaction per Weekday",
x = "Days",
y = "")
ggplotly(data4,tooltip = "text")
Trasaksi per Bulan
online_retail$InvoiceMonth <- month(online_retail$InvoiceDate,label=T)
data5 <- as.data.frame(table(online_retail$InvoiceMonth))
data5 <- setNames(data5,c("Month","Quantity"))
data5 <- data5 %>%
mutate(label=glue(
"Month: {Month}
Quantity: {Quantity}"))
data5 <-
data5 %>%
ggplot(aes(x = Month, Quantity,text=label))+
geom_col(aes(fill = Quantity))+
scale_fill_gradient(low = "#A44512",high = "#FFB21F")+
scale_y_continuous(labels = comma)+
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))+
labs(title = "Transaction per Month",
x = "Month",
y = "")
ggplotly(data5,tooltip = "text")
Berdasarkan dari preprocessing didapatkan insight yaitu:
Total Penjualan hingga mencapai $1.186.106
Total Customer mencapai 4292 user
Total Transaction 17651 Invoice
Total Country mencapai 37 negara
Pada bulan Januari hingga Juli penjualan mengalamin naik turun, lalu mulai bulan September hingga November mengalami kenaikan yang cukup siginifikan.
Produk yang paling banyak terjual adalah “WHITE HANGING HEART T-LIGHT HOLDER”.
Pembeli dengan pembelian terbanyak yaitu dengan nomor CustomerID “17841”
Jam 12 siang adalah waktu yang paling sering pembeli melakukan pembelian, lalu yang paling jarang ada di jam 6 pagi.
Hari Kamis adalah waktu yang paling sering pembeli melakukan pembelian, lalu yang paling jarang ada di hari Jumat.
Bulan November merupakan bulan dengan penjualan terbanyak, sedangkan Februari merupakan bulan dengan penjualan paling sedikit
Market Basket Analysis atau sering disebut Association Rules adalah suatu metode dalam menganalisa perilaku konsumen secara spesifik dari suatu golongan / kelompok tertentu. Kebutuhan market basket analysis berawal dari keakuratan dan manfaat yang dihasilkannya dalam wujud aturan assosiasi (association rules). Yang dimaksud dengan association rules adalah pola-pola keterkaitan data dalam basis data.
Market basket analysis dapat digunakan untuk melakukan analisis buying habit konsumen dengan menemukan asosiasi antar beberapa item berbeda yang dipilih oleh konsumen di dalam shopping basket (keranjang belanja) yang dibeli padasuatu transaksi tertentu. Tujuan dari market basket analysis adalah untuk mengetahui produk-produk yang mungkin akan dibeli secara bersamaan
Association Rule adalah salah satu teknik utama atau prosedur dalam Market Basket Analysis untuk mencari hubungan antar item dalam suatu dataset. Association rule (aturan asosiatif) akan menemukan pola tertentu yang mengasosiasikan data yang satu dengan data yang lain.
Untuk metrik yang digunakan untuk association rule ini yaitu:
Support menunjukkan proporsi dari jumlah transaksi yang memiliki satu atau lebih item yang muncul secara bersamaan dibandingkan dengan jumlah transaksi secara keseluruhan. Untuk rumus yang digunakan adalah sebagai berikut:
\[Support(A) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ A }{Jumlah\ seluruh\ transaksi}\]
Jika itemnya lebih dari satu, maka rumusnya yaitu:
\[Support(A,B) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ A\ \&\ B }{Jumlah\ seluruh\ transaksi}\]
Confidence menunjukkan seberapa besar kemungkinan seseorang akan membeli item B jika terdapat item A, atau bisa dibilang berapa banyak jumlah transaksi yang memiliki item A dan item B diantara transaksi-transaksi yang memiliki item A. Rumus untuk menghitung Confidence adalah sebagai berikut:
\[Confidence(A => B) = \frac{Freq(A\ \cap\ B)}{Freq(A)}\]
Jika Confidence hanya mengukur seberapa besar peluang seorang pembeli membeli item B jika diketahui item A dibeli, maka Lift mengukur seberapa besar pembelian item A dapat meningkatkan peluang pembelian item B. Rumus untuk menghitung Lift adalah sebagai berikut:
\[Lift(A,B) = \frac{Support(A,B)}{Support(A)\ Support(B)}\]
Lift membandingkan peluang ketika keberadaan item A menjadi sinyal kuat bahwa iteml B juga akan dibeli, dengan peluang bahwa keberadaan item A dengan B saling independen dan tidak berkaitan, sehingga:
Jika nilai Lift = 1, maka kedua item bersifat independen satu sama lain (tidak ada rules yang terbentuk).
Ketika nilai Lift > 1, maka dapat kita katakan bahwa keberadaan item A meningkatkan peluang bahwa seseorang juga membeli item B.
Jika nilai Lift < 1, maka pembelian item A malah menurunkan peluang bahwa seseorang juga akan membeli item B.
Salah satu algoritma atau metode yang populer untuk mencari Association Rule yaitu Algoritma apriori yaitu suatu metode untuk mencari pola hubungan antar satu atau lebih item dalam suatu dataset.
Algoritma apriori banyak digunakan pada data transaksi atau biasa disebut market basket, misalnya sebuah swalayan memiliki market basket, dengan adanya algoritma apriori pemilik swalayan dapat mengetahui pola pembelian seorang konsumen, jika seorang konsumen membeli item A , B, maka punya kemungkinan 50% dia akan membeli item C.
Membuat dataframe menjadi data transaksi
#membuat data transaksi
DataTransaksi <- ddply(online_retail,c("CustomerID","Date"),
function(df1)paste(df1$Description,
collapse = ","))
#mengubah variabel InvoiceNo dan Date ke Null, tidak diperlukan untuk analisis data
DataTransaksi$CustomerID <- NULL
DataTransaksi$Date <- NULL
#mengubah nama kolom
colnames(DataTransaksi) <- c("Items")
DataTransaksi
Eksport file data transaksi kedalam file csv
write.csv(DataTransaksi, "Market Basket.csv", quote = FALSE, row.names = FALSE)
Import kembali data csv dengan mengguakan function read.transaction()
transaction <- read.transactions("Market Basket.csv", format = 'basket', sep = ',')
summary(transaction)
## transactions as itemMatrix in sparse format with
## 15964 rows (elements/itemsets/transactions) and
## 7343 columns (items) and a density of 0.002584
##
## most frequent items:
## WHITE HANGING HEART T-LIGHT HOLDER REGENCY CAKESTAND 3 TIER
## 1546 1362
## ASSORTED COLOUR BIRD ORNAMENT JUMBO BAG RED RETROSPOT
## 1289 1277
## PARTY BUNTING (Other)
## 1165 296262
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 930 589 528 591 674 606 569 594 562 521 535 460 461 500 472 470 446 402 447 384
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 351 296 308 259 222 235 199 182 221 204 141 131 132 142 128 107 108 88 103 92
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 73 87 75 62 59 57 58 57 46 45 47 44 45 50 46 29 30 32 33 25
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 23 22 18 18 21 20 24 26 19 21 18 4 19 15 13 13 16 5 9 12
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 11 16 9 9 12 10 7 10 6 5 3 7 6 4 5 4 5 3 3 2
## 101 102 103 104 105 106 107 108 109 110 111 113 115 116 117 119 120 121 122 123
## 2 5 3 1 4 3 4 5 6 2 2 4 1 2 2 2 1 1 3 2
## 124 125 126 127 128 129 132 135 138 139 140 141 142 144 146 149 150 151 154 155
## 1 2 1 3 1 1 1 1 1 1 2 1 2 1 2 1 1 1 1 1
## 157 158 160 166 171 177 178 179 180 188 198 199 211 217 226 249 250 347 436
## 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 7 14 19 25 436
##
## includes extended item information - examples:
## labels
## 1 1 HANGER
## 2 10 COLOUR SPACEBOY PEN
## 3 12 COLOURED PARTY BALLOONS
Tahap pertama yang dilakukan untuk membuat rules apriori adalah dengan menentukan terlebih dahulu nilai Support dan Confidence. Nilai support ini diartikan sebagai minimal produk yang dibeli sebanyak 0.002 (2%) transaksi, kemudian untuk minimum confidence secara subjektif diberi nilai 0.8 (80%).
#membuat model (Min Support 0.002, Confidence 0.8)
or_apriori <- apriori(transaction, parameter = list(supp=0.002, conf=0.8))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.002 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 31
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[7343 item(s), 15964 transaction(s)] done [0.12s].
## sorting and recoding items ... [1970 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 done [0.10s].
## writing ... [10963 rule(s)] done [0.01s].
## creating S4 object ... done [0.01s].
Dari hasil tersebut, didapat sebanyak 10963 rules.
Melihat rules secara rekomendasi product
#===PRODUCT SELECTION===#
#make new column based on From
rules_tabel_selection <-
rules_tabel %>%
mutate(Product_Selection = tolower(Product_Selection),
Product_Selection = str_replace_all(Product_Selection, "\\{|\\}","")) %>%
mutate(Quantity = str_count(Product_Selection,",")) %>%
separate(col = Product_Selection, into = paste("Product_Selection_",1:max(.$Quantity), sep = ""),
sep = ",")
rules_tabel_selection$Transaction <- seq.int(nrow(rules_tabel_selection))
#===PRODUCT RECOMMENDATION===#
#make new column based on To
rules_tabel_recomendation <-
rules_tabel %>%
mutate(Product_Recommendation = tolower(Product_Recommendation),
Product_Recommendation = str_replace_all(Product_Recommendation, "\\{|\\}","")) %>%
mutate(Quantity = str_count(Product_Recommendation,",")) %>%
separate(col = Product_Recommendation, into = paste("Product_Recommendation", sep = ""),
sep = ",")
rules_tabel_recomendation$Transaction <- seq.int(nrow(rules_tabel_recomendation))
#==MERGE DATA==#
rules_tabel_df <- merge(rules_tabel_selection, rules_tabel_recomendation, by = "Transaction")
rules_tabel_df <-
rules_tabel_df %>%
select(Product_Selection_1, Product_Selection_2, Product_Selection_3, Product_Selection_4,
Product_Selection_5, Product_Selection_6, Product_Selection_7, Product_Recommendation.y,
Confidence.y, Support.y, Lift.y)
#==RENAME COLUMN==#
names(rules_tabel_df)[names(rules_tabel_df) == "Product_Recommendation.y"] <- "Product_Recommendation"
names(rules_tabel_df)[names(rules_tabel_df) == "Confidence.y"] <- "Confidence"
names(rules_tabel_df)[names(rules_tabel_df) == "Support.y"] <- "Support"
names(rules_tabel_df)[names(rules_tabel_df) == "Lift.y"] <- "Lift"
#Change "NA" to "NOTHING"
rules_tabel_df[is.na(rules_tabel_df)] <- "NOTHING"
#Remove space on value
rules_tabel_df <-
rules_tabel_df %>%
mutate_at(vars(c(Product_Selection_1, Product_Selection_2, Product_Selection_3,Product_Selection_4,
Product_Selection_5, Product_Selection_6,Product_Selection_7)), str_trim) %>%
mutate_at(vars(c(Product_Selection_1, Product_Selection_2, Product_Selection_3,Product_Selection_4,
Product_Selection_5, Product_Selection_6,Product_Selection_7)), str_squish)
rules_tabel_df
scater_plot_apriori <- plot(or_apriori, engine="plotly")
scater_plot_apriori
graph_plot_apriori <-
plot(or_apriori, # rules yang telah dibuat
method = "graph", #
measure = "confidence",
engine = "htmlwidget") # membuat grafik interaktif
graph_plot_apriori
Dari graph diatas, dataset ini hanya membentuk beberapa rule. Semakin merah warna node/lingkaran rules maka semakin tinggi nilai lift. Kemudian pada graph terdapat tanda arah/panah yang menunjukan item antecedent (awalan) tertentu menghasilkan item consequent (hasil) melalui rules tertentu.
Berdasarkan hasil analisa dari hasil visualisasi yang ditampilkan, terdapat beberapa barang yang mempunyai nilai keterikatan yang tinggi dilihat dari barang yang terkoneksi oleh masing-masing rule. Dari penjelasan analisa diatas, dengan menerapkan market basket analysis pada perusahaan retail maka akan memudahkan perusahaan untuk menentukan strategi-strategi, seperti:
Lebih efisien daripada mass marketing
Menargetkan produk kepada segmen tertentu
Dapat mengenal pelanggannya dengan lebih baik
Dapat memfokuskan strategi perusahaan
Mengoptimalkan posisi penempatan produk
Membuat bundle produk baru yang sesuai
Memberikan penawaran khusus pada beberapa produk