1 비지도학습 알고리즘

1.1 상관분석

  • 상관 분석은 두 변수 사이의 관련성을 파악하는 방법이다.

피어슨 상관계수

  • 피어슨 상관 계수가 대표적인 상관 분석
  • 피어슨 상관 계수는 한 변수가 커질 때 다른 변수가 함께 커지는 공분산을 표준편차로 나눈 값을 사용한다.
  • 값은 -1 ~ 1 사이를 갖게 되며, 0보다 크면 비례관계, 0보다 작으면 반비례관계, 0이면 상관이 없음을 의미한다.

1.1.1 iris 상관계수

cor(iris$Sepal.Width, iris$Sepal.Length)
## [1] -0.1175698
autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts1 <- autoparts[autoparts$prod_no == "90784-76001", c(2:11)]
autoparts2 <- autoparts1[autoparts1$c_thickness < 1000, ]

1.1.2 autopart 데이터의 상관계수

  • 변수가 많은 경우 한 눈에 보기 어렵다는 단점이 존재한다.
cor(autoparts2$separation, autoparts2$s_separation)
## [1] -0.9946107
cor(autoparts2)
##                      fix_time     a_speed      b_speed    separation
## fix_time           1.00000000 -0.40965888 -0.053310788  0.6481035050
## a_speed           -0.40965888  1.00000000  0.094201813 -0.6297286266
## b_speed           -0.05331079  0.09420181  1.000000000 -0.0079536955
## separation         0.64810350 -0.62972863 -0.007953695  1.0000000000
## s_separation      -0.64955379  0.61663567  0.004768493 -0.9946106507
## rate_terms        -0.27573524  0.16379549  0.086763287 -0.4065543276
## mpa                0.01128835  0.42082145  0.065904868  0.0827314919
## load_time          0.02037007  0.39266555  0.022221837 -0.3181313349
## highpressure_time  0.01500145 -0.03609957 -0.013110064 -0.0007672313
## c_thickness       -0.06179651 -0.16476471  0.011748578 -0.1901120525
##                   s_separation   rate_terms          mpa   load_time
## fix_time          -0.649553792 -0.275735237  0.011288347  0.02037007
## a_speed            0.616635670  0.163795487  0.420821453  0.39266555
## b_speed            0.004768493  0.086763287  0.065904868  0.02222184
## separation        -0.994610651 -0.406554328  0.082731492 -0.31813133
## s_separation       1.000000000  0.417739099 -0.079472678  0.31399479
## rate_terms         0.417739099  1.000000000 -0.006729618  0.13530350
## mpa               -0.079472678 -0.006729618  1.000000000  0.22330961
## load_time          0.313994794  0.135303504  0.223309612  1.00000000
## highpressure_time -0.009468168 -0.015795293 -0.042117049 -0.02557634
## c_thickness        0.121676176  0.012913095 -0.579886953 -0.12169953
##                   highpressure_time c_thickness
## fix_time               0.0150014512 -0.06179651
## a_speed               -0.0360995659 -0.16476471
## b_speed               -0.0131100638  0.01174858
## separation            -0.0007672313 -0.19011205
## s_separation          -0.0094681675  0.12167618
## rate_terms            -0.0157952933  0.01291309
## mpa                   -0.0421170493 -0.57988695
## load_time             -0.0255763439 -0.12169953
## highpressure_time      1.0000000000  0.08522342
## c_thickness            0.0852234187  1.00000000

1.1.3 symnum() 함수를 이용한 상관계수

  • symnum 을 이용하여 간단하게 표현할 수 있다.
x <- cor(autoparts2)
symnum(x)
##                   f a b sp s_ r m l h c
## fix_time          1                    
## a_speed           . 1                  
## b_speed               1                
## separation        , ,   1              
## s_separation      , ,   B  1           
## rate_terms              .  .  1        
## mpa                 .           1      
## load_time           .   .  .      1    
## highpressure_time                   1  
## c_thickness                     .     1
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

1.1.4 그래프를 이용한 상관계수

library(corrgram)
corrgram(x)

