now is better than never

6. [비지도학습] 연관규칙 (Association Rules) 본문

머신러닝 & 딥러닝

6. [비지도학습] 연관규칙 (Association Rules)

김초송 2023. 3. 31. 15:32

머신러닝 3가지 종류  3가지

  1. 지도학습 : 정답이 있는 데이터로 기계를 학습
  2. 비지도학습 : 정답이 없는 데이터로 기계를 학습
    ex) 연관규칙,  k-means
  3. 강화학습 

 

연관규칙

  • 둘 이상의 거래, 사건에 포함된 항복들의 관련성을 파악하는 탐색적 데이터 분석 기법
  • 컨텐트 기반 추천 머신러닝 알고리즘
  1. DNA 패턴, 단백질 서열 분석
  2. 사기성 신용카드 거래 패턴
  3. 장바구니 분석
  4. OTT 콘텐츠 추천

 

지지도 (support)

  • 전체 거래 중 A 상품과 B 상품을 동시에 포함하는 거래 비율
  • support(X) = count(X) / N = X 상품의 거래 건수 / 전체 거래 건수
    support(X, Y) = count(X Y) / N =  X 상품과 Y 상품을 포함하는 거래 건수 / 전체 거래 건수

신뢰도 (confidence)

  • A 상품을 샀을 때 B 상품을 살 조건부 확률에 대한 척도
  • confidence(X -> Y) = support(X, Y) / support(X)
  • P(A | B) = P(A ∩ B) / P(B)
  • 신뢰도가 높을 수록 유용한 규칙

향상도 (lift)

  • 발견한 규칙이 우연에 의한 발생인지 아닌지 판단하는 척도
  • 연관성을 보는 척도
  • lift(X -> Y) = confidence(X -> Y) / support(Y)
  • lift(A -> B) = P(B | A) / P(B) = P(A ∩ B) / P(A) * P(B)
    = A 와 B 를 모두 포함하는 거래 건수 / A 를 포함하는 거래 건수 * B 를 포함하는 거래 건수
향상도 = 1 서로 독립적인 관계 과자와 우산
향상도 > 1 양(+)의 상관관계 빵과 버터
향상도 < 1 음(-)의 상관관계 설사약과 변비약

 

R 로 연관규칙 구현

  1. 연관규칙 패키지 설치
  2. 데이터 프레임을 행렬로 변환
  3. apriori 함수로 연관관계 분석
  4. 가장 연관성이 높은 항목
  5. 연관규칙 시각화
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) )
x

install.packages("arules")
library(arules)

x2 <- as.matrix(x, "Transaction")
x2

rule1 <- apriori(x2, parameter=list(supp=0.2, conf=0.6, target='rules'))
rule1 # 49 개 연관규칙 발견

# 가장 연관성이 높은 항목들
inspect(sort(rule1))

# 시각화
install.packages("sna")
install.packages("rgl")
library(sna)
library(rgl)

b2 <- t(as.matrix(x)) %*% as.matrix(x) # 희소행렬
b2

b3 <- b2 - diag(diag(b2))
b3

gplot(b3, displaylabels = TRUE, vertex.cex = sqrt(diag(b2)), vertex.col = 'green',
      edge.col = 'blue', boxed.labels = FALSE, arrowhead.cex = 1, label.pos = 3, edge.lwd = b3*2)
  • supp=0.2, conf=0.6, target='rules' : 지지도가 0.2 이상이고 신뢰도가 0.6 이상인 법칙을 발견
  • 희소행렬 (b2) : 시각화를 위한 행렬
  • b3 : 대각선을 0 으로, 나머지 값은 그대로 
  • displaylabels=TRUE : 품목명 출력
    vertex.cex : 노드 동그라미 크기
    vertex.col : 노드 색깔
    boxed.label : 팡목
    arrowhead.csv : 화살표 크기
    label.pos : 품목명 위치 (1은 노드 아래, 2는 노드 위에)
    edgle.lwe
# 병원 약국 데이터

building <- read.csv("C:/Data/building.csv",fileEncoding = 'cp949')
View(building)

# 결측치 처리
colSums(is.na(building))
building[is.na(building)] <- 0

# 불필요한 컬럼 제거 + 행렬 변환
building2 <- as.matrix(building[ , -1], "Transaction")

library(arules)

rule2 <- apriori(building2, parameter=list(supp=0.2, conf=0.6, target="rule"))
inspect(sort(rule2))

# 약국만 보기
parmacy <- subset(rule2, subset=lhs %in% '약국' & confidence > 0.7)
inspect(sort(parmacy))
    lhs                   rhs          support confidence coverage lift     count
[1] {약국}             => {휴대폰매장} 0.25    1          0.25     3.333333 5    
[2] {약국}             => {병원}       0.25    1          0.25     3.333333 5    
[3] {약국, 휴대폰매장} => {병원}       0.25    1          0.25     3.333333 5    
[4] {병원, 약국}       => {휴대폰매장} 0.25    1          0.25     3.333333 5
  • 약국이 있는 건물에 주로 휴대폰 매장과 병원이 있음

 

Python 으로 연관규칙 구현

  1. 패키지 임포트
  2. 데이터 로드
  3. 결측치 처리
  4. 연관분석 
import pandas as pd
from mlxtend.frequent_patterns import association_rules, apriori

building = pd.read_csv("C:/Data/building.csv", encoding='cp949', index_col=0)

building.isnull().sum()
building.fillna(0, inplace=True)

# boolean 타입으로 변경
building2 = building.astype(bool)
building2

a = apriori(building2, min_support=0.1, use_colnames=True)
a # 지지도만 출력

rule = association_rules(a, metric='confidence', min_threshold=0.3)
rule # 지지도와 함께 나머지 성능척도도 같이 출력

rule[rule.support>=0.4].sort_values(by='support', ascending=False) # 지지도 4 이상인 것만 출력

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.