RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Machine Learning

정답 없는 환자 데이터에서 그룹 찾기: 군집화(Clustering) 알고리즘 완전 정복

2025. 12. 29. 09:58

의료 데이터를 분석하다 보면, "정답(Label)"이 없는 경우가 많습니다. "이 환자는 A형 당뇨입니다"라는 라벨이 없어도, 수많은 환자 데이터 속에서 "비슷한 특성을 가진 환자 그룹"을 찾아내야 할 때가 있죠. 이를 비지도 학습(Unsupervised Learning), 그중에서도 군집화(Clustering)라고 합니다.

 

오늘은 환자의 검진 데이터(혈압, 콜레스테롤 등)를 이용해 숨겨진 환자 군(Cluster)을 찾아내는 4가지 핵심 알고리즘을 배워봅니다.

 

1. 군집화의 정석: K-Means Clustering

가장 대중적이고 직관적인 알고리즘입니다. 데이터 공간에 K개의 중심점(Centroid)을 찍고, 환자들을 가장 가까운 중심점에 배정하는 방식입니다.

의료 시나리오: 고혈압 환자 리스크 그룹핑

환자들을 '저위험군', '중위험군', '고위험군' 3개(K=3)로 나누고 싶다고 가정해 봅시다.

동작 원리 (Algorithm)

  1. K 결정: 3개의 그룹으로 나누겠다고 정함.
  2. 초기화: 임의의 환자 3명을 중심점(Centroid)으로 지정.
  3. 할당: 모든 환자를 가장 가까운 중심점 그룹에 넣음.
  4. 이동: 그룹의 평균 위치로 중심점을 이동.
  5. 반복: 더 이상 중심점이 움직이지 않을 때까지 3~4번 반복.

치명적 단점과 해결책 (K-Means++)

K-Means는 처음 중심점을 어디에 찍느냐에 따라 결과가 완전히 달라질 수 있습니다. 운이 나쁘면 엉뚱한 그룹핑이 되죠.

이를 해결한 것이 K-Means++입니다.

  • 핵심: 첫 중심점은 랜덤으로 찍되, 그다음 중심점은 최대한 멀리 떨어진 곳에 찍습니다 .
  • 효과: 이렇게 하면 초기 중심점들이 골고루 퍼져서 훨씬 안정적인 결과를 얻습니다.
from sklearn.cluster import KMeans

# init='k-means++' 옵션이 핵심! (기본값으로 설정되어 있음)
model = KMeans(n_clusters=3, init='k-means++', random_state=42)
model.fit(patient_data)

 

2. 계층적 군집화: Hierarchical Clustering (Agglomerative)

환자 한 명 한 명을 하나의 클러스터로 보고, 가장 비슷한 환자끼리 토너먼트처럼 합쳐나가는 방식입니다.

  • 장점: K(그룹 수)를 미리 정할 필요 없이, 나중에 덴드로그램(Dendrogram)을 보고 결정하면 됩니다.
  • 의료 적용: 질병의 아형(Subtype)을 연구할 때, 환자군이 어떻게 세분화되었다가 합쳐지는지 계층 구조를 파악하기 좋습니다.

 

3. 노이즈에 강하다: DBSCAN (밀도 기반 군집화)

K-Means는 원형으로 예쁘게 뭉친 데이터만 잘 찾습니다. 하지만 현실 의료 데이터는 복잡하고 이상치(Outlier)가 많죠. 이럴 땐 DBSCAN이 최고입니다.

핵심 파라미터

  1. eps (반경): "이웃"이라고 부를 수 있는 최대 거리.
  2. min_samples: 반경 내에 최소 몇 명이 있어야 "그룹"으로 쳐줄 것인가.

의료 시나리오: 희귀 질환 및 데이터 오류 탐지

  • 밀집된 구역: 일반적인 환자 패턴 (Cluster)
  • 동떨어진 점: 이상치(Noise)로 분류됨.
    • 이를 통해 기기 오작동으로 인한 이상한 수치나, 특이 케이스(희귀 질환자)를 자동으로 걸러낼 수 있습니다.
from sklearn.cluster import DBSCAN

# 반경 0.5 내에 5명 이상 모여야 그룹으로 인정
model = DBSCAN(eps=0.5, min_samples=5)
labels = model.fit_predict(patient_data)
# labels가 -1인 환자는 '이상치(Noise)'입니다.

 

4. 복잡한 구조를 푼다: Spectral Clustering

데이터의 분포가 단순한 거리가 아니라, 복잡한 곡선이나 도넛 모양일 때 사용합니다. 내부적으로 PCA(주성분 분석)의 원리를 이용해 차원을 축소한 뒤 군집화를 수행합니다 .

  • 특징: 데이터 간의 '유사도(Affinity)' 행렬을 만들어 분석하므로 기하학적으로 복잡한 데이터도 잘 나눕니다.

 

5. 요약 Note

어떤 알고리즘을 써야 할까요?

  1. K-Means(++): 데이터가 많고, 그룹이 원형으로 예쁘게 퍼져 있을 때. (가장 일반적)
  2. Hierarchical: 그룹 수를 모르겠고, 환자 간의 계층 구조를 보고 싶을 때.
  3. DBSCAN: 이상치(Outlier)가 많거나, 데이터 모양이 불규칙할 때. (노이즈 제거용으로도 훌륭함)
  4. Spectral: 위 방법들로 잘 안 나뉘는 복잡한 데이터일 때.

"환자들을 3그룹으로 나눠보세요"라는 요청을 받으면, 무조건 K-Means만 쓰지 마시고 DBSCAN으로 이상치를 먼저 제거해보는 건 어떨까요? 분석의 퀄리티가 달라집니다.

 

'Study Note > Machine Learning' 카테고리의 다른 글

라벨이 없는 환자 데이터에서 '위험군' 찾기: 군집화(Clustering) 알고리즘 4종 정복  (1) 2025.12.29
의료 AI의 협진 시스템: Random Forest와 XGBoost 섞어 쓰기 (Blending)  (0) 2025.12.29
응급실 예측 2편: 로그의 마법과 5대 회귀 모델 총출동 (Linear부터 XGBoost까지)  (0) 2025.12.24
응급실 예측, 디테일의 차이: Metric 정의부터 타겟 분리(Target Splitting)까지  (0) 2025.12.23
응급실은 언제 붐빌까? : 시계열 회귀, 로그(Log)의 마법, 그리고 4대 평가지표  (0) 2025.12.23
    'Study Note/Machine Learning' 카테고리의 다른 글
    • 라벨이 없는 환자 데이터에서 '위험군' 찾기: 군집화(Clustering) 알고리즘 4종 정복
    • 의료 AI의 협진 시스템: Random Forest와 XGBoost 섞어 쓰기 (Blending)
    • 응급실 예측 2편: 로그의 마법과 5대 회귀 모델 총출동 (Linear부터 XGBoost까지)
    • 응급실 예측, 디테일의 차이: Metric 정의부터 타겟 분리(Target Splitting)까지
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바