1. Introduction
Hai! Di kernel ini kita akan menggunakan algoritma Apriori untuk melakukan Market basket analysis. Market apa? Merupakan teknik yang digunakan oleh pengecer besar untuk mengungkap asosiasi antar item. Ini bekerja dengan mencari kombinasi item yang sering terjadi bersamaan dalam transaksi, memberikan informasi untuk memahami perilaku pembelian. Hasil dari jenis teknik ini, secara sederhana, adalah seperangkat aturan yang dapat dipahami sebagai "jika ini, maka itu".
Pertama, penting untuk menentukan algoritma Apriori, termasuk beberapa konsep statistik (support, confidence, lift dan conviction) untuk memilih aturan yang menarik. Kemudian kita akan menggunakan kumpulan data yang berisi lebih dari 6.000 transaksi dari toko roti/Bread untuk menerapkan algoritma dan menemukan kombinasi produk yang dibeli bersama.
2 Association rules
Algoritme Apriori menghasilkan aturan asosiasi atau asosciation rule untuk kumpulan data tertentu. Asosciation rule menyiratkan bahwa jika item A muncul, maka item B juga terjadi dengan probabilitas tertentu. Mari kita lihat contohnya,
Transaction |
Items |
t1 |
{T-shirt, Trousers, Belt} |
t2 |
{T-shirt, Jacket} |
t3 |
{Jacket, Gloves} |
t4 |
{T-shirt, Trousers, Jacket} |
t5 |
{T-shirt, Trousers, Sneakers, Jacket, Belt} |
t6 |
{Trousers, Sneakers, Belt} |
t7 |
{Trousers, Belt, Sneakers} |
# Load libraries
library(tidyverse) # data manipulation
library(arules) # mining association rules and frequent itemsets
library(arulesViz) # visualization techniques for association rules
library(knitr) # dynamic report generation
library(gridExtra) # provides a number of user-level functions to work with "grid" graphics
library(lubridate) # work with dates and times
# Read the data
trans <- read.transactions("BreadBasket_DMS.csv", format="single", cols=c(3,4), sep=",", rm.duplicates=TRUE)
3.1 Transaction object
## transactions in sparse format with
## 6614 transactions (rows) and
## 104 items (columns)
3.2 Summary
## transactions as itemMatrix in sparse format with
## 6614 rows (elements/itemsets/transactions) and
## 104 columns (items) and a density of 0.02008705
##
## most frequent items:
## Coffee Bread Tea Cake Pastry (Other)
## 3188 2146 941 694 576 6272
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10
## 2556 2154 1078 546 187 67 18 3 2 3
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 2.000 2.089 3.000 10.000
##
## includes extended item information - examples:
## labels
## 1 Adjustment
## 2 Afternoon with the baker
## 3 Alfajores
##
## includes extended transaction information - examples:
## transactionID
## 1 1
## 2 10
## 3 1000
## transactions as itemMatrix in sparse format with
## 6614 rows (elements/itemsets/transactions) and
## 104 columns (items) and a density of 0.02008705
##
## most frequent items:
## Coffee Bread Tea Cake Pastry (Other)
## 3188 2146 941 694 576 6272
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10
## 2556 2154 1078 546 187 67 18 3 2 3
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 2.000 2.089 3.000 10.000
##
## includes extended item information - examples:
## labels
## 1 Adjustment
## 2 Afternoon with the baker
## 3 Alfajores
##
## includes extended transaction information - examples:
## transactionID
## 1 1
## 2 10
## 3 1000
3.3 Structure
## Formal class 'transactions' [package "arules"] with 3 slots
## ..@ data :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
## .. .. ..@ i : int [1:13817] 11 63 80 19 80 11 93 14 45 11 ...
## .. .. ..@ p : int [1:6615] 0 1 3 5 7 9 11 15 16 17 ...
## .. .. ..@ Dim : int [1:2] 104 6614
## .. .. ..@ Dimnames:List of 2
## .. .. .. ..$ : NULL
## .. .. .. ..$ : NULL
## .. .. ..@ factors : list()
## ..@ itemInfo :'data.frame': 104 obs. of 1 variable:
## .. ..$ labels: chr [1:104] "Adjustment" "Afternoon with the baker" "Alfajores" "Argentina Night" ...
## ..@ itemsetInfo:'data.frame': 6614 obs. of 1 variable:
## .. ..$ transactionID: chr [1:6614] "1" "10" "1000" "1001" ...
4. Data Dictionary
- Date. Variabel kategori yang memberi tahu kita tanggal transaksi (format YYYY-MM-DD). Kolom tersebut mencakup tanggal dari 30/10/2016 hingga 09/04/2017.
- Time. Variabel kategorikal yang memberi tahu kita waktu transaksi (format HH: MM: SS).
- Transaction Variabel kuantitatif yang memungkinkan kita untuk membedakan transaksi. Baris yang memiliki nilai yang sama di bidang ini milik transaksi yang sama, itulah mengapa kumpulan data memiliki lebih sedikit transaction daripada observation.
- Item. Variabel kategori yang berisi produk.
itemFrequencyPlot () memungkinkan kita menampilkan nilai absolut atau relatif. Jika absolut itu akan memplot frekuensi numerik dari setiap item secara independen. Jika relatif, ini akan menunjukkan berapa kali item tersebut muncul dibandingkan dengan yang lain, seperti yang ditunjukkan pada plot berikut.
Coffee adalah produk terlaris sejauh ini, diikuti oleh bread dan tea. Mari kita tampilkan beberapa visualisasi lain yang menjelaskan distribusi waktu menggunakan fungsi ggplot ().
Transaksi per bulan
# Load data
trans_csv <- read.csv("BreadBasket_DMS.csv")
# Visualization - Transactions per month
trans_csv %>%
mutate(Month=as.factor(month(Date))) %>%
group_by(Month) %>%
summarise(Transactions=n_distinct(Transaction)) %>%
ggplot(aes(x=Month, y=Transactions)) +
geom_bar(stat="identity", fill="mistyrose2",
show.legend=FALSE, colour="black") +
geom_label(aes(label=Transactions)) +
labs(title="Transactions per month") +
theme_bw()
Kumpulan data mencakup tanggal dari 30/10/2016 hingga 09/04/2017, itulah sebabnya kita memiliki sangat sedikit transaksi di bulan Oktober dan April.
Transaksi per hari kerja
# Visualization - Transactions per weekday
trans_csv %>%
mutate(WeekDay=as.factor(weekdays(as.Date(Date)))) %>%
group_by(WeekDay) %>%
summarise(Transactions=n_distinct(Transaction)) %>%
ggplot(aes(x=WeekDay, y=Transactions)) +
geom_bar(stat="identity", fill="peachpuff2",
show.legend=FALSE, colour="black") +
geom_label(aes(label=Transactions)) +
labs(title="Transactions per weekday") +
scale_x_discrete(limits=c("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")) +
theme_bw()
# Visualization - Transactions per hour
trans_csv %>%
mutate(Hour=as.factor(hour(hms(Time)))) %>%
group_by(Hour) %>%
summarise(Transactions=n_distinct(Transaction)) %>%
ggplot(aes(x=Hour, y=Transactions)) +
geom_bar(stat="identity", fill="steelblue1", show.legend=FALSE, colour="black") +
geom_label(aes(label=Transactions)) +
labs(title="Transactions per hour") +
theme_bw()
No comments: