머신러닝(Machine Learning)/추천 시스템(Recommendation System)

Association Analysis / Association Rule / Apriori 알고리즘 - 2 of 3

leebaro 2017. 10. 1.
728x90

연관글 보기

Association Analysis / Association Rule / Apriori 알고리즘 - 1 of 3

Association Analysis / Association Rule / Apriori 알고리즘 - 2 of 3

Association Analysis / Association Rule / Apriori 알고리즘 - 3 of 3



이번에는 직접 코딩을 하면서 association rule에 대해서 보고자 한다. 아래 데이터는 20개의 건물에 입주한 상점 유형을 보여주는 데이터이다. 이 데이터를 사용하여 association rule을 이용한다면, 건물을 기준으로 연관성이 있는 상점이 무엇인지 알아볼 수 있다. 이러한 사례를 응용한다면 온라인 쇼핑몰 장바구니에 담긴 상품을 기준으로 고객이 살만한 다른 상품을 추천 해줄수 있을 것이다.

먼저, 코드와 데이터가 있는 경로를 지정하고, 데이터를 불러온다.

setwd("G:/workspace/R/001.AssociationAnalysis")
# Association Rle 모델을 만들 데이터 읽음
build <- read.csv("./data/building.csv", header = T)
build
##         X 병원 약국 카페 휴대폰매장 일반음식점 패밀리레스토랑 당구장  보습학원 슈퍼마켓 은행 편의점 화장품
## 1   건물1    1    1   NA          1         NA             NA     NA	    NA       NA   NA     NA      1
## 2   건물2   NA   NA   NA         NA          1              1      1	    NA       NA   NA      1     NA
## 3   건물3   NA   NA    1         NA         NA             NA     NA	     1       NA    1     NA     NA
## 4   건물4   NA   NA    1         NA         NA             NA     NA	     1       NA    1     NA     NA
## 5   건물5    1   NA   NA         NA          1              1     NA	    NA       NA   NA      1      1
## 6   건물6   NA   NA    1          1         NA             NA     NA	    NA       NA   NA     NA     NA
## 7   건물7   NA   NA   NA         NA         NA              1     NA	    NA       NA   NA     NA      1
## 8   건물8    1    1   NA          1         NA             NA     NA	    NA       NA   NA     NA     NA
## 9   건물9   NA   NA   NA         NA         NA             NA      1	    NA        1   NA     NA     NA
## 10 건물10   NA   NA   NA         NA          1              1     NA	    NA       NA   NA      1      1
## 11 건물11   NA   NA    1         NA         NA             NA     NA	     1       NA    1     NA     NA
## 12 건물12   NA   NA   NA         NA          1              1      1	    NA       NA   NA     NA     NA
## 13 건물13    1    1   NA          1         NA             NA     NA	    NA       NA   NA     NA     NA
## 14 건물14   NA   NA   NA         NA          1              1     NA	    NA       NA   NA      1      1
## 15 건물15   NA   NA   NA         NA          1              1     NA	    NA       NA   NA      1      1
## 16 건물16   NA   NA    1         NA         NA             NA     NA	     1       NA    1     NA     NA
## 17 건물17   NA   NA   NA         NA          1              1      1	    NA       NA   NA     NA     NA
## 18 건물18    1    1   NA          1         NA             NA     NA	    NA       NA   NA     NA     NA
## 19 건물19   NA   NA   NA         NA          1              1      1	    NA       NA   NA     NA     NA
## 20 건물20    1    1   NA          1         NA             NA     NA	    NA       NA   NA     NA     NA

위의 표는 각 건물에 입점한 상점 여부를 보여준다. 예를들어 1번 건물에는 병원과 약국은 있지만 카페는 없다. 2번 건물에는 병원과 약국은 없고 일반음식점이 있다. 연관관계를 분석할 수 있도록 NA값을 0으로 변환하는 데이터 전처리 해야한다.

