본문 바로가기

Study/class note

머신러닝 / 연관규칙 이론, R 로 연관규칙 모델 구현하기

ㅇ머신러닝 종류 3가지

1. 지도학습

2. 비지도 학습 : 연관규칙, k-means

3. 강화학습

 

 

73 연관규칙 이론

이 세상의 대부분의 데이터는 정답이 없는 데이터가 훨씬 많음.

 

정답이 없는 데이터를 현업에서는 어떻게 활용하고 있는가?

> 연관규칙 apriori 알고리즘(8장) : 아마존의 연관상품 추천, 넷플릭스 연관 영화 추천, 유튜브 알고리즘, 쿠팡 물류시스템

 

 

ㅇ연관규칙이란?

데이터 내부에 존재하는 항목 간의 상호관계 또는 종속관계를 찾아내는 분석기법. 데이터간의 관계에서 조건과 반응을 연결하는 분석으로 장바구니 분석 또는 서열 분석이라고 함. 간당한 성능 측정치(수학식)를 이용해서 거대한 데이터에서 데이터간의 연관성을 찾는 알고리즘.

 

ㅇ연관규칙 apriori  알고리즘은 어떤 데이터의 패턴을 찾을 때 유용한가?

1. 암 데이터에서 빈번히 발생하는 DNA 패턴과 단백질의 서열을 검사할 때 

2. 사기성 신용카드 및 사기성 보험 청구시 발생하는 패턴을 발견할 때

3. 유통업에서 장바구니 분석을 통해 상품 추천 뿐만 아니라 상품진열, 홈쇼핑의 경우 방송순서 등에 적용하고 있고 유튜브에서 관심 있어하는 영상 추천하는데 적용되고 있음

 

ㅇ연관 규칙의 관련한 중요 용어 3가지 - p.373

1. 지지도 : 전체 거래 중 항목 A와 항목 B를 동시에 포함하는 거래의 비율

2. 신뢰도 : A상품을 샀을 때 B상품을 살 조건부 확률에 대한 척도

3. 향상도 : 발견한 규칙이 우연에 의한 발생인지 아닌지를 판단하는 척도

 

1) 지지도 : 전체 거래 중 항목 A와 항목 B를 동시에 포함하는 거래의 비율

- X아이템의 지지도 (n(X) : 아이템 X의 거래 건수, N : 전체 거래 건수)

 

- 두 아이템 X와 Y의 지지도(n(X∩Y) : 아이템 X와 Y를 포함하는 거래 건수, N : 전체 거래 건수)

 

 

2) 신뢰도 : A상품을 샀을 때 B상품도 살 조건부 확률에 대한 척도

신뢰도를 확률로 풀면 조건부확률식이 됨

신뢰도가 높을수록 유용한 규칙일 가능성이 높다고 할 수 있음.

 

 

3) 향상도 : 규칙이 우연에 의해 발생한 것인지를 판단하기 위한 연관성 정도 척도

"두 아이템의 연관규칙이 우연인지 아닌지를 나타내는 척도"

: X→Y에 대한 신뢰도를 Y에 대한 지지도로 나눈 값

즉, (X와 Y를 모두 포함하는 거래건수)를 (X를 포함하는 거래건수 * Y를 포함하는 거래건수)로 나눈 것.

 

향상도 설명 예시
향상도 = 1 서로 독립적인 관계 과자와 후추
향상도 > 1 양(+)의 상관관계 빵과 버터
향상도 < 1 음(-)의 상관관계 설사약과 변비약

 

 

문제362. (점심시간 문제) 다음의 데이터의 지지도를 구하시오.

거래번호 거래아이템
1 우유, 버터, 시리얼
2 우유, 시리얼
3 우유, 빵
4 버터, 맥주, 오징어

 

예제1. 우유와 시리얼을 동시에 구매할 결합확률인 지지도

support(우유,시리얼) = P(우유∩시리얼) = 2/4 = 0.5

 

예제2. 우유를 구매할 때 시리얼도 같이 구매할 신뢰도

confidence(우유→시리얼) = P(시리얼 |우유) = P(시리얼∩우유) / P(우유) = 2/3 = 0.66

 

예제3. 우유를 구매할 때 시리얼을 사는게 우연인지 아닌지 알아보는 향상도

lift(우유→시리얼) = confidence(우유→시리얼) / support(우유,시리얼) = (2/3) / (2/4) = 4/3

 

 

문제363. 시리얼→우유 의 지지도와 신뢰도를 각각 구하시오.

support(시리얼, 우유) = P(시리얼∩우유) = 2/4 = 0.5

