R 8장. 연관규칙 (apriori 알고리즘)
R(알) 2017. 9. 23. 19:03
■ apriori 알고리즘
- apriori 알고리즘 이무엇인지?
- apriori 알고리즘 실습 1 ( 맥주와 기저귀)
- apriori 알고리즘 실습 2 (상가 건물 데이터)
- apriori 알고리즘 실습 3 ( 책 : 야채와 우유 데이터)
■ 1.apriori 알고리즘이 무엇인지?
맥주와 기저귀와의 관계를 알아낸 대표적인 기계학습 방법
시리얼 ----------------> 우유
쉽게 말해 이 규칙은 시리얼을 사면 우유도 함께 구매한다는 것을 알아내는 알고리즘
- apriori 알고리즘 공식(p312)
count(x) <- x 아이템의 거래건수
support(x) = ---------------
↑ N <- 데이터베이스의 전체 거래 건수
아이템 x에 대한 지지도
support(x,y)
confidence (x -> y) = ----------------
support(x)
연관 관계의 계산은 아이템들의 출현 빈도를 이용하여 계산을 하게 된다.
신뢰도(기저귀 ---> 맥주) ? 항목 기저귀를 포함하는 건수에서 기저귀와 맥주를 모두
포함하는 건수의 비를 구한다.
다시 말하면 ?
아이템 기저귀가 출현될 때 또 다른 아이템 맥주가 포함되어있을 경우의 조건부 확률
지지도(우유 ---> 시리얼) : 우유와 시리얼을 동시에 구매할 확률
신뢰도(우유 ---> 시리얼) : 우유를 구매할때 시리얼도 같이 구매할 확률
예 : 90%의 사람이 시리얼 구매할 때 우유를 같이 구매한다.
라는 연관 규칙을 발견하려 한다.
거래번호 구매물품 (p311)
1 우유, 버터,시리얼
2 우유, 시리얼
3 우유, 빵
4 버터, 맥주, 오징어
문제232. 전체 아이템에서 우유와 시리얼이 동시에 출현할 확률은?
2/4
문제233. 우유를 샀을때 시리얼 살 조건부 확률
2/3
문제234. 이와는 반대로 시리얼을 샀을때 우유를 동시에 구매할 확률
100%
이를 간단히 표현하면 다음과 같다
우유 ---> 시리얼( 50%, 66%)
시리얼 --> 우유 (50%, 100%)
시리얼을 샀을때 우유를 사게되는 지지도는 50%이고 신뢰도는 100% 이다.
우리가 찾고자 하는 연관 규칙은 지지도와 신뢰도가 둘다 최소한도보다
높은것이다.
보통은 최소 지지도를 정하여 그 이하는 모두 버리고 그중에 신뢰도가 어느정도 높은것들만 가져오는
방법을 쓴다.
x와 y라는 항목의 조합의 수도 너무나도 다양하기 때문에 모든 경우의 수를 다 계산한다면 시간이 오래 걸린다.
최소 지지도 이상의 데이터를 찾는다 어떻게 하면 찾을 수 있는지 연습해보자
거래번호 아이템
1 A C D
2 B C E
3 A B C E
4 B E
문제235. 위으 각각의 아이템에 대해서 지지도를 산정해보시오!
원래 지지도는 "구매건수/전체구매건수" 로 계산 할 수 있지만
여기서는 단순하게 아이템의 갯수로 처리하시오
아이템 지지도
A 2
B 3
C 3
D 1
E 3
문제236. 이것에 대해서 지지도가1이상인것만 추출하여 다시 정리하시오
아이템 지지도
A 2
B 3
C 3
E 3
문제237. 이제 아이템들간의 연관규칙을 알아야하므로 다시 아이템들간의
조합으로 재구성하고 지지도를 다시 구하시오
아이템 목록 지지도 거래번호 아이템
A B 1 1 A C D
A C 2 2 B C E
A E 1 3 A B C E
B C 2 4 B E
B E 3
C E 2
그리고 지지도가 1인것은 제외한다.
아이템 목록 지지도
A C 2
B C 2
B E 3
C E 2
문제238. 이제 각각의 아이템 목록에서 첫번째 아이템을 기준으로
동일한것을 찾아보시오!
B 가 발생하면 이 B에 대해서 각각의 두번재 키를 조합한다.
B 에 대해서 C, E가 조합된다.
아이템 목록 지지도
B C E 2
처음상태 -------------------------------------> 발견된 연관규칙
거래번호 아이템 아이템 목록 지지도
1 A C D B C E 2
2 B C E
3 A B C E
4 B E
문제239. 맥주와 기저귀 판매 목록 데이터를 가지고
기저귀를 사면 맥주를 산다라는 연관규칙을 발견하시오 !
x <- data.frame(
beer=c(0,1,1,1,0),
bread=c(1,1,0,1,1),
cola=c(0,0,1,0,1),
diapers=c(0,1,1,1,1),
eggs=c(0,1,0,0,0),
milk=c(1,0,1,1,1) )
install.packages("arules")
library(arules)
trans <- as.matrix(x, "Transaction")
trans
rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1
inspect(sort(rules1))
지지도 신뢰도
5 {beer} => {diapers} 0.6 1.0000000 1.2500000
6 {diapers} => {beer} 0.6 0.7500000 1.2500000
7 {milk} => {bread} 0.6 0.7500000 0.9375000
8 {bread} => {milk} 0.6 0.7500000 0.9375000
문제240. 건물 상가에 서로 연관이 있는 업종은 무엇인가?
(병원 ---> 약국) data 게시판에 건물 상가 데이터
install.packages("arules")
library(arules)
build<- read.csv('building.csv', header= T)
build[is.na(build)]<- 0
build <- build[-1]
trans <- as.matrix(build, "Transaction")
rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1
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
결론 : 일반 음식점과 패밀리 레스토랑이 같은 건물에 있는 경향이 높고 약국과 병원, 휴대폰 판매점이 같은 건물에 있는 경향이 있다.
문제241. 보습학원이 있는 건물에는 어떤 업종의 매장이 있는지 알아내시오 (연관이 높은지 알아내시오 )
30 {보습학원, 은행} => {카페} 0.20 1.0000000 4.000000
31 {카페, 보습학원} => {은행} 0.20 1.0000000 5.000000
보습학원 있으면 아주 높은 확률로 그 건물에 은행이나 카페가 있네여 !
- apriori 알고리즘 실습 3 (책: 야채와 우유 데이터 )
[ 경원형 발표 ]
groceries <- read.transactions("groceries.csv",sep=",")
groceries
summary(groceries)
# 9835행은 저장된 거래와 169개 열은 사람들의 장바구니에 있을 수 있는 169개 제품에 대한 속성이다.
# 매트릭스의 각 칸은 거래에서 구매한 제품이면 1, 그렇지 않으면 0이 된다.
# 밀도값 0.02609146은 매트릭스에서 0이 아닌 칸의 비율을 뜻한다.
# 9835 * 169 = 1,662,115개가 매트릭스에 있기 때문에 상점의 영업시간동안
# 총 1662115 * 0.02609146 = 43,367개의 제품이 거래됏음을 계산 할 수 있다.
# 평균 한번의 거래에서 43367 / 9835 = 4.409개의 다른 제품이 구매됏다.
# whole milk 의 2513 / 9835 = 0.2555이기 때문에 거래의 25.6%에서 whole milk가 나타난다.
# whole milk 말고도 나머지도 일반적인 제품이다.
# element (itemset/transaction) length distribution를 보면
# 2159 거래는 하나의 제품을 포함하고 있고 1개 거래가 32개 제품을 포함한다.
# mean이 4.409로 43367 / 9835 = 4.409 이 계산과 맞아 떨어진다.
# 희소 매트릭스의 내용을 보기 위해 벡터 연산의 조합과 inspect() 함수를 사용한다.
# 첫 5개의 거래를 볼수 있다.
# csv 파일과 같다
inspect(groceries[1:5])
# itemFrequency() 함수는 제품이 포함한 거래의 비율을 볼 수 있게 한다.
# 예를 들어 식료품 데이터 3개 제품에 대해 지지도 레벨(support level)을 볼 수 있다.
itemFrequency(groceries[,1:3])
# 데이터에서 적어도 0.1(10%)의 지지도 이상인 8개 제품을 보여준다.
itemFrequencyPlot(groceries , support=0.1)
# groceries 데이터에서 상위 20개 제품에 대한 다이어그램이다.
itemFrequencyPlot(groceries, topN=20)
image(groceries[1:5])
# 100개의 행과 169개의 열로 구성된 매트릭스 다이어그램을 생성한다.
image(sample(groceries,100))
## 3단계 : 데이터로 모델 훈련
apriori(groceries)
# 하루에 두번씩(약 60번) 구매되는 제품이라면 지지도 레벨을 계산하는데 쓸 수 있다.
# 총 9835에서 60은 0.006이기 때문에 지지도를 0.006으로 한다.
# 결과에 포함되기 위해서 적어도 25% 정확도의 규칙을 뜻하는 0.25인 신뢰도 경계 값으로 시작한다.
# 두 제품보다 적게 포함되는 규칙을 제거하기 위한 minlen을 2로 설정한다.
groceryrules <- apriori(groceries, parameter=list(support = 0.006, confidence=0.25, minlen=2))
# 463개의 연관 규칙을 포함하고 있다. 규칙이 사용할 만한지 결정하기 위해 좀 더 살펴봐야 한다.
groceryrules
## 4단계: 모델 성능 평가
# rule length distribution 이부분을 살펴보면
# 150개의 규칙이 2개의 제품을 갖고 있는 반면, 297개의 규칙은 3개, 16개의 규칙은 4개 제품을 가지고 있다
# 세번째 열인 리프트(lift)는 지금까지 고려하지 않은 메트릭이다. 다른 물품을 구매한 것을 고려해
# 전형적인 구매 비율과 상대적으로 물푸이 얼마나 구매됏는지 측정한다. 이는 다음 식으로 정의 된다.
# confidence(X->Y)
# lift(X->Y) = -------------------
# support(Y)
# mining info 부분은 얼마나 규칙을 선택할 수 있는지 알려준다.
# 9835건의 거래를 포함한 groceries 데이터는 최소 지지도인 0.006과 최소 신뢰도인 0.25로 규칙을 만든것을 확인할 수 있다.
summary(groceryrules)
# lhs는 규칙을 작동시키기 위해 충족해야할 조건이고 rhs는 충족된 조건의 결과로 예상되는 값이다.
# 첫번째 규칙은 소비자가 potted plants(화분 식물)을 사면 whole milk(전유)도 산다는 의미이다
# 약 0.007의 지지도와 0.4의 신뢰도를 가지고 있고 이 규칙은 약 0.7%의 거래를 이룬다.
inspect(groceryrules[1:3])
## 5단계 : 모델 성능 향상
# 리프트 통계를 따르는 최상상의 5개 규칙은 다음과 같다.
# 리프트가 3.956477인 첫번째 규칙은 허브를 산 구매자는 일반적으로 근채류 구매가 4배에 가깝다고 나온다.
# 두번째 규칙은 딸기를 구매한 소비자는 일반 소비자보다 3배 더 많이 거품크림을 구매한다.
inspect(sort(groceryrules,by="lift")[1:5])
# subset() 함수는 거래,제품,규칙의 부분집합을 찾는 기법을 제공한다.
# 딸기 홍보광고를 만들기 위해서 딸기가 포함된 규칙을 저장한다.
berryrules <- subset(groceryrules,items %in% "berries")
inspect(berryrules)
# 장바구니 분석 결과를 공유하기 위해 write함수로 csv파일에 저장할 수 있다.
write(groceryrules, file="groceryrules.csv",sep=",", quote=TRUE, row.names=FALSE)
# 규칙을 데이터 프레임으로 변환하는것이 편리하다. as() 함수를 이용해서 만들수 있다.
groceryrules_df <- as(groceryrules, "data.frame")
# 수치가 가장 높은 순으로 정렬
install.packages("doBy")
library(doBy)
head(orderBy(~-lift,groceryrules_df))
head(orderBy(~-support,groceryrules_df))
head(orderBy(~-confidence,groceryrules_df))
str(groceryrules_df)
문제242. (점심시간 문제) 다음 데이터에서 가장 연관성이 높은 항목을 찾으시오
x <- data.frame(
영화=c(0,1,1,1,0,1,1,1,0,1,1,1,1),
오징어=c(1,0,1,1,1,1,0,0,0,1,0,0,1),
맥주=c(0,0,1,0,1,0,0,0,1,1,0,0,1),
음료=c(1,1,0,1,1,0,0,1,0,0,1,1,0),
스낵=c(0,1,0,0,0,0,0,0,0,1,1,0,0),
팝콘=c(0,1,1,1,1,1,1,1,0,1,1,0,1))
trans <- as.matrix(x, "Transaction")
trans
rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
rules1
inspect(sort(rules1))
> inspect(sort(rules1))
lhs rhs support confidence lift
1 {} => {영화} 0.7692308 0.7692308 1.0000000
2 {} => {팝콘} 0.7692308 0.7692308 1.0000000
3 {영화} => {팝콘} 0.6923077 0.9000000 1.1700000
4 {팝콘} => {영화} 0.6923077 0.9000000 1.1700000
5 {오징어} => {팝콘} 0.4615385 0.8571429 1.1142857
6 {팝콘} => {오징어} 0.4615385 0.6000000 1.1142857
7 {음료} => {영화} 0.3846154 0.7142857 0.9285714
x <- data.frame(
영화=c(0,1,1,1,0,1,1,1,0,1,1,1,1),
오징어=c(1,0,1,1,1,1,0,0,0,1,0,0,1),
맥주=c(0,0,1,0,1,0,0,0,1,1,0,0,1),
음료=c(1,1,0,1,1,0,0,1,0,0,1,1,0),
스낵=c(0,1,0,0,0,0,0,0,0,1,1,0,0),
팝콘=c(0,1,1,1,1,1,1,1,0,1,1,0,1))
trans <- as.matrix(x, "Transaction")
trans
rules1 <- apriori(trans, parameter = list(supp=0.2, conf=0.6, target="rules"))
a <- as(rules1, "data.frame")
head(orderBy(~-lift,a))
'R(알) ' 카테고리의 다른 글
한국인 신체데이터로 다양한 분석하고 시각화 해보기 (0) | 2017.09.23 |
---|---|
R 7장 신경망과 서포트 벡터 머신(발표자료) (0) | 2017.09.23 |
R 9장. k-means 알고리즘 (0) | 2017.09.09 |
R 7장 신경망과 서포트 벡터 머신 (0) | 2017.09.09 |
R 5장. 결정트리 (0) | 2017.09.08 |