본문 바로가기
파이썬

주성분 분석 (PCA: Principal Component Analysis)

by hyeongcheol 2025. 4. 13.
반응형

데이터 분석을 효과적으로 하기 위해서는, 데이터에 실질적으로 영향을 주는 변수들로 변수 개수를 최소화하는 것이 좋습니다.

이번 시간에는, 주성분 분석 방법을 사용하여 변수 개수를 최소화해 보겠습니다.

 

데이터 불러오기 및 전처리

먼저 iris 데이터를 불러와서, 분석하고자 하는 데이터를 만들어 줍니다.

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# Load iris data
iris = load_iris()

# Data formatting
iris = pd.DataFrame(iris.data, columns=iris.feature_names)    
iris['Class'] = load_iris().target
iris['Class'] = iris['Class'].map({0:'Setosa', 1:'Versicolour', 2:'Verginca'})

 

변수 간의 크기 차이가 주성분 분석에 영향을 주는 것을 방지하기 위해, StandardScaler 함수를 사용하여 변수들을 정규화합니다.

이때, Class열은 숫자가 아니므로 제거해 줍니다.

# Normalization for numeric variables only
x = iris.drop(columns='Class')
x = StandardScaler().fit_transform(x)
print(pd.DataFrame(x).head())

 

주성분 개수 선정

다음으로는, 주성분을 몇 개로 할지 결정해 보겠습니다.

먼저, 임시로 주성분의 개수를 네 개로하고 explained_variance_ratio_값을 계산해 봅니다.

explained_variance_ratio_은, 전체 데이터에서 각 주성분이 설명할 수 있는 분산의 비율을 의미합니다.

첫 번째 주성분이 73%, 두 번째 주성분이 23%를 설명할 수 있으므로, 주성분의 개수는 두 개로 충분함을 알 수 있습니다.

# Find the number of principal components
pca = PCA(n_components=4)
pca_fit = pca.fit(x)
print("Variance explanatory power : ", pca.explained_variance_ratio_)

plt.title('Scree plot')
plt.xlabel('Number of components')
plt.ylabel('Explained variance')
plt.plot(np.arange(1,len(pca.explained_variance_ratio_)+1), pca.explained_variance_ratio_, 'o-')
plt.show()

Variance explanatory power
Variance explanatory power
Scree plot
Scree plot

 

주성분 분석을 통한 변수 최소화

이제 주성분의 개수를 두 개로 한 뒤 fit_transform() 함수를 적용하여, 새로운 데이터프레임을 만들어 봅니다.

두 개의 주성분으로도, 네 개의 변수를 사용했을 때와 유사한 산점도를 나타낼 수 있음을 알 수 있습니다.

# Data with two principal components
pca = PCA(n_components=2)
PCA_components = pca.fit_transform(x)
PCA_iris = pd.DataFrame(data=PCA_components, columns=['PC1','PC2'])
print(PCA_iris.head())

PCA_iris['Class'] = iris.Class
sns.pairplot(PCA_iris, diag_kind='auto', hue='Class')
plt.show()

# Scatter plot from original data
sns.pairplot(iris, diag_kind='auto', hue='Class')
plt.show()

(Left) Two principal components, (Right) Original data
(Left) Two principal components, (Right) Original data

 

이와 같이 주성분 분석 방법을 사용하면, 변수 개수를 최소화하여 데이터 분석이 가능함을 확인해 보았습니다.

반응형