working_helen

[데이터 전처리] 설명변수 PCA 본문

TAVE/뿌스팅 project

[데이터 전처리] 설명변수 PCA

HaeWon_Seo 2023. 8. 7. 22:26

데이터 전치리 과정에서 학습한 내용 중 두 번째로 PCA에 대해 공부해본다. 본 프로젝트에서는 변수의 개수가 많고, 상관관계와 VIF를 보았을 때 다중공선성 문제가 존재한다고 판단되어 변수 선택 + PCA 전처리 과정을 진행했다.

 

1. 주성분 분석 PCA

  1) 차원 축소

  2) 주성분 분석

2. 주성분 분석 과정

3. 파이썬 코드

(4. 주성분 분석 수학적 이해)

 


1. 주성분 분석 PCA (Principal Component Analysis)

 

1) 데이터의 차원 = 설명변수(feature)의 개수

- 하나의 feature가 추가될 때마다 데이터의 차원이 하나씩 증가한다.

- feature가 너무 많아져 차원이 증가하면 데이터를 표현하는 Feature Space의 부피가 기하 급수적으로 증가한다.

- 이로 인해 데이터의 양과 노이즈는 많아지지만 데이터 밀도는 매우 희소해져 학습 속도가 느려진다. 또한 중요하지 않은 feature들로 인해 과적합되거나 모델 성능이 저하될 수 있다.

출처 : https://chancoding.tistory.com/52

 

=> Feature selection, Dimensionality Reduction 등이 필요하다.

  • Feature selection(변수 선택) : y에 유의미한 영향을 미치는 feature만 선택하고, 불필요한 feature를 제거한다.
  • Dimensionality Reduction(차원 축소) : 고차원 데이터의 특징을 최대한으로 유지하면서 데이터를 저차원화시킨다.

 

 

 

2) 주성분 분석

주성분 PC (Principal Component)
= 분산이 가장 큰 성분
= 전체 데이터의 분포를 가장 잘 설명하는 성분

 

- 주성분 분석은 차원 축소의 한 방법

- 전체 변수가 아닌 주성분 변수들만 사용하여 기존의 데이터를 표현함으로써 차원을 줄인다.

- 기존의 변수들로부터 데이터의 분포를 가장 잘 설명하는, 서로 연관성이 없는 새로운 주성분 변수 PC로 변환한다.

더 적은 개수의 변수로 데이터를 충분히 잘 설명하는 축을 생성한다.

- 설명변수가 너무 많아 중요한 일부 변수만으로 모델링을 하려는 경우 PCA를 사용한다.

- 데이터가 겹칠수록 점들 간 거리가 줄어 전체 분산이 작아진다. 따라서 분산을 최대화하는, 점들간 거리를 최대한 멀리하는 축을 이용한다.

 

 

 

 

2. 주성분 분석 과정

1) 변수 Scaling (Mean centering)

- Scaling을 하지 않으면 각 설명변수(feature)의 값의 범위나 분포에 따라 주성분이 설명하는 분산량 계산에 영향을 미칠 수 있다. 이는 모델의 성능 저하로 이어지기 때문에 주성분 분석시 반드시 표준화를 해주어야 한다.

- 예를 들어, 단위가 크고 분포가 넓은 변수는 실제 사실 여부와 관계없이 단순히 스케일에 의해 단위가 작고 분포가 좁은 변수보다 주성분 추출에 더 많은 영향을 줄 수 있다.

- Mean centering, 평균이 0, 분산이 1인 분포로 스케일링한다.

 

 

 

2) 공분산행렬 => 고유벡터 + 고유값

- 스케일링 된 feature들을 이용해 공분산행렬(Covariance Matrix)을 계산한다.

- 공분산행렬로부터 고유벡터(Eigen vector) + 고유값(Eigen value)을 추출한다.

- 고유값 분해(eigenvalue-decomposition), 특이값 분해(SVD, Singular Value Decomposition) 등 이용

 

 

 

3) 주성분 추출

: 원본 데이터로부터 n개의 주성분을 추출한다.

 = 데이터의 분산을 가장 잘 설명하고 + 주성분들 사이에는 연관성이 없는 n개의 축을 찾는다.

 

  • 데이터의 분산을 가장 잘 설명한다 = 고유값이 크다
  • 주성분들 사이에는 연관성이 없는 = 다른 주성분들과 직교를 이루는 =  다른 주성분으로 생성 될 수 없는 축