1.2 군집분석

  • 군집분석이란 개체들이 가진 특성들의 유사성에 따라서 몇 개의 군집들로 분할하는 방법이다.
  • 군집분석의 목적은 유사한 성향을 가진 개체를 모으는 것
  • 개체를 분류하기 위한 기준이 존재하지 않는 상황에서도 가능하다.
  • 군집분석을 하기전에 스케일을 같게 하는 절차가 필요하다.

군집분석의 목적

  • 유사한 성향을 가진개체를 모아 군집을 형성할 수 있다.
  • 시각적 표현을 통하여 군집간의 특성을 관찰할 수 있다.
  • 데이터의 구조를 파알할 수 있다.
  • 개체를 분류하기 위한 명확한 분류 기준이 존재하지 않거나 기준이 밝혀지지 않은 상태에서 유용하게 이용할 수 있다.

1.2.1 k-평균 군집분석(k-means clustering)

  • 비계층적 군집분석의 대표적인 방법으로는 k-평균 군집분석이 있다.
  • 초기 군집수에 따라 결과가 많이 달라진다. 다양한 k를 넣어보아서 가장 좋은 결과를 선택한다.
  • 연속형 변수일 때 사용이 용이하다.
  • 계산량이 적어 대용량 데이터도 빠르게 처리할 수 있다.

  • 장점 1.각 개체의 군집이 명시되기 때문에 실제 상황에서 적용하기 어렵다.

  • 단점
  1. K를 임의로 정해야한다.
  2. 값의 범위가 다양할 경우에는 적절치 않다.
  3. 적은 수의 이상치가 영향을 미친다.

1.2.2 군집분석 수행과정

  1. 군집수 k를 결정한다. 가장 서로 멀리 떨어진 k개의 개체를 초기점으로 임의 선택한다.
  2. 주변의 객체들이 가장 가까운 초기점으로 할당되어 군집이 형성된다.
  3. 각 군집 내에서 새로운 중심좌표(평균)을 구한다.
  4. 좌표의 변동이 없을 때까지 반복한다.

1.2.3 분석 (1) - 데이터 준비

  • iris 를 활용
iris2 <- iris[, 3:4]
head(iris2)
##   Petal.Length Petal.Width
## 1          1.4         0.2
## 2          1.4         0.2
## 3          1.3         0.2
## 4          1.5         0.2
## 5          1.4         0.2
## 6          1.7         0.4

1.2.4 정규화

  • scale() 함수로 정규화
data.scaled <- scale(iris2)
head(data.scaled)
##      Petal.Length Petal.Width
## [1,]    -1.335752   -1.311052
## [2,]    -1.335752   -1.311052
## [3,]    -1.392399   -1.311052
## [4,]    -1.279104   -1.311052
## [5,]    -1.335752   -1.311052
## [6,]    -1.165809   -1.048667

1.2.5 군집분석 수행

data.cluster <- kmeans(data.scaled, centers = 3)

1.2.6 그래프 표현

plot(data.scaled, col = data.cluster$cluster)
points(data.cluster$centers,  col = 1:3, pch = 8, cex = 2)

1.2.7 분석 (2) - 데이터 준비

  • autoparts 활용
autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts3 <- autoparts[autoparts$prod_no == "45231-3B610", c(2:11)]

autoparts3$flag <- 1
autoparts3$flag[autoparts3$c_thickness > 32] <- 2
autoparts3$flag[autoparts3$c_thickness < 20] <- 3

table(autoparts3$flag)
## 
##    1    2    3 
## 2298   38   42

1.2.8 정규화

data.scaled <- scale(autoparts3[,1:9])    # 불량요인을 결정하는 c_thickness는 제외
head(data.scaled)
##         fix_time     a_speed  b_speed  separation s_separation rate_terms
## 18780 -0.1369565  0.27414980 2.861916  0.30986579   -0.6256391  0.4958978
## 18781 -0.1369565 -0.01704125 2.820923 -0.07819886   -0.4515622  0.4958978
## 18782 -0.1369565  0.17708612 2.533971 -0.02276105   -0.4950814  0.4958978
## 18783 -0.1369565 -0.23543453 1.577467  0.08811456   -0.4950814 -0.1585112
## 18784 -0.3121724  0.08002243 1.686782  0.30986579   -0.5603603  1.1503069
## 18785 -0.1369565  0.44401124 2.793594 -0.05971959   -0.2557257 -0.1585112
##             mpa   load_time highpressure_time
## 18780 0.2438613 -0.03480827       -0.40027978
## 18781 0.2554364 -0.03480827        0.05342152
## 18782 0.2438613 -0.03480827       -0.85398108
## 18783 0.2554364 -0.03480827       -1.98823432
## 18784 0.2554364 -0.03480827       -1.76138367
## 18785 0.2322862 -0.03480827       -1.08083173

