# chap18_AssociationAnalysis
# 연관분석(Association Analysis)
# 1. 연관규칙 평가 척도 (지지도, 신뢰도, 향상도)
# 2. 트랜잭션 객체 생성
# 3. 연관규칙 시각화
# 4. 식료품점 파일 예제
# 군집분석 : 그룹핑 하는 작업
# ↓
# 연관분석 : 그룹에 대한 특성 분석(장바구니 분석)
#--------------------------------------------------
# 연관분석은 군집분석에 의해서 그룹핑된 cluster를 대상으로 해당
# 그룹에 대한 특성을 분석하는 방법으로 장바구니 분석으로 알려짐
# 즉 유사한 개체들을 클러터로 그룹화하여 각 집단의 특성 파악
# 대용량 데이터베이스에서는 전체 데이터를 유사한 클러스터로 묶어서 관찰 및 분석하는 것이 더 효율적이다.
# 특징
# - 데이터베이스에서 사건의 연관규칙을 찾는 무방향성 데이터마이닝 기법
# - 무방향성(x -> y변수 없음) -> 비지도 학습에 의한 패턴 분석 방법
# - 사건과 사건 간 연관성(관계)를 찾는 방법(예:기저귀와 맥주)
# - A와 B 제품 동시 구매 패턴(지지도)
# - A 제품 구매 시 B 제품 구매 패턴(신뢰도)
# 예) 장바구니 분석 : 장바구니 정보를 트랜잭션(상품 거래 정보)이라고 하며,
# 트랜잭션 내의 연관성을 살펴보는 분석기법
# 분석절차 : 거래내역 -> 품목 관찰 -> 상품 연관성에 대한 규칙(Rule) 발견
# 활용분야
# - 대형 마트, 백화점, 쇼핑몰 등에서 고객의 장바구니에 들어있는 품목 간의 관계를 탐구하는 용도
# ex) 고객들은 어떤 상품들을 동시에 구매하는가?
# - 맥주를 구매한 고객은 주로 어떤 상품을 함께 구매하는가?
# - 대형 마트,백화점, 쇼핑몰 판매자 -> 고객 대상 상품추천, 마케팅
# 1) 고객 대상 상품추천 및 상품정보 발송
# -> ex) A고객에 대한 B 상품 쿠폰 발송
# 2) 텔레마케팅를 통해서 패키지 상품 판매 기획 및 홍보
# 3) 상품 진열 및 show window 상품 display
# 연관규칙(Association Rule)
# - 상업 데이터베이스에서 가장 흔히 쓰이는 도구로,
# - 어떤 사건이 얼마나 자주 동시에 발생하는가를 표현하는 규칙(조건)
#########################################
# 1. 연관규칙 평가 척도
#########################################
# 연관규칙의 평가 척도
# 1. 지지도(support) : 전체자료에서 A를 구매한 후 B를 구매하는 거래 비율
# A->B 지지도 식
# -> A와 B를 포함한 거래수 / 전체 거래수
# -> n(A, B) : 두 항목(A,B)이 동시에 포함되는 거래수
# -> n : 전체 거래 수
# 2. 신뢰도(confidence) : A가 포함된 거래 중에서 B를 포함한 거래의 비율(조건부 확률)
# A->B 신뢰도 식
# -> A와 B를 포함한 거래수 / A를 포함한 거래수
# 3. 향상도(Lift) : 하위 항목들이 독립에서 얼마나 벗어나는지의 정도를 측정한 값
# 향상도 식
# -> 신뢰도 / B가 포함될 거래율
# <지지도와 신뢰도 예시>
# t1 : 라면,맥주,우유
# t2 : 라면,고기,우유
# t3 : 라면,과일,고기
# t4 : 고기,맥주,우유
# t5 : 라면,고기,우유
# t6 : 과일,우유
# A -> B 지지도 신뢰도 향상도
# 맥주 -> 고기 1/6=0.166 1/2=0.5 0.5/0.66(4/6)=0.75
## 연관성 규칙 분석을 위한 패키지
install.packages("arules") # association Rule
# read.transactions(), apriori(), Adult 데이터셋 제공
library(arules) #read.transactions()함수 제공
### 사용된 파일은 https://joyfuls.tistory.com/4 에서 다운 받으실 수 있습니다.
# 1. transaction 객체 생성(파일 이용)
setwd("C:/Rwork-I/Part-IV")
tran<- read.transactions("tran.txt", format="basket", sep=",")
tran
# 2. transaction 데이터 보기
inspect(tran)
# 3. rule 발견(생성) - 지지도,신뢰도 = 0.1
# apriori(트랜잭션 data, parameter=list(supp, conf))
# 연관성 규칙 평가 척도 - 지지도와 신뢰도
rule<- apriori(tran, parameter = list(supp=0.3, conf=0.1)) # 16 rule
rule<- apriori(tran, parameter = list(supp=0.1, conf=0.1)) # 35 rule
inspect(rule) # 규칙 보기
# 지지도, 신뢰도, maxlen 인수
help("apriori") # support 0.1, confidence 0.8, and maxlen 10
rule <- apriori(tran)
rule<- apriori(tran, parameter = list(supp=0.1, conf=0.8, maxlen=10))
inspect(rule)
#########################################
# 2. 트랜잭션 객체 생성
#########################################
#형식)
#read.transactions(file, format=c("basket", "single"),
# sep = NULL, cols=NULL, rm.duplicates=FALSE,encoding="unknown")
#------------------------------------------------------
#file : file name
#format : data set의 형식 지정(basket 또는 single)
# -> single : 데이터 구성(2개 칼럼) -> transaction ID에 의해서 상품(item)이 대응된 경우
# -> basket : 데이터 셋이 여러개의 상품으로 구성 -> transaction ID 없이 여러 상품(item) 구성
#sep : 상품 구분자
#cols : single인 경우 읽을 컬럼 수 지정, basket은 생략(transaction ID가 없는 경우)
#rm.duplicates : 중복 트랜잭션 항목 제거
#encoding : 인코딩 지정
#------------------------------------------------------
# (1) single 트랜잭션 객체 생성
## read demo data - sep 생략 : 공백으로 처리, single인 경우 cols 지정
# format = "single" : 1개의 transaction id에 의해서 item이 연결된 경우
setwd("C:/2_Rwork/Part-IV")
stran <- read.transactions("demo_single",format="single",cols=c(1,2))
inspect(stran)
# <실습> 중복 트랜잭션 객체 생성
stran2<- read.transactions("single_format.csv", format="single", sep=",",
cols=c(1,2), rm.duplicates=T)
stran2
summary(stran2) # 248개 트랜잭션에 대한 기술통계 제공
# 트랜잭션 보기
inspect(stran2) # 248 트랜잭션 확인
# 규칙 발견
astran2 <- apriori(stran2) # supp=0.1, conf=0.8와 동일함
#astran2 <- apriori(stran2, parameter = list(supp=0.1, conf=0.8))
astran2 # set of 102 rules
attributes(astran2)
inspect(astran2)
# 향상도가 높은 순서로 정렬
inspect(sort(astran2, by="lift"))
inspect(head(sort(astran2, by="lift")))
# (2) basket 트랜잭션 데이터 가져오기
btran <- read.transactions("demo_basket",format="basket",sep=",")
inspect(btran) # 트랜잭션 데이터 보기
##############################################
# 3. 연관규칙 시각화(Adult 데이터 셋 이용)
##############################################
data(Adult) # arules에서 제공되는 내장 데이터 로딩
str(Adult) # Formal class 'transactions' , 48842(행)
Adult
attributes(Adult)# 트랜잭션의 변수와 범주 보기
################ Adult 데이터 셋 #################
# 32,000개의 관찰치와 15개의 변수로 구성되어 있음
# 종속변수에 의해서 년간 개인 수입이 5만달러 이상 인지를
# 예측하는 데이터 셋으로 transactions 데이터로 읽어온
# 경우 48,842행과 115 항목으로 구성된다.
##################################################
# [data.frame 형식으로 보기] - 트랜잭션 데이터를 데이터프레임으로 변경
adult<- as(Adult, "data.frame") # data.frame형식으로 변경
str(adult) # 'data.frame': 48842 obs. of 2 variables:
head(adult) # 칼럼 내용 보기
# 요약 통계량
summary(Adult)
#---------------------------------------------------------------
# 신뢰도 80%, 지지도 10%이 적용된 연관규칙 6137 발견
#----------------------------------------------------------------
ar<- apriori(Adult, parameter = list(supp=0.1, conf=0.8))
ar1<- apriori(Adult, parameter = list(supp=0.2)) # 지도도 높임
ar2<- apriori(Adult, parameter = list(supp=0.2, conf=0.95)) # 신뢰도 높임
ar3<- apriori(Adult, parameter = list(supp=0.3, conf=0.95)) # 신뢰도 높임
ar4<- apriori(Adult, parameter = list(supp=0.35, conf=0.95)) # 신뢰도 높임
ar5<- apriori(Adult, parameter = list(supp=0.4, conf=0.95)) # 신뢰도 높임
# 결과보기
inspect(head(ar5)) # 상위 6개 규칙 제공 -> inspect() 적용
# confidence(신뢰도) 기준 내림차순 정렬 상위 6개 출력
inspect(head(sort(ar5, decreasing=T, by="confidence")))
# lift(향상도) 기준 내림차순 정렬 상위 6개 출력
inspect(head(sort(ar5, by="lift")))
## 연관성 규칙에 대한 데이터 시각화를 위한 패키지
install.packages("arulesViz")
library(arulesViz) # rules값 대상 그래프를 그리는 패키지
plot(ar3) # 지지도(support), 신뢰도(conf) , 향상도(lift)에 대한 산포도
plot(ar4, method="graph") # 연관규칙 네트워크 그래프
# 각 연관규칙 별로 연관성 있는 항목(item) 끼리 묶여서 네트워크 형태로 시각화
#########################################
# 4. <<식료품점 파일 예제>>
#########################################
library(arules)
# transactions 데이터 가져오기
data("Groceries") # 식료품점 데이터 로딩
str(Groceries) # Formal class 'transactions' [package "arules"] with 4 slots
Groceries
# [data.frame 형 변환]
Groceries.df<- as(Groceries, "data.frame")
head(Groceries.df)
#itemFrequencyPlot(Groceries, topN=20, type="absolute") # 상위 20개 토픽
# 지지도 0.001, 신뢰도 0.9
rules <- apriori(Groceries, parameter=list(supp=0.001, conf=0.8))
inspect(rules)
# 규칙을 구성하는 왼쪽(LHS) -> 오른쪽(RHS)의 item 빈도수 보기
plot(rules, method="grouped")
# 최대 길이 3이내로 규칙 생성
rules <- apriori(Groceries, parameter=list(supp=0.001, conf=0.80, maxlen=3))
inspect(rules) # 29개 규칙
# confidence(신뢰도) 기준 내림차순으로 규칙 정렬
rules <- sort(rules, decreasing=T, by="confidence")
inspect(rules)
library(arulesViz) # rules값 대상 그래프를 그리는 패키지
plot(rules, method="graph", control=list(type="items"))
#######################################
### 특정 item 서브셋 작성/시각화
#######################################
# 오른쪽 item이 전지분유(whole milk)인 규칙만 서브셋으로 작성
wmilk <- subset(rules, rhs %in% 'whole milk') # lhs : 왼쪽 item
wmilk # set of 18 rules
inspect(wmilk)
plot(wmilk, method="graph") # 연관 네트워크 그래프
# 오른쪽 item이 other vegetables인 규칙만 서브셋으로 작성
oveg <- subset(rules, rhs %in% 'other vegetables') # lhs : 왼쪽 item
oveg # set of 10 rules
inspect(oveg)
plot(oveg, method="graph") # 연관 네트워크 그래프
'R 과 데이터분석 > 기초 문법 ~ 머신러닝' 카테고리의 다른 글
[R 데이터분석] 17장. 군집분석 (0) | 2019.09.13 |
---|---|
[R 데이터분석] 16장. 분류분석 (0) | 2019.09.13 |
[R 데이터분석] 15장. 회귀분석 (0) | 2019.09.13 |
[R 데이터분석] 14장. 상관분석 (0) | 2019.09.13 |
[R 데이터분석] 13장. 집단간 차이 검정 (0) | 2019.09.13 |
댓글