[분류] Apriori 라이브러리를 이용한 장바구니 분석 하기

2020. 11. 16. 06:51노트/R : 통계

 

데이터 

groceries.csv
0.49MB

 

패키지 설치 

install.packages("arules")
library(arules)

 

데이터 읽어오기 

# read.csv로 읽어오면 안됌
# groceries <- read.csv("C:\\Users\\diane\\OneDrive\\바탕 화면\\Diane\\groceries.csv",sep = ",")

groceries <- read.transactions("C:\\Users\\diane\\OneDrive\\바탕 화면\\Diane\\groceries.csv",sep = ",")

str(groceries)

summary(groceries)

 

데이터 조사하기 

# 169:   거래내역에서 전체 상품의 종류의 갯수, 
# 1~ 32 : 거래당 구매 상품의 갯수 

inspect(groceries[1:5])

item 빈도 산출 

itemFrequency((groceries[,150:169]))

itemFrequencyPlot(groceries, support = 0.1) # 지지도가 0.1 이상인 것들만 출력 

itemFrequencyPlot(groceries, topN =20) # 상위 20개만 출력 

image(groceries[1:5])

image(sample(groceries,100))

 

apriori 라이브러리 사용 

apriori(groceries)

groceryRules <- apriori(groceries, parameter = list(support = 0.006, confidence = 0.25, minlen = 2))

# min=2 : 2 개 미만의 아이템을 갖는 규칙은 제거 

inspect(groceryRules[1:3])

inspect(sort(groceryRules, by="lift")[1:5])

# 3.956477의 의미는 대략 4 
# 허브를 산 사람들이 채소를 살 가능성이 채소를 산 일반 고객보다 4배 더 높다.  

berryRules <- subset(groceryRules, items %in% c("berries","yogurt"))

inspect(berryRules)

 

Epub data 로 장바구니 분석하기 

data(Epub)

summary(Epub)

inspect(Epub[1:10])

# 각각 item별로 비중에 대한 비율 출력 
itemFrequency(Epub[,1:10])

# 지지도가 0.01 이상인 항목에 대해서만 비율 그림 출력 
itemFrequencyPlot(Epub, supprot=0.01 , main = 'item Frequency')

# 상위 30 이상인 항목에 대해서만 출력 
itemFrequencyPlot(Epub, topN=30, main = 'item Frequency' )

image(sample(Epub,500))


연관 규칙 분석

epub_rule <- apriori(data= Epub, parameter = list(support=0.001, confidence = 0.2, minlen = 2))

summary(epub_rule)

inspect(epub_rule)

inspect(sort(epub_rule, by="lift")[1:20])

inspect(sort(epub_rule, by="support")[1:20])

rule_ins <- subset(epub_rule, items %in% c("doc_72f", "doc_4ac"))

inspect(rule_ins)

# %in% 는 적어도 하나의 제품이 존재하면 해당 규칙을 가져 옴 

rule_ins <- subset(epub_rule, items %pin% c("60e"))
inspect(rule_ins)

# %pin% 은 왼쪽 오른쪽 상관없이 60e 규칙이 들어가 있으면 출력하라 

inspect(rule_ins)

# %ain%은 온전히 일치해야함 

rule_ins <-subset(epub_rule, items %pin% c("60e") & confidence > 0.25)
inspect(rule_ins)


연관규칙 시각화를 위한 tool 설치 

install.packages("arulesViz")
library(arulesViz)
plot(epub_rule)

 

plot(sort(epub_rule,by="support")[1:20], method="grouped")

plot(epub_rule, method = "graph", control = list(type="items"))

plot(epub_rule, method="graph",
     control = list(type ="items",
                    vertex.label.cex = 0.7, # 점 크기(기본 :1)
                    edge.arrow.size = 0.3, # 화살표의 크기 
                    edge.arrow.width = 2)) # 화살표의 넓이 

# 원의 크기는 지지도에 비례하여 커짐
# 원의 색깔은 향상도(lift)에 비례하여 진해짐