1.2.9 군집분석

data.cluster <- kmeans(data.scaled, centers = 3)

1.2.10 그래프 표현

plot(data.scaled, col = data.cluster$cluster)
points(data.cluster$centers, col = 1:3, pch = 8, cex = 2)

1.2.11 결과, 수치 확인

data.cluster <- kmeans(data.scaled, centers = 3)
plot(data.scaled, col = data.cluster$cluster)
points(data.cluster$centers, col = 1:3, pch = 8, cex = 2)

table(real = autoparts3$flag, pred = data.cluster$cluster)
##     pred
## real    1    2    3
##    1   41 2233   24
##    2   30    8    0
##    3    1   41    0

1.3 계층적 군집분석

  • 계층적 군집분석은 군집분석 결과를 나무 구조 형식의 덴드로그램으로 표현

  • 장점 : 1.전체 군집들 사이의 구조적 관계를 쉽게 살펴볼 수 있다. 2.군집의 수를 사전에 결정할 필요가 없다.

  • 단점 : 1.데이터 집합이 매우 클 경우, 계산 속도가 느리다. 2.데이터를 재정렬하거나, 몇 개의 관측치를 제외 시킬 경우 전혀 다른 결과가 나타날 수 있다. 3.일단 개체가 특정 군집에 할당되면 다시는 다른 군집에 포함되지 못하는 성질을 가지고 있기 때문에 때때로 잘못된 군집결과를 초래할 수 있다. 4.초기에 이상치가 분류되면 전체 구조가 왜곡된다.

  • 수행과정
  1. 각 개체를 하나의 군집으로 모형 전체 n개의 군집을 형성한다.
  2. 각 군집 간의 거리를 계산하여 가장 가까운 두 개의 군집을 합친다.
  3. 전 개체가 하나의 군집이 될 때까지 2번을 반복하여 군집을 계속 합친다. 거리 계산에는 유클리디안 기법을 사용하는 dist() 함수가 자주 이용된다. 가까운 두 개의 군집을 합치는 데는 hclust() 함수를 사용한다.

1.3.1 군집분석 수행

  • 1.(x,y) 좌표
x1 <- c(8, 12, 15)
x2 <- c(10, 13, 18)
x <- data.frame(x1, x2); x
##   x1 x2
## 1  8 10
## 2 12 13
## 3 15 18
d <- dist(x); d
##           1         2
## 2  5.000000          
## 3 10.630146  5.830952
hc <- hclust(d)
plot(hc)

  1. 단일 벡터인 경우
  • 변수가 단일 벡터인 경우 그 값은 Y 축 값으로 가정된다.
x <- c(1, 3, 7, 14, 2, 28, 27, 25, 10, 11)
(d <- dist(x))
##     1  2  3  4  5  6  7  8  9
## 2   2                        
## 3   6  4                     
## 4  13 11  7                  
## 5   1  1  5 12               
## 6  27 25 21 14 26            
## 7  26 24 20 13 25  1         
## 8  24 22 18 11 23  3  2      
## 9   9  7  3  4  8 18 17 15   
## 10 10  8  4  3  9 17 16 14  1
hc <- hclust(d)
plot(hc)

1.3.2 데이터준비

  • autoparts 활용
autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts4 <- autoparts[autoparts$prod_no == "45231-P3B750", -1]
autoparts4$flag <- 1
autoparts4$flag[autoparts4$c_thickness > 32] <- 2
autoparts4$flag[autoparts4$c_thickness < 20] <- 3
table(autoparts4$flag)
## 
##  1  2  3 
## 50 17  2

1.3.3 정규화

