logo

[데이터 시각화 소개] 차원 축소

 

차원 축소

 

차원 축소란?

차원 축소란 고차원 데이터의 정보를 최대한 보존하면서 차원의 수를 줄이는 기법을 말합니다. 즉, 복잡한 데이터의 차원을 줄여서 더 간단하게 데이터를 표현하는 과정입니다. 이는 데이터 시각화, 노이즈 제거, 효율적인 저장 및 계산, 그리고 특히 고차원에서 발생하는 '차원의 저주' 문제를 완화하기 위해 사용됩니다.

 

차원 축소의 필요성 및 중요성

데이터의 차원이 늘어날수록 필요한 데이터 포인트의 수가 기하급수적으로 증가합니다. 이는 데이터를 처리하기 위한 계산 비용을 높이며, 부족한 샘플로 인해 과대적합(overfitting)의 위험을 증가시킵니다. 또한, 고차원 데이터는 직관적인 시각화가 어렵기 때문에 데이터의 이해를 돕기 어렵습니다. 따라서 차원의 축소는 불필요한 정보를 제거하고 중요한 특성을 강조함으로써 데이터의 핵심적인 특성을 파악할 수 있게 합니다.

 

주요 차원 축소 기법의 개략적 소개

  1. 주성분 분석 (PCA): PCA는 데이터의 분산을 최대로 하는 축을 찾아, 그 축으로 데이터를 투영시키는 방식으로 차원을 축소합니다. 이 과정에서 데이터의 중요한 변동성을 유지하면서 차원을 줄일 수 있습니다.

  2. 멀티디멘셔널 스케일링 (MDS): MDS는 객체 간의 거리를 보존하면서 저차원 공간에 데이터를 매핑합니다. 이는 거리 또는 유사도에 기반한 차원 축소 방법으로, 객체 간의 관계를 저차원에서도 유지하려는 목적을 가집니다.

  3. t-분포 확률적 임베딩 (t-SNE): 고차원 데이터의 군집 구조를 저차원에서 잘 나타내기 위해 설계된 기법입니다. t-SNE는 유사한 객체는 가까이, 그렇지 않은 객체는 멀리 떨어지게 하여 고차원 데이터의 구조를 저차원에서도 잘 반영합니다.

 

예시: PCA 사용하기

주성분 분석 (PCA)의 간단한 예를 Python과 seaborn 패키지를 사용하여 확인해보겠습니다. Iris 데이터 세트에 PCA를 적용하여 데이터를 2차원으로 축소하는 예를 들겠습니다.

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

# Iris 데이터 불러오기
iris = load_iris()
X = iris.data
y = iris.target

# 데이터 표준화
X_scaled = StandardScaler().fit_transform(X)

# PCA 모델 생성 및 적용
pca = PCA(n_components=2)  # 2차원으로 축소
X_pca = pca.fit_transform(X_scaled)

# 결과를 데이터 프레임으로 변환
df = pd.DataFrame(data = X_pca, columns = ['principal component 1', 'principal component 2'])
df['target'] = y

# 시각화
sns.scatterplot(x="principal component 1", y="principal component 2", hue="target", palette="deep", data=df)
plt.title('PCA of Iris Dataset')
plt.show()

이 예제 코드는 Iris 데이터 세트를 불러와 표준화한 뒤 PCA를 적용하여 2차원으로 차원 축소를 수행하고, seaborn을 이용하여 결과를 시각화하는 과정을 보여줍니다. 여기서 PCA를 통해 차원이 축소된 데이터는 꽃의 종류별로 잘 구분되는 것을 볼 수 있습니다.


 

차원의 저주(Curse of Dimensionality)

차원의 저주란 데이터 공간의 차원이 증가함에 따라 데이터 과학과 머신러닝에 있어서 나타나는 일련의 문제들을 가리킵니다. 높은 차원에서 데이터를 처리하면 처리해야 할 공간이 기하급수적으로 증가하여 데이터의 밀도가 희박해지며, 이로 인해 다양한 알고리즘들이 효율적으로 작동하지 못하는 문제가 발생합니다.

 

