본문 바로가기

코딩/데이터분석

[Python/데이터분석]iris 데이터셋 K-means 알고리즘 적용 및 결과 해석

반응형

  학교에서 '다변량 통계' 과목을 듣고 있는데 '군집 분석'에 대한 과제를 하면서 필요한 내용에 대해 정리한 글

군집 분석은 머신 러닝에서 비지도 학습 알고리즘에 속하는 방법이다. 흔히 클러스터링 알고리즘(Clustering Algorithm)이라고도 하며, 계층적(hierarchical) 방법과 비계층적(Non-hierachical) 방법이 있다.

  계층적 방법은 흔히 개체간 거리 기반의 알고리즘을 말하며, 대표적으로 유클리디안, 마할라노비스, 맨하탄, 체비세프, 민코프스키 계산 방법이 있다. 

  비계층적 방법은 이번 포스팅에서 다룰 K-means 알고리즘을 말하며, 일반적으로 데이터셋에서 구분 할 class의 수를 알고 있는 경우 많이 활용한다. 이번 포스팅에서는 K-means 알고리즘에 대한 간단한 정리와 실제 iris dataset에 적용하여 결과를 해석해보려고 함.

 

1. K-means 알고리즘

 

출처 : https://towardsdatascience.com/k-means-a-complete-introduction-1702af9cd8c

  K-means 알고리즘은 비지도 학습(Unsupervised-Learning) 알고리즘 중 하나이고, 거리 기반 알고리즘이다. 알고리즘 초기에 중심점(Centroid)를 군집수(Cluster) 만큼 랜덤으로 선택 후, 가까운 데이터 포인트들을 하나씩 cluster로 포함시키는 알고리즘이다.

 

알고리즘의 진행 순서는 아래와 같다.

 

1)  Cluster 개수만큼 중심점(Centroid) 선택 -> 알고리즘에서는 랜덤으로 선택한다.

2)  각 데이터들을 가장 가까운 중심점으로 할당한다.(Cluster를 형성한다.)

3) 데이터가 추가 된 Cluster를 기준으로 새로운 중심점을 업데이트한다.

4) 2번째 3번째 단계를 진행하여 중심점이 수렴할 때까지 알고리즘을 반복한다.

 

  위와 같은 알고리즘이다 보니 주의해야할 부분은 있다. K-means 알고리즘뿐 만 아니라 거리 기반 알고리즘에 해당하는 말이겠지만, 데이터의 스케일이 다른 경우 클러스터링이 제대로 수행되지 않을 수 있다. 따라서, K-means 진행시에는 데이터 표준화를 진행 후, 알고리즘을 수행하는 것이 좋다.

  또한, K-means 알고리즘은 이상치(outlier) 데이터가 어떤 클러스터에도 속하지 않는 경우가 나올 수가 있다. 이러한 경우에는 별도의 처리 방식이 필요하다. 해당 데이터셋의 도메인 지식이 있다면 데이터셋에서 이상치를 제거하거나 다른 값으로 대체한다. 또는, 알고리즘 상에서 설정한 cluster 개수를 늘려서 별도의 cluster로 형성하게끔도 할 수 있다.

 

  아래 2번에서는 파이썬을 통해 K-means 알고리즘을 구현해볼 것이다. 데이터셋은 iris dataset을 사용하고 결과를 간단해 해석해보려 한다.

 

 

2. IRIS dataset에 K-means 알고리즘 적용 결과

 

<코드>

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Iris 데이터 로드
iris = datasets.load_iris()
X = iris.data

# 데이터 스케일링 (표준화)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 군집 개수 지정
n_clusters = 3

# K-Means 군집 모델 초기화
kmeans = KMeans(n_clusters=n_clusters, random_state=42)

# 모든 특성 조합에 대한 시각화
feature_combinations = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

plt.figure(figsize=(16, 12))

