공부중 .../다변량분석
[다변량분석]주성분 분석 Principal Component Analysis
Chelsey
2022. 3. 26. 08:05
728x90
주성분 분석 PCA 이란?
현상에 대한 관련된 변수가 적다면 상관없지만, 100개 등 너무 많은 수인 경우 분석하기가 어렵다. 그래서 변수를 줄이는 방식을 생각하게 되는데, dimension reduction과 같은 원래 데이터를 손실하지 않으면서 차원을 줄이는 방법을 강구하게 된다.
PCA는 고차원의 데이터를 저차원으로 환원시키는 방법이다.
X1 X2 X3 ... X100 수 많은 변수들을 이용하게 되면 PC=a1X1+a2X2+a3X3+...+a100X100 아주 많은 변수를 사용하기 때문에 식이 엄청나게 길어진다. 그래서 변수를 100개 모두가 아닌 그 중 n개만 선택해서 데이터를 표현하고자 하게된다.
여기서 a1, a2, ..., a100은 주성분 계수라고 한다.
그래서 PC1=a1X1+a2X2 의 분산과 PC2=b1X1+b2X2 의 분산의 차이를 보았을 때 분산의 크기가 가장 큰 식을 선택하게된다. 100개의 변수 중 2개만 선택하는 것이니 만큼 데이터를 아주 잘 표현할 수 있는 변수를 선택하는 것 또한 중요하다.
주성분 수의 결정
주성분의 값 합 / 전체 고유값의 합
상관계수 행렬
Kaiser's rule : 고유값 >= 1 인 경우만 주성분으로 취급한다.
Jollife : 고유값 >= 0.7 이상만 주성분으로 추출
주성분 결정 후, 주성분 점수를 매기고, 이를 이용해 다른 분석 가능(군집 분석)
R을 이용한 주성분 분석
install.packages("HSAUR2")
library(HSAUR2)
data("heptathlon")
summary(heptathlon)
# 데이터 다듬기
heptathlon$hurdles <- max(heptathlon$hurdles) - heptathlon$hurdles
heptathlon$run200m <- max(heptathlon$run200m) - heptathlon$run200m
heptathlon$run800m <- max(heptathlon$run800m) - heptathlon$run200m
hep_data = heptathlon[,-8]
# cor:상관계수행렬로 한다. scores:주성분석점수를 구한다.
hep_pca=princomp(hep_data, cor=T, scores=T)
names(hep_pca) # 어떤게 있는지 확인
hep_pca
# 몇개의 주성분을 선택할 것인가?
summary(hep_pca)
# 음수인 경우도 영향을 주는 것이므로 제곱을 해서 어느정도인지 확인해야한다.
eig_val=hep_pca$sdev^2
round(eig_val,3) # 1보다 큰 값 확인
# 1이 넘는 2개 선택
# 스크리 그림과 누적분산 그림
# 그림을 통해 주성분 개수를 정할 수도 있다.
# 스크리 그림
screeplot(hep_pca, type='lines', pch=19, main='Scree plot')
# 높은 두개면 충분하겠다로 그림을 읽을 수 있다.
#누적분산 그림
hep_var=hep_pca$sdev^2 # 분산값
hep_var_ratio=hep_var/sum(hep_var) # 비율
round(hep_var_ratio,3)
plot(cumsum(hep_var_ratio), type='b', pch=19,
xlab='Component',ylab='Cumulative Proportion')
# pch:Point Charater
# 주성분 계수
round(hep_pca$loadings[,c(1:2)],3)
hep_pca$scores[c(1:5),c(1:2)]
biplot(hep_pca, cex=0.7, col=c("Red","Blue"))
# 주성분 계수, 주성분 점수
Python을 이용한 주성분 분석
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
heptathlon=pd.read_csv("heptathlon.csv")
round(heptathlon.describe(),2) # 소수점 이하 2자리 반올림
# Data 변환. 최댓값 - 최솟값
heptathlon.hurdles=np.max(heptathlon.hurdles)-heptathlon.hurdles
heptathlon.run200m=np.max(heptathlon.run200m)-heptathlon.run200m
haptathlon.run800m=np.max(heptathlon.run800m)-heptathlon.run800m
# 분석 변수 선택
hep_data=heptathlon.iloc[:,1:8]
hep_data=heptathlon.iloc[:,1:-1]
# 혹은 아래와 같은 방법으로
feature=['hurldes','highjump','shot','run200m','longjump','javelin','run800m']
hep_data=heptathlon[feature]
# 변수 표준화
from sklearn.preprocessing import StandardScaler
x=StandardScaler().fit_transform(hep_data)
# 초기 주성분 분석
from sklearn.decomposition import PCA
pca_init=PCA(n_components=len(hep_data.columns))
pca_init.fit(x)
pca_init.explained_variance_
# 스크리 그림
plt.title('Scree Plot')
plt.xlabel('Components')
plt.ylabel('Explained Variance')
plt.plot(pca_init.explained_variance_,'o-')
plt.show()
# 주성분 분석
from sklearn.decomposition import PCA
pca=PCA(n_components=2) # 주성분 2개로
hep_pca=pca.fit_transform(x)
pca.explained_variance_ # 분산
pca.explained_variance_ration_ # 분산 비율
# 주성분 계수
np.round(pca.components_, 3)
# 주성분 점수
hep_pca[0:5,:]
변수 표준화: (X-X.mean)/표준편차 평균 0, 분산 1
728x90