K-평균 군집화
scikit-learn
- Python에서의 기계학습을 위해 사용되는 대표적인 라이브러리
import sklearn
인공지능 / 기계학습 / 딥러닝의 구분
인공지능
: 문제 해결을 위하여 인간의 지능을 모사하는 경우
기계학습 (머신러닝)
: 학습과 경험을 거듭할수록 기계가 발전하는 경우
딥러닝
: 신경망을 기초로 하여 학습이 이루어지는 경우
K-평균 군집화
- 사전에 군집의 개수 K를 결정
- 각 군집에는 중심이 존재하게 될 것인데, 중심과 군집 내 데이터 거리 차의 제곱 합을 최소로 하는 최적의 군집을 찾는 방식

K-means 알고리즘으로 주어진 데이터를 군집화하려면?
알고리즘 수행을 위해 필요한 라이브러리
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
plt.figure(figsize = (10,5))
K-means Clustering 수행하기
df = pd.read_csv('menu.csv', engine = 'python')
df_data = df[['가격', '판매량']] # 가격과 판매량을 중심으로 군집화
km = KMeans(n_clusters = 4, random_state = 0) # 군집의 수와 초기 중심 설정
km.fit(df_data) # K-means Clustering 수행
result = km.predict(df_data) # 각 음료를 네 개 군집에 할당
- n_clusters : 군집의 수
- randoms_state : 초기 중심
군집화 결과 출력
km.cluster_centers_
df['CLUSTER'] = result
plt.scatter(df['가격'], df['판매량'], df['CLUSTER'])
plt.show()

밀도 기반 군집화
여러 가지 군집화 방법론
K-means
- 군집의 수를 정해 놓고, 각 군집의 중심에 데이터가 최대한 몰리게끔 군집화
- 원형으로 몰려 있는 데이터가 아닌 경우 부적절하다는 단점
밀도 기반 군집화 (DBSCAN)
- 같은 군집에 속한 데이터들은 끼리끼리 밀도 있게 모여 있을 것이라 가정
- Density-Based Spatial Clustering of Applications with Noise
계층적 군집화
- 유사도가 높은 개체끼리 묶고, 그 군집을 다시 다른 개체와 묶는 과정을 반복
- Dendrogram을 통해 군집화 결과를 시각화할 수 있음
DBSCAN
- 원의 반지름과 원 안에 포함될 최소 점 개수를 사전에 지정
- 최소 점 개수보다 더 많은 점이 포함되면, 원으로 점을 묶음
- 만들어진 원들을 하나로 이어 최종 군집을 결정
- → 어느 군집에도 포함되지 않는 점이 존재할 수 있다 (noise point)
재개발 사업을 위해 주택들을 몇 개의 구획으로 나누고자 하는 00시. 위치가 가까운 주택끼리 밀도 있게 뭉치도록 구획을 결정하려면?
DBSCAN을 이용한 군집화 시작 전 작업
import pandas as pd
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
df = pd.read_csv('housing.csv')
house_position = df[['x', 'y']] # 주택명은 군집화에 불필요하므로 제외
주택 위치 데이터를 바탕으로 DBSCAN 군집화 수행
db = DBSCAN(eps = 10, min_samples = 3) # 원의 반지름과 최소 데이터 수를 제시
cluster_pred = db.fit_predict(house_position) # DBSCAN을 적용하고 군집 번호를 저장
- eps : 원의 반지름 결정
- min_samples : 최소 데이터 수 결정
df = ['CLUSTER'] = cluster_pred
군집화 결과 최종 시각화
x = house_position['x']
y = house_position['y']
plt.scatter(x,y,c = cluster_pred)
- DBSCAN의 결과는 실험을 반복해도 바뀌지 않음

계층적 군집화
계층적 군집화
- 데이터로 주어진 모든 개체끼리의 유사도를 계산 (이상치 배제 X)
- 유사도가 가장 높은 두 개체를 하나의 군집으로 묶음
- 같은 과정을 반복하여, Tree 형태로 최종 군집화 수행
유사도 계산 방법
: Linkage 방법에 따라 군집화 결과가 달라질 수 있다
Single Linkage
: 서로 다른 그룹의 점 사이 거리의 최솟값을 유사도로 간주
Complete Linkage
: 서로 다른 그룹의 점 사이 거리의 최댓값을 유사도로 간주
Average Linkage
: 서로 다른 그룹의 점 사이 거리의 평균값을 유사도로 간주
앞선 주택 문제를 계층적 군집화로 풀어보면?
import pandas as pd
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
df = pd.read_csv('housing.csv')
house_position = df[['x', 'y']]
주택 데이터를 불러오고 위치 열만을 추출
linked = linkage(house_position, 'single')
dendrogram(linked, orientation = 'top')
계층적 군집화를 수행하고 결과를 즉시 시각화

'Python' 카테고리의 다른 글
| [Python] 국문 전처리와 텍스트 마이닝 방법 (0) | 2025.10.02 |
|---|---|
| [Python] BeautifulSoup를 이용한 웹 크롤링 (0) | 2025.10.01 |
| [Python] 데이터 전처리 후 Matplotlib로 시각화 방법 (0) | 2025.09.30 |
| [Python] Pandas를 이용한 데이터 처리 방법 정리 (0) | 2025.09.30 |
| [Python] 재귀 호출과 그 응용 (0) | 2025.09.30 |