confidence(시리얼→우유) = P(우유 |시리얼) = P(우유∩시리얼) / P(시리얼) = (2/4) / (2/4) = 1

 

  지지도 신뢰도
우유→시리얼 50% 66%
시리얼→우유 50% 100%

 

문제364. 다음은 쇼핑몰의 거래내역이다. 연관규칙 : 우유→빵에 대한 신뢰도는 얼마인가?

항목 거래수
우유 10
20
우유,빵 50
빵,초콜릿 40
전체 거래건수 100

confidence(우유→빵) = P(빵|우유) = P(빵∩우유) / P(우유) = 50/60 = 0.83

 

문제365. 우유→커피에 대한 지지도를 구하시오.

항목 거래수
우유 100
커피 100
{우유,커피} 100
{커피, 초콜릿} 50
전체 거래건수 200

support(우유, 커피) = P(우유∩커피) = 100/200 = 0.5

 

 

문제366. 아래의 데이터 프레임을 R에서 만들고 기저귀를 샀을 때 맥주도 살 지지도, 신뢰도, 향상도를 각각 R로 구하시오

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) )

# 맥주 -> 기저귀 지지도(sup), 신뢰도(con), 향상도(lift)
sup <- nrow(x[x$beer == 1 & x$diapers == 1, ]) / nrow(x)
sup  #0.6
con <- sup / (nrow( x[x$beer == 1,] )/nrow(x))
con  #1

 

 

74 R 로 연관규칙 모델 구현하기

목표 : 사람들이 마트나 온라인 쇼핑몰에 와서 구매한 구매 내역을 보고 어떤 물건을 살 때 어떤 물건도 같이 사더라는 연관성을 파악하려 함.

 

#1. 데이터 로드

#2. 연관규칙 패키지 설치

#3. 1번에서 만든 데이터 프레임을 행렬로 변환

#4. 연관규칙 패키지의 apriori 함수를 이용해서 연관관계를 분석

#5. 가장 연관성이 높은 항목들이 어떤건지 출력

#1. 데이터 로드
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) )

#2. 연관규칙 패키지 설치
install.packages("arules")
library(arules)

#3. 1번에서 만든 데이터 프레임을 행렬로 변환
#arules패키지가 데이터를 행렬로 제공받기 때문
x2 <- as.matrix(x, "Transaction")
x2

#4. 연관규칙 패키지의 apriori 함수를 이용해서 연관관계를 분석
rule1 <- apriori(x2, parameter = list(supp=0.2, conf = 0.6, target = "rules"))
   # x2데이터에서 지지도가 0.2 이상이고 신뢰도가 0.6이상인 법칙만 발견해라

rule1  #set of 49 rules 

#5. 가장 연관성이 높은 항목들이 어떤건지 출력
inspect(sort(rule1))

맥주를 샀을 때 기저귀를 살 연관성이 가장 높고 그 다음으로 기저귀를 샀을 때 맥주를 살 연관성이 두번째로 높음

 

#6. 위의 연관규칙을 시각화
install.packages("sna")
install.packages("rgl")
library(sna)
library(rgl)

b2 <- t(as.matrix(x)) %*% as.matrix(x)  #희소행렬을 만들기 위한 코드
b2

diag(b2)  #b2행렬의 대각선을 출력
diag(diag(b2))  #b2대각선 행렬만 나오고 나머지는 0으로 출력됨

b3 <- b2 - diag(diag(b2))
b3  # 대각선 행렬만 모두 0으로 나오고 나머지 행렬은 자기값 그대로 출력됨


gplot(b3 , displaylabel=T , vertex.cex=sqrt(diag(b2)) , vertex.col = "pink" ,
      edge.col="steelblue" , boxed.labels=F , arrowhead.cex = .3 , 
      label.pos = 3 , edge.lwd = b3*2)

displaylabel=T : 라벨 출력

vertex.cex=sqrt(diag(b2)) : 출력되는 동그라미의 크기

vertex.col = "pink" : 동그라미 색깔

edge.col="steelblue" : 연결선 색깔

boxed.labels=F : 라벨 박스처리

arrowhead.cex = .3 : 화살표의 크기

label.pos = 3 : 라벨 위치(1은 원 아래, 2는 원 왼쪽, 3은 원 위, 4는 원 오른쪽, 5는 원 중앙)

edge.lwd = b3*2 : 연결선의 굵기

 

 

ㅇapriori 알고리즘 예제2(보습학원과 연관성이 높은 업종은?)

보습학원이 많은 건물에는 어떤 업종으로 입점을 해야 장사가 잘될까?

