Introduction
PCA, 주성분 분석을 할때, 가장 고려해야 하는 부분은
"그래서 몇 차원으로 줄일 것인데?" 이다.
이 주성분의 수를 결정하는 여러 방법들에 대해 알아보고자 한다.
방법 1 > Scree Plot
방법 2 > 고윳값을 활용한 결정 : Average of Eigenvalue (누적 기여율)
주의. PCA를 할 때는 반드시 변수들의 단위를 표준화시켜줘야 한다.
고윳값을 활용한 결정
PCA의 고윳값을 통해서는 설명 가능한 분산의 비율이 어느정도인지를 알 수 있다.
고윳값이 0.7 이상인지, 누적기여율이 80%가 넘어가는 지점까지의 주성분들을 기준으로 판단하게 된다.
코드를 통한 실제 확인
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
dataset = datasets.load_wine()
data = dataset.data
df = pd.DataFrame(data, columns = dataset['feature_names'])
# 표준화를 통한 PCA 준비
std_df = pd.DataFrame(StandardScaler().fit_transform(df),
columns = dataset['feature_names'])
wine data를 활용하여, 실습을 진행하려고 한다.
우선, 기여율을 확인하기 위해서는 아무튼 PCA를 진행해야 한다.
pca = PCA(n_components = 10)
pca_result = pca.fit_transform(std_df)
pca_df = pd.DataFrame(pca_result,
columns = [f"pca{num+1}" for num in range(pca_result.shape[1])]
우선적으로 10개의 축으로 PCA를 진행하였다. 이제 기여도를 계산하고자 한다.
다행히 sklearn의 PCA에 이미 explained_variance를 계산할 수 있다.
pca_choose_result = pd.DataFrame({'eigenvector' : pca.explained_variance_,
'propotion of variance' : pca.explained_variance_ratio_},
index = np.array([f"pca{num+1}" for num in range(pca_result.shape[1])]))
pca_choose_result['cum_propotion'] = pca_choose_result['propotion of variance'].cumsum()
여기에서, eigenvector가 0.7 이상인 것은 pca1 ~ pca5까지, 그리고 5에서 최초로 누적기여도가 0.8을 돌파했다.
따라서, pca의 주성분 개수를 5개로 설정하는 것이 적합할 것이다.
Scree plot을 활용한 결정?
scree plot에서는 각 pca성분별로 eigenvalue, 즉 설명 가능한 분산 값을 직접 그리게 된다.
line이 직접 완만해지는 지점을 적절한 주성분 개수로 잡게 된다.
일반적으로 시각적으로 보아서는 이를 정확하게 잡기는 어렵기에 기여율을 확인하는 방식을 쓴다.
실제로 위의 예시를 그리면 다음과 같다.
그림만으로는, 파악하기 어렵다.
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] MAB(Multi-Armed Bandits) 찍먹하기 (0) | 2022.03.04 |
---|---|
[Data] Missing Value의 여러 대체 방법 (0) | 2022.02.23 |
[Data] 자기 조직화 지도 (Self-Organizing Map) 이란? - 개요잡기 (0) | 2022.02.13 |
[Data] Bayesian AB Test (0) | 2022.02.09 |
[Data] A/B Test란? (0) | 2022.02.02 |