01 차원축소
-01 다차원 척도법 (MDS : Multidimensional Scaling)
-02 주성분 분석 (PCA)
01 차원축소
변수의 수를 줄여야하는 이유는 모델의 복잡도를 낮추고 일반화 성능을 극대화시키기 위함이다. (비지도학습)
변수의 수를 줄이는 가장 간단한 방법은 변수제거인데, 변수 제거에 있어서는 :
1) 명확한 이유가 있어야 함
2) 데이터 자체가 가지고 있는 작은 신호 혹은 가능성에 대한 고민을 계속해야 함
위와 같은 이유로 가장 마지막에 고려되는 것이 좋은 방법이다.
변수의 수를 줄이는 또 다른 방법은 차원축소이며 변수제거에 대응되는 방법이고, 제거가 아닌 차원축소를 사용하는 이유는 정보의 소실을 최소화하기 위함이다.
차원축소는 최종 모형에 있어 학습에 필요한 변수를 줄이며, 기존 변수의 선형결합으로 변수의 제거 없이 변수의 수를 줄이는 방법이다. (기존 변수의 수보다 적은 수의 인공변수를 유도)
또한 모델의 단순화와 동시에 시각화에 있어 이점을 가진다.
n개의 변수가 존재한다고 가정했을 때, 3차원 이상의 시각화는 불가능하나 차원축소를 통해 2차원 혹은 3차원으로 데이터를 확인할 수 있다.
대표적으로 MDS, PCA 등이 있다.
-01 다차원 척도법 (MDS : Multidimensional Scaling)
기존 데이터 포인트들이 가지고 있는 유사성, 비유사성 (거리)들을 최대한 반영/보존하면서 차원을 축소하는 기법이다. (비지도학습)
스트레스 값으로 평가한다.
다차원 척도법은 개체들 사이의 집단화를 시각적으로 표현하며, 유클리드 거리를 주로 사용한다.
유도되는 인공변수의 수는 목적에 맞게 정해지며, 2차원 시각화를 원하는 경우 2개의 인공변수, 3차원 시각화를 원하는 경우 3개의 인공변수 등으로 정하면 된다.
인공변수의 수는 변수의 수를 초과할 수 없다.
다차원 척도법은 기존 변수들의 신호에 따라 가중치를 조정하며 선형결합(가중합)을 통해 변수간의 관계를 구한다.
예를 들어 100개의 변수가 존재하며 2차원으로의 차원 축소가 필요한 경우, 원본 데이터가 가지고 있는 거리들을 아무리 보존하여도 기존 변수 수에 비해 급격히 적은 수의 변수로 압축되기 때문에 기존 거리에 대한 반영이 왜곡될 수밖에 없는데 이를 스트레스(stress)라고 한다.
스트레스 값은 0에 가까울수록 적합도 수준이 완벽하며, 1에 가까울수록 나쁘다.
이는 기존 거리와 인공변수로 인해 재계산된 거리 간의 차이를 말한다.
즉, 기존 변수와 유도된 변수까지의 거리가 0이라면 본래 변수들의 거리를 완벽히 반영하나 (기존과 유사함), 스트레스 값이 증가할수록 왜곡이 심해짐을 뜻한다.
| 스트레스 값 | 적합도 수준 |
| 0 | 완벽 |
| 0.05 이내 | 매우 좋음 |
| 0.05 ~ 0.10 | 만족 |
| 0.10 ~ 0.15 | 보통 |
| 0.15 이상 | 나쁨 |
[ 예제 - iris 데이터의 차원 축소 (MDS) ]
# 1. 변수 스케일링
X <- scale(iris[,-5]) # 표준화 (평균 : 0, 표준편차 : 1)
# 2. MDS 인공변수 생성
cmdscale(d, # 거리행렬
k) # 유도할 인공변수의 수
mds2 <- cmdscale(dist(X), 2)
mds3 <- cmdscale(dist(X), 3)
# 3. 인공변수 확인
df_mds2 <- data.frame(mds2)
df_mds3 <- data.frame(mds3)
# 유도 전 원본 데이터
head(iris[, -5])
> head(iris[, -5])
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
5 5.0 3.6 1.4 0.2
6 5.4 3.9 1.7 0.4
# 2차원으로 차원축소를 진행한 데이터
head(df_mds2)
> head(df_mds2)
X1 X2
1 -2.257141 0.4784238
2 -2.074013 -0.6718827
3 -2.356335 -0.3407664
4 -2.291707 -0.5953999
5 -2.381863 0.6446757
6 -2.068701 1.4842053
# 3차원으로 차원축소를 진행한 데이터
head(df_mds3)
> head(df_mds3)
X1 X2 X3
1 -2.257141 0.4784238 0.12727962
2 -2.074013 -0.6718827 0.23382552
3 -2.356335 -0.3407664 -0.04405390
4 -2.291707 -0.5953999 -0.09098530
5 -2.381863 0.6446757 -0.01568565
6 -2.068701 1.4842053 -0.02687825
# 4. 인공변수를 사용한 분류분석 진행
# 1) 기존모델 : 4개변수를 모두 학습
library(randomForest)
m1 <- randomForest(Species ~ ., data = iris)
> randomForest(Species ~ ., data = iris)
Call:
randomForest(formula = Species ~ ., data = iris)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 2
OOB estimate of error rate: 4%
Confusion matrix:
setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 47 3 0.06
virginica 0 3 47 0.06
# 2) 인공변수 모델 : 2개 변수로 요약하여 학습
df_mds2$Species <- iris$Species
m2 <- randomForest(Species ~ ., data = df_mds2)
> randomForest(Species ~ ., data = df_mds2)
Call:
randomForest(formula = Species ~ ., data = df_mds2)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 1
OOB estimate of error rate: 10.67%
Confusion matrix:
setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 42 8 0.16
virginica 0 8 42 0.16
# 3) 인공변수 모델 : 3개 변수로 요약하여 학습
df_mds3$Species <- iris$Species
m3 <- randomForest(Species ~ ., data = df_mds3)
> randomForest(Species ~ ., data = df_mds3)
Call:
randomForest(formula = Species ~ ., data = df_mds3)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 1
OOB estimate of error rate: 6%
Confusion matrix:
setosa versicolor virginica class.error
setosa 50 0 0 0.00
versicolor 0 45 5 0.10
virginica 0 4 46 0.08
* 의사결정나무, 랜덤포레스트와 같은 tree 기반 모델의 경우 내부에서 변수를 자동으로 선택하기 때문에 굳이 차원축소를 진행할 필요가 없다.
* 전통회귀분석의 경우 변수의 수가 많을 시 차원을 축소한 데이터를 이용하여 회귀계수를 구할 수 있다. 또한 다중공선성 문제가 심각한 경우 PCA를 통한 인공변수 유도가 가능하다. (인공변수는 모두 서로 독립적이다.)
# 5. 저차원 공간선상의 시각화
# 2차원
plot(df_mds2$X1, df_mds2$X2, col = iris$Species)