data.scaled <- scale(autoparts4[, 1:9])
head(data.scaled)
##        fix_time   a_speed   b_speed separation s_separation rate_terms
## 28155 0.1777265 0.5722081 0.8228063  0.4349209   -0.5047412  1.7659691
## 28156 0.1777265 0.5971102 0.5965105  0.5665693   -0.5531290  1.7659691
## 28157 0.2110502 0.7340721 0.5831990  0.3659623   -0.4865958  1.7659691
## 28158 0.2110502 0.5224038 0.3835261  0.3973071   -0.4503049  0.9256114
## 28159 0.2110502 0.7963274 0.4101492  0.5038796   -0.4382079  0.9256114
## 28160 0.1444028 0.5224038 0.6763796  0.4913416   -0.4442564  0.9256114
##             mpa load_time highpressure_time
## 28155 0.6149726 0.1589139        -0.1422649
## 28156 0.6199176 0.1589139         2.0802881
## 28157 0.6199176 0.1889551         0.4133734
## 28158 0.6149726 0.1889551         0.5985861
## 28159 0.6199176 0.1889551         1.8950754
## 28160 0.6199176 0.1589139        -0.3274776

1.3.4 그래프 표현

d <- dist(data.scaled)
data.cluster <- hclust(d)
plot(data.cluster)

1.4 유사도 분석

1.4.1 다차원척도법

  • 다차원 척도법도 비계층적 군집분석 중 하나에 속한다.
  • 데이터들의 거리를 구하고, 상대적인 위치를 그래프에 표시하는 방법이다.
  • 다차원 데이터를 주성분 분석 방식으로 2차원, 또는 3차원의 저차원으로 변환한다. (주성분 회귀분석을 사용하면 다중공선성이 제거됨.)
  • 데이터의 거리는 유클리디안 기법을 이용한다.

1.4.2 다차원척도법 수행

  • 자료준비
autoparts <- read.csv("autoparts.csv", header = TRUE)
autoparts4 <- autoparts[autoparts$prod_no == "45231-P3B750", -1]
autoparts4$flag <- 1
autoparts4$flag[autoparts4$c_thickness > 32] <- 2
autoparts4$flag[autoparts4$c_thickness < 20] <- 3

1.4.3 거리행렬 구하기

d <- dist(autoparts4[, 1:9])
fit <- cmdscale(d)
head(fit)
##            [,1]      [,2]
## 28155 -16.39510 -2.178715
## 28156 -17.76661 -3.919369
## 28157 -15.66237 -3.554004
## 28158 -15.48761 -3.793146
## 28159 -16.20712 -4.972811
## 28160 -16.38329 -2.121006
x <- fit[, 1]  # 거리 행렬의 x 좌표
y <- fit[, 2]  # 거리 행렬의 y 좌표

1.4.4 그래프 표현

plot(x, y, xlab = "Coordinate 1", ylab = "Coordinate 2", main = "MDS-autoparts4", type = "n")  # n 옵션을 사용하면 실제로 그리진 않고 자리만 잡는다
text(x, y, labels = autoparts4$flag, cex = 0.7, col = autoparts4$flag) # 각 데이터의 라벨을 보여준다.

연습문제

  1. EDA
#2. occupancy_all.csv 파일을 읽어 mydata 변수에 담으시오
mydata <- read.csv("occupancy_all.csv")

