Basket analysis/ Association
Rule
FPM còn gọi là basket analysis là kĩ thuật phân tích hành vi khách hàng dựa trên lịch sử giao dịch của họ, từ đó giúp cho kinh doanh nắm được nhu cầu sử dụng sản phẩm và thị hiếu của khách hàng từ đó có những chiến dịch Marketing một cách hợp lý.
Ví dụ: Trong siêu thị, thông thường khách hàng mua bàn chải và kem đánh răng môi lần giao dịch, điều này thấy rằng 2 sản phẩm (item) này đã tạo ra một mối quan hệ (association rule) và các mỗi quan hệ như vậy sẽ giúp cho người bán hàng sẽ dự đoán được hành vi mua hàng của khách hàng để từ đó có được những chiến lược kinh doanh hợp lý để giúp tăng doanh thu.
Ta xét một ví dụ:
Xét toàn bộ các giao dịch của khách hàng A trong mỗi lần mua hàng, thì xác suất để khách hàng mua bàn chải là 5%, và trong những lần mua bàn chải xác suất khách hàng mua kem đánh răng là 60% thì hành vi mua sắm của khách hàng đã tạo nên mối quan hệ (association rule) của chính khách hàng A, hành vi mua bàn chải và kem đánh răng của khách hàng A được miêu tả như sau:
{Bàn chải => Kem đánh răng}[suppport = 5%, confidence = 60%]
Ở đây xuất hiện 2 chỉ số là support và confidence, đây là 2 chỉ số quan trọng để cấu thành lên 1 rule trong basket analysis. Vậy, 2 chỉ số này có ý nghĩa là gì?
Support: Tần xuất để khách hàng mua một hay nhiều sản phẩm trong toàn bộ các giao dịch của mình.
Confidence: Cơ hội để khách hàng mua thêm 1 sản phẩm tiếp theo trong chuỗi hành vi mua sắm của mình.
Xét trong ví dụ trên:
-
Support[bàn chải] = 5% nghĩa là có 100 khách hàng vào của hàng mua sắm thì có 5 khách hàng mua bàn chải.
-
Confidence[bàn chải => kem đánh răng] = 60% nghĩa là trong số 5 khách hàng mua bàn chải ở trên thì có 3 khách hàng mua cả kem đánh răng trong chuỗi giao dịch của mình.
Mức Support:
-
Ví dụ đối với sản phẩm là Break:
Ý nghĩa: Có 5 khách hàng thì 4 khách hàng mua Break chiếm 80%
-
Ví dụ khách hàng mua cả Break và Beer.
Ý nghĩa: Có 5 khách hàng thì 1 khách hàng mua cả Break và Beer chiếm 20%
Mức Confidence:
Trong số những khách hàng mua Break thì bao nhiêu trong số đó là mua bia, rule được hình thành như sau:
Ý nghĩa: Đối với những khách hàng mua Break thì xác suất để họ mua thêm Beer là 25%.
{Bàn chải => Kem đánh răng}[suppport = 5%, confidence = 60%]
Support[bàn chải] = 5% nghĩa là có 100 khách hàng vào của hàng mua sắm thì có 5 khách hàng mua bàn chải.
Confidence[bàn chải => kem đánh răng] = 60% nghĩa là trong số 5 khách hàng mua bàn chải ở trên thì có 3 khách hàng mua cả kem đánh răng trong chuỗi giao dịch của mình.
Mức Support:
- Ví dụ đối với sản phẩm là Break:Ý nghĩa: Có 5 khách hàng thì 4 khách hàng mua Break chiếm 80%
- Ví dụ khách hàng mua cả Break và Beer.Ý nghĩa: Có 5 khách hàng thì 1 khách hàng mua cả Break và Beer chiếm 20%
Mức Confidence:
Trong số những khách hàng mua Break thì bao nhiêu trong số đó là mua bia, rule được hình thành như sau:
Ý nghĩa: Đối với những khách hàng mua Break thì xác suất để họ mua thêm Beer là 25%.
Các bước thực hiện thuật toán
Để thực hiện thuật toán Basket Analysis tìm mối liên hệ giữa các item, thì chúng ta cần phải cài đặt package: arules và arulesVis.
Các bước thực hiện biến đổi dữ liệu:
-
Bước 1: Chuyển dữ liệu dạng data.frame về dạng liệt kê các transaction
- sử dụng hàm read.transaction()
-
Bước 2: Sử dụng hàm apriori() để tìm các mối quan hệ giữa các item.
-
Bước 3: Xóa các rule trùng lặp.
-
Bước 4: Trực quan hóa dữ liệu
- Sử dụng hàm plot() trong package arulesViz.
-
Bước 5: Convert từ rule sang khách hàng.
Để thực hiện thuật toán Basket Analysis tìm mối liên hệ giữa các item, thì chúng ta cần phải cài đặt package: arules và arulesVis.
Các bước thực hiện biến đổi dữ liệu:
- Bước 1: Chuyển dữ liệu dạng data.frame về dạng liệt kê các transaction
- sử dụng hàm read.transaction()
- Bước 2: Sử dụng hàm apriori() để tìm các mối quan hệ giữa các item.
- Bước 3: Xóa các rule trùng lặp.
- Bước 4: Trực quan hóa dữ liệu
- Sử dụng hàm plot() trong package arulesViz.
- Bước 5: Convert từ rule sang khách hàng.
Call library
.libPaths(“D:/Phu/R/R
Packages & Research/OldLibrary/3.5”)
knitr::opts_chunk$set(echo = TRUE)
rm(list = ls())
library(arules)
library(arulesViz)
.libPaths(“D:/Phu/R/R Packages & Research/3.5”)
library(igraph)
knitr::opts_chunk$set(echo = TRUE)
rm(list = ls())
library(arules)
library(arulesViz)
.libPaths(“D:/Phu/R/R Packages & Research/3.5”)
library(igraph)
#
data <- read.csv("D:/Phu/AD_HOC/R10_Analysis/SP_AFF.csv")
data %>% head()
data <- read.csv("D:/Phu/AD_HOC/R10_Analysis/SP_AFF.csv")
data %>% head()
## ID PRODUCT_LINE
## 1 20802679 Product A
## 2 27714633 Product B
## 3 26908988 Product A
## 4 30546868 PRODUCT C
## 5 30316174 PRODUCT C
## 6 31041526 Product B
## 1 20802679 Product A
## 2 27714633 Product B
## 3 26908988 Product A
## 4 30546868 PRODUCT C
## 5 30316174 PRODUCT C
## 6 31041526 Product B
#Using function read.transaction() to
transform data.frame format to listed format data (items)
baset.raw <-
read.transactions(file = paste("D:/Phu/AD_HOC/R10_Analysis/", "SP_AFF.csv",sep = ""),
format = "single",
sep = ",",
header = TRUE,
cols = c("CUSID","PRODUCT_LINE"))
baset.raw %>%
summary()
baset.raw <-
read.transactions(file = paste("D:/Phu/AD_HOC/R10_Analysis/", "SP_AFF.csv",sep = ""),
format = "single",
sep = ",",
header = TRUE,
cols = c("CUSID","PRODUCT_LINE"))
baset.raw %>%
summary()
## transactions as itemMatrix in
sparse format with
## 4772 rows (elements/itemsets/transactions) and
## 9 columns (items) and a density of 0.286486
##
## most frequent items:
## PRODUCT C Product A Product B Product D
## 4364 2665 2138 1304
## Product F (Other)
## 602 1231
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7
## 861 1602 1365 650 233 48 13
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 2.000 2.578 3.000 7.000
##
## includes extended item information - examples:
## labels
## 1 Bond
## 2 Product G
## 3 Product E
##
## includes extended transaction information - examples:
## transactionID
## 1 10112168
## 2 10133226
## 3 10200049
## 4772 rows (elements/itemsets/transactions) and
## 9 columns (items) and a density of 0.286486
##
## most frequent items:
## PRODUCT C Product A Product B Product D
## 4364 2665 2138 1304
## Product F (Other)
## 602 1231
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7
## 861 1602 1365 650 233 48 13
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 2.000 2.578 3.000 7.000
##
## includes extended item information - examples:
## labels
## 1 Bond
## 2 Product G
## 3 Product E
##
## includes extended transaction information - examples:
## transactionID
## 1 10112168
## 2 10133226
## 3 10200049
#Use function Apriori to look for
the rules
rule <-
apriori(data = baset.raw,
parameter = list(support = 0.01, #Minimum support level to filter the transaction.
# N???u m???c support nh??? nh???t là (10%) thì có nghia là n???u khách hàng mua 1 s???n ph???m A
# mà ít hon 10% thì s???n ph???m dó s??? không dc coi là 1 rules.
confidence = 0.5, # Minimum confidence level to filter the transaction-
# M???c d??? tin c???y t???i thi???u d??? l???c các giá tr???
maxlen = 9, # Tìm ki???m m???i quan h??? t???i da c???a 2 s???n ph???m. (A ==> B)
minlen = 1)
# ,appearance = list(rhs = c("Pro1"))
)
rule <-
apriori(data = baset.raw,
parameter = list(support = 0.01, #Minimum support level to filter the transaction.
# N???u m???c support nh??? nh???t là (10%) thì có nghia là n???u khách hàng mua 1 s???n ph???m A
# mà ít hon 10% thì s???n ph???m dó s??? không dc coi là 1 rules.
confidence = 0.5, # Minimum confidence level to filter the transaction-
# M???c d??? tin c???y t???i thi???u d??? l???c các giá tr???
maxlen = 9, # Tìm ki???m m???i quan h??? t???i da c???a 2 s???n ph???m. (A ==> B)
minlen = 1)
# ,appearance = list(rhs = c("Pro1"))
)
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.01 1
## maxlen target ext
## 9 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 47
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[9 item(s), 4772 transaction(s)] done [0.00s].
## sorting and recoding items ... [9 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 done [0.00s].
## writing ... [108 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.01 1
## maxlen target ext
## 9 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 47
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[9 item(s), 4772 transaction(s)] done [0.00s].
## sorting and recoding items ... [9 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 done [0.00s].
## writing ... [108 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
# filter the highest lift indicators
as(rule,"data.frame") %>%
arrange(desc(lift)) %>%
head(n = 20)
as(rule,"data.frame") %>%
arrange(desc(lift)) %>%
head(n = 20)
##
rules
## 1 {Product E,PRODUCT C,Product B} => {Product G}
## 2 {Product E,Product B} => {Product G}
## 3 {Product E,PRODUCT C} => {Product G}
## 4 {Product E} => {Product G}
## 5 {Product B,Product F,Product A} => {Product D}
## 6 {PRODUCT C,Product B,Product F,Product A} => {Product D}
## 7 {Product F,Product A} => {Product D}
## 8 {PRODUCT C,Product F,Product A} => {Product D}
## 9 {Product G,Product F} => {Product B}
## 10 {Product G,PRODUCT C,Product F} => {Product B}
## 11 {Product F,Product D,Product A} => {Product B}
## 12 {PRODUCT C,Product F,Product D,Product A} => {Product B}
## 13 {Product B,Product F} => {Product D}
## 14 {PRODUCT C,Product B,Product F} => {Product D}
## 15 {Product F,Product A} => {Product B}
## 16 {PRODUCT C,Product F,Product A} => {Product B}
## 17 { Bond,Product D} => {Product A}
## 18 { Bond,Product B,Product D} => {Product A}
## 19 { Bond,PRODUCT C,Product D} => {Product A}
## 20 { Bond,PRODUCT C,Product B,Product D} => {Product A}
## 1 {Product E,PRODUCT C,Product B} => {Product G}
## 2 {Product E,Product B} => {Product G}
## 3 {Product E,PRODUCT C} => {Product G}
## 4 {Product E} => {Product G}
## 5 {Product B,Product F,Product A} => {Product D}
## 6 {PRODUCT C,Product B,Product F,Product A} => {Product D}
## 7 {Product F,Product A} => {Product D}
## 8 {PRODUCT C,Product F,Product A} => {Product D}
## 9 {Product G,Product F} => {Product B}
## 10 {Product G,PRODUCT C,Product F} => {Product B}
## 11 {Product F,Product D,Product A} => {Product B}
## 12 {PRODUCT C,Product F,Product D,Product A} => {Product B}
## 13 {Product B,Product F} => {Product D}
## 14 {PRODUCT C,Product B,Product F} => {Product D}
## 15 {Product F,Product A} => {Product B}
## 16 {PRODUCT C,Product F,Product A} => {Product B}
## 17 { Bond,Product D} => {Product A}
## 18 { Bond,Product B,Product D} => {Product A}
## 19 { Bond,PRODUCT C,Product D} => {Product A}
## 20 { Bond,PRODUCT C,Product B,Product D} => {Product A}
## support confidence lift count
## 1 0.01487846 0.5916667 7.735434 71
## 2 0.01487846 0.5867769 7.671505 71
## 3 0.02179380 0.5445026 7.118812 104
## 4 0.02200335 0.5440415 7.112783 105
## 5 0.02430847 0.6338798 2.319689 116
## 6 0.02430847 0.6338798 2.319689 116
## 7 0.02787091 0.6157407 2.253309 133
## 8 0.02787091 0.6157407 2.253309 133
## 9 0.01005868 0.8727273 1.947921 48
## 10 0.01005868 0.8727273 1.947921 48
## 11 0.02430847 0.8721805 1.946700 116
## 12 0.02430847 0.8721805 1.946700 116
## 13 0.04819782 0.5168539 1.891432 230
## 14 0.04819782 0.5168539 1.891432 230
## 15 0.03834870 0.8472222 1.890994 183
## 16 0.03834870 0.8472222 1.890994 183
## 17 0.02430847 1.0000000 1.790619 116
## 18 0.01592624 1.0000000 1.790619 76
## 19 0.02430847 1.0000000 1.790619 116
## 20 0.01592624 1.0000000 1.790619 76
- Nhận xét: Ở đâu xuất hiện thêm chỉ số Lift có ý nghĩa:
- Nếu: Lift > 1 khi KH mua sản phẩm A sẽ làm tăng khả năng mua thêm sản phẩm B a lần.
- Nếu: Lift < 1 khi KH mua sản phẩm A sẽ làm giảm khả năng mua thêm sản phẩm B a lần.
- Nếu: Lift = 1 khi KKH mua sản phẩm A sẽ không làm tăng khả năng mua sản phẩm B (A và B là 2 sản phẩm độc lập với nhau)
- Tuy nhiên, trong thực tế, tùy mục đích là tìm các rule để tăng khả năng bán được sản phẩm nên chúng ta chỉ quan tâm tới các rule mà có hệ số Lift > 1.
- Loại bỏ các rule trùng lặp
# Loại bỏ những rule trùng lặp.
subset.matrix <- is.subset(rule,rule,sparse = FALSE) # Tạo matrix dánh giá các rule
#subset.matrix[1:3,1:3] # Ki???m tra matrix vuông con 3x3.
# Là ma tr???n vuông c???p nxn ( n là s??? rule du???c t???o), nên các giá tr??? b??? trùng l???p qua tru???ng chéo chính nh???n giá tr??? (TRUE).
# nên ta dua các giá tr??? phía du???c du???ng chéo chính v??? giá tr??? NA.
subset.matrix[lower.tri(subset.matrix,diag = T)] <- NA
# L???y toàn b??? nh???ng giao d???ch là t???p con c???a giao d???ch khác. T???o là t???p redundant.
redundant <- colSums(subset.matrix,na.rm=T) >= 1
# Lo???i b??? nh???ng rule trùng (lo???i b??? kh???i rule ban d???u t???p redundant)
rules <- rule[!redundant]
# Sau khi lo???i rules trùng
rule.final <- rules
rule.final %>%
inspect()
subset.matrix <- is.subset(rule,rule,sparse = FALSE) # Tạo matrix dánh giá các rule
#subset.matrix[1:3,1:3] # Ki???m tra matrix vuông con 3x3.
# Là ma tr???n vuông c???p nxn ( n là s??? rule du???c t???o), nên các giá tr??? b??? trùng l???p qua tru???ng chéo chính nh???n giá tr??? (TRUE).
# nên ta dua các giá tr??? phía du???c du???ng chéo chính v??? giá tr??? NA.
subset.matrix[lower.tri(subset.matrix,diag = T)] <- NA
# L???y toàn b??? nh???ng giao d???ch là t???p con c???a giao d???ch khác. T???o là t???p redundant.
redundant <- colSums(subset.matrix,na.rm=T) >= 1
# Lo???i b??? nh???ng rule trùng (lo???i b??? kh???i rule ban d???u t???p redundant)
rules <- rule[!redundant]
# Sau khi lo???i rules trùng
rule.final <- rules
rule.final %>%
inspect()
## lhs rhs support confidence lift
## [1] {} => {Product A} 0.55846605 0.5584661 1.000000
## [2] {} => {PRODUCT C} 0.91450126 0.9145013 1.000000
## [3] {Product E}=> {Product G} 0.02200335 0.5440415 7.112783
## [4] {Product E}=> {Product B} 0.02535624 0.6269430 1.399332
## [5] {Product G}=> {Product B} 0.05008382 0.6547945 1.461496
## [6] { Bond} => {Product B} 0.04568315 0.5227818 1.166845
## [7] {Product F} => {Product B} 0.09325231 0.7392027 1.649895
## [8] {Product D}=> {Product B} 0.13935457 0.5099693 1.138248
## count
## [1] 2665
## [2] 4364
## [3] 105
## [4] 121
## [5] 239
## [6] 218
## [7] 445
## [8] 665
## [1] {} => {Product A} 0.55846605 0.5584661 1.000000
## [2] {} => {PRODUCT C} 0.91450126 0.9145013 1.000000
## [3] {Product E}=> {Product G} 0.02200335 0.5440415 7.112783
## [4] {Product E}=> {Product B} 0.02535624 0.6269430 1.399332
## [5] {Product G}=> {Product B} 0.05008382 0.6547945 1.461496
## [6] { Bond} => {Product B} 0.04568315 0.5227818 1.166845
## [7] {Product F} => {Product B} 0.09325231 0.7392027 1.649895
## [8] {Product D}=> {Product B} 0.13935457 0.5099693 1.138248
## count
## [1] 2665
## [2] 4364
## [3] 105
## [4] 121
## [5] 239
## [6] 218
## [7] 445
## [8] 665
as(rule.final,
"data.frame") %>% head(n = 100)
## rules support confidence lift count
## 1 {} => {Product A} 0.55846605 0.5584661 1.000000 2665
## 2 {} => {PRODUCT C} 0.91450126 0.9145013 1.000000 4364
## 3 {Product E} => {Product G} 0.02200335 0.5440415 7.112783 105
## 4 {Product E} => {Product B} 0.02535624 0.6269430 1.399332 121
## 7 {Product G} => {Product B} 0.05008382 0.6547945 1.461496 239
## 9 { Bond} => {Product B} 0.04568315 0.5227818 1.166845 218
## 12 {Product F} => {Product B} 0.09325231 0.7392027 1.649895 445
## 14 {Product D} => {Product B} 0.13935457 0.5099693 1.138248 665
## 1 {} => {Product A} 0.55846605 0.5584661 1.000000 2665
## 2 {} => {PRODUCT C} 0.91450126 0.9145013 1.000000 4364
## 3 {Product E} => {Product G} 0.02200335 0.5440415 7.112783 105
## 4 {Product E} => {Product B} 0.02535624 0.6269430 1.399332 121
## 7 {Product G} => {Product B} 0.05008382 0.6547945 1.461496 239
## 9 { Bond} => {Product B} 0.04568315 0.5227818 1.166845 218
## 12 {Product F} => {Product B} 0.09325231 0.7392027 1.649895 445
## 14 {Product D} => {Product B} 0.13935457 0.5099693 1.138248 665
#
sub.rule1 <- subset(rule.final,(lhs %in% c("PRODUCT C")))
sub.rule1 %>%
inspect()
#plot
plot(rule.final,method = "graph")
sub.rule1 <- subset(rule.final,(lhs %in% c("PRODUCT C")))
sub.rule1 %>%
inspect()
#plot
plot(rule.final,method = "graph")