# 3차원
# 방법1) 정적 시각화
install.packages('scatterplot3d')
library(scatterplot3d)
cols <- c('black', 'red', 'blue')[as.numeric(iris$Species)]
scatterplot3d(df_mds3$X1, df_mds3$X2, df_mds3$X3,
pch = 19,
color = cols,
main = '3차원 산점도')

# 방법2) 동적 시각화
install.packages('rgl')
library(rgl)
plot3d(df_mds3$X1, df_mds3$X2, df_mds3$X3,
col = cols,
size = 1,
type = 's')


# 6. 평가
▶ 다양한 stress가 존재한다. : stress
stress
σ22 (d′, b X) = (ηd′2 + b2 η2(X) – 2 b ρ(d′, X)) / (b2 ∑i
www.fon.hum.uva.nl
* 스트레스 값의 경우 역시 변수의 수가 증가할수록 감소하는 경향을 보이는데, 충분히 데이터를 표현할 수 있는 지점 역시 엘보포인트로 확인 가능하다. (raw stress 기준)
* 따라서 인공변수가 몇 개일 때 가장 효율적으로 차원을 축소할 수 있는지에 대한 결정을 진행할 수 있다.
# 1) 일반적인 스트레스(raw stress)

- 절대적인 평가 지점이 없음
- 인공변수의 수가 많아질수록 stress가 작아짐
- 가장 급변하는 지점 (elbow point)이 가장 좋은 인공변수 수
- sum((원래 거리 - 유도된 거리)^2)
f_stress <- function(data, mds_result) {
true_dist <- as.matrix(dist(data))
mds_dist <- as.matrix(dist(mds_result))
vstress <- sum((true_dist - mds_dist)^2)/2 #dist를 통해 행렬을 이미 구한 상태이므로 중복계산이 되어 2로 나누어준다.
return(round(vstress, 4))
}
f_stress(X, mds2)
> f_stress(X, mds2)
[1] 351.862
f_stress(X, mds3)
> f_stress(X, mds3)
[1] 8.1365
# ** 최적의 인공변수 수 확인
vstress <- c()
for (i in 1:4) {
m_mds <- cmdscale(dist(X), i)
vstress <- c(vstress, f_stress(X, m_mds))
}
plot(1:4, vstress, type = 'o', xlab = '인공변수 수',
ylab = 'raw stress')

▲ 4차원 데이터를 3차원으로 차원숙소하는 것도 나쁘지는 않으나, 2차원으로 차원축소를 진행하여도 충분히 스트레스 값이 감소한다.
따라서 데이터 탐색과정에 있어 차원축소를 진행하는 경우라면 3차원으로 시각화/데이터 탐색을 진행하는 것보다는 2차원으로 축소하는 것이 가장 좋다고 결론을 내릴 수 있다.
# 2) kruskal stress

- kruskal_stress = sum((원래 거리 - 유도된 거리)^2) / sum(원래 거리^2)
f_kruskal <- function(data, mds_result) {
true_dist <- as.matrix(dist(data))
mds_dist <- as.matrix(dist(mds_result))
up_value <- sum((true_dist - mds_dist)^2)/2
down_value <- sum(true_dist^2)/2
kruskal <- sqrt(up_value / down_value)
return(round(kruskal,6))
}
f_kruskal(X, mds2)
> f_kruskal(X, mds2)
[1] 0.062736
f_kruskal(X, mds3)
> f_kruskal(X, mds3)
[1] 0.00954
| 스트레스 값 | 적합도 수준 |
| 0.05 이내 | 매우 좋음 |
| 0.05 ~ 0.10 | 만족 |
▲ 둘 모두 다 스트레스 값이 매우 좋음 ~ 만족에 해당되기 때문에 인공변수의 수 지정에 대한 결정이 명확하지 않은 경우, 1번과 같은 raw stress를 통해 elbow point를 확인 후 변수 설정 결정을 진행할 수 있다.
[ 예제 - 보스턴 데이터 차원축소 (MDS) ]
회귀분석을 진행하기 전 차원축소를 통한 시각화는 이상치를 탐색하기 위해 사용된다.
(모든 변수를 고려하였을 때 동떨어져 있는 데이터의 탐색)
# 1. 데이터 로딩
library(MASS)
head(Boston)
> head(Boston)
crim zn indus chas nox rm age dis rad
1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1
2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2
3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2
4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3
5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3
6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3
tax ptratio black lstat medv
1 296 15.3 396.90 4.98 24.0
2 242 17.8 396.90 9.14 21.6
3 242 17.8 392.83 4.03 34.7
4 222 18.7 394.63 2.94 33.4
5 222 18.7 396.90 5.33 36.2
6 222 18.7 394.12 5.21 28.7
X <- Boston[,-ncol(Boston)]
# 2. 변수 스케일링
X_sc <- scale(X)
# 3. MDS로 인공변수 생성
mds2 <- cmdscale(dist(X_sc), 2)
mds3 <- cmdscale(dist(X_sc), 3)
# key에 대한 접근을 위해 ($변수명) data.frame으로 변환해준다.
df_mds2 <- data.frame(mds2)
df_mds3 <- data.frame(mds3)
# 4. 평가(적절한 인공변수 수 확인)
# 1) raw stress
vstress <- c()
for (i in 1:ncol(X)) {
m_mds <- cmdscale(dist(X_sc), i)
vstress <- c(vstress, f_stress(X_sc, m_mds))
}
plot(1:ncol(X), vstress, type = 'o', xlab = '인공변수 수',
ylab = 'raw stress')

# 2) kruskal stress
f_kruskal <- function(data, mds_result) {
true_dist <- as.matrix(dist(data))
mds_dist <- as.matrix(dist(mds_result))
up_value <- sum((true_dist - mds_dist)^2)/2
down_value <- sum(true_dist^2)/2
kruskal <- sqrt(up_value / down_value)
return(round(kruskal,6))
}
vstress1 <- c() ; vstress2 <- c()
for (i in 1:ncol(X)) {
m_mds <- cmdscale(dist(X_sc), i)
vstress1 <- c(vstress1, f_stress(X_sc, m_mds))
vstress2 <- c(vstress2, f_kruskal(X_sc, m_mds))
}
par(mfrow=c(1,2))
plot(1:ncol(X), vstress1,
xlab = '인공변수 수', ylab = 'raw stress',
type = 'o')
plot(1:ncol(X), vstress2,
xlab = '인공변수 수', ylab = 'kruskal stress',
type = 'o')
abline(h=0.1, col='red')

▲ kruskal stress의 경우 0.1 이하가 좋으므로 인공변수는 7개 이상인 것이 좋은 것으로 확인된다. (7~9개 정도의 범위)
(7개 미만의 변수를 사용하는 것은 기존 데이터에서 지나친 왜곡을 일으키는 것으로 확인된다.)
만약 0.5를 기준으로 한다면 인공변수는 9개 이상을 사용하는 것이 좋은 것으로 확인된다.
다만, MDS를 통한 인공변수는 변수간의 독립성이 보장되어있지 않기 때문에 전통회귀분석을 위한 인공변수는 수 선택을 진행하기 위해서는 PCA를 통해 다시 살펴보는 것이 좋다.
(Boston 데이터는 다중공선성 문제가 존재한다.)
=> 두 스트레스 결과를 종합하였을 때 인공변수는 7 ~ 9개가 적합한 것으로 판단되었다.
# 5. 시각화
# 2차원)
plot(df_mds2$X1, df_mds2$X2)

▲ 극단의 이상치는 보이지 않으나, 전체적인 경향에서 떨어져있는 것으로 보이는 데이터가 일부 확인된다.
(이상치가 두드러지는 경향은 아닌 것으로 판단된다.)
# 3차원)
scatterplot3d(df_mds3$X1, df_mds3$X2, df_mds3$X3,
pch=19)

plot3d(df_mds3$X1,df_mds3$X2, df_mds3$X3,
col = 'blue',
size=1, type='s')



▶ 시각화 결과 : 이상치로 예상되는 데이터는 특별히 확인되지 않았다.
-02 주성분 분석 (PCA)
상관관계가 있는 고차원 자료를 분산을 유지하며 저차원 자료로 변환하는 차원 축소 기법이다.
주성분 분석은 다음과 같은 용도로 사용된다. :
- 시각화를 위한 목적
- 회귀분석에 적용하기 위한 목적 (다중공선성 문제가 심각할 시)
만약 기존 회귀분석 시 변수들 간의 다중공선성 문제가 매우 심각하여 예측이 어려운 상활일 때, 예측력을 올리면서 신뢰할 수 있는 모델을 만들기 위해 인공변수를 사용한다.
상관성이 높은 변수들의 선형 결합으로 기존 변수를 요약 및 축소하며 공분산 행렬 또는 상관계수 행렬을 사용해 모든 변수를 가장 잘 설명하는 주성분을 도출한다.
따라서 분산에 대한 설명력이 첫 번째 인공변수에서 가장 크며, 인공변수가 만들어짐에 따라 점점 설명력이 감소한다.
새로 유도된 주성분은 해석하기 어렵다. (기존 회귀분석처럼 면적이 1 증가할 때 기울기가 n 증가한다 식의 해석이 어려워진다.)
그렇기에 주성분 분석을 통해 회귀분석을 진행하는 것은 y를 잘 예측하기 위한 용도로만 사용되어야 한다.
=> 다만 이는 전통적인 선형회귀 관점에서의 설명이며, 최근에는 다중공선성의 영향을 상대적으로 덜 받는 Random Forest 회귀와 같은 머신러닝 기법이 활용되고 있다.
1) 주성분 분석의 평가
독립변수들과 주성분과의 거리인 정보 손실량을 최소화하거나, 주성분의 분산 설명력을 최대화하는 모형을 선택한다.
일반적으로 누적 분산 설명력이 70% 이상인 주성분 수를 선택하며, 고유값(Eigenvalue)이 1 이상인 주성분만 선택한다.
2) 공분산 행렬과 상관계수 행렬
(1) 공분산 행렬
각 변수 간의 절대적인 분산과 공분산을 나타낸다.
변수 측정 단위를 그대로 반영하므로 같은 단위를 갖는 변수일 때 사용하며, 변수 스케일에 민감하다.
(2) 상관계수 행렬
공분산을 각 변수의 표준편차로 표준화한 값이며, 변수 간의 상대적인 관계만을 반영한다.
스케일이 다른 변수들을 비교할 때 사용한다.
[ 예제 - 보스턴 데이터 차원축소 (PCA) ]
# 1. 데이터 로딩
library(MASS)
X <- Bostonp[, -ncol(Boston)]
# 2. 변수 스케일링
X_sc <- scale(X)
# 3. PCA에 의한 인공변수 생성
m_pca <- prcomp(X_sc)
m_pca
> m_pca
Standard deviations (1, .., p=13):
[1] 2.4752472 1.1971947 1.1147272 0.9260535 0.9136826 0.8108065 0.7316803 0.6293626 0.5262541 0.4692950 0.4312938
[12] 0.4114644 0.2520104
Rotation (n x k) = (13 x 13):
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
crim 0.250951397 -0.31525237 0.24656649 0.06177071 -0.082156919 0.21965961 -0.777607207 -0.153350477
zn -0.256314541 -0.32331290 0.29585782 0.12871159 -0.320616987 0.32338810 0.274996280 0.402680309
indus 0.346672065 0.11249291 -0.01594592 0.01714571 0.007811194 0.07613790 0.339576454 -0.173931716
chas 0.005042434 0.45482914 0.28978082 0.81594136 -0.086530945 -0.16749014 -0.074136208 0.024662148
nox 0.342852313 0.21911553 0.12096411 -0.12822614 -0.136853557 0.15298267 0.199634840 -0.080120560
rm -0.189242570 0.14933154 0.59396117 -0.28059184 0.423447195 -0.05926707 -0.063939924 0.326752259
age 0.313670596 0.31197778 -0.01767481 -0.17520603 -0.016690847 0.07170914 -0.116010713 0.600822917
dis -0.321543866 -0.34907000 -0.04973627 0.21543585 -0.098592247 -0.02343872 0.103900440 0.121811982
rad 0.319792768 -0.27152094 0.28725483 0.13234996 0.204131621 0.14319401 0.137942546 -0.080358311
tax 0.338469147 -0.23945365 0.22074447 0.10333509 0.130460565 0.19293428 0.314886835 -0.082774347
ptratio 0.204942258 -0.30589695 -0.32344627 0.28262198 0.584002232 -0.27315330 -0.002323869 0.317884202
black -0.202972612 0.23855944 -0.30014590 0.16849850 0.345606947 0.80345454 -0.070294759 0.004922915
lstat 0.309759840 -0.07432203 -0.26700025 0.06941441 -0.394561129 0.05321583 -0.087011169 0.424352926
PC9 PC10 PC11 PC12 PC13
crim 0.26039028 0.019369130 -0.10964435 -0.086761070 -0.045952304
zn 0.35813749 0.267527234 0.26275629 0.071425278 0.080918973
indus 0.64441615 -0.363532262 -0.30316943 0.113199629 0.251076540
chas -0.01372777 -0.006181836 0.01392667 0.003982683 -0.035921715
nox -0.01852201 0.231056455 0.11131888 -0.804322567 -0.043630446
rm 0.04789804 -0.431420193 0.05316154 -0.152872864 -0.045567096
age -0.06756218 0.362778957 -0.45915939 0.211936074 0.038550683
dis -0.15329124 -0.171213138 -0.69569257 -0.390941129 0.018298538
rad -0.47089067 0.021909452 0.03654388 0.107025890 0.633489720
tax -0.17656339 -0.035168348 -0.10483575 0.215191126 -0.720233448
ptratio 0.25442836 0.153430488 0.17450534 -0.209598826 -0.023398052
black -0.04489802 -0.096515117 0.01927490 -0.041723158 0.004463073
lstat -0.19522139 -0.600711409 0.27138243 -0.055225960 -0.024431677
# 인공변수 생성 시 각 변수의 가중치
m_pca$rotation
> m_pca$rotation
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
crim 0.250951397 -0.31525237 0.24656649 0.06177071 -0.082156919 0.21965961 -0.777607207 -0.153350477
zn -0.256314541 -0.32331290 0.29585782 0.12871159 -0.320616987 0.32338810 0.274996280 0.402680309
indus 0.346672065 0.11249291 -0.01594592 0.01714571 0.007811194 0.07613790 0.339576454 -0.173931716
chas 0.005042434 0.45482914 0.28978082 0.81594136 -0.086530945 -0.16749014 -0.074136208 0.024662148
nox 0.342852313 0.21911553 0.12096411 -0.12822614 -0.136853557 0.15298267 0.199634840 -0.080120560
rm -0.189242570 0.14933154 0.59396117 -0.28059184 0.423447195 -0.05926707 -0.063939924 0.326752259
age 0.313670596 0.31197778 -0.01767481 -0.17520603 -0.016690847 0.07170914 -0.116010713 0.600822917
dis -0.321543866 -0.34907000 -0.04973627 0.21543585 -0.098592247 -0.02343872 0.103900440 0.121811982
rad 0.319792768 -0.27152094 0.28725483 0.13234996 0.204131621 0.14319401 0.137942546 -0.080358311
tax 0.338469147 -0.23945365 0.22074447 0.10333509 0.130460565 0.19293428 0.314886835 -0.082774347
ptratio 0.204942258 -0.30589695 -0.32344627 0.28262198 0.584002232 -0.27315330 -0.002323869 0.317884202
black -0.202972612 0.23855944 -0.30014590 0.16849850 0.345606947 0.80345454 -0.070294759 0.004922915
lstat 0.309759840 -0.07432203 -0.26700025 0.06941441 -0.394561129 0.05321583 -0.087011169 0.424352926
PC9 PC10 PC11 PC12 PC13
crim 0.26039028 0.019369130 -0.10964435 -0.086761070 -0.045952304
zn 0.35813749 0.267527234 0.26275629 0.071425278 0.080918973
indus 0.64441615 -0.363532262 -0.30316943 0.113199629 0.251076540
chas -0.01372777 -0.006181836 0.01392667 0.003982683 -0.035921715
nox -0.01852201 0.231056455 0.11131888 -0.804322567 -0.043630446
rm 0.04789804 -0.431420193 0.05316154 -0.152872864 -0.045567096
age -0.06756218 0.362778957 -0.45915939 0.211936074 0.038550683
dis -0.15329124 -0.171213138 -0.69569257 -0.390941129 0.018298538
rad -0.47089067 0.021909452 0.03654388 0.107025890 0.633489720
tax -0.17656339 -0.035168348 -0.10483575 0.215191126 -0.720233448
ptratio 0.25442836 0.153430488 0.17450534 -0.209598826 -0.023398052
black -0.04489802 -0.096515117 0.01927490 -0.041723158 0.004463073
lstat -0.19522139 -0.600711409 0.27138243 -0.055225960 -0.024431677
▲ PC1 = 0.250951397x1 - 0.256314541X2 + ... + 0.309759840x13
PC2 = -0.31525237x1 + ...
....
# 인공변수에 의해 새롭게 해석된 기존 데이터의 좌표
m_pca$x
> m_pca$x
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
1 -2.0962230302 0.772348426 0.342603683 -0.890892398 -0.4226520968 0.3150263857 -0.318325737 -0.2955393303
2 -1.4558109894 0.591399952 -0.694512011 -0.486976617 0.1956820178 -0.2639619858 -0.553313693 0.2234488130
3 -2.0725465519 0.599046578 0.166956375 -0.738473392 0.9336101548 -0.4476516192 -0.484080910 -0.1050621597
4 -2.6089217589 -0.006863826 -0.100184990 -0.343381425 1.1038635624 -0.6639924028 -0.622025294 -0.2556877489
5 -2.4557547719 0.097615346 -0.075273718 -0.427483833 1.0648704572 -0.6164371715 -0.704388921 0.1343910563
6 -2.2126618432 -0.009477633 -0.671716355 -0.175736244 0.6265675626 -0.5708542684 -0.650539609 -0.1095817370
7 -1.3575376559 0.349526292 -0.371631528 -0.397740214 -1.0720867163 0.4584158091 -0.019745675 -0.2864456262
8 -0.8412121417 0.577228493 -0.518027787 -0.537226588 -1.3783241634 0.5786851900 -0.224609549 0.8385842653
9 -0.1797503956 0.342179528 -1.348304420 -0.245676894 -2.3479801462 0.6244438337 -0.314428558 1.3167001491
10 -1.0731221380 0.315888821 -0.557917054 -0.379556648 -1.4291167916 0.4554256585 -0.105105445 0.4570337988
# 4. 시각화
# 1) 2차원
par(mfrow = c(1,1))
plot(m_pca$x[,1], m_pca$x[,2], type = 'o')
df_pca <- data.frame(m_pca$x)
library(ggplot2)
ggplot(df_pca, aes(x = PC1,
y = PC2)) +
geom_point()

