1. Latar Belakang

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.

1.2. Problem Statement

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.

1.3. Project Idea

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.

1.4. Problem Scope

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.

1.5. Output

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.

1.6. Business Impact

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

1.7. Refrensi

2. Data Preprocessing

2.1. Aktifkan Library

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)

2.2. Import Data

Import data yang akan digunakan

online_retail <- read_excel("Online Retail.xlsx")
online_retail

2.3. Cek Missing Value

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.

2.4. Cek Tipe Data

Pengecekan tipe data ini bertujuan untuk mengetahui apakah setiap variabel sudah mempunyai tipe data yang sesuai. Berikut adalah beberapa jenis dari tipe data:

  • Character (chr) : Data karakter atau string
  • Integer (int) : Data bilangan bulat
  • Double (dbl) : Data bilangan desimal
  • Datetime (dttm) : Data waktu atau tanggal
  • Factor (fct) : Data kategorik atau kelompok
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

2.5. Seleksi Data

  • Pilih Quantity yang nilainya lebih dari 0
online_retail <- 
  online_retail %>% 
  filter(Quantity > 0)
  • Ambil data Tanggal dan data Waktu dari variabel InvoiceDate
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")

2.6. Data Summary

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

3. Market Basket Analysis

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

3.1. Association Rule Metric

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:

3.1.1. Support

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}\]

3.1.2. Confidence

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)}\]

3.1.3. Lift

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.

3.2. Apriori

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.

4. Modeling

4.1. Transformasi Data

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

4.2. Membuat Rules

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.

4.3. Hasil Rules

4.3.1. Data 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

4.3.2. Visualization Rules

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.

5. Kesimpulan

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