고차원 데이터 처리 시 발생하는 문제점들

  1. 데이터의 밀도 감소: 차원이 증가할수록, 같은 양의 데이터로는 공간을 충분히 채우기 어렵게 되어 데이터 간 거리가 멀어지게 됩니다. 이는 샘플간의 거리 계산을 기반으로 한 알고리즘들이 제대로 작동하지 않게 만듭니다.

  2. 과적합(Overfitting) 우려 증가: 고차원 공간에서는 모델이 단순히 데이터 포인트를 외우는 경향이 생길 수 있어, 일반화 가능성이 낮아집니다.

  3. 계산 복잡도 증가: 차원이 증가하면, 계산에 필요한 시간과 메모리가 지수적으로 늘어나 알고리즘의 성능이 크게 저하될 수 있습니다.

  4. 특성 선택의 어려움: 고차원 데이터에서는 모든 특성이 유용하지 않을 수 있으며, 중요한 특성을 선택하는 것이 매우 어려워집니다.

 

Python 예시 코드: 고차원 데이터의 시각화

고차원 데이터를 직접적으로 시각화하기 어렵기 때문에, 차원 축소 기법인 주성분 분석(PCA)을 사용하여 고차원 데이터의 특성을 이해해 볼 수 있습니다. Seaborn 라이브러리는 데이터 시각화에 있어 매우 유용하지만, 차원 축소 부분에서는 주로 scikit-learn 같은 라이브러리가 활용됩니다. 하지만 결과를 시각화하는 부분에서 seaborn을 활용할 수 있습니다.

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

# 임의의 고차원 데이터 생성
X, y = make_blobs(n_samples=300, centers=4, n_features=10, random_state=42)

# PCA를 사용하여 데이터를 2차원으로 축소
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 데이터프레임으로 변환
df_pca = pd.DataFrame(X_pca, columns=['PC1', 'PC2'])
df_pca['cluster'] = y

# seaborn을 사용한 시각화
plt.figure(figsize=(8, 6))
sns.scatterplot(x='PC1', y='PC2', hue='cluster', data=df_pca, palette='Set2')
plt.title('PCA Result of High Dimensional Data')
plt.show()

이 코드는 고차원 데이터를 2차원 주성분으로 축소하여 시각화하는 과정을 보여줍니다. PCA는 여러 차원의 특성을 가진 데이터에서 가장 중요한 특성을 추출하여 차원을 줄이는 방법입니다. 시각화를 통해 데이터의 구조와 클러스터를 직관적으로 파악할 수 있게 됩니다.


주성분 분석(PCA)

주성분 분석(Principal Component Analysis, PCA)은 고차원 데이터의 차원을 축소하는 통계적 절차로, 데이터의 분산을 최대한 보존하면서 서로 상관없는 새로운 차원(주성분)으로 데이터를 변환합니다. PCA는 다양한 분야에서 데이터 시각화, 노이즈 데이터 필터링, 특징 추출 및 선택, 고차원 데이터 세트의 압축 등에 널리 사용됩니다.

 

PCA의 기본 원리 및 수학적 배경

PCA는 대부분의 분산이 있는 데이터의 '방향'을 찾고, 이후 덜 중요한 방향들을 찾아내는 방법을 사용합니다. 이러한 방향들을 주성분이라고 합니다.

  1. 데이터의 표준화: PCA를 진행하기 전에, 각 특징의 중요도가 동등하게 고려되도록 특징들을 표준화해야 합니다(평균이 0, 분산이 1이 되도록 조정).

  2. 공분산 행렬 계산: 데이터 세트의 공분산 행렬을 계산합니다. 이는 특징들 간의 상관관계를 보여줍니다.

  3. 고유값 분해: 공분산 행렬의 고유값과 고유벡터를 계산합니다. 고유벡터들이 주성분의 방향을 나타내고, 고유값은 그 방향의 중요도(분산)를 나타냅니다.

  4. 주성분 선택: 가장 큰 고유값부터 순서대로 고유벡터를 선택합니다. 선택한 고유벡터의 수는 축소할 차원의 수가 됩니다.

  5. 차원 축소: 선택한 주성분으로 데이터를 투영하여, 축소된 차원의 데이터 세트를 얻습니다.

 

