열람실 좌석을 클러스터링하면 어떠한 결과값이 나올지 궁금
이렇게 만들면, 열람실 좌석의 위치에 따른 선호도를 알 수 있지 않을까 예상
클러스터링은 비슷한 특성을 가진 데이터 포인트들을 그룹화하는 기계학습의 한 분야입니다. 이 방법은 데이터의 구조를 이해하고, 숨겨진 패턴을 발견하며, 의미 있는 인사이트를 추출하는 데 유용합니다. 이 글에서는 클러스터링의 다양한 기법들을 가볍게 소개해 보겠습니다.
마치며
클러스터링은 데이터를 이해하고 구조화하는 데 매우 중요한 도구입니다. 각 클러스터링 기법은 고유한 특성과 사용 케이스를 가지고 있으므로, 실제 문제에 적용하기 전에 데이터의 특성을 고려하여 가장 적합한 방법을 선택하는 것이 중요합니다.
실루엣 값이 가장큰 3으로 결정해서 진행
from sklearn.metrics import silhouette_score
# K값을 4로 설정하고 K-평균 군집 분석 수행
kmeans = KMeans(n_clusters=2, random_state=42)
seat_stats['군집'] = kmeans.fit_predict(seat_stats[['이용횟수', '평균이용시간']])
# 군집화 결과 시각화
plt.figure(figsize=(10, 6))
plt.scatter(seat_stats['이용횟수'], seat_stats['평균이용시간'], c=seat_stats['군집'], cmap='viridis')
plt.title('Cluster of Seats')
plt.xlabel('Usage Frequency')
plt.ylabel('Average Usage Time (minutes)')
plt.colorbar(label='Cluster')
plt.show()
# 군집별 중심점 확인
centers = kmeans.cluster_centers_
# 실루엣 점수 계산
silhouette_avg = silhouette_score(seat_stats[['이용횟수', '평균이용시간']], seat_stats['군집'])
centers, silhouette_avg
유사도 매트릭스를 만들고 진행해야합니다.
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
# 데이터 표준화
scaler = StandardScaler()
features_scaled = scaler.fit_transform(seat_stats[['이용횟수', '평균이용시간']])
# 코사인 유사도 매트릭스 계산
similarity_matrix = cosine_similarity(features_scaled)
# 유사도 매트릭스의 크기 확인
similarity_matrix.shape
from scipy.cluster.hierarchy import dendrogram, linkage
# 계층적 군집화 수행
linked = linkage(similarity_matrix, 'single')
# 덴드로그램 시각화
plt.figure(figsize=(10, 7))
dendrogram(linked,
orientation='top',
labels=seat_stats['좌석번호'].values,
distance_sort='descending',
show_leaf_counts=True)
plt.show()
from scipy.cluster.hierarchy import fcluster
# 군집 수를 기반으로 각 데이터 포인트에 대한 군집 라벨 할당
# 여기서는 덴드로그램을 기반으로 적절해 보이는 군집 수를 선택해야 합니다.
# 4개의 군집을 형성한다고 결정.
cluster_labels = fcluster(linked, t=8, criterion='maxclust')
# 군집 라벨을 좌석번호 데이터에 할당
seat_stats['군집_유사도기반'] = cluster_labels
# 군집 라벨이 할당된 데이터의 처음 몇 줄 확인
seat_stats.head()
# 군집화 결과 시각화
plt.figure(figsize=(10, 6))
plt.scatter(seat_stats['이용횟수'], seat_stats['평균이용시간'], c=seat_stats['군집_유사도기반'], cmap='viridis')
plt.title('Cluster of Seats')
plt.xlabel('Usage Frequency')
plt.ylabel('Average Usage Time (minutes)')
plt.colorbar(label='Cluster')
plt.show()
from sklearn.cluster import DBSCAN
# DBSCAN 군집화 수행
# eps와 min_samples는 데이터의 특성에 따라 조정해야 할 수 있습니다.
dbscan = DBSCAN(eps=0.6, min_samples=5)
seat_stats['군집_DBSCAN'] = dbscan.fit_predict(features_scaled)
# 군집화 결과 시각화
plt.figure(figsize=(10, 6))
plt.scatter(seat_stats['이용횟수'], seat_stats['평균이용시간'], c=seat_stats['군집_DBSCAN'], cmap='viridis', s=50)
plt.title('DBSCAN Clustering of Seats')
plt.xlabel('Usage Frequency')
plt.ylabel('Average Usage Time (minutes)')
plt.colorbar(label='Cluster')
plt.show()
# 군집화 결과 확인
seat_stats.groupby('군집_DBSCAN').size()
from sklearn.cluster import SpectralClustering
# 스펙트럴 군집화 수행
# 군집 수는 앞서 K-평균에서 사용했던 것과 동일하게 4로 설정
spectral_clustering = SpectralClustering(n_clusters=3, affinity='nearest_neighbors', random_state=42)
seat_stats['군집_스펙트럴'] = spectral_clustering.fit_predict(features_scaled)
# 군집화 결과 시각화
plt.figure(figsize=(10, 6))
plt.scatter(seat_stats['이용횟수'], seat_stats['평균이용시간'], c=seat_stats['군집_스펙트럴'], cmap='viridis', s=50)
plt.title('Spectral Clustering of Seats')
plt.xlabel('Usage Frequency')
plt.ylabel('Average Usage Time (minutes)')
plt.colorbar(label='Cluster')
plt.show()
# 군집화 결과 확인
seat_stats.groupby('군집_스펙트럴').size()