ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 73 - Clustering(군집화) - 비계층 군집분석
    Python 데이터 분석 2022. 11. 25. 16:07

     

    Clustering(군집화)

    사전정보(label)가 없는 자료에 대해 컴퓨터 스스로가 패턴을 찾아 여러 개의 군집을 형성함.

    비지도학습.

     

    군집화는 아무런 정보가 없는 상태에서 데이터를 분류하는 방법이다. K-means Clustering 이란 데이터 분류 종류를 K개 라고 했을 때 입력한 데이터 중 임의로 선택된 K 개의 기준과 각 점들의 거리를 오차로 생각하고 각각의 점들은 거리가 가장 가까운 기준에 해당한다고 생각하는 것이다. 그리고 이제 각각 기준에 해당하는 점들 모두의 평균을 새로운 기준으로 갱신해 나가게 된다. 이렇게 해서 가장 적절한 중심점들을 찾는 것이다. 이렇게 학습을 반복하면 데이터를 분류할 수 있게 된다.

     

    계층적 군집분석

    개별 대상 간의 거리에 의하여 가장 가까이 있는 대상들로 부터 시작하여 결합해 감으로써 나무모양의 계층적 구조를 형성해 나가는 방법으로 이 과정에서 군집의 수가 감소한다. 계층적 군집분석은 군집이 형성되는 과정을 정확하게 파악할 수 있다는 장점이 있으나 자료의 크기가 크면 분석하기 어렵다는 단점이 있다.

     

    방법 : 단일결합법, 완전결합법, 평균결합법, 중심결합기준법, Ward법

     

     

    # Clustering(군집화) : 사전정보(label)가 없는 자료에 대해 컴퓨터 스스로가 패턴을 찾아 여러 개의 군집을 형성함.
    # 비지도학습
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rc('font', family = 'malgun gothic')
    
    np.random.seed(123)
    var = ['x', 'y']
    labels = ['점0', '점1', '점2', '점3', '점4']
    x = np.random.random_sample([5, 2]) * 10
    # print(x)
    df = pd.DataFrame(x, columns=var, index=labels)
    print(df)
    
    # plt.scatter(x[:, 0], x[:, 1], s=50, c='blue', marker='o')
    # plt.grid(True)
    # plt.show()
    
    from scipy.spatial.distance import pdist, squareform
    dist_vec = pdist(df, metric='euclidean') # 데이터(배열)에 대해 각 요소간 거리를 계산한 후 1차원 배열로 반환
    print('dist_vec : \n', dist_vec)
    
    row_dist = pd.DataFrame(squareform(dist_vec), columns = labels, index = labels)
    print(row_dist) # squareform을 활용하여 데이터 프레임으로 넣어주면 보기 편하다.
    
    # 계층적 군집분석
    from scipy.cluster.hierarchy import linkage
    row_clusters = linkage(dist_vec, method='complete') # linkage 안에는 데이터 간의 거리 데이터를 넣는다.
    
    df = pd.DataFrame(row_clusters, columns=['군집id1', '군집id2', '거리', '멤버수'])
    print(df)
    
    # dendrogram으로 row_clusters를 시각화
    from scipy.cluster.hierarchy import dendrogram
    low_dend = dendrogram(row_clusters, labels = labels)
    plt.ylabel('유클리드 거리')
    plt.show()
    
    
    
    <console>
               x         y
    점0  6.964692  2.861393
    점1  2.268515  5.513148
    점2  7.194690  4.231065
    점3  9.807642  6.848297
    점4  4.809319  3.921175
    dist_vec : 
     [5.3931329  1.38884785 4.89671004 2.40182631 5.09027885 7.6564396
     2.99834352 3.69830057 2.40541571 5.79234641]
              점0        점1        점2        점3        점4
    점0  0.000000  5.393133  1.388848  4.896710  2.401826
    점1  5.393133  0.000000  5.090279  7.656440  2.998344
    점2  1.388848  5.090279  0.000000  3.698301  2.405416
    점3  4.896710  7.656440  3.698301  0.000000  5.792346
    점4  2.401826  2.998344  2.405416  5.792346  0.000000
       군집id1  군집id2        거리  멤버수
    0    0.0    2.0  1.388848  2.0
    1    4.0    5.0  2.405416  3.0
    2    1.0    6.0  5.393133  4.0
    3    3.0    7.0  7.656440  5.0

     

     

     

     

     

    거리를 보고 어느 점인지 찾아내어 확인 가능

     

    시각화를 해서 어떤 군집이 생기는지 확인 가능하다.

    그러나 거리가 얼마나 떨어져있는지까지는 확인할 수 없다.

     

     

    댓글

Designed by Tistory.