데이터 분석

[250417] 군집, 차원축소

경 민 2025. 4. 17. 20:43
👩🏻‍💻  Point of Today I LEARNED 
📌 SQL
● 코드카타

📌 Python 
● 실무에 쓰는 머신러닝 기초 7,8강 (군집/차원축소)
● 머신러닝 특강 복습 (군집/차원축소)
머신러닝 특강 어제 거 복습 (회귀)

 

심화 프로젝트 D-1 

이제 지금까지 공부한 통계 + 머신러닝을 실전으로 써먹을 시간이다.

어떤 주제, 어떤 방법을 선택할지 기대가 된다.

많이 어렵고 머리 터지겠지만

후회없는 프로젝트가 될 수 있도록 해보자.


1. SQL 

1-1. 코드카타 제한시간 두고 풀기

1) 코드카타 149번

https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true

포인트. union all 을 쓰면 안 된다. 

(select
    concat(name,'(',left(occupation,1),')')
from occupations
order by name);

(select
    concat('There are a total of ',count(1),' ',lower(occupation),'s.')
from occupations
group by occupation
order by count(1), occupation);

 

  • 이유: 컬럼이 다르기 때문에
  • 이럴 경우 그냥 쿼리 두 개를 써주기만 해도 된다.

2. Python

2-1. 실무에 쓰는 머신러닝 기초 7,8강 + 머신러닝 특강 복습(군집/차원축소) 

1) 군집 분석 개념

  • 비슷한 특성을 가진 데이터끼리 그룹핑 (군집/클러스터링) ➜ 각 그룹 내 데이터끼리의 유사도 최대화 & 다른 그룹과의 차이 최대화
  • 군집에 쓸 컬럼은 주로 연속형(수치형) 변수 사용
    • 이유 : 대부분의 군집 알고리즘은 유클리디안 거리 등의 거리기반 방식으로 비슷한 애들끼리 모으기 때문에 수치형일 때 정확하게 계산된다.
    • 범주형 변수도 인코딩해서 수치화하면 가능하긴 하지만 범주 많을수록 고차원이 되어버리기 때문에 이럴 경우 차원축소를 해줘야 한다.
  • 목적
    1. 데이터 구조 파악
    2. 세그먼트
      • 마케팅 - 고객 세그먼트 / 제조업 - 기계 작동패턴 분류 등
    3. 절차
      1. 데이터 수집 및 기간 선정
        • 최소 3개월 이상의 데이터셋 권장
      2. eda 및 전처리
        • ① 이상치, 결측치 탐지 및 전부 제거 (혹은 DBScan으로 이상치 자연스럽게 분류)
          • 결제금액처럼 유의미한 지표의 경우 이상치 제거 X
          • 각 컬럼의 의미와 값에 대한 해석이 필요한 경우 주관 개입 필수 ex) 값이 0, 이진형 변수 등
        • ② 스케일링
        • ③ 상관관계 확인 (다중공선성 방지를 위해 한 쌍 중 하나만 가져오기)
        • ④ 데이터 분포
        • ⑤ unique 컬럼 제거 ex) customer_id
      3. 차원축소
      4. 군집 수 / 파라미터 설정
        • 군집 수는 3~5개 정도로 시작해서 Silhouette Coefficient, elbow-point, Distance Map 참고해서 최적값 찾기
        • 이 때, 초기 군집 수 참고할 수 있는 방법 (자세한 건 아래 참고)
          1. scree plot의 elbow-point 
          2. Distance Map
      5. 군집 모델 적용 및 시각화(산점도로 분포 확인)
      6. 평가 및 결과 해석  ⭐️ ⭐️ ⭐️ ⭐️ ⭐️
        • 비지도학습이기 때문에 정확한 평가가 쉽지 않기 때문에 실루엣 계수 등을 평가 지표로 활용
        • 성능 평가 결과가 만족스럽지 않다면 다른 알고리즘 적용해보거나 파라미터 재조정, 피처 엔지니어링 등 계속 반복실험(매 실험마다 기록하는 게 중요)
        • 하나의 군집이 전체의 절반 이상을 차지하면 다시 시작.. (클러스터 비중 편향 문제)
        • 최종 결과가 나오면 각 군집이 갖는 주요 특징(평균값, 주요 변수 분포 등)을 파악해서 군집별 특징 정리
      7. 해석 기반 액션 아이템 제시
  • 매 실험 끝나고 확인해야 할 것들 ⭐️⭐️⭐️⭐️⭐️
