비지도학습 알고리즘 (2)

2 연관규칙

2.1 연관규칙

  • 연관규칙과 장바구니 분석
  • 어떤 일들이 함께 발새하는 지 판단 - 쇼핑카드
  • 장바구니 분석 - 상품 진열, 상품 패키징
  • 데이터로부터 규칙 생성 - 주말에 기저귀를 사면 맥주를 산다

2.1.1연관규칙의 장단점

  • 장점
  1. 생성된 규칙이 진관적으로 이해하기 쉬울 뿐만 아니라 실제적인 활용 가능성이 높음
  2. 강력한 비목적성 분석기법
  • 단점
  1. 적용할 수 있는 문제가 구매 상품 간의 연관규칙 생성으로 제한
  2. 상당한 계산 과정이 필요하다.
  3. 빈도수가 적은 상품은 연관성 규칙에서 제외되기 쉽다.

2.1.2 연관규칙 평가 척도

1.동시출현 행렬 - 연관규칙은 ‘A상품을 구매하면, B상품을 구매한다’ 또는 ’A상품과 B상품을 구매하면, C상품을 구매한다’는 형태

  1. 지지도(support)
  • 두상품을 동시에 포함하는 거래의 비율
  • 지지도는 연관규칙의 강도에 대한 척도는 아니며 단순히 이러한 거래가 얼마나 빈번하게 발생하는지를 나타내는 척도로
  • 구매율
  • 연관규칙의 강도가 강하더라도, 이러한 거래가 희소하게 발생한다면 상점입장에서는 의미가 없음
  1. 신뢰도(Confidence)
  • 연관규칙의 강도를 나타내는 척도
  • A를 구매했을 때, B도 함께 구매할 확률
  • 지지도는 대칭적인 반면, 신뢰도는 대칭적이지 않음.
  • support(A->B) = support(B->A)
  • confidence(A->B) != confidence(B->A)
  • confidence(A->B) : P(AnB)/P(A)
  1. 향상도(Lift)
  • B상품의 구매확률이 A상품의 구매에 따라서 얼마나 증가했는지를 의미
  • 향상도가 1 이라는 것은 두 상품의 구매기 독립적인 것을 의미
  • 1보다 클 때는 양의 상관관계를, 1보다 작을 때는 음의 상관관계
  • improvement(A->B) : P(B|A)/P(B)

2.1.3 연관규칙의 분류

  1. 유용한 규칙 -분석 이전에는 알지 몰랐으나, 분석을 통해서 알아냈으며 실제로 활용 가능한 규칙

  2. 사소한 규칙 -이미 잘 알고 있는 규칙 -새로운 사실이 아니므로 실제유용성은 떨어지나

  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. 조직 커뮤니케이션 분석

중심석 척도

  1. 연결 중심성 -한 노드가 가지는 연결의 개수
  2. 근접 중심성
  • 한 노드가 다른 노드들에 이르는 거리가 평균적으로 얼마나 가까운가
  1. 매개 중심성
  • 특정 경로의 최단 경로에 얼마나 포함되어 있는가
  • 중개자역할에 대한 척도
  1. 에이겐벡터 중심성

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)

  • 원 데이터 집합으로부터 크기가 같은 표본을 여러번 단순 임의 복원추출하여 각 표본에 대해 분류기를 생성한 후 그 결과를 앙상블하는 방법임
  • 반복추출방법을 사용하기 때문에 같은 데이터가 한 표본에 여러번 추출 될 수도있고 어떤 데이터는 추출되지 않을 수도 있다.

예제

  1. 자료준비
#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
  1. 분류기준에서 10째 자료를 보자, (tree 키안에 들어있는 value를 보고 싶은데 그중에서도 10번째)
plot(iris.bagging$trees[[10]])   
text(iris.bagging$trees[[10]])

  1. 예측
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))