데이터셋 : building.csv

#1. 데이터 로드

#2. 결측치 확인

#3. 결측치가 있다면 0으로 변경

#4. 연관규칙에 불필요한 컬럼 제외

#5. 데이터프레임을 행렬로 변환

#6. 위의 행렬 데이터로 업종간의 연관분석

#7. 연관규칙 확인

#8. 위의 결과에서 보습학원에 대한 부분만 따로 떼어서 출력

 

#1. 데이터 로드
bd <- read.csv("c:\\data\\building.csv")
View(bd)  #데이터 보기 쉬움

#2. 결측치 확인
colSums(is.na(bd))  

#3. 결측치가 있다면 0으로 변경
bd[is.na(bd)] <- 0
colSums(is.na(bd))  #결측치 없음 확인

#4. 연관규칙에 불필요한 컬럼 제외
bd2 <- bd[,-1]  #첫번째 컬럼(x)만 제외시킴
head(bd2)

#5. 데이터프레임을 행렬로 변환
bd3 <- as.matrix(bd2, "Transaction")
head(bd3)

#6. 위의 행렬 데이터로 업종간의 연관분석
library(arules)
rule2 <- apriori(bd3, parameter = list(supp=0.2, conf = 0.6, target = "rule"))
rule2  #set of 46 rules 

#7. 연관규칙 확인
View(inspect(sort(rule2)))

> 일반음식점이 있는 곳에 패밀리 레스토랑이 있고, 약국이 있는 곳에 병원이 있다는 연관성을 확인할 수 있음

 

#8. 위의 결과에서 보습학원에 대한 부분만 따로 떼어서 출력
rule3 <- subset(rule2, subset = lhs %pin% '보습학원'&confidence > 0.7)
inspect(sort(rule3))

 

문제367. 편의점과 연관성이 높은 업종은 무엇인가?

rule4 <- subset(rule2, subset = lhs %in% '편의점'&confidence > 0.7)
View(inspect(sort(rule4)))

문제368. 병원이 있는 건물에 가장 연관된 업종은 무엇인가?

rule5 <- subset(rule2, subset = lhs %in% '병원'&confidence > 0.7)
View(inspect(sort(rule5)))

 

문제369. 보습학원이 있는 건물에 어떤 업종이 많이 있는지 연관분석을 한 결과를 시각화 하시오.

#1. 데이터 로드
bd <- read.csv("c:\\data\\building.csv")
head(bd)

#2. 결측치 확인 및 결측치 0으로 치환
colSums(is.na(bd))
bd[is.na(bd)] <- 0
colSums(is.na(bd))

#3. 불필요한 컬럼 제외
bd2 <- bd[,-1]
bd2

#4. 데이터 프레임을 행렬로 변경하고 희소행렬로 변경
bd3 <- t(as.matrix(bd2)) %*% as.matrix(bd2)

#5. 희소행렬의 대각선을 0으로 변경
bd4 <- bd3 - diag(diag(bd3))
View(bd4)

#5. 시각화
gplot(bd4 , displaylabel=T , vertex.cex=sqrt(diag(bd3)) , vertex.col = "pink" ,
      edge.col="steelblue" , boxed.labels=F , arrowhead.cex = .3 , 
      label.pos = 5 , edge.lwd = bd4*2)

 

문제370. (오늘의 마지막 문제) 화장품 매장과 가장 연관이 있는 업종은 무엇인지 연관분석하시오.

#1. 데이터 로드
bd <- read.csv("c:\\data\\building.csv")
View(bd)  #데이터 보기 쉬움

#2. 결측치 확인
colSums(is.na(bd))  

#3. 결측치가 있다면 0으로 변경
bd[is.na(bd)] <- 0
colSums(is.na(bd))  #결측치 없음 확인

#4. 연관규칙에 불필요한 컬럼 제외
bd2 <- bd[,-1]  #첫번째 컬럼(x)만 제외시킴
head(bd2)

#5. 데이터프레임을 행렬로 변환
bd3 <- as.matrix(bd2, "Transaction")
head(bd3)

#6. 위의 행렬 데이터로 업종간의 연관분석
library(arules)
rule2 <- apriori(bd3, parameter = list(supp=0.2, conf = 0.6, target = "rule"))
rule2  #set of 46 rules 

#7. 연관규칙 확인
View(inspect(sort(rule2)))

#화장품 
rule_cosmetic <- subset(rule2, subset = lhs %in% '화장품'&confidence > 0.7)
View(inspect(sort(rule_cosmetic)))

반응형