✅ 초기 k값 설정 참고 방법

① scree plot 자료의 elbow-point

k값의 범위를 지정해서 각 k값으로 모델링 했을 때 걸리는 소요 시간을 계산해서 꺾은선 그래프로 보여주는 함수
from yellowbrick.cluster import KElbowVisualizer

# KMeans 모델적용
model = KMeans()

# k 값의 범위를 조정 가능
visualizer = KElbowVisualizer(model, k=(3,12))

# 데이터 적용
visualizer.fit(pca_df)
visualizer.show()


② Distance Map
군집 간 거리를 시각화해줌 (어디까지나 확인용)

from yellowbrick.cluster import intercluster_distance
from sklearn.cluster import MiniBatchKMeans

intercluster_distance(MiniBatchKMeans(5, random_state=42), pca_df)

 


2) 군집 모델 종류

K-Means 클러스터링
  • 각 군집(K)의 평균(Means)을 이용해서 클러스터링하는 모델
  • 알고리즘 개요 ⭐️
    1. 인간이 K값 (군집 개수) 지정해주면
    2. 모델이 랜덤하게 K개의 중심점을 선택해서 모든 데이터 포인터들을 가장 가까운 중심에 할당시켜서 1차 클러스터링
    3. 중심점과 데이터포인터들 간의 거리를 최소화하기 위해 중심점을 재선택해서 클러스터링하는 과정을 반복
    4. 거리기반으로 최적의 중심점 K개 도출 (거리 평균이 더이상 바뀌지 않는 지점)
  • 장점
    • 계산 속도 빠르고 구현 간단
    • 대용량 데이터에도 비교적 잘 작동
  • 단점
    • 군집 수를 몇 개 지정할지 최적값 찾는 게 중요
    • 중심점에 영향을 미치는 이상치에 취약
    • 원형 구조가 아닌 복잡한 형태의 분포는 적용이 어려움
DBScan
  • 일정 거리(ε) 내 데이터가 많으면(최소 포인트 수 minPts 이상) 그 영역을 ‘밀도가 높다’고 판단해 군집화하는 기법
  • 장점
    • 이상치, 노이즈를 자연스럽게 하나의 군집처럼 파악 가능
    • 밀도 기반이기 때문에 k값 불필요 (밀도 높으면 알아서 그룹핑함)
    • 원형 구조가 아닌 복잡한 형태도 군집화 잘 함
  • 단점
    • 파라미터 ε, minPts 잘 해줘야 함
    • 데이터 밀도 균일하지 않으면 성능 저하 (밀도기반 모델이니까.)
계층적 클러스터링(AgglomerativeClustering)
  • 방법
    1. (확장형) 데이터 포인트 하나하나를 하나의 군집으로 시작해서 유사도 높은 애들끼리 병합 반복해서 최종적으로 군집 트리 형성
    2. (분리형) 하나의 거대 군집으로 시작해서 분할
  • 장점
    • 군집의 계층적 구조를 직관적으로 파악 가능 (by 덴드로그램 시각화)
    • 군집 수를 명확하게 지정하지 않아도 덴드로그램의 특정 높이에 따라 유연하게 군집 개수 결정 가능
  • 단점
    • 계산이 복잡하기 때문에 대규모 데이터에 적용하기 어려움

3) 차원축소

  • 중요한 변수 몇 개만 선택해서 재구성하는 기법
  • 전처리 목적일 경우 반드시 모델 학습 전에 실행하기
  • 장점
    1. 고차원일 경우의 복잡도 해결 (트리기반모델의 경우 고차원도 잘 처리하기 때문에 굳이 안해도 됨)
    2. 다중공선성 해결
    3. 노이즈 제거로 모델 성능 및 일반화 능력 개선
    4. 시각화 할 때 직관적인 결과 해석 가능
    5. 데이터 핵심 구조 및 패턴 발견 용이
