이번 글은 코드잇 강의를 수강하면서 배운 내용을 주로 하여 정리되어 있습니다. (코드잇 스프린트 데이터 애널리스트 트랙 1기 훈련생)
차원 축소란?
차원 축소
데이터에서 ‘차원’이란 변수의 개수를 의미합니다.
변수가 1개인 데이터는 1차원 데이터, 변수가 2개인 데이터는 2차원 데이터, n개인 데이터는 n차원 데이터라고 부릅니다.
예를 들어, 고객 정보 데이터에서 변수가 6개인 경우, 각 변수는 고객의 다양한 특성을 나타냅니다.
차원이 높은 데이터를 분석에 활용하면 더 많은 정보를 반영한 결과를 얻을 수 있기에 차원이 많은 데이터를 활용할 필요가 있습니다.
이렇게 데이터의 차원이 높아지면 많은 정보를 나타낼 수 있지만, 너무 많은 차원은 분석의 정확도를 떨어지는 결과를 불러 일으키며, 이를 ‘차원의 저주’라고 합니다.
위 문제를 해결하기 위해서는 여러 방법이 있는데, 여러 방법들 중 하나인 차원 축소라는 방법을 이용할 수 있습니다.
차원 축소는 데이터를 구성하는 차원의 수를 줄이는 기법으로, 크게 두 가지 접근법이 있습니다: 차원 선택과 차원 추출입니다.
(차원의 저주를 해결하기 위한 목적)
차원 선택
다중공선성을 제거하기 위해 강한 상관성을 가진 컬럼이나 특성은 제거하는 과정을 통해 분석하고자 하는 차원을 선택할 수 있습니다.
- 방법: 데이터의 전체 차원 중 의미 있다고 판단되는 것들만 선택해 사용합니다.(실제로는 변수 간의 관계를 면밀히 확인하여 제거할 변수를 판단해야 한다.)
- 장점 :
- 사용이 쉽고 빠릅니다.
- 각 변수의 특성이 유지되므로 결과 해석이 쉽습니다.
- 단점 :
- 제거한 변수에 대한 정보가 손실됩니다.
차원 추출
차원추출은 데이터를 가장 잘 설명하는 차원을 새롭게 생성하여 차원을 줄이는 방법입니다.
또한, 여러 변수의 특징을 종합적으로 나타내는 새로운 변수를 찾아 통합합니다.
차원 추출 방법의 종류
- PCA
- T-sne
자의적 판단에 의한 단순 선형결합의 어떤 의미를 가지는지에 대해서는 수학적으로 검증 불가능하기 때문에 데이터 특성을 잘 반영하면서 유의미한 컬럼 간의 선형 결합을 하고 싶다면 PCA를 사용할 수 있습니다.
- 장점 :
- 데이터를 설명하는 데 필요한 정보를 최대한 보존합니다.
- 차원 선택보다 상대적으로 나은 성능을 보입니다.
- 단점 :
- 새로 생성된 변수의 의미를 해석하기 어렵습니다.
- 추가적인 연산이 필요해 계산 비용이 증가합니다.
차원의 저주
위에서 설명한 내용대로 데이터의 차원이 높아지면 많은 정보를 나타낼 수 있지만, 너무 많은 차원은 모델의 성능과 분석의 정확도를 떨어뜨릴 수 있습니다.
이러한 현상을 '차원의 저주'라고 하며, 차원이 높아질수록 분석의 성능이 저하될 수 있습니다.
- 거리 기반의 고전적 머신러닝 모델이 차원이 늘어남에 따라 성능이 저하되는 현상
문제점
- 노이즈 데이터 확률 증가
- 모델 연산량 증가
- 모델 최적화를 위한 필요 데이터수 증가
차원 축소가 필요한 이유
- 차원의 저주 문제 해결 : 데이터의 차원이 높아지면 분석 성능이 저하되거나 과적합 문제가 발생할 수 있기 때문에, 차원 축소를 통해 이 문제를 완화할 수 있습니다.
- 계산 효율성 향상 : 차원을 줄이면 연산량이 줄어들어 모델 학습과 예측 속도가 빨라집니다.
- 데이터 시각화 용이 : 고차원 데이터를 2차원이나 3차원으로 축소하면 데이터의 패턴과 구조를 시각적으로 이해하기 쉬워집니다.
다양한 변수 선택법
데이터 분석을 위해서는 다양한 변수 중에 통계적 방법들을 통해 유의미한 변수를 선택할 필요가 있습니다.
- 필터 방법 (Filter Methods):
- 설명: 변수와 목표 변수 간의 통계적 관계를 평가해 중요한 변수를 선택합니다.
- 예시: 상관 관계, 분산 분석, 카이제곱 검정 등
- 상관 관계 : 다중공선성 변수 제거
- 분산 분석 : 분산 분석을 통해 변수의 유의성 판단
- 카이제곱 검정 : 범주형 변수의 유의성으로 판단
- 장점: 빠르고 계산 효율적입니다.
- 단점: 각 변수를 독립적으로 평가하므로 상호작용을 고려하지 않습니다.
- 랩퍼 방법 (Wrapper Methods):
- 설명: 변수 조합을 생성하고 모델을 학습해 성능을 평가하여 최적의 변수 집합을 선택합니다.
- 모델 유의성 판단 기준 : p-value, adj R_Squared, AIC, BIC
- 예시: 전진 선택법, 후진 제거법, 단계적 선택법.
- 전진선택 - 비어있는 변수에서 시작하여 변수를 하나씩 추가하여 모델의 유의성에 따라 변수를 선택합니다.
- 후진제거 - 모든 변수들을 포함한 상테에서 하나씩 변수를 제거하며, 모델의 유의성에 따라 변수를 선택합니다.
- 단계적선택 - 변수를 추가, 제거하며 모든 조합들에 대해 모델의 유의성에 따라 변수를 선택합니다.
- 장점: 변수 간의 상호작용을 고려할 수 있습니다.
- 단점: 계산 비용이 많이 듭니다.
- 임베디드 방법 (Embedded Methods):
- 설명: 모델 학습 과정에서 변수 선택을 수행합니다.
- 예시: LASSO, 릿지 회귀, 결정 트리 기반 방법.
- 장점: 모델 학습과 변수 선택이 동시에 이루어져 효율적입니다.
- 단점: 특정 모델에 종속적일 수 있습니다.
PCA(주성분 분석)
PCA (Principal Component Analysis)
PCA는 대표적인 차원 축소(정사영) 기법 중 하나로 여러 차원들의 특징을 가장 잘 설명해 주는 차원인 주성분을 이용하여 차원을 축소하는 방법입니다.
주성분은 데이터들의 중심(원점)을 지나면서 모든 데이터들에서의 수직 거리의 합이 가장 가깝도록 하는 선을 말합니다.
차원 축소를 할 때, 기존 데이터를 제일 잘 설명하는 경우
- 분산이 가장 큰 경우 (PCA는 데이터의 변동성(분산)을 최대한 유지하면서 차원을 축소하는 것을 의미합니다.)
PCA의 동작 과정
- 데이터 표준화 및 원점 이동 :
- 목적 : 변수 간 단위를 통일(표준화)하고 데이터의 중심을 원점으로 이동.
- 방법 : 각 변수의 값을 평균에서 빼고 표준편차로 나누는 표준화 과정.
- 결과 : 변수의 단위가 통일되고, 데이터의 중심이 원점으로 이동.(표준화를 통해 데이터의 중심이 원점으로 이동하는 것입니다.)
- 주성분 찾기 :
- 첫 번째 주성분(PC1) : 데이터들의 중심을 지나면서 모든 데이터들에서의 수직 거리 합이 가장 작은 선.
- 두 번째 주성분(PC2) : 첫 번째 주성분에 수직이면서 원점을 지나고, 데이터들과의 거리 합이 가장 작은 선.
- 결과 : 데이터들을 가장 잘 설명해주는 두 개의 주성분(PC1, PC2)이 찾아짐.
- 데이터 투영하기(Projection) :
- 데이터를 주성분 위로 옮기는 과정.
- 결과 : 모든 데이터들이 주성분 위에 위치하게 됨.
- 새로운 축 기준으로 데이터 회전하기 :
- 목적 : 주성분(PC1, PC2)을 각각 x축과 y축이 될 수 있도록 축과 데이터 전체를 회전하여 축을 재설정.
- 결과 : 데이터의 분포가 새로운 축 기준으로 변함.
주성분을 찾는 방법
위에서 PCA는 고차원 데이터의 특성을 최대한 잘 반영하는 축인 주성분을 찾아서 데이터를 저차원으로 투영하는 방법인 것을 알 수 있었습니다.
이때, 주성분은 위 내용을 통해 데이터들의 중심(원점)을 지나면서 모든 데이터들에서의 수직 거리의 합이 가장 가깝도록 하는 선을 찾으면 된다고 설명했었습니다.
밑의 과정을 통해 주성분을 찾는 방법을 살펴보겠습니다.
- 데이터 표준화 및 원점 이동:
- 데이터를 표준화하여 각 변수의 단위를 통일하고 중심을 원점으로 이동합니다.
- 주성분 찾기:
- 첫 번째 주성분(PC1): 모든 데이터와 선 사이의 수직 거리 합이 최소가 되는 선을 찾습니다. 이는 곧 데이터를 투영했을 때 데이터들의 분산이 최대가 되는 선을 찾는 것과 같습니다.
- 두 번째 주성분(PC2): 첫 번째 주성분에 수직이면서 원점을 지나고, 데이터들과의 거리 합이 가장 작은 선을 찾습니다.
- 주성분끼리 직교하게 하여 서로 상관이 없도록 만들어 데이터의 설명력을 최대화합니다.
- 데이터 투영하기:
- 데이터를 주성분 위로 투영합니다. 이는 데이터를 주성분 방향으로 옮기는 과정을 의미합니다.
- 데이터가 주성분 위에 위치하게 되며, 이 주성분들이 새로운 축이 됩니다.
- 새로운 축 기준으로 데이터 회전하기:
- 주성분들을 새로운 x축과 y축으로 설정하여 데이터 전체를 회전시킵니다.
- 예를 들어, 2차원 데이터에서는 PC1이 x축, PC2가 y축이 됩니다.
- 차원 축소:
- 1차원 축소: 첫 번째 주성분(PC1)만을 사용하여 데이터를 나타냅니다.
- 2차원 유지: 첫 번째 주성분(PC1)과 두 번째 주성분(PC2)을 사용하여 데이터를 나타냅니다.
예시를 통해 확인하는 주성분을 찾는 과정
- 데이터 표준화:
- 원래 데이터에서 각 변수의 평균을 빼고 표준편차로 나눠서 표준화된 데이터로 변환합니다.
- 첫 번째 주성분(PC1) 찾기:
- 데이터와 선 사이의 수직 거리 합이 최소가 되는 선을 찾습니다.
- 이 선은 데이터를 투영했을 때 분산이 최대가 되는 방향입니다.
- 두 번째 주성분(PC2) 찾기:
- 첫 번째 주성분에 수직이면서 원점을 지나는 선을 찾습니다.
- 이는 데이터의 다른 특성을 반영하면서 첫 번째 주성분과 직교하여 서로 독립적인 정보를 제공합니다.
- 차원이 높아질 경우:
- 예를 들어, 3차원 데이터의 경우 주성분 PC1, PC2, PC3을 순차적으로 찾아냅니다.
- 1차원 축소: PC1만 사용.
- 2차원 축소: PC1과 PC2 사용.
PCA는 데이터를 가장 잘 설명하는 축을 찾는 과정입니다.
이 축은 데이터와의 수직 거리 합을 최소화하며, 데이터를 투영했을 때 분산이 최대가 되는 방향입니다.
주성분들은 서로 직교하여 독립적인 정보를 제공하며, 이를 통해 차원을 축소할 수 있습니다. 차원 축소를 통해 데이터의 특성을 유지하면서도 분석을 단순화할 수 있습니다.
PCA 과정
데이터 불러오기
import pandas as pd
df = pd.read_csv('data/ex_data.csv')
표준화
#1. pandas 이용
df_mean = df.mean() # 각 컬럼의 평균값
df_std = df.std() # 각 컬럼의 표준편차
scaled_df = (df - df_mean)/df_std # 컬럼별 표준화 진행
scaled_df.head()
#2. sklearn의 standardscaler 이용
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
s.fit(df)
scaled_df = s.transform(df)
scaled_df = pd.DataFrame(scaled_df,columns = df.columns)
PCA 라이브러리 불러오기 및 PCA 모델 생성
from sklearn.decomposition import PCA
# 차원을 2개로 줄이기 위해 n_components를 2로 설정하여 PCA 모델을 생성
pca = PCA(n_components=2)
PCA 학습 및 변환
pca.fit(scaled_df) # PCA 학습
scaled_df_pca = pca.transform(scaled_df) # 주성분으로 데이터 변환
데이터프레임으로 변환 및 결과 시각화
pca_df = pd.DataFrame(scaled_df_pca, columns=['PC1', 'PC2'])
sns.scatterplot(data=pca_df, x='PC1', y='PC2')
적절한 주성분 수 구하기
위의 내용을 간단히 다시 설명하면, PCA는 고차원 데이터를 저차원으로 축소하면서도 데이터의 중요한 정보를 최대한 유지하는 방법입니다.
주성분(principal components)은 데이터의 분산을 가장 많이 설명하는 새로운 축입니다.
이 때 적절한 주성분의 수를 구하기 위해서 Scree Plot이라는 그래프를 그려볼 수 있으며, 지금부터 Scree Plot에 대해 설명하도록 하겠습니다.
Scree Plot은 각 주성분이 데이터의 전체 분산에서 차지하는 비율을 시각화한 그래프입니다.
이를 통해 각 주성분이 데이터의 변동성을 얼마나 잘 설명하는지 알 수 있습니다.
PCA와 Scree Plot을 이용한 차원 축소 과정
PCA 적용 및 변환
from sklearn.decomposition import PCA
import pandas as pd
# 예시 데이터: scaled_df (표준화된 데이터 프레임)
pca = PCA(n_components=6) # 사용할 주성분의 수 지정
pca.fit(scaled_df) # PCA 학습
scaled_df_pc = pca.transform(scaled_df) # 주성분으로 데이터 변환
pca_df = pd.DataFrame(scaled_df_pc, columns=['PC1', 'PC2', 'PC3', 'PC4', 'PC5', 'PC6'])
Scree Plot 생성
import matplotlib.pyplot as plt
import numpy as np
var = pca.explained_variance_ratio_ # 각 주성분의 분산 비율
x = np.arange(len(var))
plt.bar(x, var)
plt.xlabel('Principal Component (PC)')
plt.ylabel('Variance Ratio')
plt.title('Scree Plot')
plt.show()
- 이 그래프는 각 주성분이 원본 데이터의 분산을 얼마나 설명하는지 보여줍니다.
누적 분산 비율 계산
cum_var = np.cumsum(var) # 누적 분산 비율 계산
cum_vars = pd.DataFrame({'Cumulative Variance Ratio': cum_var}, index=pca_df.columns)
print(cum_vars)
- 이 결과를 통해 각 주성분의 누적 분산 비율을 확인할 수 있습니다.
최적의 주성분 개수 결정
- 일반적으로 누적 분산 비율이 70% 이상이 되는 주성분 개수를 선택합니다.
- 예: PC1부터 PC3까지의 누적 분산 비율이 80%라면, 3개의 주성분이 전체 데이터의 특성을 충분히 설명한다고 볼 수 있습니다.
optimal_num_components = np.argmax(cum_var >= 0.70) + 1
print(f'Optimal number of components: {optimal_num_components}')
PCA의 특징
PCA(Principal Component Analysis)는 고차원 데이터를 저차원으로 축소시키는 방법으로, 데이터를 최대한 보존하면서 차원을 축소하는 특징이 있습니다.
PCA의 장점
- 정보 보존: PCA는 데이터가 가진 중요한 정보를 최대한 보존하면서 차원을 축소합니다. 예를 들어, 6차원 데이터를 2차원으로 축소할 때, 새로 생성된 두 개의 주성분(PC1과 PC2)은 원래 6개의 변수가 가진 정보를 종합적으로 고려하여 정보 손실을 최소화합니다.
- 시각화 및 분석 용이성: 고차원 데이터를 저차원으로 축소하여 시각화하면 데이터의 특징을 한눈에 파악할 수 있습니다. 예를 들어, PCA로 차원을 줄였을 때 기존 6개 변수가 가진 정보 중 약 65%가량이 보존될 수 있습니다.
- 예측 모델의 성능 향상: 차원을 축소시킨 데이터를 활용하여 예측 모델을 학습시키면 더 정확하고 일반화된 결과를 얻을 수 있습니다.
PCA의 단점
- 주성분 해석의 어려움: PCA의 결과로 얻어진 주성분은 여러 변수의 영향을 종합적으로 받기 때문에, 주성분의 의미를 명확하게 정의하기 어렵습니다.
- 계산 비용 증가: PCA는 고차원 데이터를 다루기 위한 많은 연산이 필요합니다. 따라서, 차원이 높을수록 계산 비용이 급격히 증가하며 연산 시간이 오래 걸립니다. PCA를 사용하기 전에 데이터의 차원, 크기, 연산 환경을 고려해야 합니다.
차원 추출 활용
PCA와 K-means 클러스트링 : PCA와 k-means 클러스터링을 통한 데이터 분석
1. 데이터 불러오기
import pandas as pd
# 예시 데이터 불러오기
data = pd.read_csv('CC_GENERAL.csv')
data.head(10)
2. 데이터 전처리(표준화)
고객 아이디(CUST_ID)를 제외하고 나머지 데이터를 사용합니다. 각 열의 단위를 조정하여 표준화합니다.
# 고객 아이디 컬럼 제거
data = data.drop('CUST_ID', axis=1)
# 데이터 표준화
scaled_data = (data - data.mean()) / data.std()
3. PCA 적용
PCA를 통해 차원을 축소합니다.(예시에서는 2차원으로 축소.)
from sklearn.decomposition import PCA
X = scaled_data.copy()
pca = PCA(n_components=2)
pca.fit(X)
x_pca = pca.transform(X)
pca_df = pd.DataFrame(x_pca, columns=['PC1', 'PC2'])
4. k-means 클러스터링
PCA로 축소한 데이터를 활용하여 k-means 클러스터링을 진행합니다. 최적의 군집 개수를 찾기 위해 Elbow Plot을 그립니다.
from sklearn.cluster import KMeans
import seaborn as sns
import matplotlib.pyplot as plt
# Elbow Plot 그리기
ks = range(1, 10)
inertias = []
for k in ks:
model = KMeans(n_clusters=k)
model.fit(pca_df)
inertias.append(model.inertia_)
sns.lineplot(x=ks, y=inertias, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.title('Elbow Plot')
plt.show()
Elbow Plot을 통해 최적의 군집 개수(k=6)를 선택합니다.
# k-means 클러스터링
model = KMeans(n_clusters=6)
model.fit(pca_df)
labels = model.labels_
# 결과 시각화
pca_df['label'] = labels
sns.scatterplot(data=pca_df, x='PC1', y='PC2', hue='label', palette='rainbow')
plt.title('k-means Clustering Results')
plt.show()
5. 클러스터 결과 해석
원본 데이터에 클러스터 번호를 부여하고, 각 클러스터별로 고객 수와 각 열의 평균을 확인합니다.
# 원본 데이터에 클러스터 번호 부여
data['cluster'] = labels
# 각 클러스터별 고객 수 확인
print(data['cluster'].value_counts())
# 각 클러스터별 열 평균 계산
cluster_means = data.groupby('cluster').mean()
print(cluster_means.T)
특정 열(예: 잔액, 잔액 갱신 빈도)에 대해 클러스터별 특징을 확인하고 결과를 요약할 수 있습니다.
# 특정 열에 대한 클러스터별 평균 확인
selected_columns = ['BALANCE', 'BALANCE_FREQUENCY']
cluster_means_subset = cluster_means[selected_columns]
print(cluster_means_subset.T)
이번 글에서는 차원 축소(차원 선택과 차원 추출) / 차원의 저주 / 다양한 변수 선택법 / PCA(주성분 분석) / 차원 추출 활용 방법이 포함된 내용을 정리했으며, 파이썬에서 데이터 분석을 하거나 프로그래밍을 하는 사람들에게 알아두면 유용한 개념들로 이번 기회를 통해 다른 분들도 정리하면 좋을 것 같습니다.
글 읽어주셔서 감사합니다.
출처 및 참고자료 : 코드잇 사이트 강의 '차원 축소' https://www.codeit.kr/topics/dimensionality-reduction
'프로그래밍 > 데이터 분석' 카테고리의 다른 글
[데이터 분석 심화 개념] 장바구니 분석 개념 정리 2️⃣ (연관 규칙 알고리즘) (1) | 2024.08.15 |
---|---|
[데이터 분석 심화 개념] 장바구니 분석 개념 정리 1️⃣ (장바구니 분석의 개념, 연관 규칙 마이닝의 개념과 규칙 평가 지표) (0) | 2024.08.12 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 3️⃣ (다양한 클러스터링 모델) (0) | 2024.08.04 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 2️⃣ (K-Means) (0) | 2024.08.04 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 1️⃣ (지도학습 및 비지도학습, 클러스터링) (0) | 2024.08.04 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!