Programming/R

R에서 Apriori 알고리즘으로 연관분석 해보기

사족보행 개발자 2025. 2. 9. 22:02
728x90

Apriori 알고리즘을 활용한 장바구니 분석

1. 개요

장바구니 분석(Market Basket Analysis, MBA)은 고객의 구매 행동을 이해하고 거래 데이터에서 제품 간의 연관성을 찾는 기법이다. 본 블로그에서는 R의 arulesarulesViz 패키지를 사용하여 장바구니 분석을 수행한다.

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 알고리즘을 활용하여 분석 속도를 개선할 수도 있다.

728x90