PCA 주성분 분석

  • 선형 축소
  • 가장 분산이 큰 방향(= 각 군집별 대표적인 특성 정보를 담고있는 축) 상위 n개만 선별 추출하는 축소기법
  • 주성분 = 데이터의 핵심적인 축 (not 컬럼!)
  • 분산 크기에 따라 1주성분, 2주성분, ...
  • 설명 분산 비율(explained_variance_ratio_)로 원하는 수준을 충족하는 적정 주성분 개수 확인 가능  
    • 예시) 2개 주성분만으로 전체 분산의 90%를 설명할 수 있다
  • components_로 어떤 변수가 주성분에 얼마나 기여하는지 각각의 가중치 확인 가능 (= 해당 주성분이 어떤 피처들의 조합으로 형성되었는지 확인)
# 변수별 주성분에 대한 가중치
pd.DataFrame(pca.components_, columns=scale_df.columns, index=[pca_df.columns]).T

↪︎ 절대값 클수록 각 주성분에 대한 영향력이 크다는 것 (주성분의 대표 특성)

  • 파라미터 n_components 사용법 (정수 2,3 권장)
    1. 정수 n ☞ '주성분 중 상위 n개만 사용할게' (← 주로 시각화 목적일 때 2 또는 3으로 사용
    2. 실수 0.95 ☞ '전체 분산의 95%를 설명하는만큼 주성분 개수 선택해줘' (← 설명 분산 비율 적용해서 정확도 높이고 싶을 때 사용/ 시각화 어렵기 때문에 이 경우에는 주성분 중 일부만 시각화하거나 pairplot으로 구현하기)
    3. None (기본값) ☞ '일단 차원 축소하지 않고 모든 주성분 사용할게' (fit() 이후 설명분산비율 보고 수동 조절 가능)
t-SNE, UMAP

  • 비선형 축소 (고차원 데이터의 구조를 2D/3D로 매핑)
  • 알고리즘 개요
    1. 고차원에서의 주변 데이터들 간의 거리를 바탕으로 지역적 확률 분포 계산
    2. 다른 차원에서도 '최대한' 같은 확률 분포로 배치 (경사하강법으로 최적화)
  • 하이퍼파라미터 튜닝으로 성능 조절
    • t-SNE perplexity, learning rate, iteration 수
    • UMAP n_neighbors, min_dist 등

4) 군집 성능평가 지표

** 아래는 내부 평가에 해당하며, 더 확실한 평가를 위해서는 실제 확인 가능한 데이터와 군집결과를 비교하는 외부 평가 방법이 있다.

① 실루엣 계수 (Silhouette Score)

 

  • 각 데이터 포인트의 응집도(a)와 분리도(b)를 이용해 계산
    • 응집도(a) : 같은 군집 내 데이터와의 평균 거리 ☞ 낮을수록 좋음
    • 분리도(b) : 가장 가까운 다른 군집과의 평균 거리 ☞ 높을수록 좋음
  • -1~1 사이의 값
    • 1에 가까울수록 군집 성능 좋음
    • 0에 가까울수록 군집 경계
    • 음수면 잘못된 군집화 의심
  • 덩어리 쪼갤수록(k값 올라갈수록) 점수 낮아지는 건 당연함 ➜ 동일한 k값 기준으로 피처 조절해서 점수 비교
  • sklearn.metrics.silhouette_samples

② Davies-Bouldin Index

  • 군집 내 분산 & 군집 간 거리의 비율 ➜ 군집이 겹치는 문제에 대한 검사에 활용
  • 0 이상의 값
    • 0에 가까울수록 군집 성능 좋음
    • 값이 커질수록 군집 품질 낮음
  • 예시)
    • DBScan 의 경우 노란색이랑 보라색 군집끼리 겹쳐짐
    • (= 보라색 군집 내 분산이 크고, 보라색&노란색 군집 간 거리가 좁다)
    • 이 경우 Davies-Bouldin Index 값이 커진다.