build[is.na(build)] <- 0
build <- build[-1]
build
##    병원 약국 카페 휴대폰매장 일반음식점 패밀리레스토랑 당구장 보습학원	슈퍼마켓 은행 편의점 화장품
## 1     1    1    0          1          0              0      0        0	       0    0      0      1
## 2     0    0    0          0          1              1      1        0	       0    0      1      0
## 3     0    0    1          0          0              0      0        1	       0    1      0      0
## 4     0    0    1          0          0              0      0        1	       0    1      0      0
## 5     1    0    0          0          1              1      0        0	       0    0      1      1
## 6     0    0    1          1          0              0      0        0	       0    0      0      0
## 7     0    0    0          0          0              1      0        0	       0    0      0      1
## 8     1    1    0          1          0              0      0        0	       0    0      0      0
## 9     0    0    0          0          0              0      1        0	       1    0      0      0
## 10    0    0    0          0          1              1      0        0	       0    0      1      1
## 11    0    0    1          0          0              0      0        1	       0    1      0      0
## 12    0    0    0          0          1              1      1        0	       0    0      0      0
## 13    1    1    0          1          0              0      0        0	       0    0      0      0
## 14    0    0    0          0          1              1      0        0	       0    0      1      1
## 15    0    0    0          0          1              1      0        0	       0    0      1      1
## 16    0    0    1          0          0              0      0        1	       0    1      0      0
## 17    0    0    0          0          1              1      1        0	       0    0      0      0
## 18    1    1    0          1          0              0      0        0	       0    0      0      0
## 19    0    0    0          0          1              1      1        0	       0    0      0      0
## 20    1    1    0          1          0              0      0        0	       0    0      0      0

위의 표와 같이 건물 번호를 보여준 첫 번째 칼럼을 삭제하고, NA값을 0으로 변경했다.

