Overview
최근 빅데이터를 기반으로한 마케팅 기법들이 많이 활용되고 있다. 대량의 데이터에서 숨겨진 항목 간의 연관규칙을 찾아내는 연관성 분석 역시 이러한 마케팅 기법 중 하나로, 월마트나 아마존 닷컴 등 여러 기업에서도 활용되고 있다. 예를 들면, 마트에서 장보는 사람들의 카트 내 상품을 보게 되면 주로 어떤 상품과 어떤 상품을 같이 구입할 확률이 높은지 등을 파악하여 연관성이 높은 상품들의 배치를 조정하여 구매를 유도하는 식이다. 이번에는 이러한 연관성에 대한 분석을 해볼 것이다.
패키지 설치 및 데이터 준비
분석을 위한 샘플을 직접 만들고 apriori 함수를 적용해 보았다. 지지도 0.1, 신뢰도 0.8 이상인 연관성 규칙이 81개 도출된 것을 확인할 수 있다.
#install.packages("arules")
#install.packages("arulesViz")
library(arules)
searchL <- list(
c("동남아", "푸켓", "수영복", "유심", "패키지", "가족여행", "자유여행", "리조트", "베트남"),
c("가족여행", "패키지", "유럽", "푸켓", "자유여행", "환율", "신혼여행", "신발사이즈표"),
c("보라카이", "신혼여행", "날씨", "환율", "비행기표", "풀빌라", "시차"),
c("패키지", "동남아", "가족여행", " 휴양지", "여행추천지", "특가"),
c("일본", "번역기", "후쿠오카", "온천", "가족여행", "리조트", "포켓와이파이"),
c("몰디브", "신혼여행", "항공권", "동남아", "비행시간", "숙소", "비자", "발리", "풀빌라"),
c("호텔","동남아","세부", "호핑투어", "리조트", "신혼여행", "풀빌라", "필리핀"),
c("푸켓", "풀빌라", "여행", "신혼여행", "자유여행", "와이파이", "코타키나발루"),
c("동남아", "보홀", "보라카이", "팔라완", "가족여행", "스쿠버다이빙", "여행책"),
c("푸켓","가족여행","보라카이", "동남아", "스쿠버다이빙", "리조트", "피피섬"),
c("배낭여행", "유럽", "호스텔", "북유럽", "서유럽", "파리", "루브르", "에투알", "에펠"),
c("이탈리아", "베네치아", "토스카니", "피렌체", "바티칸", "여행지도"),
c("하와이", "괌", "푸켓", "세부", "리조트","가족여행", "골드카드"),
c("괌", "푸켓", "세부", "호텔", "풀비라", "가족여행", "힐튼", "쉐라톤"),
c("베네치아", "피렌체", "신혼여행", "로마", "패키지"),
c("배낭여행", "유럽", "호텔팩", "공항","환율", "픽업서비스","런던","파리", "체코", "호스텔"),
c("특가", "파리", "환율", "스위스", "이탈리아", "오스트리아", "와이파이", "호스텔"),
c("지중해", "유럽", "특가", "배낭여행", "패키지", "파리", "스위스", "이탈리아", "오스트리아"),
c("유럽", "동유럽", "날씨", "체코", "환율", "비엔나", "배낭여행", "부다페스트", "호스텔"),
c("유심", "체코", "신혼여행", "크로아티아", "패키지", "비엔나", "류블랴냐", "독일", "동유럽", "부다페스트"),
c("패키지","지중해","호텔","유럽", "동유럽", "폴란드", "부다페스트", "신혼여행", "프라하","크로아티아"),
c("동유럽", "폴란드", "체코", "프라하", "독일", "크로아티아", "날씨"),
c("이스탄불", "호스텔", "유럽", "자유여행", "배낭여행", "지중해", "날씨", "파묵칼레"),
c("신혼여행", "이탈리아", "지중해", "날씨", "유럽", "자유여행", "와이파이", "유심"),
c("이탈리아", "지중해", "산토리니", "아테네", "유럽", "터키"),
c("유심", "터키", "유럽", "그리스", "지중해","이탈리아"),
c("배낭여행", "유심","지중해","아테네","산토리니","메테오라","로마","베네치아"),
c("유럽", "날씨", "동유럽","사진", "우산","3박10일", "패키지"))
buyItems <- list(
c("삼겹살","생수", "소주", "과자"),
c("삼겹살","생수", "소주", "사과"),
c("장어","생수","소주","양파"),
c("땅콩", "생수", "맥주", "오이"),
c("땅콩", "생수", "맥주", "감")
)
# 트랜잭션 데이터로 형변환
buyItems <- as(buyItems, "transactions")
# 변환된 트랜잭션 확인(11개 항목에 대해 5개 거래 존재)
buyItems## transactions in sparse format with
## 5 transactions (rows) and
## 11 items (columns)
## items
## [1] {과자,삼겹살,생수,소주}
## [2] {사과,삼겹살,생수,소주}
## [3] {생수,소주,양파,장어}
## [4] {땅콩,맥주,생수,오이}
## [5] {감,땅콩,맥주,생수}
# apriori 함수 수행( 지지도 0.1, 신뢰도 0.8 이상인 연관성 규칙 구하기)
buyItemResult <- apriori(buyItems, parameter = list(support=0.1, confidence=0.8))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.1 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: 0
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[11 item(s), 5 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 ... [81 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
결과 살펴보기
연관성 분석 결과는 inspect 함수를 통해 연관성 규칙을 확인할 수 있다. 81개의 연관성 규칙 중 5개만 우선 확인해 보자.
## set of 5 rules
## lhs rhs support confidence lift count
## [1] {} => {생수} 1.0 1 1.000000 5
## [2] {과자} => {삼겹살} 0.2 1 2.500000 1
## [3] {과자} => {소주} 0.2 1 1.666667 1
## [4] {과자} => {생수} 0.2 1 1.000000 1
## [5] {사과} => {삼겹살} 0.2 1 2.500000 1
연관성 규칙과 함께 해당 규칙의 지지도, 신뢰도, 향상도, 연관성 규칙을 만족하는 거래 수가 출력되는 것을 확인할 수 있다. 이번에는 81개의 규칙 중 향상도가 1인 규칙은 우연에 의해 발생할 가능서잉 높은 연관성 규칙이므로 향상도가 1.2 이상인 규칙만 골라보자. 연관성 분석 결과는 데이터프레임과 동일하게 subset 함수를 통해 일부 연관성 규칙들을 발췌할 수 있다.
# 향상도가 1.2 이상인 연관성 규칙만 선택
subBuyResult <- subset(buyItemResult, subset=lift > 1.2)
#결과 확인
subBuyResult## set of 52 rules
## lhs rhs support confidence lift count
## [1] {과자} => {삼겹살} 0.2 1 2.500000 1
## [2] {과자} => {소주} 0.2 1 1.666667 1
## [3] {사과} => {삼겹살} 0.2 1 2.500000 1
## [4] {사과} => {소주} 0.2 1 1.666667 1
## [5] {양파} => {장어} 0.2 1 5.000000 1
원인(lhs)과 결과(rhs)에 대해서도 논리식을 통해 특정 항목의 연관성 규칙만 뽑아 확인해 볼 수 있다.
## lhs rhs support confidence lift count
## [1] {삼겹살} => {소주} 0.4 1 1.666667 2
## [2] {삼겹살} => {생수} 0.4 1 1.000000 2
## [3] {과자,삼겹살} => {소주} 0.2 1 1.666667 1
## [4] {과자,삼겹살} => {생수} 0.2 1 1.000000 1
## [5] {사과,삼겹살} => {소주} 0.2 1 1.666667 1
## [6] {사과,삼겹살} => {생수} 0.2 1 1.000000 1
## [7] {삼겹살,소주} => {생수} 0.4 1 1.000000 2
## [8] {삼겹살,생수} => {소주} 0.4 1 1.666667 2
## [9] {과자,삼겹살,소주} => {생수} 0.2 1 1.000000 1
## [10] {과자,삼겹살,생수} => {소주} 0.2 1 1.666667 1
## [11] {사과,삼겹살,소주} => {생수} 0.2 1 1.000000 1
## [12] {사과,삼겹살,생수} => {소주} 0.2 1 1.666667 1
## lhs rhs support confidence lift count
## [1] {과자,삼겹살} => {소주} 0.2 1 1.666667 1
## [2] {과자,삼겹살} => {생수} 0.2 1 1.000000 1
## [3] {과자,삼겹살,소주} => {생수} 0.2 1 1.000000 1
## [4] {과자,삼겹살,생수} => {소주} 0.2 1 1.666667 1
# lhs가 삼겹살 or 과자 or 삼겹살과 과자인 연관성 규칙
inspect(subset(buyItemResult, subset = lhs %oin% c("삼겹살", "과자")))## lhs rhs support confidence lift count
## [1] {} => {생수} 1.0 1 1.000000 5
## [2] {과자} => {삼겹살} 0.2 1 2.500000 1
## [3] {과자} => {소주} 0.2 1 1.666667 1
## [4] {과자} => {생수} 0.2 1 1.000000 1
## [5] {삼겹살} => {소주} 0.4 1 1.666667 2
## [6] {삼겹살} => {생수} 0.4 1 1.000000 2
## [7] {과자,삼겹살} => {소주} 0.2 1 1.666667 1
## [8] {과자,삼겹살} => {생수} 0.2 1 1.000000 1
## lhs rhs support confidence lift count
## [1] {삼겹살} => {소주} 0.4 1 1.666667 2
## [2] {삼겹살} => {생수} 0.4 1 1.000000 2
## [3] {과자,삼겹살} => {소주} 0.2 1 1.666667 1
## [4] {과자,삼겹살} => {생수} 0.2 1 1.000000 1
## [5] {사과,삼겹살} => {소주} 0.2 1 1.666667 1
## [6] {사과,삼겹살} => {생수} 0.2 1 1.000000 1
## [7] {삼겹살,소주} => {생수} 0.4 1 1.000000 2
## [8] {삼겹살,생수} => {소주} 0.4 1 1.666667 2
## [9] {과자,삼겹살,소주} => {생수} 0.2 1 1.000000 1
## [10] {과자,삼겹살,생수} => {소주} 0.2 1 1.666667 1
## [11] {사과,삼겹살,소주} => {생수} 0.2 1 1.000000 1
## [12] {사과,삼겹살,생수} => {소주} 0.2 1 1.666667 1
연관성 분석 결과는 sort 함수를 통해 지지도, 신뢰도, 향상도 기준으로 정렬할 수 있다. 지지도, 신뢰도, 향상도를 기준으로 정렬 후 상위 10개만 확인해 보겠다.
# 지지도, 신뢰도, 향상도 기준으로 정렬
subBuyResult_order <- sort(subBuyResult, by=c("support", "lift", "confidence"))
# 상위 10개만 확인
inspect(subBuyResult_order[1:10])## lhs rhs support confidence lift count
## [1] {땅콩} => {맥주} 0.4 1 2.500000 2
## [2] {맥주} => {땅콩} 0.4 1 2.500000 2
## [3] {땅콩,생수} => {맥주} 0.4 1 2.500000 2
## [4] {맥주,생수} => {땅콩} 0.4 1 2.500000 2
## [5] {삼겹살} => {소주} 0.4 1 1.666667 2
## [6] {삼겹살,생수} => {소주} 0.4 1 1.666667 2
## [7] {양파} => {장어} 0.2 1 5.000000 1
## [8] {장어} => {양파} 0.2 1 5.000000 1
## [9] {소주,양파} => {장어} 0.2 1 5.000000 1
## [10] {소주,장어} => {양파} 0.2 1 5.000000 1
위 연관성 분석을 통해 “땅콩-맥주”, “삼겹살-소주” 항목 간에 긴밀한 연관성이 있음을 확인할 수 있다.
결과 시각화
이번에는 연관성 분석 결과를 시각화하는 방법을 살펴보자.
빈도수 확인
arules 패키지의 itemFrequencyPlot 함수를 활용하면 항목별 거래 빈도수를 확인할 수 있다. 항목이 너무 많은 경우에는 최소 지지도를 설정하믕로써 특정 비율 이상인 항목에 대해서만 그래프에 표현할 수도 있다.
# 항목별 빈도수 시각화(최소 지지도 0.2 이상인 항목에 대해서만 빈도수 확인)
# itemFrequencyPlot 함수는 "트랜젝션 데이터"를 입력 항목으로 받는다.
itemFrequencyPlot(buyItems, support=0.2)위의 그래프를 통해 생수의 경우 모든 거래에 나타나고 소주는 60%의 거래에서 나타나는 것을 확인할 수 있다.
평행좌표 그래프
평행좌표 그래프는 여러 연관성 규칙들을 하나의 그래프로 확인할 수 있도록 시각화를 하는 것이다. y축에 항목들을 나열한 후 연관된 항목들을 수평으로 결과까지 연결시킴으로써 각 항목들이 어느 항목들과 연관성을 가지고 있는지 파악할 수 있다.
## lhs rhs support confidence lift count
## [1] {땅콩,생수} => {맥주} 0.4 1 2.5 2
위 그래프는 {땅콩, 생수} => {맥주} 연관성 규칙에 대한 평행좌표 그래프이다. 땅콩과 생수를 거쳐 맥주까지 연관성을 가지는 항목들을 연결해 표현한 것을 확인할 수 있다. 이번에는 여러 연관성 규칙을 동시에 확인해보자.
## lhs rhs support confidence lift count
## [1] {땅콩,생수} => {맥주} 0.4 1 2.500000 2
## [2] {삼겹살} => {소주} 0.4 1 1.666667 2
## [3] {과자,생수,소주} => {삼겹살} 0.2 1 2.500000 1
## [4] {과자,삼겹살,생수} => {소주} 0.2 1 1.666667 1
# 3,5,33,50 번째 연관성 규칙을 하나의 평행좌표 그래프에 표현
plot(subBuyResult_order[c(3,5,33,50)], method = "paracoord")여러 연관성 규칙들이 하나의 평행좌표 그래프에 표현된 것을 확인할 수 있다. 기본적으로 선의 두께는 지지도를 의미하며 지지도가 높을수록 선은 두꺼워진다. measure 입력 항목을 설정해 신뢰도, 향상도로 선 두께의 의미를 변경할 수 있다.
네트워크 그래프
네트워크 그래프란 항목 간의 연관성을 네트워크 형태로 표현함으로써 연관성이 있는 항목들의 관계를 파악할 수 있는 그래프이다. 네트워크 그래프 또한 arulesViz 패키지의 plot 함수를 통해 생성할 수 있다.
## lhs rhs support confidence lift count
## [1] {땅콩} => {맥주} 0.4 1 2.500000 2
## [2] {맥주} => {땅콩} 0.4 1 2.500000 2
## [3] {땅콩,생수} => {맥주} 0.4 1 2.500000 2
## [4] {맥주,생수} => {땅콩} 0.4 1 2.500000 2
## [5] {삼겹살} => {소주} 0.4 1 1.666667 2
## [6] {삼겹살,생수} => {소주} 0.4 1 1.666667 2
## [7] {양파} => {장어} 0.2 1 5.000000 1
## [8] {장어} => {양파} 0.2 1 5.000000 1
## [9] {소주,양파} => {장어} 0.2 1 5.000000 1
## [10] {소주,장어} => {양파} 0.2 1 5.000000 1
네트워크 그래프를 통해 조건과 결과를 화살표로 연결하고 그 사이에 지지도를 원의 크기로 시각화함으로써 각 항목 간의 연관성을 한눈에 파악할 수 있다. 장어, 양파, 삼겹살은 소주와 연관돼 있고 땅콩은 맥주와 밀접한 관계가 있으며, 생수는 두 그룹에 공통적으로 존재하는 항목임을 알 수 있다.
배낭여행과 관련된 검색어를 찾아보자
## List of 28
## $ : chr [1:9] "동남아" "푸켓" "수영복" "유심" ...
## $ : chr [1:8] "가족여행" "패키지" "유럽" "푸켓" ...
## $ : chr [1:7] "보라카이" "신혼여행" "날씨" "환율" ...
## $ : chr [1:6] "패키지" "동남아" "가족여행" " 휴양지" ...
## $ : chr [1:7] "일본" "번역기" "후쿠오카" "온천" ...
## $ : chr [1:9] "몰디브" "신혼여행" "항공권" "동남아" ...
## $ : chr [1:8] "호텔" "동남아" "세부" "호핑투어" ...
## $ : chr [1:7] "푸켓" "풀빌라" "여행" "신혼여행" ...
## $ : chr [1:7] "동남아" "보홀" "보라카이" "팔라완" ...
## $ : chr [1:7] "푸켓" "가족여행" "보라카이" "동남아" ...
## $ : chr [1:9] "배낭여행" "유럽" "호스텔" "북유럽" ...
## $ : chr [1:6] "이탈리아" "베네치아" "토스카니" "피렌체" ...
## $ : chr [1:7] "하와이" "괌" "푸켓" "세부" ...
## $ : chr [1:8] "괌" "푸켓" "세부" "호텔" ...
## $ : chr [1:5] "베네치아" "피렌체" "신혼여행" "로마" ...
## $ : chr [1:10] "배낭여행" "유럽" "호텔팩" "공항" ...
## $ : chr [1:8] "특가" "파리" "환율" "스위스" ...
## $ : chr [1:9] "지중해" "유럽" "특가" "배낭여행" ...
## $ : chr [1:9] "유럽" "동유럽" "날씨" "체코" ...
## $ : chr [1:10] "유심" "체코" "신혼여행" "크로아티아" ...
## $ : chr [1:10] "패키지" "지중해" "호텔" "유럽" ...
## $ : chr [1:7] "동유럽" "폴란드" "체코" "프라하" ...
## $ : chr [1:8] "이스탄불" "호스텔" "유럽" "자유여행" ...
## $ : chr [1:8] "신혼여행" "이탈리아" "지중해" "날씨" ...
## $ : chr [1:6] "이탈리아" "지중해" "산토리니" "아테네" ...
## $ : chr [1:6] "유심" "터키" "유럽" "그리스" ...
## $ : chr [1:8] "배낭여행" "유심" "지중해" "아테네" ...
## $ : chr [1:7] "유럽" "날씨" "동유럽" "사진" ...
## transactions in sparse format with
## 28 transactions (rows) and
## 91 items (columns)
## items
## [1] {가족여행,동남아,리조트,베트남,수영복,유심,자유여행,패키지,푸켓}
## [2] {가족여행,신발사이즈표,신혼여행,유럽,자유여행,패키지,푸켓,환율}
## [3] {날씨,보라카이,비행기표,시차,신혼여행,풀빌라,환율}
## [4] { 휴양지,가족여행,동남아,여행추천지,특가,패키지}
## [5] {가족여행,리조트,번역기,온천,일본,포켓와이파이,후쿠오카}
## [6] {동남아,몰디브,발리,비자,비행시간,숙소,신혼여행,풀빌라,항공권}
## [7] {동남아,리조트,세부,신혼여행,풀빌라,필리핀,호텔,호핑투어}
## [8] {신혼여행,여행,와이파이,자유여행,코타키나발루,푸켓,풀빌라}
## [9] {가족여행,동남아,보라카이,보홀,스쿠버다이빙,여행책,팔라완}
## [10] {가족여행,동남아,리조트,보라카이,스쿠버다이빙,푸켓,피피섬}
## [11] {루브르,배낭여행,북유럽,서유럽,에투알,에펠,유럽,파리,호스텔}
## [12] {바티칸,베네치아,여행지도,이탈리아,토스카니,피렌체}
## [13] {가족여행,골드카드,괌,리조트,세부,푸켓,하와이}
## [14] {가족여행,괌,세부,쉐라톤,푸켓,풀비라,호텔,힐튼}
## [15] {로마,베네치아,신혼여행,패키지,피렌체}
## [16] {공항,런던,배낭여행,유럽,체코,파리,픽업서비스,호스텔,호텔팩,환율}
## [17] {스위스,오스트리아,와이파이,이탈리아,특가,파리,호스텔,환율}
## [18] {배낭여행,스위스,오스트리아,유럽,이탈리아,지중해,특가,파리,패키지}
## [19] {날씨,동유럽,배낭여행,부다페스트,비엔나,유럽,체코,호스텔,환율}
## [20] {독일,동유럽,류블랴냐,부다페스트,비엔나,신혼여행,유심,체코,크로아티아,패키지}
## [21] {동유럽,부다페스트,신혼여행,유럽,지중해,크로아티아,패키지,폴란드,프라하,호텔}
## [22] {날씨,독일,동유럽,체코,크로아티아,폴란드,프라하}
## [23] {날씨,배낭여행,유럽,이스탄불,자유여행,지중해,파묵칼레,호스텔}
## [24] {날씨,신혼여행,와이파이,유럽,유심,이탈리아,자유여행,지중해}
## [25] {산토리니,아테네,유럽,이탈리아,지중해,터키}
## [26] {그리스,유럽,유심,이탈리아,지중해,터키}
## [27] {로마,메테오라,배낭여행,베네치아,산토리니,아테네,유심,지중해}
## [28] {3박10일,날씨,동유럽,사진,우산,유럽,패키지}
트랜잭션 데이터로 변환된 검색어 정보를 apriori 함수에 입력해 연관성을 분석한다.
# 연관성 분석 (지지도 0.1 이상, 신뢰도 0.8 이상 연관성 규칙 도출)
aResult <- apriori(searchT, parameter = list(support=0.1, confidence=0.8))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.1 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: 2
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[91 item(s), 28 transaction(s)] done [0.00s].
## sorting and recoding items ... [27 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [17 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
# 도출된 연관성 규칙 지지도, 향상도, 신뢰도 기준으로 정렬
aResult <- sort(aResult, by=c("support", "lift", "confidence"))
# 연관성 규칙 확인
inspect(aResult)## lhs rhs support confidence lift count
## [1] {지중해} => {유럽} 0.2142857 0.8571429 2.181818 6
## [2] {푸켓} => {가족여행} 0.1785714 0.8333333 2.916667 5
## [3] {배낭여행} => {유럽} 0.1785714 0.8333333 2.121212 5
## [4] {유럽,호스텔} => {배낭여행} 0.1428571 1.0000000 4.666667 4
## [5] {배낭여행,유럽} => {호스텔} 0.1428571 0.8000000 4.480000 4
## [6] {유럽,이탈리아} => {지중해} 0.1428571 1.0000000 4.000000 4
## [7] {호스텔} => {배낭여행} 0.1428571 0.8000000 3.733333 4
## [8] {풀빌라} => {신혼여행} 0.1428571 1.0000000 3.111111 4
## [9] {리조트} => {가족여행} 0.1428571 0.8000000 2.800000 4
## [10] {이탈리아,지중해} => {유럽} 0.1428571 1.0000000 2.545455 4
## [11] {배낭여행,호스텔} => {유럽} 0.1428571 1.0000000 2.545455 4
## [12] {호스텔} => {유럽} 0.1428571 0.8000000 2.036364 4
## [13] {크로아티아} => {동유럽} 0.1071429 1.0000000 5.600000 3
## [14] {부다페스트} => {동유럽} 0.1071429 1.0000000 5.600000 3
## [15] {유럽,파리} => {배낭여행} 0.1071429 1.0000000 4.666667 3
## [16] {리조트,푸켓} => {가족여행} 0.1071429 1.0000000 3.500000 3
## [17] {배낭여행,파리} => {유럽} 0.1071429 1.0000000 2.545455 3
도출된 연관성 규칙 중 조건 또는 결과에 “배낭여행”이라는 항목이 존재하는 연관성 규칙만 따로 추출해보자.
# 배낭여행을 포함하는 연관성 규칙 추출
packResult <- subset(aResult, subset=lhs %in% c("배낭여행") | rhs %in% c("배낭여행"))
# 연관성 규칙확인
inspect(packResult)## lhs rhs support confidence lift count
## [1] {배낭여행} => {유럽} 0.1785714 0.8333333 2.121212 5
## [2] {유럽,호스텔} => {배낭여행} 0.1428571 1.0000000 4.666667 4
## [3] {배낭여행,유럽} => {호스텔} 0.1428571 0.8000000 4.480000 4
## [4] {호스텔} => {배낭여행} 0.1428571 0.8000000 3.733333 4
## [5] {배낭여행,호스텔} => {유럽} 0.1428571 1.0000000 2.545455 4
## [6] {유럽,파리} => {배낭여행} 0.1071429 1.0000000 4.666667 3
## [7] {배낭여행,파리} => {유럽} 0.1071429 1.0000000 2.545455 3
마지막으로 도출된 연관성 규칙에서 배낭여행과 관련된 검색어를 추출해 보도록 하자. 연관성 규칙의 조건과 결과 항목을 조회하는 lhs 함수와 rhs 함수를 활용한다.
## List of 7
## $ : chr "배낭여행"
## $ : chr [1:2] "유럽" "호스텔"
## $ : chr [1:2] "배낭여행" "유럽"
## $ : chr "호스텔"
## $ : chr [1:2] "배낭여행" "호스텔"
## $ : chr [1:2] "유럽" "파리"
## $ : chr [1:2] "배낭여행" "파리"
## List of 7
## $ : chr "유럽"
## $ : chr "배낭여행"
## $ : chr "호스텔"
## $ : chr "배낭여행"
## $ : chr "유럽"
## $ : chr "배낭여행"
## $ : chr "유럽"
## [1] "배낭여행" "유럽" "호스텔" "배낭여행" "유럽" "호스텔"
## [7] "배낭여행" "호스텔" "유럽" "파리" "배낭여행" "파리"
## [1] "배낭여행" "유럽" "호스텔" "파리"
위의 결과를 통해 배낭여행과 관련된 검색어로 “유럽”, “호스텔”, “파리”가 있음을 확인할 수 있다. 도출된 연관성 분석 결과는 네트워크 그래프로 시각화함으로써 연관관계를 직관적으로 파악할 수도 있다.
네트워크 그래프를 통해 배낭여행을 하는 고객에게는 호스텔 관련 숙박정보를 제공하고 허니문 고객에게는 풀빌라, 가족여행인 경우 리조트를 추천하는 것이 효과적이라는 것을 확인할 수 있다. 데이터가 많을수록 도출된 연관성의 신뢰도는 높아진다. 이미 알고 있는 일반적인 규칙을 다시 확인하는 것도 의미는 있겠지만 그보다는 비록 상대적으로 약한 연관성을 가지고 있더라도 평소 눈에 보이지 않았던 연관성을 찾아내고 숨어있는 의미를 이해하는 것이 더욱 바람직한 활용법이라 할 수 있을 것이다.