파이썬으로 군집분석하기가 이렇게 쉬워도 되는건가

파이썬을 이용한 군집분석의 단계별 가이드

데이터 준비와 전처리, 최적 군집 수 결정, 군집 모델링, 결과 시각화 등으로 진행되는 군집 분석 과정이 파이썬을 이용하면 아주 쉬워진다. 예전에 SAS, R 등을 이용할 때와 비교하면, 정말 호랑이 담배피던 시절을 얘기하는 꼰대가 된다. 군집분석이 필요할 때 빠르게 이용할 수 있도록 단계별 파이썬 샘플 코드를 정리해 놓았다.

1. 데이터 준비

데이터 분석의 첫 단계는 항상 데이터를 준비하는 것입니다. 우선 필요한 파이썬 라이브러리를 불러옵니다.

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

데이터를 불러오고 필요한 전처리를 수행합니다. 예를 들어, 결측치 처리, 변수 변환 등이 있습니다.

data = pd.read_csv('your_dataset.csv')
data = data.dropna()

2. 데이터 정규화

데이터 정규화는 데이터 과학과 머신 러닝에서 데이터의 범위를 조정하여 더 효율적인 분석과 모델링을 가능하게 하는 중요한 전처리 단계입니다. 다음은 데이터 정규화의 세 가지 주요 방법에 대한 설명입니다.

  1. Min-Max 정규화: 이 방법은 데이터를 0과 1 사이의 범위로 변환합니다. 각 데이터 포인트에서 최솟값을 빼고, 이를 최댓값과 최솟값의 차이로 나누어 계산합니다. 이 방식은 데이터의 상대적 크기와 분포를 유지하면서 모든 데이터를 동일한 범위로 조정합니다. 예를 들어, normalized = (x - min(x)) / (max(x) - min(x)) 식으로 계산합니다. 이는 모든 특성의 중요도를 동등하게 만들어 줍니다.
  2. 표준화 (Z-점수 정규화): 표준화는 데이터의 평균을 0, 표준편차를 1로 조정하는 방법입니다. 이는 각 데이터 포인트에서 평균을 빼고 표준편차로 나누어 계산합니다. 표준화는 데이터가 정규 분포를 따르지 않을 때 특히 유용하며, 이상치에 덜 민감합니다. 예를 들어, standardized = (x - mean(x)) / std(x) 식으로 계산합니다.
  3. 로버스트 정규화 (Robust Scaling): 로버스트 정규화는 중앙값(median)과 사분위수 범위(IQR)를 사용하여 데이터를 스케일링합니다. 이 방법은 이상치의 영향을 최소화하고자 할 때 유용합니다. 데이터에서 중앙값을 빼고, 이를 IQR로 나누어 계산합니다. 예를 들어, robust_scaled = (x - median(x)) / IQR(x) 식으로 계산합니다.

각각의 정규화 방법은 데이터의 특성과 분석 목적에 따라 선택됩니다. Min-Max 정규화는 데이터의 분포를 그대로 유지하면서 범위를 조정할 때 유용하고, 표준화는 데이터의 평균과 분산을 일정하게 유지하고자 할 때 적합합니다. 반면 로버스트 정규화는 이상치의 영향을 크게 받지 않는 데이터 처리에 적합합니다.

군집 분석을 위해서는 변수들의 스케일을 통일시키는 것이 중요한데, 주로  StandardScaler를 사용하여 데이터를 정규화합니다.StandardScaler()는 파이썬의 scikit-learn 라이브러리에서 제공하는 함수로, 데이터를 표준화하는 데 사용됩니다. 이 함수는 각 특성(변수)의 평균을 0, 표준편차를 1로 조정하여 데이터를 정규 분포에 가깝게 변환합니다. 표준화 (Z-점수 정규화)는 특히 다양한 범위의 값들을 가진 특성들을 비교하거나 조합할 때 유용하며, 많은 머신 러닝 알고리즘에서 중요한 전처리 단계입니다. StandardScaler()는 이상치에 민감할 수 있으므로, 이상치가 많은 데이터에는 다른 정규화 방법을 고려할 필요가 있습니다.

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

3. 최적의 군집 수 결정

군집 분석을 수행하기 전에 최적의 군집 수를 결정해야 합니다. 이를 위해 Elbow Method를 사용할 수 있습니다. Elbow Method는 군집 분석에서 최적의 군집 수를 결정하기 위해 사용되는 기법입니다. 이 방법은 다양한 군집 수(K 값)에 대해 각각의 Within-Cluster Sum of Square (WCSS) 값을 계산하고, 이를 시각화합니다. 그래프에서 WCSS가 급격히 감소하는 지점, 즉 ‘팔꿈치’와 유사한 지점을 최적의 군집 수로 선택합니다.

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(scaled_data)
    wcss.append(kmeans.inertia_)

plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

Elbow Method 이외에 군집 수를 결정하는 방법으로 실루엣분석과 덴드로그램 사용 방법이 있습니다. 1) 실루엣 분석(Silhouette Analysis): 실루엣 분석은 군집 내의 데이터 포인트가 얼마나 잘 모여 있는지, 그리고 다른 군집과는 얼마나 잘 분리되어 있는지를 측정합니다. 실루엣 점수는 -1에서 +1 사이의 값을 가지며, 값이 높을수록 군집화가 잘 되어 있다고 볼 수 있습니다. 각각의 군집 수에 대해 실루엣 점수를 계산하여 가장 높은 점수를 보이는 군집 수를 선택합니다. 2) 덴드로그램 사용 (Hierarchical Clustering): 계층적 군집화에서는 덴드로그램이라는 트리 형태의 도표를 사용하여 데이터 포인트 간의 유사성을 시각적으로 표현합니다. 덴드로그램을 분석하여, 군집 간의 거리가 급격히 증가하는 지점을 찾아 군집 수를 결정할 수 있습니다. 이는 특히 계층적 군집화 방법을 사용할 때 효과적인 방법입니다.

일반적으로 대개의 경우에는 Elbow Method를 사용하면 무리가 없습니다.

4. 군집 모델링

Elbow Method를 통해 결정된 최적의 군집 수를 사용하여 군집 모델을 생성합니다.

kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
clusters = kmeans.fit_predict(scaled_data)
data['cluster'] = clusters

5. 군집분석 결과 및 시각화

마지막 단계는 생성된 군집을 분석하고 시각화하는 것입니다. 이를 위해 matplotlib 라이브러리를 활용할 수 있습니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
plt.scatter(data[data['cluster'] == 0]['Feature1'], data[data['cluster'] == 0]['Feature2'], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(data[data['cluster'] == 1]['Feature1'], data[data['cluster'] == 1]['Feature2'], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(data[data['cluster'] == 2]['Feature1'], data[data['cluster'] == 2]['Feature2'], s = 100, c = 'green', label = 'Cluster 3')
plt.title('Clusters of customers')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

군집 분석은 데이터 내 자연스러운 그룹을 찾아내는 강력한 방법입니다. 이 단계별 가이드와 코드를 통해 파이썬에서 군집 분석을 수행하는 방법을 익힐 수 있습니다.