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.각 개체의 군집이 명시되기 때문에 실제 상황에서 적용하기 어렵다.
- 단점
- K를 임의로 정해야한다.
- 값의 범위가 다양할 경우에는 적절치 않다.
- 적은 수의 이상치가 영향을 미친다.
1.2.2 군집분석 수행과정
- 군집수 k를 결정한다. 가장 서로 멀리 떨어진 k개의 개체를 초기점으로 임의 선택한다.
- 주변의 객체들이 가장 가까운 초기점으로 할당되어 군집이 형성된다.
- 각 군집 내에서 새로운 중심좌표(평균)을 구한다.
- 좌표의 변동이 없을 때까지 반복한다.
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.초기에 이상치가 분류되면 전체 구조가 왜곡된다.
- 수행과정
- 각 개체를 하나의 군집으로 모형 전체 n개의 군집을 형성한다.
- 각 군집 간의 거리를 계산하여 가장 가까운 두 개의 군집을 합친다.
- 전 개체가 하나의 군집이 될 때까지 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)
- 단일 벡터인 경우
- 변수가 단일 벡터인 경우 그 값은 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) # 각 데이터의 라벨을 보여준다.
연습문제
- 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 ...
- 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)
- 상관분석 수행
- 높은 상관 관계를 갖는 변수의 쌍 확인
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
- 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와 비교하시오