PCA: Principal Component Analysis - 주성분 분석
*특성 추출의 대표적인 기법.
입력 변수들을 선형 변환하는 비지도학습 방법
분산이 큰 주성분부터 차례로 선택
서로 직교하는 주성분의 방향과 분산은 기존 변수의 공분산행렬에 대한 고유벡터와 고유값으로 나타남.
Cov X = λ X
기존 변수는 Cov를 구하고 나서 이후에는 사용이 안 됨.
X: 고유벡터
λ: 고유값
주성분 분석 절차

[간단한 예시로 실습]

라이브러리 임포트
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
1단계: 데이터 작성
X = np.array([[50,73],[65,75],[75,80],[80,82],[95,85]])
X
# 원 데이터 시각화
plt.scatter(X[:,0],X[:,1])
plt.xlabel('X1')
plt.ylabel('X2')
plt.xlim(0,100)
plt.ylim(0,100)
2단계: 피처 스케일링
scaler = StandardScaler() # Scaler 객체 생성
scaler.fit(X)
X_std = scaler.fit_transform(X) # 표준화 한거 X_std에 선언
X_std
# 표준화 데이터 시각화
plt.scatter(X_std[:,0],X_std[:,1])
plt.xlabel('X1')
plt.ylabel('X2')
plt.xlim(-3,3)
plt.ylim(-3,3)
3단계: 공분산 행렬 계산
# 피처 스케일링을 하면 평균 0, 분산 1로 맞춰줌.
print(np.mean(X_std, axis=0))
print(np.cov(X_std[:,0],X_std[:,1],axis=0)) # 공분산 행렬
4단계: 고유값과 고유벡터 계산
pca = PCA(n_components = 2)
pca.fit(X_std) # 공분산 행렬의 고유벡터, 고유값 계산
print(pca.explained_variance_) # 해당 성분의 고유값 (λ) [분산]
print(pca.explained_variance_ratio_) # 각 성분의 분산 비율
5단계: 주성분 추출
print(pca.components_) # 주성분 (고유벡터)
6단계: 주성분으로 데이터 변환
Z = pca.transform(X_std)
Z
7단계: 시각화와 해석
# 주성분으로 변환 (데이터를 새로운 좌표축으로 회전시킴)
# 기존에 비스듬히 퍼진 데이터를 축에 정렬된 형태로 변환
plt.scatter(Z[:,0],Z[:,1])
plt.xlabel('X1')
plt.ylabel('X2')
plt.xlim(-3,3)
plt.ylim(-3,3)
plt.arrow(0,0,pca.components_[0,0],pca.components_[0,1],color='r')
plt.arrow(0,0,pca.components_[1,0],pca.components_[1,1],color='r')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.xlim(-2,2)
plt.ylim(-2,2)
[Iris 데이터로 실습]

라이브러리 임포트
data = datasets.load_iris() # Dictionary 형태로 로드됨
# 밸류 추출
target = data["target"] # annotations 리스트
features = data["feature_names"] # 리스트
X = data["data"] # numpy 배열로 존재
1단계: 데이터 작성
data = datasets.load_iris() # Dictionary 형태로 로드됨
# 밸류 추출
target = data["target"] # annotations 리스트
features = data["feature_names"] # 리스트
X = data["data"] # numpy 배열로 존재
# 시각화를 위해 DataFrame 생성
df = pd.DataFrame(data = X, columns = features)
df['target'] = target
df
# 변수가 3개 이상이라 pairplot으로 시각화.
plt.figure(figsize = (8,8)) # figsize 지정 안 해줘도 됨
ax = sns.pairplot(df,hue='target') # hue: 점 색깔 설정. annotation에 따라 다르게 표시
plt # 시각화
2단계: 피처 스케일링
scaler = StandardScaler()
scaler.fit(X)
X_std = scaler.transform(X)
X_std
3단계: 공분산 행렬 계산
print(np.mean(X_std,axis=0)) # 평균 - 봐도 별 의미 없긴 함
print(np.cov(X_std)) # 공분산
4단계: 고유값과 고유벡터 계산
pca = PCA(n_components=4) # 변수가(features) 4개
pca.fit(X_std) # 공분산에 대한 고유벡터, 고유값 계산
print(pca.explained_variance_) # 고유값
print(pca.explained_variance_ratio_) # 고유값 영향력
# 성분별 고유값 시각화
plt.plot(pca.explained_variance_,'o-') # plot에는 리스트 그냥 들어가면 됨
plt.title('Scree plot')
plt.xlabel('# PC')
plt.ylabel('var')
plt
5단계: 주성분 추출
print(pca.components_) # 주성분 보기
6단계: 주성분으로 데이터 변환
Z = pca.transform(X_std)
Z
df_pca = pd.DataFrame(data = Z, columns = ['PC1','PC2','PC3','PC4'])
df_pca['target'] = target
plt.figure()
ax = sns.pairplot(df_pca,hue='target')
plt
7단계: 시각화와 해석
# 4차원이지만 PC1, PC2축에서만 시각화 해봄
loadings = pca.components_
plt.figure()
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.xlim(-2,2)
plt.ylim(-2,2)
for idx, loading in enumerate(loadings):
plt.arrow(0,0,loading[0],loading[1],color='r')
plt.annotate(f'X{idx+1}',(loading[0],loading[1]))
요약
차원축소: 다차원 데이터 세트로부터 차원의 수가 적은 데이터 세트로 만드는 방법으로,특성선택과 특성추출이
있다. 특성 선택은 기존 변수들 중에서 유의미한 변수만 선택하는 방법이며, 특성 추출은 기존 변수들로부터 새
로운 변수들로 변환하여 추출하는 방법이다.
주성분분석 개요: 특성추출의 대표적인 기법으로, 기존 변수에서 분산이 가장 큰 방향의 서로 직교하는 주성분
들로 선형변한한다.
주성분과 분산: 주성분은 기존 변수의 공분산행렬에 대한 고유벡터 방향의 축이며, 고윳값은 주성분의 분산을
의미한다.
주성분 분석: 주성분의 분산 비율이 큰 순으로 그 합이 90%를 넘는 최소의 주성분을 추출하거나, scree plot에
서 주성분의 증가에 따른 분산 비율의 기울기가 완만해지는 elbow point까지의 주성분으로 추출한다.
주성분 분석 기본 절차: 데이터 작성 → 탐색적 데이터 분석 → 피처 스케일링 → 공분산 행렬 계산 → 공분산 행
렬에 대한 고윳값과 고유벡터 계산→ 주선분의 분산비율 계산→ 주성분 추출→ 주성분으로의 데이터 변환
주성분 분석 패키지: 주성분분석에 시용되는 주요 모듈은 skleam.decomposition 패키지의 PCA 모듈이다.
'AI Study > Machine Learning' 카테고리의 다른 글
| 의사결정나무: Decision Tree (0) | 2025.12.15 |
|---|---|
| SVM: Support Vector Machine (0) | 2025.12.15 |
| K-최근접 이웃: KNN, K-nearest neighbors (0) | 2025.12.15 |
| 연관분석: Apriori Algorithm (0) | 2025.12.15 |
| 군집화, K-Means Clustering (1) | 2025.10.28 |