library(arules)
## Warning: package 'arules' was built under R version 3.4.1
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
trans <- as.matrix(build, "Transaction")
rules1 <- apriori(trans, parameter = list(supp=0.2, conf = 0.6, target = "rules"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.6    0.1    1 none FALSE            TRUE       5     0.2      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 4 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[12 item(s), 20 transaction(s)] done [0.00s].
## sorting and recoding items ... [11 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [46 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].

위와 같이 apriori 알고리즘을 사용할 때는 supp(지지도)와 conf(신뢰도) 값을 지정해줘야 한다. 앞의 글에서도 설명했지만 지지도는 전체 건수 중 X와 Y가 모두 포함되어 있는 건수의 비(위의 데이터에서 X,Y는 상점을 의미함)이고, 신뢰도는 항목 X를 포함하는 건수 중에서 X와 Y를 모두 포함하는 건수의 비를 의미한다. 아무리 신뢰도가 높다고 하더라도 지지도가 낮으면 X,Y의 조합이 의미가 있더라고 활용도가 떨어진다. X,Y를 함께 선택할 확률이 매우 낮기 때문이다. 마지막에서 2번째 위의 줄을 보면 46 rules라고 나왔다. 아래에서 보여주겠지만, 총 46개 조합의 결과가 나왔다는 것이다.

inspect(sort(rules1))
##      lhs                                   rhs              support    confidence lift    
## [1]  {일반음식점}                       => {패밀리레스토랑} 0.40    1.0000000  2.222222
## [2]  {패밀리레스토랑}                   => {일반음식점}     0.40    0.8888889  2.222222
## [3]  {약국}                             => {휴대폰매장}     0.25    1.0000000  3.333333
## [4]  {휴대폰매장}                       => {약국}           0.25    0.8333333  3.333333
## [5]  {약국}                             => {병원}           0.25    1.0000000  3.333333
## [6]  {병원}                             => {약국}           0.25    0.8333333  3.333333
## [7]  {휴대폰매장}                       => {병원}           0.25    0.8333333  2.777778
## [8]  {병원}                             => {휴대폰매장}     0.25    0.8333333  2.777778
## [9]  {편의점}                           => {일반음식점}     0.25    1.0000000  2.500000
## [10] {일반음식점}                       => {편의점}         0.25    0.6250000  2.500000
## [11] {편의점}                           => {패밀리레스토랑} 0.25    1.0000000  2.222222
## [12] {화장품}                           => {패밀리레스토랑} 0.25    0.8333333  1.851852
## [13] {약국,휴대폰매장}                  => {병원}           0.25    1.0000000  3.333333
## [14] {병원,약국}                        => {휴대폰매장}     0.25    1.0000000  3.333333
## [15] {병원,휴대폰매장}                  => {약국}           0.25    1.0000000  4.000000
## [16] {일반음식점,편의점}                => {패밀리레스토랑} 0.25    1.0000000  2.222222
## [17] {패밀리레스토랑,편의점}            => {일반음식점}     0.25    1.0000000  2.500000
## [18] {일반음식점,패밀리레스토랑}        => {편의점}         0.25    0.6250000  2.500000
## [19] {보습학원}                         => {은행}           0.20    1.0000000  5.000000
## [20] {은행}                             => {보습학원}       0.20    1.0000000  5.000000
## [21] {보습학원}                         => {카페}           0.20    1.0000000  4.000000
## [22] {카페}                             => {보습학원}       0.20    0.8000000  4.000000
## [23] {은행}                             => {카페}           0.20    1.0000000  4.000000
## [24] {카페}                             => {은행}           0.20    0.8000000  4.000000
## [25] {당구장}                           => {일반음식점}     0.20    0.8000000  2.000000
## [26] {당구장}                           => {패밀리레스토랑} 0.20    0.8000000  1.777778
## [27] {편의점}                           => {화장품}         0.20    0.8000000  2.666667
## [28] {화장품}                           => {편의점}         0.20    0.6666667  2.666667
## [29] {화장품}                           => {일반음식점}     0.20    0.6666667  1.666667
## [30] {보습학원,은행}                    => {카페}           0.20    1.0000000  4.000000
## [31] {카페,보습학원}                    => {은행}           0.20    1.0000000  5.000000
## [32] {카페,은행}                        => {보습학원}       0.20    1.0000000  5.000000
## [33] {일반음식점,당구장}                => {패밀리레스토랑} 0.20    1.0000000  2.222222
## [34] {패밀리레스토랑,당구장}            => {일반음식점}     0.20    1.0000000  2.500000
## [35] {편의점,화장품}                    => {일반음식점}     0.20    1.0000000  2.500000
## [36] {일반음식점,편의점}                => {화장품}         0.20    0.8000000  2.666667
## [37] {일반음식점,화장품}                => {편의점}         0.20    1.0000000  4.000000
## [38] {편의점,화장품}                    => {패밀리레스토랑} 0.20    1.0000000  2.222222
## [39] {패밀리레스토랑,편의점}            => {화장품}         0.20    0.8000000  2.666667
## [40] {패밀리레스토랑,화장품}            => {편의점}         0.20    0.8000000  3.200000
## [41] {일반음식점,화장품}                => {패밀리레스토랑} 0.20    1.0000000  2.222222
## [42] {패밀리레스토랑,화장품}            => {일반음식점}     0.20    0.8000000  2.000000
## [43] {일반음식점,편의점,화장품}         => {패밀리레스토랑} 0.20    1.0000000  2.222222
## [44] {패밀리레스토랑,편의점,화장품}     => {일반음식점}     0.20    1.0000000  2.500000
## [45] {일반음식점,패밀리레스토랑,편의점} => {화장품}         0.20    0.8000000  2.666667
## [46] {일반음식점,패밀리레스토랑,화장품} => {편의점}         0.20    1.0000000  4.000000

위의 결과 값은 우리가 정의한 0.2 이상의 support 값과 0.6 이상의 confidence 값을 가진 아이템의 조합이다. 1행을 보면 일반음식점이 있으면 패밀리레스토랑이 있을 확률이 높다고 나왔다. 15번 행을 보면 병원, 휴대폰매장이 있으면 병원이 있을 확률이 높다고 나왔다. lift라는 값은 앞에 글에서 설명한 것 처럼 support와 confidence를 조합한 평가 지표이다.

모든 경우에 수에 따른 연관성 높은 결과를 확인할 수 있지만 항목이 많다면 내가 원하는 값에 맞는 결과를 찾기 어려울 것이다. 그럴 경우에는 아래와 같이 특정 데이터를 포함한 결과를 추출한 수 있다.

rules2 <- subset(rules1, subset = lhs %pin% '카페' & confidence > 0.6)
inspect(sort(rules2))
##     lhs                rhs        support confidence lift
## [1] {카페}          => {보습학원} 0.2     0.8        4   
## [2] {카페}          => {은행}     0.2     0.8        4   
## [3] {카페,보습학원} => {은행}     0.2     1.0        5   
## [4] {카페,은행}     => {보습학원} 0.2     1.0        5

위와 같은 결과나 나왔다. 카페가 포함된 조합을 기준으로 연관이 있는 데이터를 보여준다. 이러한 알고리즘을 사용한다면, 온라인 쇼핑몰에서 고객이 구매할 상품들을 장바구니에 담았을 때, 담겨 있는 상품을 기준으로 연관된 상품을 추천해준다면 구매할 확률이 높아질 것이다.

다음에는 위에서 보여준 결과를 시각화를 통해 어떻게 표현할 수 있는지 진행하도록 하겠다.


연관글 보기

Association Analysis / Association Rule / Apriori 알고리즘 - 1 of 3

Association Analysis / Association Rule / Apriori 알고리즘 - 2 of 3

Association Analysis / Association Rule / Apriori 알고리즘 - 3 of 3



Reference

http://ar-eum.com/


728x90