지도학습을 끝내고 비지도학습을 배우니 그래도 할만한 것 같다. 비지도학습은 시각화를 통해 의미를 찾아내는 것이 중요한 듯하다.
학습시간 09:00~01:00(당일16H/누적294H)
클러스터링은 원핫인코딩 & 스케일링을 해야한다.
차원축소는 데이터 정제를 위해서이기도 하지만 시각화를 위해서이기도 하다.
A. Elbow Method
B. 클러스터링 평가 지표 - 실루엣 점수
C. KMeans 특징과 한계
A. 차원 축소
B. 피처 선택
C. 피처 엔지니어링
D. 데이터 수집과 생성
E. 알고리즘 선택
A. 데이터 표준화
B. 공분산 행렬 계산
C. 고유값 분해
D. 주성분 선택
E. 데이터 변환
A. 설명된 분산 비율 / 누적 설명 분산 비율
B. 스크리플롯
''' Mall_Customers 로 실습 진행'''
import pandas as pd
df = pd.read_csv('data/Mall_Customers.csv')
df = df.drop(columns=['CustomerID'])
df = pd.get_dummies(df, columns=['Gender'])
from sklearn.preprocessing import StandardScaler
X = df
scl = StandardScaler()
X_scl = scl.fit_transform(X)

from sklearn.cluster import KMeans
k_range = range(1, 11)
inertia_list = [KMeans(n_clusters=k).fit(X_scl).inertia_ for k in k_range]
plt.plot(k_range, inertia_list, '-o')

from sklearn.metrics import silhouette_score
s_score = [silhouette_score(X_scl, KMeans(n_clusters=k).fit_predict(X_scl))for k in range(2, 11)]
plt.plot(range(2, 11), s_score, '-o')

from sklearn.cluster import KMeans
m_kmeans = KMeans(n_clusters=5)
pred_kmeans = m_kmeans.fit_predict(X_scl)
시각화 그래프 참고하여 k=5로 설정함
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scl)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=pred_kmeans, s=40)
2차원 그래프로 보기 위해 2차원으로 축소. 5개 그룹이 잘 형성되었다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 1. 데이터 준비
iris = load_iris()
X = iris.data
X_scaled = StandardScaler().fit_transform(X)
# 2. PCA 수행
pca = PCA()
X_pca = pca.fit_transform(X_scaled)
# 3. 값 계산
explained_var = pca.explained_variance_ratio_
cumulative_var = np.cumsum(explained_var)
# 4. 몇 번째 주성분까지 90%를 설명하는지 계산
threshold = 0.9
num_components_90 = np.argmax(cumulative_var >= threshold) + 1
print(f"🔍 90% 설명하려면 최소 {num_components_90}개의 주성분이 필요해!")
# 5. 시각화
plt.figure(figsize=(10, 8))
# 개별 주성분 설명력 (막대)
plt.bar(range(1, len(explained_var)+1), explained_var,
alpha=0.6, align='center', label='individual components')
# 누적 설명력 (선)
plt.plot(range(1, len(cumulative_var)+1), cumulative_var,
marker='o', linestyle='-', color='royalblue', label='cum sum')
# 90% 기준선
plt.axhline(y=threshold, color='red', linestyle='--', label='threshold (90%)')
# 라벨 설정
plt.xlabel('num of principal components')
plt.ylabel('ratio')
plt.title('Explained Variance & 90% Threshold Point')
plt.xticks(range(1, len(explained_var)+1))
plt.grid(True, linestyle=':', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.show()
90% 이상 설명된 주성분을 구하려면 최소 2차원이어야 한다는 뜻.
월요일에 내용을 조금 더 추가해야지!