PCA를 사용하는 예제 및 시각화

PCA를 이해하기 위한 간단한 예제와 함께 Python과 seaborn 라이브러리를 사용하여 시각화해보겠습니다.

 

예제: Iris 데이터 세트를 사용한 PCA

Iris 데이터 세트는 붓꽃의 종류를 분류하기 위한 특징들(꽃잎 길이, 꽃잎 너비 등)을 포함합니다. 이 데이터를 사용하여 PCA를 수행하고, 결과를 시각화해보겠습니다.

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

# Iris 데이터 로드 및 준비
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names

# 데이터 표준화
X_std = StandardScaler().fit_transform(X)

# PCA 수행
pca = PCA(n_components=2)  # 2차원으로 차원 축소
X_pca = pca.fit_transform(X_std)

# PCA 결과 DataFrame으로 변환
df_pca = pd.DataFrame(data=X_pca, columns=['PC1', 'PC2'])
df_pca['target'] = y

# 시각화
plt.figure(figsize=(8,6))
sns.scatterplot(x='PC1', y='PC2', hue='target', style='target', palette='Set2', data=df_pca)
plt.title('PCA of Iris Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(title='Species')
plt.show()

이 코드는 Iris 데이터 세트를 표준화하고, PCA를 사용하여 2차원으로 차원을 축소한 후, 결과를 시각화합니다. 시각화 결과에서 보이듯이, PCA는 붓꽃 데이터를 주성분을 기반으로 효과적으로 구분합니다. 첫 번째 주성분(PC1)이 데이터의 대부분의 변량을 포착하고 있으며, 두 번째 주성분(PC2)는 나머지 변량을 포착합니다.


MDS(Multi-Dimensional Scaling)는 고차원 데이터를 낮은 차원의 공간 (보통 2차원 또는 3차원)으로 시각화하여 데이터 간의 유사성과 패턴을 쉽게 이해하고 해석할 수 있게 하는 통계 기법입니다. 이 방법은 데이터 사이의 거리(또는 유사성)를 기반으로 하여, 각 데이터 포인트들을 낮은 차원에 매핑합니다. 이 과정에서, 고차원 데이터의 구조를 가능한 한 유지하려고 노력합니다.

 

MDS의 기본 원리 및 수학적 배경

MDS의 목표는 고차원 공간에서의 데이터 포인트 간 거리를 보존하는 것입니다. 즉, 원본 고차원 공간에서 두 데이터 포인트 사이의 거리와, 낮은 차원에서 이들 포인트의 표현 사이의 거리가 가능한 유사하도록 만듭니다. 이처럼 거리의 보존을 통해, 고차원 데이터의 구조를 낮은 차원에서도 나타내려고 합니다.

수학적으로 MDS 과정은 다음과 같이 요약됩니다:

  1. 유사도 또는 거리 행렬(D) 계산: 데이터 포인트 간의 거리(또는 유사도)를 계산하여 행렬 형태로 나타냅니다.
  2. 거리 행렬을 바탕으로 새로운 점들의 좌표를 찾습니다. 이 과정에서 보통 스트레스 함수를 최소화하는 좌표를 찾는 최적화 과정을 거칩니다.
 

MDS를 사용하는 예제 및 시각화

MDS를 이해하기 위한 간단한 Python 예제를 아래에 제시합니다. 이 예제에서는 Seaborn 라이브러리를 사용하지만, 실제 MDS 계산을 위해서는 Scikit-learn 라이브러리 활용을 보여줍니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import MDS
from sklearn.datasets import load_digits
import seaborn as sns

# 데이터 로드
digits = load_digits()
data = digits.data

# MDS 모델 생성 및 변환
model = MDS(n_components=2, random_state=1)
data_transformed = model.fit_transform(data)

# 결과 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(data_transformed[:,0], data_transformed[:,1], hue=digits.target, palette='Spectral', legend='full')
plt.title('MDS digit data visualization')
plt.xlabel('MDS1')
plt.ylabel('MDS2')
plt.show()

이 코드는 손글씨 숫자 데이터셋(load_digits)을 사용하여, MDS를 통해 64차원 데이터를 2차원으로 축소해 시각화한 예입니다. MDS 클래스의 n_components 파라미터는 축소하고자 하는 차원 수를 설정합니다. 여기선 2차원으로 설정했습니다. 변환된 데이터는 data_transformed 변수에 저장됩니다. Seaborn의 scatterplot 함수를 사용해, 변환된 데이터의 시각화를 진행합니다. 여기서 hue 파라미터는 데이터 포인트를 색으로 구분하여 보여주는 역할을 합니다.

다중차원 스케일링을 통해 고차원 데이터의 구조와 패턴을 이해할 수 있도록 돕는 이 예시처럼, MDS는 데이터 탐색 및 분석에 있어 강력한 도구가 될 수 있습니다.


 

t-SNE의 기본 원리

t-SNE(t-distributed Stochastic Neighbor Embedding)는 고차원 데이터를 두 차원 또는 세 차원으로 축소하여 시각화하기 위한 기법 중 하나입니다. 다차원 데이터 포인트 간의 유사도를 확률 분포로 표현한 후, 이 유사도를 최대한 보존하는 방식으로 저차원 공간에 데이터 포인트를 매핑하는 방식입니다.

t-SNE의 핵심 아이디어는 고차원 공간에서 가까운 포인트들은 저차원 공간에서도 가까울 확률이 높게, 멀리 있는 포인트들은 저차원 공간에서도 멀리 떨어지도록 하는 것입니다. 이를 위해, 고차원 공간에서의 포인트 간 거리를 기반으로 가우시안 분포를 사용해 유사도를 계산하고, 저차원 공간에서는 t-분포를 사용합니다. 이 방식은 고차원 공간에서 멀리 떨어진 포인트들의 거리 정보를 저차원에서도 잘 표현할 수 있게 도와줍니다.

 

t-SNE를 이용한 다차원 데이터의 시각화 예제

다음은 Python의 seabornscikit-learn 라이브러리를 사용하여 t-SNE를 이용해 다차원 데이터를 시각화하는 예제입니다. 이 예제에서는 유명한 iris 데이터셋을 사용합니다. iris 데이터셋은 꽃잎(petal)과 꽃받침(sepal)의 길이와 너비를 바탕으로 한 150개의 꽃 관측치가 포함되어 있으며, 이들은 세 가지 꽃 종(species) 중 하나로 분류됩니다.

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.manifold import TSNE

# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# t-SNE 적용
tsne = TSNE(n_components=2, random_state=0)
X_tsne = tsne.fit_transform(X)

# 결과 시각화
palette = sns.color_palette("hsv", 3)
sns.scatterplot(X_tsne[:,0], X_tsne[:,1], hue=y, legend='full', palette=palette)

plt.title('t-SNE visualization of the Iris dataset')
plt.xlabel('t-SNE-1')
plt.ylabel('t-SNE-2')
plt.show()

위 코드에서 TSNE 클래스의 인스턴스를 생성할 때 n_components=2는 저차원 공간의 차원 수를 설정합니다. 여기서는 2차원으로 설정하여 결과를 2D 그래프로 시각화할 수 있습니다. random_state=0은 결과의 재현 가능성을 위해 랜덤 시드를 고정합니다.

t-SNE는 특히 고차원 데이터의 군집을 시각적으로 표현하는 데 유용합니다. 하지만, t-SNE는 계산 비용이 매우 높은 편이며, random_state에 따라 결과가 달라질 수 있음을 주의해야 합니다. 따라서, 결과 해석 시 이러한 점들을 고려하는 것이 중요합니다.

Previous
히트맵