# 5. 평가
# 1) 누적분산설명력이 80%인 인공변수의 수 확인
# 교재에는 70%로 작성되어 있으며 현업에서는 80%으로 확인할 때가 있다.
m_pca$sdev^2 / sum(m_pca$sdev^2) * 100 # 각 주성분의 분산설명력
> m_pca$sdev^2 / sum(m_pca$sdev^2) * 100 # 각 주성분의 분산설명력
[1] 47.1296064 11.0251932 9.5585898 6.5967316
[5] 6.4216611 5.0569783 4.1181237 3.0469024
[9] 2.1303333 1.6941371 1.4308797 1.3023306
[13] 0.4885328
cumsum(m_pca$sdev^2 / sum(m_pca$sdev^2) * 100) # 각 주성분의 누적 분산설명력
> cumsum(m_pca$sdev^2 / sum(m_pca$sdev^2) * 100)
[1] 47.12961 58.15480 67.71339 74.31012 80.73178
[6] 85.78876 89.90688 92.95379 95.08412 96.77826
[11] 98.20914 99.51147 100.00000
# 2) 각 주성분(인공변수)의 고윳값이 1 이상인 인공변수의 수 확인
m_pca$sdev # 각 주성분의 표준편차
m_pca$sdev^2 # 각 주성분의 고윳값(1 이상)
> m_pca$sdev # 각 주성분의 표준편차
[1] 2.4752472 1.1971947 1.1147272 0.9260535 0.9136826
[6] 0.8108065 0.7316803 0.6293626 0.5262541 0.4692950
[11] 0.4312938 0.4114644 0.2520104
> m_pca$sdev^2 # 각 주성분의 고윳값(1 이상)
[1] 6.12684883 1.43327512 1.24261667 0.85757511
[5] 0.83481594 0.65740718 0.53535609 0.39609731
[9] 0.27694333 0.22023782 0.18601437 0.16930298
[13] 0.06350926
plot(1:13, m_pca$sdev^2, type = 'o')
abline(h=1, col='red')

▲ 고윳값 1 이상을 살펴보았을 때 인공변수는 3개까지 유도하는 것이 적절함으로 판단된다.
'아이티윌_데이터 분석 55기 > 강의내용 필기_통계 및 분석' 카테고리의 다른 글
| #17 17일차_로지스틱 회귀, 시계열 분석, 연관 분석 (0) | 2026.05.08 |
|---|---|
| #16 16일차_결측값 처리와 이상값 검색 (★) (0) | 2026.05.07 |
| #14 14일차_회귀분석, 변수 선택 및 제거 (0) | 2026.04.30 |
| #13 13일차_군집분석 및 평가 ·해석, 변수 스케일링, 회귀분석 (0) | 2026.04.29 |
| #12 12일차_교차검증, 분류모형, 군집분석 (0) | 2026.04.28 |