정보

    • 업무명     : 기초통계 : 주성분 분석

    • 작성자     : 박진만

    • 작성일     : 2020-04-16

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

     

    [특징]

    • 통계이론 설명

     

    [활용 자료]

    • 없음

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 내용 참조

     

     

     상세 내용

    [주성분 분석]

    • 주성분 분석 (PCA)은 다차원 데이터를 더 작은 차원으로 대체하는 차원 축소 방법이다.

    • 다차원 데이터의 경우 분산이 가장 큰 차원을 찾으면 데이터에 존재하는 많은 정보를 설명 할 수 있다.

    • PCA는 이러한 분산을 최대화하는 차원 (주성분)을 찾는 방법이다.

     

    [주성분의 계산]

    • n 개의 샘플 각각에 대해 p 개의 조사 데이터가 있다고 가정하면, 전체 데이터는 n × p 매트릭스로 표현 될 수 있다.

    • 여기서, i \((1 \leq i \leq p)\) 번째 특징은 \(\mathbf{x}_{i}=\left(x_{1 i}, x_{2 i}, \cdots, x_{n i}\right)^{T}\)로 표현되고, 모든 샘플 데이터의 n × p 행렬은 X = (x1, x2, ⋯, xn) 로 나타낼 수 있다.

     

    [분산 공분산 행렬]

    • 다음에, p 개의 피처 (측정 항목) 중에서, k 및 l 항목의 공분산은 아래의 공식에 따라 다음과 같이 계산 될 수 있다.

     

     

    • 여기서  \(\mu_{k}=\sum_{j=1}^{n} x_{j k}\) 이며 또한, \(\mathbf{x}^{\prime}_{k}=\left(x_{1 k}-\mu_{k}, x_{2 k}-\mu_{k}, \cdots, x_{n k}-\mu_{k}\right)^{T}\) 이다.

    • 모든 p 조합에 대한 순서쌍 간의 공분산을 계산하면 모든 조합에 대해 아래와 같은 분산 공분산 행렬 Σ를 얻을 수 있다.

     

     

    • 여기서 \(\mathbf{X}^{\prime}=\left(\mathbf{x}_{1}^{\prime}, \mathbf{x}_{2}^{\prime}, \cdots, \mathbf{x}_{n}^{\prime}\right)\) 이다.

     

    [고유근과 고유벡터]

    • PCA의 목표는 기능의 분산을 최대화하는 차원을 찾는 것이다.

    • 따라서 기존 데이터 X에 대해 좌표 변환을 수행하고 변환 된 데이터의 분산을 최대화하는 변환을 찾는 것으로 충분하다.

    • 여기서, X에 대한 좌표 변환을 수행하기 위해, 특정 투영 벡터 w가 곱해지고 여기서 새로운 좌표 z가 계산된다.

    • 여기서 n- 차원 샘플 피처는 투영 벡터 w에 의해 단일 포인트로 대체된다는 점에 유의한다.

     

     

    • 변환 후에는 새로운 좌표 z = (z1, z2, ⋯, zn)의 분산을 최대화하는 벡터 w를 찾아야 한다.

    • 이를 위해서는 z의 분산을 계산하여야 한다.

    • 위와 유사한 방법으로 z의 분산은 아래와 같이 계산할 수 있다.

     

     

    • z = Xw이므로 z의 분산은 다음과 같이 X의 분산 및 공분산 행렬로 대체될 수 있다.

     

     

    • 변환 된 데이터의 분산을 최대화하기 위해 Σz와 같은 벡터 w를 찾을 수 있다.

    • 벡터 w는 단위 벡터이므로 \(\|\mathbf{w}\|=1\) 이라는 조건를 사용하여 Lagrange의 결정되지 않은 승수 방법으로 w를 풀이 할 수 있다.

     

     

    • 이 표현을 최대화하는 w는 w에 대한 함수 L의 부분 도함수를 0으로 설정하여 계산된다.

     

     

    • 이러한 방식으로 PCA는 고유 값을 만든다.

    • 데이터 X에 p 피처가 있으면 ΣX '는 p × p 행렬이므로 고유 값을 얻을 수 있다

    • 이 고유 값은 내림차순으로 정렬되며 λ1> λ2> λ3> ...> λp입니다. 다음으로, 고유 값 λi마다 고유 벡터 wj가 구해진다.

     

    [주성분 스코어]

    • 고유 값과 고유 벡터가 발견되면 행렬 X를 회전 한 후 좌표를 계산할 수 있다.

    • 예를 들어, k 번째 고유 벡터를 사용하여 다음과 같은 회전 된 좌표가 얻어질 때, 이것을 k 번째 주성분의 주성분 점수 (주성분 점수)라고 한다.

     

     

    • 주성분 분석은 p 차원의 데이터를 낮은 차원에 투영하는 차원 감소에 사용되고 있다.

    • 따라서 p 차원의 데이터를 제 1 주성분과 제 2 주성분으로 이루어진 이차원 평면에 플롯하거나 또는 제 3 주성분을 포함하여 입체적으로 플롯 할 데이터의 분포 상황을 확인 하고 있다.

    • p 차원의 데이터를 여러 차원에 투영하거나 (주성분을 몇 선택하거나)은 연구 분야와 목적에 따라 다르다. 

    • 통계 등이라면, 예를 들어, 임계치 이상의 분산 (고유 값)를 가진 주성분을 선택 고유 값의 감소 상태가 평온하게 된 곳까지의 주성분을 선택하거나 누적 기여율이 80-90 %에 도달 할 때까지의 주성분 선택 등의 선택이있다. 또한 기계 학습이라면 크로스 검증 등을 통해 최적의 개수를 추정 할 수도있다.

     

     

    [기여율]

    • 제 k 주성분 축에서 데이터의 분산을 계산하면 다음과 같이 λk로 구해질 수 있다.

    • 즉, 제 k 주성분 축에서 데이터의 분산은 k 번째로 큰 고유 값과 같다.

     

     

    • 각 주성분의 기여율은 그 주성분이 데이터가있는 전체 정보량 중 어느 정도의 비율을 설명 할 수 있는지를 보여주는 비율이다.

    • 이 기여율은 아래와 같이 계산된다.

     

     

    • 또한, 제 1 주성분에서 제 k 주성분까지의 주성분을 이용하여 설명 할 수있는 데이터의 전체 정보량의 비율을 누적 기여율이라고 하며 아래와 같이 계산된다.

     

     

    [주성분 부하량 (인자 부하량)]

    • 관측 데이터의 각 특징 량과 각 주성분의 상관 관계를 주성분 부하량 (인자 부하량)이라 한다.

    • 예를 들어, 관측 데이터의 j 번째 특징 량과 제 k 주성분의 주성분 부하량은 다음과 같이 계산할 수 있다.

     

     

    [R에서 주성분 분석 하기]

    • R에는 2 개의 PCA를 수행하는 함수 prcomp와 princomp이 있다.

    • 두 함수의 입력 매개 변수와 출력 형식이 다르지만, 실제 분석에서는 모두 PCA를 행한다.

    • 각 특징의 단위가 갖추어져있는 경우 데이터를 그대로 PCA 할 수 있다. 

    • 그러나 각 기능 단위가 갖추어지지 않은 경우 (한쫏은 cm인데 다른 쪽은 g이거나) 각 특징을 정규화 (표준화) 해 둘 필요가 있다. 

    • 표준화를 실시하는 경우,

       prcomp함수 scale = TRUE를 지정하고 princomp함수 cor = TRUE를 지정한다. 각 함수의 실행 예는 다음과 같다. (이 데이터는 피셔의 붓꽃의 데이터이며, 측정 단위는 모두 cm로되어 있기 때문에, 본래는 정규화 할 필요는 없다.)

    data(iris)
    
    iris.data <- iris[, 1:4]
    iris.name <- iris[, 5]
    
    p1 <- prcomp(iris.data, scale = TRUE)
    summary(p1)
    ## Importance of components:
    ##                           PC1    PC2     PC3     PC4
    ## Standard deviation     1.7084 0.9560 0.38309 0.14393
    ## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
    ## Cumulative Proportion  0.7296 0.9581 0.99482 1.00000
    
    
    p2 <- prcomp(iris.data, scale = FALSE)
    summary(p2)
    ## Importance of components:
    ##                           PC1     PC2    PC3     PC4
    ## Standard deviation     2.0563 0.49262 0.2797 0.15439
    ## Proportion of Variance 0.9246 0.05307 0.0171 0.00521
    ## Cumulative Proportion  0.9246 0.97769 0.9948 1.00000
    
    
    p3 <- princomp(iris.data, cor = TRUE)
    summary(p3)
    ## Importance of components:
    ##                           Comp.1    Comp.2     Comp.3      Comp.4
    ## Standard deviation     1.7083611 0.9560494 0.38308860 0.143926497
    ## Proportion of Variance 0.7296245 0.2285076 0.03668922 0.005178709
    ## Cumulative Proportion  0.7296245 0.9581321 0.99482129 1.000000000
    
    
    p4 <- princomp(iris.data, cor = FALSE)
    summary(p4)
    ## Importance of components:
    ##                           Comp.1     Comp.2     Comp.3      Comp.4
    ## Standard deviation     2.0494032 0.49097143 0.27872586 0.153870700
    ## Proportion of Variance 0.9246187 0.05306648 0.01710261 0.005212184
    ## Cumulative Proportion  0.9246187 0.97768521 0.99478782 1.000000000

     

    [prcomp]

    • prcomp 함수의 출력 결과는 표준 편차 sdev, 고유 벡터 rotation, 특징 량 평균치 center 정규화 매개 변수 scale 주성분 점수 x가 저장되어 있다.

    data(iris)
    iris.data <- iris[, 1:4]
    iris.name <- iris[, 5]
    
    p <- prcomp(iris.data, scale = TRUE)
    
    names(p)
    ## [1] "sdev"     "rotation" "center"   "scale"    "x"
    
    head(p$x)
    ##            PC1        PC2         PC3          PC4
    ## [1,] -2.684126 -0.3193972  0.02791483  0.002262437
    ## [2,] -2.714142  0.1770012  0.21046427  0.099026550
    ## [3,] -2.888991  0.1449494 -0.01790026  0.019968390
    ## [4,] -2.745343  0.3182990 -0.03155937 -0.075575817
    ## [5,] -2.728717 -0.3267545 -0.09007924 -0.061258593
    ## [6,] -2.280860 -0.7413304 -0.16867766 -0.024200858
    
    biplot(p)

     

    • biplot 플롯의 횡축 (아래)과 세로축 (왼쪽)이 각각 제 1 주성분과 제 2 주성분의 축이며, 그 값이 주성분 스코어이다.

    • 각 데이터의 주성분 득점은 라벨에 그러져 있다.

    • 또한 빨간색 화살표는 주성분 부하량을 10 배 한 값을 나타내고, 가로축 (위)과 세로축 (오른쪽)이 눈금이다.

    # red arrow for Sepal.Length at PC1 and PC2
    cor(scale(d[, 1]), scale(obj$x[, 1]))
    # 0.8901688
    cor(scale(d[, 1]), scale(obj$x[, 2]))
    # -0.3208299

     

     

    [princomp]

    • princomp함수의 출력 결과는 표준 편차 sdev, 고유 벡터 loadings, 특징 량 평균치 center정규화 매개 변수 scale샘플 수 n.obs주성분 점수 scores함수 실행 명령 로그 call가 저장되어있다.

    data(iris)
    iris.data <- iris[, 1:4]
    iris.name <- iris[, 5]
    
    p <- princomp(iris.data, cor = TRUE)
    
    names(p)
    ## [1] "sdev"     "loadings" "center"   "scale"    "n.obs"    "scores"   "call"
    
    head(p$scores)
    ##         Comp.1     Comp.2      Comp.3       Comp.4
    ## [1,] -2.684126  0.3193972  0.02791483  0.002262437
    ## [2,] -2.714142 -0.1770012  0.21046427  0.099026550
    ## [3,] -2.888991 -0.1449494 -0.01790026  0.019968390
    ## [4,] -2.745343 -0.3182990 -0.03155937 -0.075575817
    ## [5,] -2.728717  0.3267545 -0.09007924 -0.061258593
    ## [6,] -2.280860  0.7413304 -0.16867766 -0.024200858

     

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    본 블로그는 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기