- PC1 (제1 주성분 축) : 원본 Feature Space에서 데이터의 분산을 최대로 설명하는 축을 찾아 PC1으로 잡는다.

- PC2 (제2 주성분 축) : PC1과 직교(orthogonal)하면서, 데이터의 분산을 최대로 설명하는 축을 찾아 PC2로 잡는다.

- PC3 (제3 주성분 축) : PC1, PC2와 직교하면서, 데이터의 분산을 최대로 설명하는 축을 찾아 PC3로 잡는다.

- n개의 PC : 동일한 방법으로 서로 직교하면서, 데이터의 분산을 최대로 설명하는 축 n개를 찾는다.

 

 

4) 축 회전

: 새롭게 생성한 주성분 축을 기준으로 분포를 변환한다.

출처 : https://rfriend.tistory.com/751

 

 

 

 

3.  파이썬 코드

- sklearn에서 제공하는 PCA 클래스로 구현할 수 있다.

from sklearn.decomposition import PCA

# PCA 객체 생성
pca = PCA(n_components = n 주성분 개수)

pca.fit(df)
pca.transform(df)

# fit + transform 한번에
pca.fit_transform(df)

 

 

1) PC값 확인

  • pca.components_ : 고유 벡터 출력 
# 주성분에 해당하는 고유벡터 가져오기
pca_components = pca.components_

# 주성분을 행으로, 기존 feature을 열로 하는 테이블 생성
pca_table = pd.DataFrame(data=pca_components.T, columns=['PC1', 'PC2', 'PC3',,, 'PCn'])
pca_table.index = df.columns

 

 

2) PC의 설명 정도 확인

  • pca.explained_variacne_ : 각 PC 값의 설명력 정도를 확인, PC값이 클수록 설명력이 높다.
  • pca.explained_variance_ratio_ : 각 PC의 explained_variance를 비율 = 전체 데이터의 분산을 설명하는 비율을 확인
# pca.explained_variance_ratio_의 출력 예시
# 순서대로 PC1, PC2, PC3의 설명 비율을 의미
[0.32493417 0.14920236 0.11900259]
=> PC1이 32%, PC2가 15%, PC3가 12%의 설명력을 가지고 있다.
     PC1은 이 데이터의 32%를 설명할 수 있고, PC2는 이 데이터의 15%를 설명할 수 있다.

 

 

 

3) 적정 주성분 pc 개수 확인

- plotly.express.area 함수를 이용해 누적 영역 plot을 생성한다.

- x축 = pc의 개수 | y축 = pc가 설명하는 분산의 비율

 

- 몇 개의 PC를 사용할 때 원하는 만큼 원래 데이터를 표현할 수 있을지 확인할 수 있다.

- 일반적으로 70% 이상을 권장하며, 90% 이상을 권장하는 경우도 있다.

- 후반 PC로 갈수록 분산을 설명하는 비율은 감소하기 때문에 위로 볼록한 그래프가 그려진다.

pca = PCA()
pca.fit(df)

# 각 PC의 설명 비율을 누적합한 array 생성
np.cumsum(pca.explained_variance_ratio_)

# PC의 설명 비율 누적 합 그래프 생성
px.area(
    x=range(1, exp_var_cumul.shape[0] + 1),
    y=exp_var_cumul,
    labels={"x": "# Components", "y": "Explained Variance"},
    width=700, height=400
)

직접 실행한 그래프 예시

 

4) 주성분으로 변환된 Dafaframe 생성

- 원래 데이터에서 구한 주성분으로 이루어진 데이터 프레임으로 변환한다.

- 각 feature에 해당하는 값이 아닌 주성분에 해당하는 값으로 채워진다.

# 기존 데이터를 주성분으로 표현한 새로운 Dafaframe 정의
pd.DataFrame(pca.fit_transform(df))

 

 

 

 

4. 주성분 분석 수학적 이해

PC의 수학적 의미 : http://matrix.skku.ac.kr/math4ai-intro/W12/

분산 행렬과 고유값의 수학적 의미 : https://angeloyeo.github.io/2019/07/27/PCA.html

 

 

 

 

 

Jupyter Notebook

 

 

 

 

 

Reference

https://m.blog.naver.com/tjdrud1323/221720259834
https://rfriend.tistory.com/751
https://chancoding.tistory.com/53
https://chancoding.tistory.com/52
https://deep-learning-study.tistory.com/812
https://deep-jin.tistory.com/entry/PCA-Principal-Component-Analysis