연관규칙(Association Rule) 검색 - 초간단 튜토리얼
설치
저는 apriori 알고리즘으로 연관규칙 마이닝을 해보렵니다. 적합한 패키지는 {arules}입니다. 먼저 CRAN으로부터 필요한 것들을 내려받습니다.
R> install.packages("arules")
거래명세서
연관규칙은 IF ... THEN ... 이라는 규칙에 따라 만들어집니다. 예를 들어 "사과를 구입했다면 주스를 구입한다."는 식입니다.
연관규칙을 생성하려면 규칙을 확률적으로 생성할 수 있도록 명세서를 줘야 합니다. 이를 특히 거래명세서라고 부릅니다.
거래명세서 오브젝트(transaction)를 여러 방법으로 만들어 봅시다.
list 형태의 데이터
직관적이고 간편한 방법입니다.
R> shopping_list = list(c("juice","coke")
,c("milk","juice","soap")
,c("juice","soap")
,c("juice","soap","coke")
,c("soap","coke"))
각각의 구입목록을 벡터로 하는 리스트를 생성했습니다. 예를 들어 1번 구매자는 주스와 콜라를, 2번 구매자는 우유, 주스, 비누를, 3번 구매자는 주스와 비누를 구입했습니다.
R> shopping_transaction = as(shopping_list,"transactions")
shopping_transaction이라는 구매명세서를 만들었습니다.
matrix 형태의 데이터
각각의 열을 거래, 행을 거래에 사용한 항목으로 삼는 행렬을 생성하여 거래명세서를 만들 수 있습니다.R> shopping_matrix = matrix(numeric(4*5),nrow =4)
R> dimnames(shopping_matrix) = list(c("milk","juice","coke","soap"),c("TR1","TR2","TR3","TR4","TR5"))
R> shopping_matrix
TR1 TR2 TR3 TR4 TR5
milk 0 0 0 0 0
juice 0 0 0 0 0
coke 0 0 0 0 0
soap 0 0 0 0 0
R> shopping_matrix[,1] = c(0,1,1,0)
R> shopping_matrix[,2] = c(1,1,0,1)
R> shopping_matrix[,3] = c(0,1,0,1)
R> shopping_matrix[,4] = c(0,1,1,1)
R> shopping_matrix[,5] = c(0,0,1,1)
R> shopping_matrix
TR1 TR2 TR3 TR4 TR5
milk 0 1 0 0 0
juice 1 1 1 1 0
coke 1 0 0 1 1
soap 0 1 1 1 1
R> shopping_transaction = as(shopping_matrix,"transactions")
데이터프레임
물품 구매와 같이 거래 형태는 list나 matrix 형태의 입력값이 적절하지만, 개체의 속성을 따질 때는 복잡합니다. 예를 들어 입학생들의 성격을 알아보기 위해 연관규칙을 사용한다면 입학생들의 속성을 거래처럼 다룰 필요가 있습니다. 이것은 대단히 귀찮기 때문에 {arules}는 직접 데이터프레임을 다루는 방법을 제공합니다.R> applicant_df = data.frame(
age=c("yr6","yr8","yr7","yr6","yr9","yr5")
,grade=c("g1","g3","g1","g1","g4","g1"))
입학생들의 나이와 입학성적을 factor로 삼는 데이터 프레임입니다.
R> applicant_transaction = as(applicant_df,"transactions")
거래명세서로 바꾸었습니다.
연관규칙 생성
앞서 list로 만든 거래명세서를 분석합시다. 두 개의 아이템이 동시에 출현할 확률(support)을 40% 이상인 경우에 한정해서(이러한 한정, 혹은 우선순위를 부여하기 때문에 apriori라고 부릅니다) 규칙을 생성하기로 합시다.R> s_list = list(
c("a","b","c")
,c("a","b")
,c("a","b","d")
,c("c","e")
,c("a","b","d","e"))
R> shopping_transaction=as(s_list,"transaction")
R> rules = apriori(shopping_transaction,parameter=list(support=0.4))
R> inspect(rules)
lhs rhs support confidence lift
1 {} => {b} 0.8 0.8 1.00
2 {} => {a} 0.8 0.8 1.00
3 {d} => {b} 0.4 1.0 1.25
4 {d} => {a} 0.4 1.0 1.25
5 {b} => {a} 0.8 1.0 1.25
6 {a} => {b} 0.8 1.0 1.25
7 {b,d} => {a} 0.4 1.0 1.25
8 {a,d} => {b} 0.4 1.0 1.25
결과를 보면 신뢰도(confidence)와 향상도(lift)가 함께 출력됩니다. 신뢰도는 lhs의 아이템(들) 출현을 가정했을 경우 rhs의 아이템(들)의 등장 확률을 알려줍니다. 향상도의 경우 신뢰도에서 말한 경우가 우연에 의한 경우(즉 확률 1)와 비교하여 얼마나 더 필연에 따른 것인지(lift - 1) 알려줍니다.
결과를 보면 1번과 2번의 경우 우연에 가깝고(lift - 1 = 0), 3번부터 8번까지는 우연보다는 25% 정도의 확률로 필연에 가깝게 발생합니다(lift - 1 = 0.25).
댓글
댓글 쓰기