이 장에서 배울 것
지금까지는 대부분 정답이 있는 문제를 다루었다. 집값을 예측할 때는 실제 가격이 있었고, 합격 여부를 예측할 때는 실제 합격·불합격 라벨이 있었다. 모델은 입력 데이터 X와 정답 y의 관계를 배웠다.
이번 장에서는 방향을 조금 바꾼다. 정답 y가 없는 데이터에서 패턴을 찾는 방법을 배운다. 이것을 비지도학습이라고 한다. 비지도학습은 "무엇이 정답인가?"보다 "데이터 안에 어떤 구조가 숨어 있는가?"를 묻는다.
이 장의 핵심은 두 가지다.
차원 축소: 특징이 많은 데이터를 더 적은 축으로 요약한다.
군집: 비슷한 데이터끼리 묶어 본다.
이 둘은 정답을 맞히기 위한 도구라기보다, 데이터를 이해하기 위한 탐색 도구에 가깝다.

왜 이 주제가 중요한가
현실의 데이터에는 정답이 없는 경우가 많다. 고객 데이터에는 "좋은 고객"이라는 정답 라벨이 없을 수 있다. 뉴스 기사에는 "주제 번호"가 붙어 있지 않을 수 있다. 센서 데이터에는 "정상 패턴 1, 정상 패턴 2" 같은 구분이 미리 정리되어 있지 않을 수 있다.
그래도 우리는 데이터를 이해해야 한다. 예를 들어 다음과 같은 질문을 할 수 있다.
고객은 몇 가지 행동 유형으로 나뉘는가?
상품 리뷰에는 어떤 주제들이 섞여 있는가?
비슷해 보이는 데이터와 유난히 다른 데이터는 무엇인가?
수십 개의 특징을 2차원 그림으로 보면 어떤 구조가 보이는가?
비지도학습은 이런 질문에 대한 첫 단서를 준다. 단, 중요한 점이 있다. 비지도학습 결과는 정답이 아니다. 군집 번호가 0번이라고 해서 "0번 유형의 사람"이라는 실제 집단이 존재한다는 뜻은 아니다. 모델이 어떤 기준으로 가까운 것들을 묶어 본 결과일 뿐이다.
따라서 비지도학습은 결론을 내리는 도구라기보다, 더 좋은 질문을 만들기 위한 도구라고 생각하는 편이 안전하다.
핵심 개념 설명
지도학습과 비지도학습의 차이
지도학습에서는 정답 y가 있다. 모델은 X를 보고 y를 맞히는 방법을 배운다.
예를 들어 다음과 같다.
이메일 특징 → 스팸 여부
집의 면적, 위치, 방 개수 → 집값
환자의 검사 수치 → 질병 여부
반면 비지도학습에서는 정답 y를 사용하지 않는다. 데이터 X만 보고 구조를 찾는다.
예를 들어 다음과 같다.
고객 구매 기록만 보고 비슷한 고객끼리 묶기
여러 개의 측정값을 2차원 그림으로 줄여 보기
문서들을 내용이 비슷한 것끼리 모아 보기
지도학습의 질문이 "정답을 얼마나 잘 맞혔는가?"라면, 비지도학습의 질문은 "이 묶음이나 구조가 해석할 만한가?"에 가깝다.
차원의 저주
머신러닝에서 차원은 보통 특징의 개수를 뜻한다. 키와 몸무게 두 개의 특징이 있으면 2차원이다. 여기에 나이, 소득, 방문 횟수, 구매 금액, 클릭 수가 계속 추가되면 차원은 늘어난다.
특징이 많아지면 정보가 많아져서 무조건 좋을 것 같지만, 항상 그렇지는 않다. 차원이 많아질수록 데이터 사이의 거리를 해석하기 어려워진다. 2차원 평면에서는 두 점이 가까운지 먼지 눈으로 볼 수 있다. 하지만 특징이 100개라면 "가깝다"는 말이 훨씬 복잡해진다.
이 문제를 직관적으로 차원의 저주라고 부른다. 차원이 커질수록 공간이 넓어지고, 데이터는 그 넓은 공간에 듬성듬성 흩어진다. 그러면 거리 기반 모델이나 시각화가 어려워진다.
그래서 많은 특징을 가진 데이터를 다룰 때는 다음 질문이 중요해진다.
정말 모든 특징이 필요한가?
중요한 구조를 유지하면서 더 적은 축으로 표현할 수 있는가?
2차원이나 3차원으로 줄여서 눈으로 확인할 수 있는가?
여기서 차원 축소가 등장한다.
PCA: 축을 바꾸어 요약하기
PCA는 Principal Component Analysis의 약자로, 한국어로는 주성분 분석이라고 부른다. 이름은 어렵지만 기본 생각은 단순하다.
PCA는 원래 특징들을 그대로 버무리는 것이 아니라, 데이터가 가장 많이 퍼져 있는 방향을 새 축으로 잡는다. 그리고 그 축들을 이용해 데이터를 더 적은 차원으로 표현한다.
예를 들어 4개의 특징을 가진 데이터를 2개의 축으로 줄일 수 있다. 이때 PCA는 가능한 한 정보 손실을 줄이려고 한다. 물론 완전히 같은 정보가 보존되는 것은 아니다. 4차원을 2차원으로 줄이면 어느 정도 손실은 생긴다. 대신 우리는 데이터를 그림으로 볼 수 있고, 전체 구조를 더 쉽게 파악할 수 있다.
PCA를 사용할 때 특히 중요한 전처리가 있다. 바로 스케일 조정이다. 어떤 특징은 0~1 범위이고, 어떤 특징은 0~10,000 범위라면 PCA는 값의 크기가 큰 특징에 더 큰 영향을 받을 수 있다. 그래서 StandardScaler처럼 평균을 0, 표준편차를 1로 맞추는 처리를 자주 한다.
k-means: 중심점을 기준으로 묶기
k-means는 대표적인 군집 알고리즘이다. 여기서 k는 만들 군집의 개수다. 예를 들어 k=3이면 데이터를 3개 묶음으로 나누려 한다.
작동 방식은 다음처럼 이해하면 된다.
군집 중심점 k개를 임의로 정한다.
각 데이터를 가장 가까운 중심점에 배정한다.
배정된 데이터들의 평균 위치로 중심점을 다시 옮긴다.
배정과 중심점 이동을 반복한다.
더 이상 크게 바뀌지 않으면 멈춘다.
k-means는 단순하고 빠르다. 하지만 한계도 분명하다. 군집 수 k를 사람이 정해야 한다. 또 둥근 모양으로 모인 데이터에는 잘 맞지만, 길게 휘어진 모양이나 크기가 크게 다른 군집에는 약할 수 있다.
따라서 k-means 결과를 볼 때는 "모델이 이렇게 나누었다"라고 말해야지, "현실의 집단은 정확히 이렇게 나뉜다"라고 말하면 안 된다.
쉬운 비유 또는 사례
책상이 매우 어지럽다고 생각해 보자. 영수증, 볼펜, 책, 충전기, 메모지가 섞여 있다. 아직 정리 기준은 없다. 누군가가 "정답은 이것이다"라고 알려 주지도 않았다.
이때 할 수 있는 일이 두 가지 있다.
첫째, 물건을 보기 쉽게 펼쳐 놓는다. 너무 많은 물건이 겹쳐 있으면 전체 모습을 보기 어렵다. 이것이 차원 축소와 비슷하다. 복잡한 정보를 더 보기 쉬운 형태로 줄여 보는 것이다.
둘째, 비슷한 물건끼리 모아 본다. 필기구는 필기구끼리, 종이는 종이끼리, 전자기기는 전자기기끼리 둘 수 있다. 이것이 군집과 비슷하다.
하지만 여기에도 주의가 필요하다. 충전 케이블은 전자기기 쪽에 둘 수도 있고, 자주 쓰는 물건 쪽에 둘 수도 있다. 정리 기준에 따라 묶음은 달라진다. 데이터 군집도 마찬가지다. 군집 결과는 데이터와 알고리즘, 전처리, 군집 수에 따라 달라진다.
직접 해보는 실습
이번 실습에서는 scikit-learn의 붓꽃 데이터를 사용한다. 붓꽃 데이터에는 실제 품종 라벨이 있지만, 여기서는 비지도학습을 연습하기 위해 학습 과정에서 라벨을 사용하지 않는다. 라벨은 마지막에 결과를 참고로 비교할 때만 사용할 수 있다.
1단계: 데이터 불러오기와 스케일 조정
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
iris = load_iris()
X = iris.data
feature_names = iris.feature_names
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X.shape)
print(feature_names)여기서 X에는 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비가 들어 있다. 특징은 4개이므로 4차원 데이터다. 사람은 4차원을 직접 볼 수 없기 때문에 PCA로 2차원으로 줄여 본다.
2단계: PCA로 2차원 만들기
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(pca.explained_variance_ratio_)
print(pca.explained_variance_ratio_.sum())explained_variance_ratio_는 각 주성분이 데이터의 퍼짐을 얼마나 설명하는지 보여 준다. 두 값을 더하면 2차원으로 줄였을 때 대략 어느 정도의 정보를 담고 있는지 감을 잡을 수 있다.
이제 2차원 그림으로 확인해 보자.
plt.figure(figsize=(6, 5))
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.8)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("PCA result")
plt.show()이 그림에서 점들이 완전히 무작위로 흩어져 있는지, 어느 정도 덩어리를 이루는지 관찰해 보자. 아직 정답 라벨을 쓰지 않았다는 점이 중요하다.
3단계: k-means로 군집 만들기
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
clusters = kmeans.fit_predict(X_scaled)
plt.figure(figsize=(6, 5))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=clusters, cmap="viridis", alpha=0.8)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("K-means clusters on PCA space")
plt.show()주의할 점이 있다. 여기서는 k-means 학습에는 원래의 스케일 조정된 4차원 데이터 X_scaled를 사용했고, 그림을 그릴 때만 PCA 결과 X_pca를 사용했다. 2차원 그림은 해석을 돕는 도구이지, 항상 학습에 써야 하는 데이터는 아니다.
4단계: 군집 수를 바꾸어 보기
for k in [2, 3, 4, 5]:
model = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = model.fit_predict(X_scaled)
plt.figure(figsize=(5, 4))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap="viridis", alpha=0.8)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title(f"k-means with k={k}")
plt.show()k를 바꾸면 군집 결과도 달라진다. 이것은 매우 중요한 관찰이다. 군집은 데이터 안에서 가능한 구조를 제안하지만, 그 구조가 유일한 정답이라고 보장하지 않는다.
실습 후에는 다음 질문에 답해 보자.
k=2,k=3,k=4중 어느 결과가 가장 자연스러워 보이는가?그렇게 판단한 이유는 무엇인가?
PCA 그림에서 가까워 보이는 점들이 항상 같은 군집으로 묶이는가?
군집 번호 0, 1, 2에 의미 있는 이름을 붙일 수 있는가? 붙일 수 없다면 왜 그런가?
흔한 실수와 오류 분석
첫 번째 실수는 군집 결과를 정답처럼 해석하는 것이다. "0번 군집은 우수 고객, 1번 군집은 위험 고객"이라고 바로 이름 붙이면 위험하다. 군집은 비슷한 데이터끼리 묶은 결과일 뿐이다. 이름을 붙이려면 각 군집의 특징 평균, 분포, 실제 사례를 추가로 확인해야 한다.
두 번째 실수는 스케일 조정을 하지 않는 것이다. k-means는 거리 기반 알고리즘이다. 값의 범위가 큰 특징이 거리 계산을 지배할 수 있다. 예를 들어 연소득은 수천만 단위이고 방문 횟수는 0~100 단위라면, 스케일 조정 없이 군집을 만들었을 때 연소득이 거의 모든 결정을 좌우할 수 있다.
세 번째 실수는 PCA 그림을 과신하는 것이다. PCA 2차원 그림은 원래 데이터를 압축해서 보여 준다. 정보 손실이 있다. 그림에서 겹쳐 보인다고 실제 고차원 공간에서도 완전히 같은 것은 아닐 수 있다. 반대로 그림에서 멀어 보여도 다른 주성분에서는 가까울 수 있다.
네 번째 실수는 군집 수를 아무 근거 없이 정하는 것이다. 실무에서는 여러 k를 비교하고, 군집별 특징이 해석 가능한지 확인한다. 필요하면 도메인 지식도 함께 사용한다. 예를 들어 마케팅 팀이 실제로 관리할 수 있는 고객 그룹이 20개가 아니라 4개라면, 모델 성능만이 아니라 활용 가능성도 고려해야 한다.
다섯 번째 실수는 군집 결과로 사람을 단정하는 것이다. 특히 고객, 학생, 환자처럼 사람에 관한 데이터라면 더 조심해야 한다. "이 사람은 위험군이다"라고 단정하기보다 "이 데이터는 특정 패턴을 보이므로 추가 확인이 필요하다"라고 표현해야 한다.
요약
비지도학습은 정답 라벨 없이 데이터의 구조를 찾는 방법이다. 지도학습이 X로 y를 맞히는 데 집중한다면, 비지도학습은 X 안의 패턴, 덩어리, 방향, 이상한 점을 탐색한다.
차원 축소는 많은 특징을 더 적은 축으로 요약한다. PCA는 데이터가 많이 퍼진 방향을 새 축으로 잡아 정보 손실을 줄이면서 차원을 낮춘다. 이를 통해 복잡한 데이터를 2차원 그림으로 확인할 수 있다.
군집은 비슷한 데이터끼리 묶는 방법이다. k-means는 중심점을 정하고, 데이터를 가까운 중심점에 배정하고, 중심점을 다시 갱신하는 과정을 반복한다. 단순하고 유용하지만 군집 수 선택, 스케일 조정, 결과 해석에 주의해야 한다.
가장 중요한 문장은 이것이다. 군집 결과는 정답이 아니라 탐색의 출발점이다.
퀴즈
지도학습과 비지도학습의 가장 큰 차이는 무엇인가?
차원이 많아지면 거리 계산과 시각화가 어려워지는 이유를 자신의 말로 설명해 보라.
PCA는 원래 특징 중 일부를 단순히 고르는 방법인가, 아니면 새로운 축을 만드는 방법인가?
k-means에서
k는 무엇을 의미하는가?k-means를 사용하기 전에 스케일 조정이 중요한 이유는 무엇인가?
군집 결과를 실제 집단의 정답처럼 단정하면 안 되는 이유는 무엇인가?
체크리스트
비지도학습이 정답 라벨 없이 구조를 찾는 방법임을 설명할 수 있다.
지도학습과 비지도학습의 목표 차이를 말할 수 있다.
차원의 저주를 직관적으로 설명할 수 있다.
PCA가 정보를 최대한 보존하며 축을 바꾸어 차원을 줄이는 방법임을 이해했다.
PCA 2차원 시각화를 만들 수 있다.
k-means의 중심점 갱신 과정을 설명할 수 있다.
군집 수
k를 바꾸면 결과가 달라질 수 있음을 확인했다.군집 결과를 정답이 아니라 탐색적 분석의 출발점으로 해석할 수 있다.
다음 장 연결
이번 장에서는 정답이 없는 데이터에서 구조를 찾는 방법을 배웠다. 하지만 모델 결과를 보는 순간 새로운 질문이 생긴다. 이 결과는 누구에게 잘 맞고, 누구에게 잘 맞지 않는가? 특정 집단에 불리한 판단을 만들지는 않는가? 오류는 어디에서 반복되는가?
다음 장에서는 모델의 성능 숫자만 보는 데서 한 걸음 더 나아간다. 오류 분석과 공정성 점검을 통해 모델이 어떤 상황에서 실패하는지, 그리고 그 실패가 특정 집단에 치우치지 않는지 살펴본다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.