주성분 분석, PCA: Principal Component Analysis

2025. 10. 28. 10:57·AI Study/Machine Learning

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
'AI Study/Machine Learning' 카테고리의 다른 글
  • SVM: Support Vector Machine
  • K-최근접 이웃: KNN, K-nearest neighbors
  • 연관분석: Apriori Algorithm
  • 군집화, K-Means Clustering
Yun Lab.
Yun Lab.
Yun Lab.
  • Yun Lab.
    윤랩
    Yun Lab.
  • 글쓰기 방명록 관리자
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • CS (13)
        • 컴퓨터구조 (6)
        • 운영체제 (7)
        • 네트워크 (0)
        • 시스템 프로그래밍 (0)
        • 데이터베이스 (0)
      • Git (0)
      • AI Study (6)
        • LLM (0)
        • Machine Learning (6)
      • 자격증 (2)
        • AICE (1)
        • 리눅스마스터 (1)
      • 논문리뷰 (4)
        • NeurIPS (0)
        • ICLR (1)
        • ICML (1)
        • 기타 (2)
      • 코딩테스트 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    LLM
    프로세스와 스레드
    2025ICML
    운영체제
    ICLR2025
    리눅스마스터
    명렁어
    쿠버네티스
    K-최근접이웃
    교착상태
    서포트벡터머신
    도커
    multi-agent
    ICML
    SVM
    머신러닝
    디시전트리
    ML
    의사결정나무
    Machine Learning
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
Yun Lab.
주성분 분석, PCA: Principal Component Analysis
상단으로

티스토리툴바