비지도학습 알고리즘 (2)
2 연관규칙
2.1 연관규칙
- 연관규칙과 장바구니 분석
- 어떤 일들이 함께 발새하는 지 판단 - 쇼핑카드
- 장바구니 분석 - 상품 진열, 상품 패키징
- 데이터로부터 규칙 생성 - 주말에 기저귀를 사면 맥주를 산다
2.1.1연관규칙의 장단점
- 장점
- 생성된 규칙이 진관적으로 이해하기 쉬울 뿐만 아니라 실제적인 활용 가능성이 높음
- 강력한 비목적성 분석기법
- 단점
- 적용할 수 있는 문제가 구매 상품 간의 연관규칙 생성으로 제한
- 상당한 계산 과정이 필요하다.
- 빈도수가 적은 상품은 연관성 규칙에서 제외되기 쉽다.
2.1.2 연관규칙 평가 척도
1.동시출현 행렬 - 연관규칙은 ‘A상품을 구매하면, B상품을 구매한다’ 또는 ’A상품과 B상품을 구매하면, C상품을 구매한다’는 형태
- 지지도(support)
- 두상품을 동시에 포함하는 거래의 비율
- 지지도는 연관규칙의 강도에 대한 척도는 아니며 단순히 이러한 거래가 얼마나 빈번하게 발생하는지를 나타내는 척도로
- 구매율
- 연관규칙의 강도가 강하더라도, 이러한 거래가 희소하게 발생한다면 상점입장에서는 의미가 없음
- 신뢰도(Confidence)
- 연관규칙의 강도를 나타내는 척도
- A를 구매했을 때, B도 함께 구매할 확률
- 지지도는 대칭적인 반면, 신뢰도는 대칭적이지 않음.
- support(A->B) = support(B->A)
- confidence(A->B) != confidence(B->A)
- confidence(A->B) : P(AnB)/P(A)
- 향상도(Lift)
- B상품의 구매확률이 A상품의 구매에 따라서 얼마나 증가했는지를 의미
- 향상도가 1 이라는 것은 두 상품의 구매기 독립적인 것을 의미
- 1보다 클 때는 양의 상관관계를, 1보다 작을 때는 음의 상관관계
- improvement(A->B) : P(B|A)/P(B)
2.1.3 연관규칙의 분류
유용한 규칙 -분석 이전에는 알지 몰랐으나, 분석을 통해서 알아냈으며 실제로 활용 가능한 규칙
사소한 규칙 -이미 잘 알고 있는 규칙 -새로운 사실이 아니므로 실제유용성은 떨어지나
설명 불가능한 규칙 -연관규칙을 통해 발견 되었으나, 실제로 해석이나 활용이 불가능한 경우 -예) 비가 오는 날 특정 상품이 많이 판매된다는 연관규칙이 생성되었으나, 그 이유를 알지 못하는 경우
2.1.4 분석수행
- 자료준비
# install.packages("arulesViz")
library(arulesViz)## Loading required package: arules
## Loading required package: Matrix
## Warning: package 'Matrix' was built under R version 3.5.1
##
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
## Loading required package: grid
## Warning: package 'grid' was built under R version 3.5.1
data("Groceries")
summary(Groceries)## transactions as itemMatrix in sparse format with
## 9835 rows (elements/itemsets/transactions) and
## 169 columns (items) and a density of 0.02609146
##
## most frequent items:
## whole milk other vegetables rolls/buns soda
## 2513 1903 1809 1715
## yogurt (Other)
## 1372 34055
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
## 2159 1643 1299 1005 855 645 545 438 350 246 182 117 78 77 55
## 16 17 18 19 20 21 22 23 24 26 27 28 29 32
## 46 29 14 14 9 11 4 6 1 1 1 1 3 1
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 4.409 6.000 32.000
##
## includes extended item information - examples:
## labels level2 level1
## 1 frankfurter sausage meat and sausage
## 2 sausage sausage meat and sausage
## 3 liver loaf sausage meat and sausage
rules <- apriori(Groceries, parameter = list(support = 0.001, confidence = 0.5))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.001 1
## maxlen target ext
## 10 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 9
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
## sorting and recoding items ... [157 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 done [0.01s].
## writing ... [5668 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
rules## set of 5668 rules
inspect(head(sort(rules, by = "lift"),3)) ## lhs rhs support
## [1] {Instant food products,soda} => {hamburger meat} 0.001220132
## [2] {soda,popcorn} => {salty snack} 0.001220132
## [3] {flour,baking powder} => {sugar} 0.001016777
## confidence lift count
## [1] 0.6315789 18.99565 12
## [2] 0.6315789 16.69779 12
## [3] 0.5555556 16.40807 10
plot(rules)## To reduce overplotting, jitter is added! Use jitter = 0 to prevent jitter.
subrules2 <- head(sort(rules, by = "lift"), 10)
plot(subrules2, method = "graph", control = list(type = "items"))## Warning: Unknown control parameters: type
## Available control parameters (with default values):
## main = Graph for 10 rules
## nodeColors = c("#66CC6680", "#9999CC80")
## nodeCol = c("#EE0000FF", "#EE0303FF", "#EE0606FF", "#EE0909FF", "#EE0C0CFF", "#EE0F0FFF", "#EE1212FF", "#EE1515FF", "#EE1818FF", "#EE1B1BFF", "#EE1E1EFF", "#EE2222FF", "#EE2525FF", "#EE2828FF", "#EE2B2BFF", "#EE2E2EFF", "#EE3131FF", "#EE3434FF", "#EE3737FF", "#EE3A3AFF", "#EE3D3DFF", "#EE4040FF", "#EE4444FF", "#EE4747FF", "#EE4A4AFF", "#EE4D4DFF", "#EE5050FF", "#EE5353FF", "#EE5656FF", "#EE5959FF", "#EE5C5CFF", "#EE5F5FFF", "#EE6262FF", "#EE6666FF", "#EE6969FF", "#EE6C6CFF", "#EE6F6FFF", "#EE7272FF", "#EE7575FF", "#EE7878FF", "#EE7B7BFF", "#EE7E7EFF", "#EE8181FF", "#EE8484FF", "#EE8888FF", "#EE8B8BFF", "#EE8E8EFF", "#EE9191FF", "#EE9494FF", "#EE9797FF", "#EE9999FF", "#EE9B9BFF", "#EE9D9DFF", "#EE9F9FFF", "#EEA0A0FF", "#EEA2A2FF", "#EEA4A4FF", "#EEA5A5FF", "#EEA7A7FF", "#EEA9A9FF", "#EEABABFF", "#EEACACFF", "#EEAEAEFF", "#EEB0B0FF", "#EEB1B1FF", "#EEB3B3FF", "#EEB5B5FF", "#EEB7B7FF", "#EEB8B8FF", "#EEBABAFF", "#EEBCBCFF", "#EEBDBDFF", "#EEBFBFFF", "#EEC1C1FF", "#EEC3C3FF", "#EEC4C4FF", "#EEC6C6FF", "#EEC8C8FF", "#EEC9C9FF", "#EECBCBFF", "#EECDCDFF", "#EECFCFFF", "#EED0D0FF", "#EED2D2FF", "#EED4D4FF", "#EED5D5FF", "#EED7D7FF", "#EED9D9FF", "#EEDBDBFF", "#EEDCDCFF", "#EEDEDEFF", "#EEE0E0FF", "#EEE1E1FF", "#EEE3E3FF", "#EEE5E5FF", "#EEE7E7FF", "#EEE8E8FF", "#EEEAEAFF", "#EEECECFF", "#EEEEEEFF")
## edgeCol = c("#474747FF", "#494949FF", "#4B4B4BFF", "#4D4D4DFF", "#4F4F4FFF", "#515151FF", "#535353FF", "#555555FF", "#575757FF", "#595959FF", "#5B5B5BFF", "#5E5E5EFF", "#606060FF", "#626262FF", "#646464FF", "#666666FF", "#686868FF", "#6A6A6AFF", "#6C6C6CFF", "#6E6E6EFF", "#707070FF", "#727272FF", "#747474FF", "#767676FF", "#787878FF", "#7A7A7AFF", "#7C7C7CFF", "#7E7E7EFF", "#808080FF", "#828282FF", "#848484FF", "#868686FF", "#888888FF", "#8A8A8AFF", "#8C8C8CFF", "#8D8D8DFF", "#8F8F8FFF", "#919191FF", "#939393FF", "#959595FF", "#979797FF", "#999999FF", "#9A9A9AFF", "#9C9C9CFF", "#9E9E9EFF", "#A0A0A0FF", "#A2A2A2FF", "#A3A3A3FF", "#A5A5A5FF", "#A7A7A7FF", "#A9A9A9FF", "#AAAAAAFF", "#ACACACFF", "#AEAEAEFF", "#AFAFAFFF", "#B1B1B1FF", "#B3B3B3FF", "#B4B4B4FF", "#B6B6B6FF", "#B7B7B7FF", "#B9B9B9FF", "#BBBBBBFF", "#BCBCBCFF", "#BEBEBEFF", "#BFBFBFFF", "#C1C1C1FF", "#C2C2C2FF", "#C3C3C4FF", "#C5C5C5FF", "#C6C6C6FF", "#C8C8C8FF", "#C9C9C9FF", "#CACACAFF", "#CCCCCCFF", "#CDCDCDFF", "#CECECEFF", "#CFCFCFFF", "#D1D1D1FF", "#D2D2D2FF", "#D3D3D3FF", "#D4D4D4FF", "#D5D5D5FF", "#D6D6D6FF", "#D7D7D7FF", "#D8D8D8FF", "#D9D9D9FF", "#DADADAFF", "#DBDBDBFF", "#DCDCDCFF", "#DDDDDDFF", "#DEDEDEFF", "#DEDEDEFF", "#DFDFDFFF", "#E0E0E0FF", "#E0E0E0FF", "#E1E1E1FF", "#E1E1E1FF", "#E2E2E2FF", "#E2E2E2FF", "#E2E2E2FF")
## alpha = 0.5
## cex = 1
## itemLabels = TRUE
## labelCol = #000000B3
## measureLabels = FALSE
## precision = 3
## layout = NULL
## layoutParams = list()
## arrowSize = 0.5
## engine = igraph
## plot = TRUE
## plot_options = list()
## max = 100
## verbose = FALSE
3 소셜네트워크 분석
- 소셜 네트워크 분석은 사람과사람 간의 관계를 분석하기 위한 기법
- 노드와 노드의 관계에 대한 분석 기법
- 특정 개인이 맺고 있는 인관관계를 살펴봄으로써 그 사람들을 이해하기 위한 방안 ### 3.1 주요개념
3.2 소셜 네트워크의 장/단점
-소셜 네으퉈크 분석은 노드와의 관계로 표현될 수 있는 문제에만 적용이 가능 - 기존의 분류 추정 등에
활용
1.통신 네으퉈크상 영향력 있는 고객의 파악 - 고객 간의 통화 기록을 기초로 통화 네트워크를 작성 타 고객의 구매에 더 많은 영향력을 미칠 수 있는 고객들을 추출 2. 범죄 주도자의 식별 - 범인들의 인적 네트워크를 분석함으로써 배후의 주도자들을 식별하는 것이 가능 3. 조직 커뮤니케이션 분석
중심석 척도
- 연결 중심성 -한 노드가 가지는 연결의 개수
- 근접 중심성
- 한 노드가 다른 노드들에 이르는 거리가 평균적으로 얼마나 가까운가
- 매개 중심성
- 특정 경로의 최단 경로에 얼마나 포함되어 있는가
- 중개자역할에 대한 척도
- 에이겐벡터 중심성
3.3 네트워크 분석 알고리즘
예제
#install.packages("sna")
library(sna)## Loading required package: statnet.common
##
## Attaching package: 'statnet.common'
## The following object is masked from 'package:base':
##
## order
## Loading required package: network
## network: Classes for Relational Data
## Version 1.13.0.1 created on 2015-08-31.
## copyright (c) 2005, Carter T. Butts, University of California-Irvine
## Mark S. Handcock, University of California -- Los Angeles
## David R. Hunter, Penn State University
## Martina Morris, University of Washington
## Skye Bender-deMoll, University of Washington
## For citation information, type citation("network").
## Type help("network-package") to get started.
## sna: Tools for Social Network Analysis
## Version 2.4 created on 2016-07-23.
## copyright (c) 2005, Carter T. Butts, University of California-Irvine
## For citation information, type citation("sna").
## Type help(package="sna") to get started.
amatrix <- rbind(c(0, 1, 1, 1, 0), c(1, 0, 0, 0, 0), c(1, 1, 0, 0, 1) ,c(0, 0, 0, 1, 0))
amatrix## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 1 1 1 0
## [2,] 1 0 0 0 0
## [3,] 1 1 0 0 1
## [4,] 0 0 0 1 0
gden(amatrix)## [1] 0.2222222
degree(amatrix, gmode = "graph")## [1] 3 1 3 1 2 2 1 2 1
closeness(amatrix, gmode = "graph")## [1] 0.4705882 0.2758621 0.4705882 0.2758621 0.3636364 0.5000000 0.3333333
## [8] 0.3636364 0.3333333
#between(amatrix, gmode ="graph")
gplot(amatrix)gplot(amatrix, mode = "circle")plot.sociomatrix(amatrix)4 시계열 분석
4.1시계열 예측의 장점과 단점
summary(AirPassengers)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 104.0 180.0 265.5 280.3 360.5 622.0
plot(AirPassengers)apts <- ts(AirPassengers, frequency = 12)
f <- decompose(apts)
plot(t)fit <- arima(AirPassengers, order = c(1, 0, 0), list(order = c(2, 1, 0), period = 12))
fore <- predict(fit, n.ahead = 24)
U <- fore$pred + 2*fore$se
L <- fore$pred - 2*fore$se
ts.plot(AirPassengers, fore$pred, U, L, col = c(1, 2, 4, 4), lty = c(1, 1, 2, 2))
legend("topleft", c("Actual", "Forecast", "Error Bounds(95% confidence)"), col = c(1, 2, 4), lty = c(1, 1, 2))5 앙상블 모형
5.1 개요
- 평균을 취함으로써 편의를 제거
- 치우침이 있는 여러 모형의 평균을 취하면, 어느 모형에 도 치우치지 않는 ~ 을 보여줌
5.2 배깅 (bagging)
- 원 데이터 집합으로부터 크기가 같은 표본을 여러번 단순 임의 복원추출하여 각 표본에 대해 분류기를 생성한 후 그 결과를 앙상블하는 방법임
- 반복추출방법을 사용하기 때문에 같은 데이터가 한 표본에 여러번 추출 될 수도있고 어떤 데이터는 추출되지 않을 수도 있다.
예제
- 자료준비
#install.packages("adabag")
library(adabag)## Loading required package: rpart
## Loading required package: caret
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.5.1
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.5.1
## Loading required package: foreach
## Loading required package: doParallel
## Loading required package: iterators
## Loading required package: parallel
## Warning: package 'parallel' was built under R version 3.5.1
data(iris)
iris.bagging <- bagging(Species ~ ., data = iris, mfinal = 10) # mfinal = 반복의 수, '트리'의 수
iris.bagging$importance## Petal.Length Petal.Width Sepal.Length Sepal.Width
## 83.0458882 16.5439436 0.4101682 0.0000000
- 분류기준에서 10째 자료를 보자, (tree 키안에 들어있는 value를 보고 싶은데 그중에서도 10번째)
plot(iris.bagging$trees[[10]])
text(iris.bagging$trees[[10]])- 예측
pred <- predict(iris.bagging, newdata = iris)
table(pred$class, iris[, 5])##
## setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 47 2
## virginica 0 3 48
5.3부스팅 (boosting)
- 샘플링과정에서 분류가 잘못된 데이터에 큰 가중을 주어 표본을 추출
- 예측력이 약한 모형들을 결합하여 예측력이 높은 모형을 생성함
- ~~
예제
library(adabag)
boo.adabag <- boosting(Species ~ ., data = iris, boost = TRUE, mfinal = 10)
plot(boo.adabag$trees[[10]])
text(boo.adabag$trees[[10]])1.예측
pred <- predict(boo.adabag, newdata = iris)
table(pred$class, iris[, 5])##
## setosa versicolor virginica
## setosa 50 0 0
## versicolor 0 50 0
## virginica 0 0 50
2.오분류율
error.rpart <- 1 - (sum(diag(tb))/sum(tb))#install.packages("ada")
library(ada)
iris1 <- iris[iris$Species == "setosa", ]
n <- dim(iris1)[1]
trind <- sample(1:n, floor(.6*n), FALSE)
teind <- setdiff(1:n, trind) # 차집합
iris[, 5] <- as.factor((levels(iris1[, 5])[2:3])[as.numeric(iris1[,5])-1]) # 차례대로 50개 씩
gids <- ada(Species ~ ., data = iris1[trind,], iter = 20, ny = 1, tpye = "discrete")
gids <- addtest(gids, iris1[teind, -5], iris1[teind, 5])
varplot(gids)5.4 Random forest
- 배깅(단순복원추출에 의해 뽑힌 bootstrap)에서 랜덤샘플을 한다.
- 테스트셋, 트레이닝셋 구분이 필요없다. 알고리즘에서 알아서 계산.
- 입력변수가 많을 수록, 배깅, 부스팅보다 예측력이 높다.
library(randomForest)## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
library(rpart)
data("stagec")
stagec3 <- stagec[complete.cases(stagec), ]
set.seed(1234)
ind <- sample(2, nrow(stagec3), replace = TRUE, prob = c(0.7, 0.3))
trainData <- stagec3[ind == 1, ]
testData <- stagec3[ind == 2, ]
rf <- randomForest(ploidy ~., data = trainData, ntree = 100, proxinity = TRUE)
table(predict(rf), trainData$ploidy)##
## diploid tetraploid aneuploid
## diploid 45 0 3
## tetraploid 1 51 0
## aneuploid 2 0 0
print(rf) # trainData 셋으로 보여주는 결과 #모델 생성과정에서 검증을 실시할 수 있다.##
## Call:
## randomForest(formula = ploidy ~ ., data = trainData, ntree = 100, proxinity = TRUE)
## Type of random forest: classification
## Number of trees: 100
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 5.88%
## Confusion matrix:
## diploid tetraploid aneuploid class.error
## diploid 45 1 2 0.0625
## tetraploid 0 51 0 0.0000
## aneuploid 3 0 0 1.0000
plot(rf)importance(rf) # 지니의 불순도## MeanDecreaseGini
## pgtime 4.6800225
## pgstat 2.0635061
## age 3.5726107
## eet 0.7875501
## g2 37.5032896
## grade 1.2084410
## gleason 2.0820408
varImpPlot(rf) # 불순도가 높은 데이터 가지치기하면 순수도를 높일 수 있다.rf.pred <- predict(rf, newdata = testData)
table(rf.pred, testData$ploidy)##
## rf.pred diploid tetraploid aneuploid
## diploid 17 0 1
## tetraploid 0 13 1
## aneuploid 0 0 0
#plot(margin(rf.pred))