[UDF] 주성분분석(PCA) in R

R에서 주성분 분석(PCA) 시 활용할 수 있는 사용자 정의 함수(UDF)를 소개하는 글입니다.


R에서 주성분 분석(PCA)을 수행하기 위해 검색하던 중 분석을 조금 더 편하게 할 수 있는 사용자 정의 함수(UDF)를 발견하였고,
범용적으로 활용할 수 있도록 함수를 변경하여 개인 소스코드 목록에 추가하였습니다.

이 포스트는 사용자 정의 함수(UDF)에 관한 글이기에 주성분 분석에 대해 알고 싶으신 분은 링크를 참고하시면 됩니다.

1. 원본(수정 전)
 변수에 대한 설명력의 누적기여율(cummulative proportion)이 80%가 되는 주성분의 개수 k개를 찾아서, 주성분 1번부터 주성분 k번째까지의 주성분점수를 반환하는 사용자 정의함수는 아래와 같습니다.
#---------------------------------------------------------
# PCA (Principal Component Analysis)
# User Defined Function
# - finding PC k which Cummulative Proportion is over 0.8
#---------------------------------------------------------

pca <- function(dataset){
  pc = prcomp(dataset, scale = TRUE)

  k = 0
  R = 0
  while(R < 0.8) {
  k = k + 1
  R = sum(pc[[1]][1:k]^2)/sum(pc[[1]]^2)

  cat("When number of Principal Component(k) is ", k,
  ", Cummulative Proportion(R) is ", R, "\n", "\n", sep="")
  }
  SelectedDataSet = pc[[5]][,1:k]
  return(SelectedDataSet)
}

2. 나에게 맞춘 사용자 함수 (수정 후)
 변수에 대한 설명력의 누적기여율(cummulative proportion)이 'prob' 이상이 되는 주성분의 개수 k개를 찾아서, 주성분 1번부터 주성분 k번째까지의 주성분점수를 반환하는 사용자 정의함수는 아래와 같습니다.

변경1) 누적기여율을 0.8로 고정하지 않고 함수에서 인자값으로 전달 받을 수 있도록 변경
  -> PCA의 경우 80%~90% 사이의 값을 일반적으로 선택하기에 개인 판단에 의존할 수 있도록 변경
#---------------------------------------------------------
# PCA (Principal Component Analysis)
# User Defined Function
# - finding PC k which Cummulative Proportion is over prob
# - http://rfriend.tistory.com/61
#---------------------------------------------------------

# dataset : PCA를 수행하려는 데이터셋 입력
# prob : 누적 기여율 기준 입력

udf.pca <- function(dataset, prob){
  pc = prcomp(dataset, scale = TRUE)

  k = 0
  R = 0
  while(R <= prob) {
  k = k + 1
  R = sum(pc[[1]][1:k]^2)/sum(pc[[1]]^2)

  cat("When number of Principal Component(k) is ", k,
  ", Cummulative Proportion(R) is ", R, "\n", "\n", sep="")
  }
  SelectedDataSet = pc[[5]][,1:k]
  return(SelectedDataSet)
}