본문 바로가기
프로그래밍/Scikit-Learn

[Scikit-Learn] 23. 주성분 분석(Principal Component Analysis) (feat. PCA)

by 부자 꽁냥이 2023. 4. 2.

주성분 분석(Principal Component Analysis)은 예측 모형에 사용될 변수를 새롭게 만들거나 차원 축소를 통한 데이터 요약을 위해 많이 사용된다. Scikit-Learn(sklearn)에서는 PCA 객체를 이용하여 주성분 분석을 할 수 있다. 이번 포스팅에서는 PCA에 대한 사용법을 알아보고자 한다.

 

주성분 분석(Principal Component Analysis)에 대한 개념은 아래 포스팅에 정리해 두었으니 참고하면 된다.

 

37. 주성분 분석(Principal Component Analysis : PCA)에 대해서 알아보자 with Python

 

37. 주성분 분석(Principal Component Analysis : PCA)에 대해서 알아보자 with Python

이번 포스팅에서는 주성분 분석(Principal Component Analysis : PCA)에 대한 개념과 파이썬(Python)을 이용하여 구현하는 방법에 대해서 알아본다. - 목차 - 1. 주성분 분석이란? 2. 주성분 구하기 3. 파이썬

zephyrus1111.tistory.com


   PCA 사용법 알아보기

주성분 분석을 위해 붓꽃 데이터 입력 변수들을 사용하고자 한다. 먼저 데이터를 불러온다.

 

from sklearn.datasets import load_iris

## 데이터 준비
iris = load_iris()
X = iris.data

 

PCA 객체는 n_components에 주성분 개수를 전달한다. 그러고 나서 fit 메서드를 이용하여 주성분 분석을 수행한다.

 

from sklearn.decomposition import PCA

pca = PCA(n_components=2).fit(X)

 

PCA 객체는 성분 벡터와 주성분 분산 등 주성분 분석 결과를 확인하기 위한 여러가지 속성과 메서드를 제공한다.

 

print('성분 벡터')
print(pca.components_)
print()

print('데이터 총 분산', np.sum(np.diag(pca.get_covariance())))
print('주성분의 분산', pca.explained_variance_)
print('분산 설명 비율', pca.explained_variance_ratio_)

 

 

성분 벡터는 n_components 만큼 출력되고 제1 성분 벡터는 (0.36, -0.08, 0.87, 0.36)이고 제2 성분 벡터는 (0.66, 0.73, -0.17, -0.08)임을 알 수 있다.

 

transform 메서드를 이용하면 주성분을 계산할 수 있다. transform에 2차원 배열로된 입력 데이터를 넣어주면 된다.

 

pc = pca.transform(X)## 주성분
print(pc)

 

[[-2.68412563  0.31939725]
 [-2.71414169 -0.17700123]
 [-2.88899057 -0.14494943]
 [-2.74534286 -0.31829898]
 [-2.72871654  0.32675451]
 ''' 중략 '''
 [ 1.94410979  0.1875323 ]
 [ 1.52716661 -0.37531698]
 [ 1.76434572  0.07885885]
 [ 1.90094161  0.11662796]
 [ 1.39018886 -0.28266094]]

 

위 결과에서 하나의 칼럼이 주성분 벡터가 된다.

 

반대로 inverse_transform에 주성분 벡터를 넣어주면 원 데이터로 변환된다.

 

inverse_pc = pca.inverse_transform(pc)
print(inverse_pc) ## 주성분을 원 데이터로 변환

 

[[5.08303897 3.51741393 1.40321372 0.21353169]
 [4.7462619  3.15749994 1.46356177 0.24024592]
 [4.70411871 3.1956816  1.30821697 0.17518015]
 [4.6422117  3.05696697 1.46132981 0.23973218]
 [5.07175511 3.52655486 1.36373845 0.19699991]
 ''' 중략 '''
 [6.66904015 3.02994114 5.39094874 1.88173174]
 [6.14880195 2.65421139 5.13134845 1.77482994]
 [6.53272206 2.96578609 5.25579114 1.825527  ]
 [6.60688475 2.98181821 5.3662607  1.87161698]
 [6.16013695 2.73344296 4.99793961 1.71875852]]

 

코드를 실행하면 위와 같이 원 데이터로 변환된다. 하지만 실제 데이터와 약간의 차이가 발생한다. 


댓글


맨 위로