#3. 자료의 행수를 파악하시오
NROW(mydata)
## [1] 10808
#4. 자료의 처음 몇 개를 확인하시오
head(mydata)
##                  date Temperature Humidity    Light      CO2 HumidityRatio
## 1 2015-02-02 14:19:00     23.7000   26.272 585.2000 749.2000   0.004764163
## 2 2015-02-02 14:19:59     23.7180   26.290 578.4000 760.4000   0.004772661
## 3 2015-02-02 14:21:00     23.7300   26.230 572.6667 769.6667   0.004765153
## 4 2015-02-02 14:22:00     23.7225   26.125 493.7500 774.7500   0.004743773
## 5 2015-02-02 14:23:00     23.7540   26.200 488.6000 779.0000   0.004766594
## 6 2015-02-02 14:23:59     23.7600   26.260 568.6667 790.0000   0.004779332
##   Occupancy
## 1         1
## 2         1
## 3         1
## 4         1
## 5         1
## 6         1
#5. 자료의 구조를 파악하시오
str(mydata)
## 'data.frame':    10808 obs. of  7 variables:
##  $ date         : Factor w/ 10808 levels "2015-02-02 14:19:00",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Temperature  : num  23.7 23.7 23.7 23.7 23.8 ...
##  $ Humidity     : num  26.3 26.3 26.2 26.1 26.2 ...
##  $ Light        : num  585 578 573 494 489 ...
##  $ CO2          : num  749 760 770 775 779 ...
##  $ HumidityRatio: num  0.00476 0.00477 0.00477 0.00474 0.00477 ...
##  $ Occupancy    : int  1 1 1 1 1 1 1 1 1 1 ...
  1. Outlier
#1. 자료의 처음 몇 개를 확인하시오
head(mydata)
##                  date Temperature Humidity    Light      CO2 HumidityRatio
## 1 2015-02-02 14:19:00     23.7000   26.272 585.2000 749.2000   0.004764163
## 2 2015-02-02 14:19:59     23.7180   26.290 578.4000 760.4000   0.004772661
## 3 2015-02-02 14:21:00     23.7300   26.230 572.6667 769.6667   0.004765153
## 4 2015-02-02 14:22:00     23.7225   26.125 493.7500 774.7500   0.004743773
## 5 2015-02-02 14:23:00     23.7540   26.200 488.6000 779.0000   0.004766594
## 6 2015-02-02 14:23:59     23.7600   26.260 568.6667 790.0000   0.004779332
##   Occupancy
## 1         1
## 2         1
## 3         1
## 4         1
## 5         1
## 6         1
#2. 이상치를 확인할 수 있는 컬럼은 무엇이 되겠는가
boxplot(mydata)

#3. 1번 컬럼인 date 컬럼을 제외하고 데이터를 mydata.2 라는 이름으로 재구성
mydata2 <- mydata[mydata$date, -1]

#4. boxplot() 을 이용하여 이상치가 있는 컬럼을 확인하시오
boxplot(mydata2)

  1. 상관분석 수행
  • 높은 상관 관계를 갖는 변수의 쌍 확인
x <- cor(mydata2)
symnum(x)
##               T Hm L C HR O
## Temperature   1            
## Humidity        1          
## Light         ,    1       
## CO2           , .  , 1     
## HumidityRatio . *  . , 1   
## Occupancy     .    * , .  1
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1
  1. k-평균 군집 분석 수행
#1. mydata2의 복사본을 mydata.2라는 이름으로 만드시오
mydata.2 <- mydata2

#2. Occupancy 내용이 1(차있음), 2(비어있음) 가 되게하시오
mydata.2$Occupancy[mydata.2$Occupancy == 0] <- 2

#3. Occupancy 컬럼이 종속변수가  되도록 데이터 정규화를 수행하시오 - occupancy 컬럼은 제외 
scale.mydata.2 <- scale(mydata.2[,1:5])
head(scale.mydata.2)
##   Temperature   Humidity    Light       CO2 HumidityRatio
## 1    2.670605 0.12790056 2.109131 0.3682499      1.072813
## 2    2.687296 0.13153414 2.077082 0.4040536      1.083400
## 3    2.698423 0.11942221 2.050061 0.4336768      1.074046
## 4    2.691469 0.09822632 1.678120 0.4499270      1.047410
## 5    2.720678 0.11336624 1.653848 0.4635132      1.075842
## 6    2.726242 0.12547818 2.031208 0.4986775      1.091712
#4. 필요한 군집의 수를 결정하여 군집분석을 수행하시오
data.cluster <- kmeans(scale.mydata.2, centers = 2)
plot(scale.mydata.2, col = data.cluster$cluster)
points(data.cluster$centers, col = 1:5, pch = 4, cex = 2)

table(real = mydata.2$Occupancy, pred = data.cluster$cluster)
##     pred
## real    1    2
##    1  336 2365
##    2 7673  434
#5. 분석된 결과를 Occupancy와 비교하시오