No Story, No Ecstasy

[ADP 실기 with R] 9. 연관분석: Apriori, FP-Growth 본문

Data Science Series

[ADP 실기 with R] 9. 연관분석: Apriori, FP-Growth

heave_17 2020. 12. 12. 17:22

https://images.app.goo.gl/Lvo347TEuzVUFt2N7

 

0. 연관분석

  - 트랜잭션 데이터로부터 항목 간 연관 관계를 발견하는 분석 기법

  - 데이터의 발생빈도와 조건부 확률을 활용하여 특정 항목 X Y가 서로 얼마나 큰 영향을 미치는지 분석

  - 결과 해석이 용이하고 사용이 편리하나, 항목 수가 증가함에 따라 계산 수가 기하급수적으로 늘어나는 것이 단점

  - 계산 속도를 줄이기 위한 알고리즘들이 개발되고 있다.

    - 지지도전체 거래 중 A가 포함된 비율

    - 신뢰도: A가 포함된 거래 중 A, B가 동시에 포함된 비율

    - 향상도: (A 포함 X and B) 대비 (A 포함 O and B) 확률 증가 비 (Lift = 1: A와 B가 서로 독립)

 

1. Apriori

  - 특정 집합의 지지도가 낮다면(infrequent), 그 집합을 포함하는 모든 집합들(superset)의 지지도 또한 낮다.

    (superset의 지지도는 subset보다 클 수 없다)

  - 이를 이용하여 최소 지지도 이하의 집합을 발견하면, 동 집합의 superset에 대한 연산을 모두 skip > 속도 향상

  - R 코드 예제

# 0. package import
library(reshape2)
library(arules)

# 1. Transaction 데이터 생성
melted.data = melt(data, id.vars = "id", na.rm = T, value.name = "value")
data = split(melted.data$value, melted.data$id)
data = as(data, "transactions")
inspect(data[1:5]) #생성된 tx 확인
itemFrequencyPlot(data, topN = 10, type = "absolute") #barplot 필요 없이 바로 그려줌

# + 굳이 ggplot을 쓰고 싶다면..
library(ggplot2)
data_2 = data %>% group_by(value) %>% summarise(count=n())
data_2 = arrange(data_2, desc(count)) %>% mutate(value = factor(value, levels=value))
data_top10 = data_2[1:10,]
ggplot(data_top10, aes(x = value, y = count)) + geom_bar(stat = "identity")

# 2. Apriori 알고리즘 적용
apriori.rules = apriori(data, parameter = list(supp = 0.002, conf = 0.8, minlen = 2, maxlen = 5))
apriori.rules = sort(apriori.rules, by = "lift", decreasing = T)

# 3. Rule 해석
summary(apriori.rules)

 

2.FP-growth

  -  iter마다 database를 스캔해야 하는 Apriori와 달리, 오직 2번만 Database Scan한다. (속도 향상)

  - FP-tree를 만듦으로써, 연관 관계를 찾아낼 수 있는 기법이다.

    (1) 첫 번째 스캔 시, single item frequent pattern을 만들어, 내림차순으로 정렬한다.

    (2) 한번 더 database를 스캔하며, FP-tree를 완성하고, tree를 활용하여 연관관계를 분석한다.

  - R 코드 예제

# 0. package import
library(rJAVA)
library(rCBA)

data("iris")
fp.data = sapply(iris,as.factor)
fp.data = data.frame(fp.data, check.names=FALSE)
txs <- as(fp.data,"transactions")
inspect(txs[1:2])
rules = fpgrowth(txs, support=0.001, confidence=0.03, maxLength=2, consequent = "Species", parallel=FALSE)
inspect(rules[1:2])

  * 활용법 제대로 알아봐야 함.. consequent = NULL 시 에러가 발생한다.