R에서 Apriori 알고리즘으로 연관분석 해보기
Apriori 알고리즘을 활용한 장바구니 분석
1. 개요
장바구니 분석(Market Basket Analysis, MBA)은 고객의 구매 행동을 이해하고 거래 데이터에서 제품 간의 연관성을 찾는 기법이다. 본 블로그에서는 R의 arules
및 arulesViz
패키지를 사용하여 장바구니 분석을 수행한다.
2. 필요한 라이브러리 로드
우선 필요한 R 패키지를 설치하고 로드한다.
> install.packages("arules")
> install.packages("arulesViz")
> library(arules)
> library(arulesViz)
3. 데이터 불러오기
arules
패키지에 내장된 Groceries
데이터를 사용한다.
> data("Groceries")
> summary(Groceries)
transactions as itemMatrix in sparse format with
9835 rows (elements/itemsets/transactions) and
169 columns (items) and a density of 0.02609146
most frequent items:
whole milk other vegetables
2513 1903
rolls/buns soda
1809 1715
yogurt (Other)
1372 34055
element (itemset/transaction) length distribution:
sizes
1 2 3 4 5 6 7 8
2159 1643 1299 1005 855 645 545 438
9 10 11 12 13 14 15 16
350 246 182 117 78 77 55 46
17 18 19 20 21 22 23 24
29 14 14 9 11 4 6 1
26 27 28 29 32
1 1 1 3 1
Min. 1st Qu. Median Mean 3rd Qu.
1.000 2.000 3.000 4.409 6.000
Max.
32.000
includes extended item information - examples:
labels level2 level1
1 frankfurter sausage meat and sausage
2 sausage sausage meat and sausage
3 liver loaf sausage meat and sausage
해당 데이터셋에는 9,835개의 거래와 169개의 서로 다른 품목이 포함되어 있다. 밀도(0.026)는 각 거래에 포함된 품목 수가 전체 품목 수에 비해 적다는 것을 의미한다.
4. 연관 규칙 생성
Apriori 알고리즘을 적용하여 유의미한 연관 규칙을 도출한다.
> rules <- apriori(Groceries, parameter = list(supp = 0.01, conf = 0.5))
Apriori
Parameter specification:
confidence minval smax arem aval
0.5 0.1 1 none FALSE
originalSupport maxtime support minlen
TRUE 5 0.01 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: 98
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [88 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 done [0.00s].
writing ... [15 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
다음과 같은 최소 기준을 설정한다.
- 최소 지지도(support): 0.01 (거래의 1% 이상 포함된 규칙)
- 최소 신뢰도(confidence): 0.5 (50% 이상의 신뢰도)
생성된 규칙 중 10개를 확인한다.
> inspect(rules[1:10])
lhs rhs support confidence coverage lift count
[1] {curd,
yogurt} => {whole milk} 0.01006609 0.5823529 0.01728521 2.279125 99
[2] {other vegetables,
butter} => {whole milk} 0.01148958 0.5736041 0.02003050 2.244885 113
[3] {other vegetables,
domestic eggs} => {whole milk} 0.01230300 0.5525114 0.02226741 2.162336 121
[4] {yogurt,
whipped/sour cream} => {whole milk} 0.01087951 0.5245098 0.02074225 2.052747 107
[5] {other vegetables,
whipped/sour cream} => {whole milk} 0.01464159 0.5070423 0.02887646 1.984385 144
[6] {pip fruit,
other vegetables} => {whole milk} 0.01352313 0.5175097 0.02613116 2.025351 133
[7] {citrus fruit,
root vegetables} => {other vegetables} 0.01037112 0.5862069 0.01769192 3.029608 102
[8] {tropical fruit,
root vegetables} => {other vegetables} 0.01230300 0.5845411 0.02104728 3.020999 121
[9] {tropical fruit,
root vegetables} => {whole milk} 0.01199797 0.5700483 0.02104728 2.230969 118
[10] {tropical fruit,
yogurt} => {whole milk} 0.01514997 0.5173611 0.02928317 2.024770 149
inspect를 통해 확인해보면, 소비자의 구매 규칙의 연관성을 파악해볼 수 있다.
연관 규칙 해석
각 규칙은 {lhs} => {rhs}
형태로 표현된다. lhs(왼쪽 항목)가 포함된 거래에서 rhs(오른쪽 항목)가 구매될 확률이 높음을 의미한다. 주요 평가 기준은 다음과 같다.
- 지지도(Support): lhs와 rhs가 함께 등장하는 거래 비율
- 신뢰도(Confidence): lhs가 등장할 때 rhs가 등장할 확률
- 향상도(Lift): lhs가 있을 때 rhs가 발생할 가능성이 무작위보다 얼마나 더 높은지(1보다 크면 긍정적 관계)
5. 규칙 필터링 및 정렬
보다 강한 규칙을 찾기 위해 향상도와 신뢰도를 기준으로 필터링한다.
> filtered_rules <- subset(rules, lift > 1.2 & confidence > 0.6)
> filtered_rules <- sort(filtered_rules, by = "lift", decreasing = TRUE)
필터링된 규칙이 있는지 확인한다.
> if (length(filtered_rules) > 0) {
inspect(filtered_rules[1:min(10, length(filtered_rules))])
} else {
cat("필터링 후 규칙이 없음.\n")
}
혹시나 하고 조건문으로 분리해두었는데, 역시나, 아마 규칙이 발견되지 않았을 것이다.
그 이유는 apriori에서 supp과 conf에 너무 과한 룰을 주었기 때문이며, 이를 아래와 같이 기준을 완화하여 다시 실행하여 해결할 수 있다.
여기서 지지도(supp)값을 0.001에서 0.005로 상향해서 넣어준다.
> rules <- apriori(Groceries, parameter = list(supp = 0.005, conf = 0.4))
> filtered_rules <- subset(rules, lift > 1.2 & confidence > 0.6)
lhs rhs support confidence coverage lift count
[1] {root vegetables,
onions} => {other vegetables} 0.005693950 0.6021505 0.009456024 3.112008 56
[2] {tropical fruit,
curd} => {whole milk} 0.006507372 0.6336634 0.010269446 2.479936 64
[3] {domestic eggs,
margarine} => {whole milk} 0.005185562 0.6219512 0.008337570 2.434099 51
[4] {butter,
domestic eggs} => {whole milk} 0.005998983 0.6210526 0.009659380 2.430582 59
[5] {butter,
whipped/sour cream} => {whole milk} 0.006710727 0.6600000 0.010167768 2.583008 66
[6] {butter,
bottled water} => {whole milk} 0.005388917 0.6022727 0.008947636 2.357084 53
[7] {tropical fruit,
butter} => {whole milk} 0.006202339 0.6224490 0.009964413 2.436047 61
[8] {root vegetables,
butter} => {whole milk} 0.008235892 0.6377953 0.012913066 2.496107 81
[9] {butter,
yogurt} => {whole milk} 0.009354347 0.6388889 0.014641586 2.500387 92
[10] {pip fruit,
domestic eggs} => {whole milk} 0.005388917 0.6235294 0.008642603 2.440275 53
6. 연관 규칙 시각화
연관 규칙을 시각화하여 관계를 직관적으로 이해한다.
plot(filtered_rules, method = "graph", control = list(type = "items"))
그래프를 통해 자주 함께 구매되는 품목을 확인할 수 있다.
7. 결론
Apriori 알고리즘을 활용한 장바구니 분석을 통해 다음과 같은 유의미한 패턴을 발견할 수 있다.
- 요거트와 버터는 우유와 함께 자주 구매된다.
- 뿌리채소와 양파는 다른 채소들과 함께 구매되는 경향이 있다.
- 마가린과 계란은 우유와 높은 연관성을 가진다.
이러한 분석 결과는 다음과 같은 비즈니스 전략에 활용될 수 있다.
- 매장 배치 최적화: 자주 구매되는 상품을 가까이 배치
- 연관 상품 추천: 온라인 및 오프라인 매장에서 크로스셀링 적용
- 프로모션 기획: 연관성이 높은 품목을 번들로 제공
지지도와 신뢰도를 조정하면서 보다 의미 있는 규칙을 찾아볼 수 있으며, 향후에는 FP-Growth 알고리즘을 활용하여 분석 속도를 개선할 수도 있다.