for i, (feature1, feature2) in enumerate(feature_combinations, 1):
    plt.subplot(2, 3, i)
    
    # 군집 모델 학습
    kmeans.fit(X_scaled[:, [feature1, feature2]])

    # 각 데이터 포인트의 군집 할당 결과 가져오기
    labels = kmeans.labels_

    # K-Means 군집 중심 좌표 가져오기
    cluster_centers = kmeans.cluster_centers_

    for j in range(n_clusters):
        plt.scatter(X_scaled[labels == j, feature1], X_scaled[labels == j, feature2], label=f'Cluster {j + 1}')

    plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='black', s=200, label='Centroids')
    plt.xlabel(f'Feature {feature1 + 1}')
    plt.ylabel(f'Feature {feature2 + 1}')
    plt.legend()

plt.tight_layout()
plt.show()

 

<결과>

 

  Iris dataset은 feature가 4개인 데이터셋이다. 벚꽃의 품종을 구분하는 데이터셋으로 cluster=3이라는 것을 이미 알고 있다. 코드 상에서 cluster=3으로 선정하고 2개의 Feature를 선택하여 모든 경우의 수를 시각화해보았다. 거리 기반 알고리즘이므로 sklearn의 StandardScaler를 통해 표준화를 진행했다. 아래에서 표준화 여부에 따른 클러스터 결과도 살펴볼 것이다. 

 

- 검은 점은 중심점(Centroid)를 나타낸다. 중심점을 기준으로 클러스터가 형성된 것을 확인할 수 있다.

- Feature3가 들어간 시각화에서 명확히 클러스터가 구분되는 것을 확인할 수 있다.(Feature3 : Petal Length)

- 클러스터간 명확한 데이터 분포를 확인하기 위해 box plot을 그려보았다.

 

<코드>

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import datasets

# Iris 데이터 로드
iris = datasets.load_iris()
X = iris.data
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)

# K-Means 군집 모델 초기화
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)

# 각 데이터 포인트의 군집 할당 결과 가져오기
labels = kmeans.labels_

# 결과를 데이터프레임에 추가
data['Cluster'] = labels

# 각 군집에 대한 box plot 그리기
data.boxplot(by='Cluster', layout=(1, 4), figsize=(12, 4))
plt.suptitle("Box plots for Each Cluster")
plt.subplots_adjust(top=0.85)
plt.show()

 

<결과>

 

 

  - box plot을 확인하면 클러스터간 명확히 구분되어지는 기준 feature는 petal length인 것을 확인할 수 있다.

  - 즉, 데이터셋에서 모든 feature를 사용하지 않고 특정 feature를 잘 선택하면 유효한 클러스터링 결과를 낼 수 있다.

 

  

  표준화에 따른 차이가 있나 확인해보고 싶어 Feature3(Petal Lenghth), Feature4(Petal Width)의 클러스터링 시각화 자료를 비교해보았다.

 

- K-means 알고리즘에서 동일한 초기값(중심점)을 선택하기 위해 random state = 42 입력

- StandardScaler를 진행했을 때, 좀더 명확히 Cluster가 구분되는 것을 확인할 수 있음.

 

 

 

4. 결과 요약

 

1) RIS 데이터셋에 K-means 알고리즘 사용시 feature3(Petal Length)가 들어간 시각화에서 클러스터(꽃의 종류)가 명확히 구분되는 양상을 보임.

2) Box plot을 통해 각 클러스터에 대한 데이터의 분포를 시각화해보면 실제 petal length가 다른 feature에 비해 데이터의

분포가 명확히 구분되는 것을 확인할 수 있음.

3) 군집 분석은 모든 feature가 관여하지 않아도 특정 feature를 잘 선정하면 유효한 클러스터링이 가능하다는 것을 알 수 있음.

4) 거리 기반 알고리즘으이므로 feature간 scale이 다르면 결과가 제대로 안나올 수 있음. 데이터 표준화 진행 후, 군집 분석을 진행하는 것이 좀더 성능이 좋은 결과를 보임

5) PCA(주성분 분석)과 같은 기법을 통해 차원 축소를 진행하고 군집 분석을 진행하면 좀더 효율적으로 데이터 분석이 가능할 수 있음.

728x90