반응형
이번 글에서는 R언어를 활용하여 표준화, 주성분 분석, 요인 분석을 해보도록 하겠습니다.
#표준화(각 요소의 값에서 평균을 뺀 후 표준편차로 나누어 수행)
data("swiss")
scale(swiss$Fertility)
#정규화
min<-apply(swiss, 2, min)
max<-apply(swiss, 2, max)
swiss_scale<-scale(swiss, center=min, scale=(max-min))
library(datasets)
data("USArrests")
#산점도를 통한 상관관계 파악
pairs(USArrests, panel=panel.smooth, main="USArrests")
#주성분 분석
#cor=FALSE : 공분산행렬로 주성분 분석 수행
#cor=TRUE : 상관행렬로 주성분 분석 수행
prin<-princomp(USArrests, cor=TRUE)
summary(prin)#summary 확인
plot(prin, type='lines', main="scree plot")#scree plot
#주성분 분석 결과에 summary함수를 적용하면 결과에 대한 요약이 나온다. summary 결과로 나오는 Standard deviation은 주성분의 표준편차, Proportion of Variance는 주성분의 기여율, Cummulative Proportion은 누적 기여율을 의미 한다.
#제 1주성분과 제 2주성분까지의 누적 기여율은 대략 86.6%로 2개의 주성분 변수를 활용하여 전체 데이터의 약 86.6%를 설명할 수 있다.
#주성분들에 의해 설명되는 변동의 비율은 ScreePlot을 통해 시각적으로도 확인이 가능하다.
#그래프의 3번째 주성분에서 기울기가 급격하게 줄어드는 형태를 보이므로, 그 이전 주성분 2번째 주성분까지 선택하는 것이 적절한다.
prin$loadings
#주성분분석 결과의 loading을 통해 주성분계수 즉, 각각의 변수가 각 중성분에 기여하는 가중치가 제시된다.
#제 1중성분은 0.536*Mulder+0.563*Assault+0.278*UrbanPop+0.543*Rape의 선형결합식으로 이루어져 있음을 파악할 수 있다.
prin$scores
#주성분분석 결과, 차원축소로 얻어지는 주성분점수는 Scores인자를 통해 확인할 수 있다.
#주성분점수는 주성분들의 선형식을 통해 새롭게 계산된 각행 별 좌표를 나타낸다.
biplot(prin, scale=0)
#biplot함수는 제1주성분과, 제2주성분으로 이루어진 좌표평면상의 원 데이터 행들의 주성분점수를 산점도 형태로 나타내고, 각 변수에 대한 주성분계수를 화살표로 시각화 하고 그래프로 표현해준다.
#제1주성분의 모든 주성분계수는 양수이므로 가로축을 기준으로 모든 변수가 0 이상의 값을 가리키는 축을 나타내고 있다. PC1을 이루는 선형결합식에서 상대적 부하량(loadings)의 절대값이 가장 큰 Assault 변수는 가장 수평의 형태를 나타내고 있으며, 상대적 부하량의 절대값이 가장 작은 UrbanPop 변수는 가장 수직에 가까운 형태를 나타내고 있다.
#요인 분석(변수들의 상관관계를 고려하여 서로 유사한 변수들을 묶어 새로운 잠재요인들을 추출하는 방법)
data("swiss")
#정규화
min<-apply(swiss, 2, min)
max<-apply(swiss, 2, max)
swiss_scale<-scale(swiss, center=min, scale=(max-min))
head(swiss_scale)
result<-factanal(swiss_scale, 3)
result
#세번재 요인이 0.759이므로 전체 데이터 분산의 약 76%를 설명할 수 있다고 해석이 가능하다.
print(result, cutoff=0.5)
cor(swiss)
c1
c1 <-data.frame(swiss$Agriculture, swiss$Examination, swiss$Education)
c2 <- data.frame(swiss$Catholic)
c3 <- data.frame(swiss$Fertility)
#요인별 산술 평균
cc1 <- round( (c1$swiss.Agriculture+c1$swiss.Examination+c1$swiss.Education) / ncol(c1), 2)
cc2 <- round( (c2$swiss.Catholic) / ncol(c2), 2)
cc3 <- round( (c3$swiss.Fertility) / ncol(c3), 2)
factor_df <- data.frame(cc1, cc2, cc3)
cor(factor_df)
여기까지 표준화, 정규화, 주성분 분석, 요인 분석이였습니다.
도움이 되셨으면 합니다.
반응형
댓글