Python에서 K-평균 클러스터링 구현: 단계별 가이드
클러스터링은 데이터 포인트를 그들의 고유한 유사성을 기반으로 그룹화할 수 있게 해주는 비지도 머신 러닝의 기본적인 기술입니다. 다양한 클러스터링 알고리즘 중에서 K-평균은 그 단순성과 효율성으로 돋보입니다. 이 기사에서는 Python의 scikit-learn 라이브러리를 사용한 K-평균 클러스터링 구현 과정을 Yellowbrick 라이브러리를 이용한 시각화와 함께 최적의 클러스터 수를 결정하는 방법을 안내합니다.
목차
클러스터링 소개
클러스터링은 데이터셋을 그룹 또는 클러스터로 분할하는 것을 포함하며, 동일한 클러스터 내의 데이터 포인트는 다른 클러스터의 데이터 포인트보다 서로 더 유사합니다. 이 기술은 고객 세분화, 이미지 압축, 이상 탐지 등 다양한 응용 분야에서 널리 사용됩니다.
K-평균 클러스터링은 구현의 용이성과 확장성으로 인해 가장 인기 있는 클러스터링 알고리즘 중 하나입니다. 이는 n개의 데이터 포인트를 k개의 클러스터로 분할하는 것을 목표로 하며, 각 데이터 포인트는 가장 가까운 평균에 속하는 클러스터에 속하게 됩니다.
환경 설정
클러스터링을 시작하기 전에 필요한 Python 라이브러리가 설치되어 있는지 확인해야 합니다. 우리는 다음을 사용할 것입니다:
- 데이터 조작을 위한 pandas
- 수치 연산을 위한 numpy
- 시각화를 위한 matplotlib 및 seaborn
- K-평균 구현을 위한 scikit-learn
- 고급 시각화를 위한 Yellowbrick
다음 명령어를 사용하여 이러한 라이브러리를 설치할 수 있습니다:
1 |
pip install pandas numpy matplotlib seaborn scikit-learn yellowbrick |
데이터셋 생성 및 탐색
데모 목적으로 scikit-learn의 make_blobs 메서드를 사용하여 합성 데이터셋을 생성할 것입니다. 이 메서드는 클러스터링을 위한 등방성 가우시안 블롭을 생성합니다.
1 2 3 4 5 |
import pandas as pd from sklearn.datasets import make_blobs # Create a synthetic dataset X, y = make_blobs(n_samples=300, centers=5, cluster_std=0.60, random_state=0) |
또는 Kaggle에서 사용할 수 있는 맞춤형 데이터셋을 사용할 수 있습니다. 제공된 데이터셋에는 다음이 포함됩니다:
- 고객 ID: 각 고객의 고유 식별자.
- Instagram 방문 점수: 사용자가 0에서 100까지의 척도로 Instagram을 얼마나 자주 방문하는지를 나타냅니다.
- 지출 순위: 사용자의 지출 순위를 나타내며, 역시 0에서 100까지의 척도입니다.
데이터셋 로드:
1 2 3 4 5 6 7 8 |
# Import necessary libraries import pandas as pd # Read the CSV file df = pd.read_csv('path_to_your_dataset.csv') # Display the first 20 rows print(df.head(20)) |
데이터 이해:
- 사용자 ID: 식별자로 사용되며 클러스터링에 직접적으로 사용되지 않습니다.
- Instagram 방문 점수: Instagram 사용자 참여도를 측정합니다.
- 지출 순위: 사용자의 지출 행동을 반영합니다.
엘보우 방법을 통한 최적 클러스터 수 결정
적절한 클러스터 수(k)를 선택하는 것은 효과적인 클러스터링에 매우 중요합니다. 엘보우 방법은 클러스터 수에 따른 클러스터 내 제곱합(WCSS)을 플로팅하고 급격하게 감소율이 변하는 “엘보우 포인트”를 식별함으로써 이를 결정하는 데 도움을 줍니다.
시각화를 위한 Yellowbrick 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from yellowbrick.cluster import KElbowVisualizer from sklearn.cluster import KMeans import matplotlib.pyplot as plt # Prepare the data X = df.iloc[:, [1, 2]].values # Assuming columns 1 and 2 are Instagram Visit Score and Spending Rank # Initialize KMeans kmeans = KMeans() # Use ElbowVisualizer to find the optimal number of clusters visualizer = KElbowVisualizer(kmeans, k=(2,10)) visualizer.fit(X) visualizer.show() |
시각화 해석:
- x-축은 클러스터 수(k)를 나타냅니다.
- y-축은 WCSS를 보여줍니다.
- “엘보우” 포인트는 최적의 k를 나타냅니다. 이 경우, 최적 클러스터 수는 4로 결정되었습니다.
K-평균 클러스터링 구현
최적의 클러스터 수가 확인되었으므로 이제 K-평균 클러스터링을 구현할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from sklearn.cluster import KMeans # Initialize KMeans with the optimal number of clusters kmeans = KMeans(n_clusters=4, random_state=0) # Fit the model to the data kmeans.fit(X) # Retrieve cluster labels labels = kmeans.labels_ # Add the cluster labels to the original dataframe df['Cluster'] = labels print(df.head()) |
주요 파라미터:
- n_clusters: 형성할 클러스터의 수 (엘보우 방법 사용)
- random_state: 결과의 재현성을 보장합니다.
클러스터 시각화:
1 2 3 4 5 6 7 8 9 |
import seaborn as sns # Plotting the clusters sns.scatterplot(x=X[:,0], y=X[:,1], hue=labels, palette='viridis') plt.title('K-Means Clustering Results') plt.xlabel('Instagram Visit Score') plt.ylabel('Spending Rank') plt.legend(title='Cluster') plt.show() |
이 시각화는 데이터 포인트가 어떻게 그룹화되었는지와 클러스터링의 효과를 이해하는 데 도움이 됩니다.
결론 및 다음 단계
이 가이드에서는 Python의 scikit-learn을 사용하여 K-평균 클러스터링을 성공적으로 구현하였으며, Yellowbrick을 사용하여 결과를 시각화하였습니다. 엘보우 방법을 사용하여 최적 클러스터 수를 결정함으로써, 우리의 클러스터링이 의미 있고 효과적이었음을 보장하였습니다.
다음 단계:
- 클러스터 중심 해석: 각 클러스터의 중심을 분석하여 클러스터의 특성을 이해합니다.
- 타겟 마케팅: 클러스터를 이용하여 특정 사용자 그룹을 식별하고 마케팅 캠페인을 타겟팅합니다.
- 고급 클러스터링 기술: 데이터의 다양한 상황에 맞는 DBSCAN 또는 계층적 클러스터링과 같은 다른 클러스터링 알고리즘을 탐색합니다.
- 특징 스케일링: 특징들이 서로 다른 단위나 스케일을 가질 때 클러스터링 성능을 향상시키기 위해 특징 스케일링을 구현합니다.
클러스터링은 데이터 과학자의 도구 상자에서 강력한 도구이며, 이를 숙달함으로써 귀중한 인사이트를 얻고 정보에 기반한 의사 결정을 내릴 수 있습니다.