우리가 데이터를 '보는' 방식: 차트가 오해를 일으키는 이유와 PCA를 사용해 해결하는 방법
Source: Dev.to
위의 링크에 있는 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록, URL 및 마크다운 형식은 그대로 유지됩니다.)
전형적인 문제
Python Baires의 멘토로서, 데이터 사이언스를 처음 시작하는 사람들의 코드에서 지속적으로 보이는 오류를 봅니다: 데이터의 양에 집착하고 정보의 질에는 신경 쓰지 않습니다.
그들은 50개의 컬럼을 가진 데이터셋을 가지고 “멋져, 정보가 많다”라고 생각합니다. 그런 다음 몇 시간씩 걸리는 모델을 훈련시키지만 정확도는 보통 수준에 머뭅니다. 이유는? 잡음과 높은 상관관계 때문입니다.
예제 데이터셋 생성
import pandas as pd
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import time
import matplotlib.pyplot as plt
import seaborn as sns
# Configuración visual
plt.style.use('dark_background')
# Generamos 30 características, pero solo 5 son realmente informativas
X, y = make_classification(
n_samples=1000,
n_features=30,
n_informative=5,
n_redundant=10, # Muchas redundantes
n_classes=2,
random_state=42
)
# Convertimos a DataFrame para que parezca real
feature_names = [f'metrica_{i}' for i in range(30)]
df = pd.DataFrame(X, columns=feature_names)
df['compra'] = y
print("Dataset generado con 30 columnas (ruido incluido):")
print(df.head())
print(f"\nForma del dataset: {df.shape}")
소음 시각화
# Matriz de correlación (primeras 10 variables)
plt.figure(figsize=(10, 8))
sns.heatmap(df.iloc[:, :10].corr(), annot=False, cmap='coolwarm')
plt.title("Mapa de Calor: Confusión de Variables (Primeras 10)")
plt.show()
변수들이 서로 뒤섞여 있어 명확한 패턴을 감지하기 어렵다는 점에 주목하세요.
PCA 적용
# 1. Escalar SIEMPRE antes de PCA (fundamental)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df.drop('compra', axis=1))
# 2. Reducir a 2 componentes para visualización
pca_visual = PCA(n_components=2)
X_pca_2d = pca_visual.fit_transform(X_scaled)
# 3. Visualizar el resultado
plt.figure(figsize=(8, 6))
plt.scatter(X_pca_2d[:, 0], X_pca_2d[:, 1], c=y, cmap='viridis', alpha=0.6)
plt.xlabel(f"Componente Principal 1 ({pca_visual.explained_variance_ratio_[0]:.2%} varianza)")
plt.ylabel(f"Componente Principal 2 ({pca_visual.explained_variance_ratio_[1]:.2%} varianza)")
plt.title("Datos proyectados en 2D con PCA (Separación visible)")
plt.show()
그래프가 보여주는 내용
30개의 열에 섞여 있던 구분할 수 없는 혼돈이 이제 단 2개의 “렌즈”(구성 요소)만으로도 명확히 구분됩니다.
모델 비교: PCA 사용 여부에 따라
# --- 원본 모델 (30 특성) ---
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 시간 측정
start_time = time.time()
model_full = RandomForestClassifier(n_estimators=100, random_state=42)
model_full.fit(X_train, y_train)
pred_full = model_full.predict(X_test)
time_full = time.time() - start_time
acc_full = accuracy_score(y_test, pred_full)
# --- PCA 모델 (95 % 분산) ---
pca_optimo = PCA(n_components=0.95) # 분산의 95 %를 유지
X_train_pca = pca_optimo.fit_transform(X_train)
X_test_pca = pca_optimo.transform(X_test)
start_time = time.time()
model_pca = RandomForestClassifier(n_estimators=100, random_state=42)
model_pca.fit(X_train_pca, y_train)
pred_pca = model_pca.predict(X_test_pca)
time_pca = time.time() - start_time
acc_pca = accuracy_score(y_test, pred_pca)
print("\n--- 성능 결과 ---")
print(f"원본 모델 (30 열): 정확도: {acc_full:.4f} | 시간: {time_full:.4f}s")
print(f"PCA 모델 ({pca_optimo.n_components_:.0f} 열): 정확도: {acc_pca:.4f} | 시간: {time_pca:.4f}s")
관찰 내용
- 시간 감소: PCA를 적용한 모델이 학습 및 예측이 더 빠릅니다.
- 정확도 비슷함: 분산의 95 %를 유지하면 정보 손실이 최소화되어 정확도가 거의 동일합니다.
언제 PCA를 사용해야 할까
- 모델 학습에 시간이 너무 오래 걸린다.
- 특성(피처) 수가 행보다 많다.
- 복잡한 데이터를 2D 또는 3D로 시각화해야 한다.
주의: PCA는 선형 관계를 가정한다. 데이터에 비선형 패턴이 있다면 Autoencoders 또는 t‑SNE와 같은 기술을 고려하라. 이는 우리 고급 과정에서도 다룬다.
결론
맹목적으로 모델을 적용하는 것을 멈추고 데이터의 수학적 구조를 이해하기 시작하는 것이 파이썬 프로그래머와 데이터 과학자를 구분하는 점입니다. 올바른 전처리 기술을 선택하는 방법을 배우고, 시각화를 마스터하며, 채용 담당자들이 높이 평가하는 효율적인 파이프라인을 구축하고 싶다면, Python Baires가 여러분을 기다립니다.
전체 프로그램을 확인하고 자리를 예약하세요:
https://www.python-baires.ar/