now is better than never
6. [비지도학습] 연관규칙 (Association Rules) 본문
머신러닝 3가지 종류 3가지
- 지도학습 : 정답이 있는 데이터로 기계를 학습
- 비지도학습 : 정답이 없는 데이터로 기계를 학습
ex) 연관규칙, k-means - 강화학습
연관규칙
- 둘 이상의 거래, 사건에 포함된 항복들의 관련성을 파악하는 탐색적 데이터 분석 기법
- 컨텐트 기반 추천 머신러닝 알고리즘
- DNA 패턴, 단백질 서열 분석
- 사기성 신용카드 거래 패턴
- 장바구니 분석
- 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 로 연관규칙 구현
- 연관규칙 패키지 설치
- 데이터 프레임을 행렬로 변환
- apriori 함수로 연관관계 분석
- 가장 연관성이 높은 항목
- 연관규칙 시각화
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 으로 연관규칙 구현
- 패키지 임포트
- 데이터 로드
- 결측치 처리
- 연관분석
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 이상인 것만 출력
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.
'머신러닝 & 딥러닝' 카테고리의 다른 글
8. 머신러닝 평가 (0) | 2023.04.03 |
---|---|
7. [비지도학습] 군집분석 (Clustering) (0) | 2023.04.03 |
5. [지도학습] 서포트 벡터 머신 (Support Vector Machine - SVM) (0) | 2023.03.30 |
4-2. [지도학습] 회귀분석 (Regression) (2) (0) | 2023.03.23 |
4. [지도학습] 회귀분석 (Regression) (1) (0) | 2023.03.22 |