Python 및 Scikit-Learn PlatoBlockchain 데이터 인텔리전스를 사용한 계층적 클러스터링에 대한 최종 가이드입니다. 수직 검색. 일체 포함.

Python 및 Scikit-Learn을 사용한 계층적 클러스터링에 대한 최종 가이드

개요

이 가이드에서는 구현에 중점을 둘 것입니다. Scikit-Learn을 사용한 계층적 클러스터링 알고리즘 마케팅 문제를 해결하기 위해

가이드를 읽고 나면 다음 사항을 이해할 수 있습니다.

  • 계층적 클러스터링을 적용하는 경우
  • 클러스터링에 적합한지 이해하기 위해 데이터 세트를 시각화하는 방법
  • 데이터 세트를 기반으로 기능을 사전 처리하고 새로운 기능을 엔지니어링하는 방법
  • PCA를 사용하여 데이터 세트의 차원을 줄이는 방법
  • 그룹을 분리하기 위해 덴드로그램을 사용하고 읽는 방법
  • 덴드로그램과 클러스터링 알고리즘에 적용되는 다양한 연결 방법과 거리 측정법은 무엇입니까?
  • 응집 및 분할 클러스터링 전략은 무엇이며 작동 방식
  • Scikit-Learn으로 집합적 계층적 클러스터링을 구현하는 방법
  • 클러스터링 알고리즘을 다룰 때 가장 자주 발생하는 문제와 해결 방법

참고 : 이 가이드의 모든 코드가 포함된 노트북을 다운로드할 수 있습니다. 여기에서 지금 확인해 보세요..

자극

마케팅 부서와 상호 작용하는 데이터 과학 팀의 일부인 시나리오를 상상해 보십시오. 마케팅은 한동안 고객의 쇼핑 데이터를 수집해 왔으며 수집된 데이터를 기반으로 고객 간의 유사성. 이러한 유사성은 고객을 그룹으로 나누고 고객 그룹을 갖는 것은 캠페인, 판촉, 전환을 타겟팅하고 더 나은 고객 관계를 구축하는 데 도움이 됩니다.

유사한 고객을 파악하는 데 도움이 될 수 있는 방법이 있습니까? 그들 중 몇 명이 같은 그룹에 속합니까? 그리고 얼마나 많은 다른 그룹이 있습니까?

이러한 질문에 답하는 한 가지 방법은 다음을 사용하는 것입니다. 클러스터링 K-Means, DBSCAN, Hierarchical Clustering 등과 같은 알고리즘. 일반적으로 클러스터링 알고리즘은 데이터 포인트 간의 유사점을 찾아 그룹화합니다.

이 경우 마케팅 데이터는 상당히 작습니다. 우리는 단 200명의 고객에 대한 정보를 가지고 있습니다. 마케팅 팀을 고려할 때 클러스터 수를 기반으로 결정이 어떻게 내려졌는지 명확하게 설명할 수 있으므로 알고리즘이 실제로 작동하는 방식을 설명하는 것이 중요합니다.

우리의 데이터가 작고 설명 가능성이 주요 요인이기 때문에, 우리는 활용할 수 있습니다 계층 적 클러스터링 이 문제를 해결하기 위해. 이 과정은 라고도 계층적 클러스터링 분석(HCA).

HCA의 장점 중 하나는 해석 가능하고 작은 데이터 세트에서 잘 작동한다는 것입니다.

이 시나리오에서 고려해야 할 또 다른 사항은 HCA가 감독되지 않은 연산. 데이터를 그룹화할 때 사용자가 특정 그룹에 속하는지 올바르게 식별하는지 확인할 방법이 없습니다(그룹을 모릅니다). 결과를 비교할 레이블이 없습니다. 그룹을 올바르게 식별했다면 나중에 마케팅 부서에서 매일 확인하게 됩니다(ROI, 전환율 등의 측정항목으로 측정).

해결하려는 문제와 해결 방법을 이해했으므로 이제 데이터를 살펴보기 시작할 수 있습니다.

간략한 탐색적 데이터 분석

참고 : 이 가이드에 사용된 데이터 세트를 다운로드할 수 있습니다. 여기에서 지금 확인해 보세요..

데이터세트를 다운로드한 후 CSV(쉼표로 구분된 값) 라는 파일 shopping-data.csv. 데이터를 더 쉽게 탐색하고 조작할 수 있도록 데이터를 DataFrame 팬더를 사용하여:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

마케팅은 200명의 고객 기록을 수집했다고 말했다. 다운로드한 데이터가 200행으로 완전한지 확인할 수 있습니다. shape 기인하다. 각각의 행과 열이 몇 개인지 알려줍니다.

customer_data.shape

결과 :

(200, 5)

엄청난! 데이터는 200개 행으로 완료됩니다. (클라이언트 기록) 그리고 우리는 또한 5개의 열이 있습니다 (특징). 마케팅 부서가 고객으로부터 수집한 특성을 확인하기 위해 열 이름을 볼 수 있습니다. columns 기인하다. 그렇게 하려면 다음을 실행하십시오.

customer_data.columns

위의 스크립트는 다음을 반환합니다.

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

여기에서 우리는 마케팅이 CustomerID, 모였다 Genre, Age, Annual Income (만 달러), 그리고 Spending Score 1명의 고객 각각에 대해 100에서 200으로 이동합니다. 설명을 요청했을 때, 그들은 Spending Score 열은 한 사람이 쇼핑몰에서 얼마나 자주 돈을 쓰는지를 1에서 100까지 나타냅니다. 즉, 고객의 점수가 0이면 이 사람은 돈을 쓰지 않고 점수가 100이면 방금 발견한 것입니다. 가장 높은 지출.

이 점수의 분포를 간단히 살펴보고 데이터세트에서 사용자의 지출 습관을 조사해 보겠습니다. 그곳이 바로 판다스 hist() 방법이 도움이 됩니다.

customer_data['Spending Score (1-100)'].hist()

IMG

히스토그램을 보면 35명 이상의 고객이 다음 사이의 점수를 가지고 있음을 알 수 있습니다. 4060, 다음 사이의 점수가 25 미만인 경우 7080. 그래서 대부분의 고객들은 균형 잡힌 소비, 중간에서 고액 지출자가 그 뒤를 이었습니다. 우리는 또한 뒤에 줄이 있는 것을 볼 수 있습니다 0, 분포의 왼쪽에, 분포의 오른쪽에 100 이전의 또 다른 줄. 이 공백은 아마도 분포에 비지급자가 포함되지 않았음을 의미하며, 이는 0, 그리고 100.

그것이 사실인지 확인하기 위해 분포의 최소값과 최대값을 볼 수 있습니다. 이러한 값은 기술 통계의 일부로 쉽게 찾을 수 있으므로 다음을 사용할 수 있습니다. describe() 다른 숫자 값 분포를 이해하는 방법:


customer_data.describe().transpose()

이렇게 하면 데이터 세트의 다른 값 분포를 읽을 수 있는 테이블이 제공됩니다.

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

우리의 가설이 확인되었습니다. 그만큼 min 가치 Spending Score is 1 그리고 최대값은 99. 그래서 우리는 가지고 있지 않습니다 0 or 100 득점자. 그런 다음 전치 된 다른 열을 살펴 보겠습니다. describe 테이블. 볼 때 meanstd 열, 우리는 그것을 볼 수 있습니다 Age 전에, mean is 38.85 그리고 std13.97. 에 대해서도 마찬가지입니다. Annual Income,와 mean of 60.56std 26.26등에 대한 Spending Scoremean of 50std of 25.82. 모든 기능에 대해 mean 를 나타내는 표준편차와 거리가 멀다. 우리의 데이터는 높은 변동성을 가지고 있습니다.

데이터가 어떻게 변하는지 더 잘 이해하기 위해 Annual Income 분포:

customer_data['Annual Income (k$)'].hist()

우리에게 줄 것입니다:

IMG

히스토그램에서 35명 이상의 고객이 있는 대부분의 데이터가 숫자 근처에 집중되어 있음을 알 수 있습니다. 60, 우리 mean, 가로축. 하지만 분포의 끝으로 갈수록 어떤 일이 발생할까요? 왼쪽으로 갈수록 평균 $60.560에서 다음 값은 평균($34.300)에서 표준 변동($60.560)을 뺀 $26.260입니다. 데이터 분포의 왼쪽으로 더 멀리 가면 유사한 규칙이 적용되며 현재 값($26.260)에서 표준 변동($34.300)을 뺍니다. 따라서 $8.040의 값을 얻게 됩니다. 데이터가 어떻게 $60에서 $8로 빠르게 증가했는지 확인하세요. 매번 $26.260씩 "점프"합니다. 이는 매우 다양하므로 변동성이 매우 높습니다.

IMG

대부분의 클러스터링 알고리즘의 거리 측정은 데이터 크기에 민감하기 때문에 데이터의 가변성과 크기는 클러스터링 분석에서 중요합니다. 크기의 차이는 한 점이 다른 점에 실제보다 더 가깝거나 더 멀리 보이도록 하여 데이터의 실제 그룹화를 왜곡함으로써 클러스터링 결과를 변경할 수 있습니다.

지금까지 데이터의 모양, 일부 분포 및 기술 통계를 살펴보았습니다. Pandas를 사용하면 데이터 유형을 나열하고 200개 행 모두가 채워졌는지 또는 일부 행이 있는지 확인할 수도 있습니다. null 값 :

customer_data.info()

결과 :

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

여기에서 우리는 없음을 알 수 있습니다. null 데이터에 값이 있고 범주형 열이 하나만 있습니다. Genre. 이 단계에서 클러스터링 모델에 어떤 기능이 추가되면 좋을지 염두에 두는 것이 중요합니다. Genre 열을 모델에 추가하려면 해당 값을 다음에서 변환해야 합니다. 범주 형수치의.

방법을 보자. Genre 데이터의 처음 5개 값을 간단히 살펴봄으로써 채워집니다.

customer_data.head() 

결과 :

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

만 있는 것 같다. FemaleMale 카테고리. 우리는 그것의 고유한 가치를 살펴봄으로써 그것을 확신할 수 있습니다. unique:

customer_data['Genre'].unique()

이것은 우리의 가정을 확인시켜줍니다:

array(['Male', 'Female'], dtype=object)

지금까지 우리는 두 가지 장르만 있다는 것을 알고 있습니다. 우리 모델에서 이 기능을 사용할 계획이라면, Male 로 변환될 수 있습니다. 0Female1. 장르 간의 비율을 확인하여 균형이 맞는지 확인하는 것도 중요합니다. 우리는 그것을 할 수 있습니다 value_counts() 방법과 그 주장 normalize=True 사이의 백분율을 표시하려면 MaleFemale:

customer_data['Genre'].value_counts(normalize=True)

이 결과는 다음과 같습니다.

Female    0.56
Male      0.44
Name: Genre, dtype: float64

데이터 세트에는 여성의 56%와 남성의 44%가 있습니다. 그들 사이의 차이는 겨우 16%이고 우리의 데이터는 50/50이 아니지만 충분히 균형 문제를 일으키지 않도록. 결과가 70/30, 60/40인 경우 더 많은 데이터를 수집하거나 해당 비율을 보다 균형 있게 만들기 위해 일종의 데이터 증강 기술을 사용하는 것이 필요할 수 있습니다.

지금까지는 모든 기능이 있지만 Age, 간략하게 조사했습니다. 어떤 우려에 Age, 일반적으로 연령 그룹을 기반으로 고객을 분류할 수 있도록 빈으로 나누는 것이 흥미롭습니다. 그렇게 하면 모델에 연령 범주를 추가하기 전에 연령 범주를 하나의 숫자로 변환해야 합니다. 그렇게 하면 15-20년이라는 범주를 사용하는 대신에 고객이 몇 명인지 계산합니다. 15-20 카테고리, 그리고 그것은 15-20.

조언: 이 가이드에서는 간략한 탐색적 데이터 분석만 제시합니다. 하지만 더 멀리 갈 수 있고 더 멀리 가야 합니다. 장르별, 연령별 소득차이와 점수차이가 있는지 확인할 수 있습니다. 이는 분석을 강화할 뿐만 아니라 더 나은 모델 결과로 이어집니다. 탐색적 데이터 분석에 대해 더 자세히 알아보려면 다음을 확인하세요. EDA 장 "실습 주택 가격 예측 – Python의 기계 학습" 가이드 프로젝트.

범주형 또는 범주형으로 수행할 수 있는 작업에 대해 추측한 후 GenreAge 열에서 논의한 내용을 적용해 보겠습니다.

인코딩 변수 및 기능 엔지니어링

나누어서 시작하자 Age 10으로 다양한 그룹으로 나누면 20-30, 30-40, 40-50 등이 됩니다. 가장 어린 고객이 15세이므로 데이터에서 가장 나이가 많은 고객의 나이인 15에서 시작하여 70에서 끝낼 수 있습니다. 15에서 시작하여 70에서 끝나는 간격은 15-20, 20-30, 30-40, 40-50, 50-60, 60-70입니다.

그룹화하거나 큰 상자 Age 이 간격에 값을 입력하면 Pandas를 사용할 수 있습니다. cut() 방법을 사용하여 빈으로 자른 다음 빈을 새 저장소에 할당합니다. Age Groups 기둥:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

결과 :

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

열 값을 볼 때 6개의 범주를 지정하고 모든 구간화된 데이터 간격을 표시하는 행도 있습니다. 이런 식으로 이전의 수치 데이터를 분류하고 새로운 데이터를 생성했습니다. Age Groups 기능.

각 범주에 몇 명의 고객이 있습니까? 열을 그룹화하고 groupby()count():

customer_data.groupby('Age Groups')['Age Groups'].count()

결과 :

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

대부분의 고객이 30~40대, 20~30대, 40~50대가 뒤를 잇는 것을 쉽게 알 수 있습니다. 이는 마케팅 부서에도 좋은 정보입니다.

현재 두 개의 범주형 변수가 있습니다. AgeGenre, 우리 모델에서 사용할 수 있도록 숫자로 변환해야 합니다. 변형을 만드는 방법에는 여러 가지가 있습니다. 우리는 Pandas를 사용할 것입니다. get_dummies() 각 간격과 장르에 대해 새 열을 만든 다음 해당 값을 0과 1로 채우는 메서드-이 종류의 작업을 호출합니다. 원 핫 인코딩. 어떻게 보이는지 봅시다:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

이렇게 하면 결과 테이블의 미리 보기가 제공됩니다.

IMG

출력을 통해 열이 Genre 열로 분할되었습니다 - Genre_FemaleGenre_Male. 고객이 여성일 때, Genre_Female 동일하다 1, 고객이 남성인 경우 0.

또한, Age Groups 열은 다음과 같이 각 간격에 대해 하나씩 6개의 열로 분할되었습니다. Age Groups_(15, 20], Age Groups_(20, 30], 등등. 와 같은 방법으로 Genre, 고객이 18세일 때, Age Groups_(15, 20] 가치는 1 다른 모든 열의 값은 0.

XNUMXD덴탈의 이점 원-핫 인코딩의 경우 열 값을 간단하게 표시할 수 있으며 어떤 일이 일어나고 있는지 이해하기 쉽습니다. 불리 이미 가지고 있던 열을 합해 8개의 열을 추가로 만들었습니다.

경고: 원-핫 인코딩된 열의 수가 행의 수를 초과하는 데이터 세트가 있는 경우 데이터 차원 문제를 피하기 위해 다른 인코딩 방법을 사용하는 것이 가장 좋습니다.

원-핫 인코딩은 또한 데이터에 0을 추가하여 더 희소하게 만듭니다. 이는 데이터 희소성에 민감한 일부 알고리즘에 문제가 될 수 있습니다.

클러스터링 요구 사항의 경우 원 핫 인코딩이 작동하는 것 같습니다. 그러나 클러스터링할 개별 그룹이 실제로 있는지 확인하기 위해 데이터를 플롯할 수 있습니다.

기본 플로팅 및 차원 축소

데이터 세트에는 11개의 열이 있으며 해당 데이터를 시각화할 수 있는 몇 가지 방법이 있습니다. 첫 번째는 10차원으로 플롯하는 것입니다(행운을 빕니다). 열 때문에 Customer_ID 열은 고려되지 않습니다. 두 번째는 초기 수치적 특징을 플로팅하는 것이고, 세 번째는 10개의 특징을 2로 변환하여 차원 축소를 수행하는 것입니다.

각 데이터 쌍 플로팅

10차원을 그리는 것은 약간 불가능하기 때문에 우리는 두 번째 접근 방식을 택할 것입니다. 초기 특징을 그릴 것입니다. 클러스터링 분석을 위해 두 가지를 선택할 수 있습니다. 결합된 모든 데이터 쌍을 볼 수 있는 한 가지 방법은 Seaborn을 사용하는 것입니다. pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

다음을 표시합니다.

IMG

한 눈에 데이터 그룹이 있는 것처럼 보이는 산점도를 찾을 수 있습니다. 흥미로운 것은 다음을 결합한 산점도입니다. Annual IncomeSpending Score. 다른 변수 산점도 사이에는 명확한 구분이 없습니다. 기껏해야 두 개의 서로 다른 점 집중이 있다고 말할 수 있습니다. Spending Score vs Age 산포도.

다음으로 구성된 두 산점도 Annual IncomeSpending Score 본질적으로 동일합니다. x축과 y축이 바뀌었기 때문에 두 번 볼 수 있습니다. 그들 중 하나를 살펴봄으로써 우리는 다섯 개의 다른 그룹으로 보이는 것을 볼 수 있습니다. Seaborn을 사용하여 이 두 가지 기능만 플로팅해 보겠습니다. scatterplot() 자세히 살펴보기:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

IMG

자세히 보면 5가지 데이터 그룹을 확실히 구분할 수 있습니다. XNUMX년에 얼마를 벌고 얼마를 쓰는지에 따라 고객이 클러스터링될 수 있는 것 같습니다. 이것은 우리 분석의 또 다른 관련 포인트입니다. 고객을 그룹화하기 위해 두 가지 기능만 고려하는 것이 중요합니다. 우리가 그들에 대해 가지고 있는 다른 정보는 방정식에 들어가지 않습니다. 이는 분석에 의미를 부여합니다. 고객이 얼마를 벌고 지출하는지 알면 필요한 유사성을 쉽게 찾을 수 있습니다.

IMG

대단해! 지금까지 우리는 이미 모델을 구축하기 위한 두 개의 변수를 가지고 있습니다. 이것이 나타내는 것 외에도 모델을 더 단순하고 간결하며 설명하기 쉽게 만듭니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

참고 : 데이터 과학은 일반적으로 가능한 한 간단한 접근 방식을 선호합니다. 비즈니스를 위해 설명하기가 더 쉬울 뿐만 아니라 더 직접적이기 때문에 2가지 기능과 설명 가능한 모델을 통해 모델이 무엇을 하고 있고 어떻게 작동하는지 명확합니다.

PCA 사용 후 데이터 플로팅

두 번째 접근 방식이 가장 좋은 것 같지만 세 번째 접근 방식도 살펴보겠습니다. 데이터의 차원이 너무 많아 데이터를 표시할 수 없거나 데이터 농도가 없거나 그룹으로 명확하게 구분되어 있지 않을 때 유용할 수 있습니다. 이러한 상황이 발생하면 이라는 방법으로 데이터 차원을 줄이는 것이 좋습니다. 주성분 분석 (PCA).

참고 : 대부분의 사람들은 시각화 전에 차원 축소를 위해 PCA를 사용합니다. 다음과 같이 클러스터링 전에 데이터 시각화에 도움이 되는 다른 방법이 있습니다. 잡음이 있는 응용 프로그램의 밀도 기반 공간 클러스터링(DBSCAN)자기 조직화 지도(SOM) 클러스터링. 둘 다 클러스터링 알고리즘이지만 데이터 시각화에도 사용할 수 있습니다. 클러스터링 분석에는 황금 표준이 없기 때문에 다양한 시각화와 다양한 알고리즘을 비교하는 것이 중요합니다.

PCA는 가능한 한 많은 정보를 보존하면서 데이터의 크기를 줄입니다. 먼저 PCA가 작동하는 방식에 대한 아이디어를 얻은 다음 데이터를 줄일 데이터 차원의 수를 선택할 수 있습니다.

각 기능 쌍에 대해 PCA는 한 변수의 더 큰 값이 다른 변수의 더 큰 값과 일치하는지 확인하고 더 작은 값에 대해서도 동일한 작업을 수행합니다. 따라서 본질적으로 특성 값이 서로 얼마나 다른지 계산합니다. 공분산. 그 결과는 행렬로 구성되어 다음을 얻습니다. 공분산 행렬.

공분산 행렬을 얻은 후 PCA는 이를 가장 잘 설명하는 기능의 선형 조합을 찾으려고 시도합니다. 이를 설명하는 기능을 식별할 때까지 선형 모델에 적합합니다. 최고 편차의 양.

주의 사항: PCA는 선형 변환이며 선형성은 데이터의 규모에 민감합니다. 따라서 PCA는 모든 데이터 값이 동일한 척도에 있을 때 가장 잘 작동합니다. 이것은 열을 빼서 수행할 수 있습니다. 평균 값에서 결과를 표준 편차로 나눕니다. 라고 데이터 표준화. PCA를 사용하기 전에 데이터가 확장되었는지 확인하십시오! 방법을 잘 모르겠다면 다음을 읽어보십시오. "Python의 기계 학습을 위한 Scikit-Learn을 사용한 기능 확장 데이터"!

최적의 선(선형 조합)이 발견되면 PCA는 다음과 같은 축의 방향을 얻습니다. 고유 벡터, 및 선형 계수, 고유값. 고유 벡터와 고유값(또는 축 방향과 계수)의 조합은 다음과 같습니다. 주요 구성 요소 PCA의. 그리고 이때 우리는 각 특징의 설명된 분산을 기반으로 차원 수를 선택할 수 있으며, 설명하는 분산의 정도에 따라 어떤 주성분을 유지하거나 폐기할지 이해함으로써 차원 수를 선택할 수 있습니다.

주성분을 얻은 후 PCA는 고유 벡터를 사용하여 데이터를 원래 축에서 주성분이 나타내는 축으로 방향을 바꾸는 기능 벡터를 형성합니다. 이것이 데이터 차원이 축소되는 방식입니다.

참고 : 여기서 고려해야 할 중요한 세부 사항 중 하나는 선형 특성으로 인해 PCA가 설명된 분산의 대부분을 첫 번째 주성분에 집중한다는 것입니다. 따라서 설명된 분산을 볼 때 일반적으로 처음 두 구성 요소로 충분합니다. 그러나 어떤 경우에는 오해의 소지가 있을 수 있으므로 클러스터링할 때 유사한 결과를 유지하는지 확인하기 위해 다른 플롯과 알고리즘을 계속 비교하십시오.

PCA를 적용하기 전에 다음 중 하나를 선택해야 합니다. Age 열 또는 Age Groups 이전에 원-핫 인코딩된 데이터의 열입니다. 두 열 모두 동일한 정보를 나타내므로 두 열을 도입하면 데이터 분산에 영향을 줍니다. 만약 Age Groups 열이 선택되면 간단히 제거하십시오. Age Pandas를 사용하는 열 drop() 메소드에 재할당 customer_data_oh 변하기 쉬운:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

이제 데이터에는 10개의 열이 있습니다. 즉, 열별로 하나의 주성분을 얻을 수 있으며, 하나의 새로운 차원을 도입하면 데이터 분산이 얼마나 더 많이 설명되는지 측정하여 사용할 주성분 수를 선택할 수 있습니다.

Scikit-Learn으로 해보자 PCA. 다음과 같이 주어진 각 차원의 설명된 분산을 계산합니다. explained_variance_ratio_ , 다음으로 누적 합계를 확인합니다. cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

누적 설명 분산은 다음과 같습니다.

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

첫 번째 차원이 데이터의 50%를 설명하고 두 번째 차원과 결합하면 99%를 설명한다는 것을 알 수 있습니다. 이것은 처음 2개의 차원이 이미 데이터의 99%를 설명한다는 것을 의미합니다. 따라서 2개의 구성 요소가 있는 PCA를 적용하고 주요 구성 요소를 가져와 플롯할 수 있습니다.

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

IMG

PCA 후 데이터 플롯은 PCA 없이 데이터의 두 열만 사용하는 플롯과 매우 유사합니다. 그룹을 형성하는 점이 이전보다 PCA 이후에 더 가깝고 조금 더 집중되어 있음을 알 수 있습니다.

IMG

덴드로그램으로 계층 구조 시각화하기

지금까지 데이터, 원-핫 인코딩된 범주 열을 탐색하고 클러스터링에 적합한 열을 결정하고 데이터 차원을 줄였습니다. 플롯은 데이터에 5개의 클러스터가 있음을 나타내지만 포인트 간의 관계를 시각화하고 클러스터 수를 결정하는 데 도움이 되는 다른 방법도 있습니다. 덴드로 그램 (일반적으로 dendogram으로 철자가 틀리는 경우). 덴드로 방법 나무 라틴어로.

XNUMXD덴탈의 덴드로 그램 데이터 세트에서 포인트를 연결한 결과입니다. 계층적 클러스터링 프로세스를 시각적으로 표현한 것입니다. 계층적 클러스터링 프로세스는 어떻게 작동합니까? 글쎄요... 그것은 다릅니다. 아마도 데이터 과학에서 이미 많이 들어본 답변일 것입니다.

계층적 클러스터링 이해

계층적 클러스터링 알고리즘(HCA) 포인트를 연결하고 클러스터를 찾기 시작하면 먼저 포인트를 2개의 큰 그룹으로 분할한 다음 이 두 그룹을 더 작은 2개의 그룹으로 분할하여 총 4개의 그룹을 가질 수 있습니다. 분열적인하향식 보다 더 전체적인 접근 방식으로 피할 수 있습니다.

또는 반대로 할 수 있습니다. 모든 데이터 포인트를 보고 서로 더 가까운 2개의 포인트를 찾아 링크한 다음 연결된 포인트에 가장 가까운 다른 포인트를 찾고 계속해서 2개의 그룹을 구축할 수 있습니다. ~로부터 상향식 (bottom-up). 어느 것이 응집체 접근 방식을 개발할 것입니다.

집합적 계층적 클러스터링을 수행하는 단계

응집적 접근을 더욱 명확하게 하기 위해 다음 단계가 있습니다. AHC(Agglomerative Hierarchical Clustering) 연산:

  1. 처음에는 각 데이터 포인트를 하나의 클러스터로 취급합니다. 따라서 시작 시 클러스터 수는 K가 될 것이며 K는 데이터 포인트 수를 나타내는 정수입니다.
  2. 가장 가까운 두 데이터 포인트를 결합하여 K-1 클러스터를 생성하여 클러스터를 형성합니다.
  3. 두 개의 가장 가까운 클러스터를 결합하여 더 많은 클러스터를 형성하여 K-2 클러스터를 생성합니다.
  4. 하나의 큰 클러스터가 형성될 때까지 위의 세 단계를 반복합니다.

주의 사항: 단순화를 위해 2단계와 3단계에서 "가장 가까운 XNUMX개의" 데이터 포인트를 말합니다. 하지만 포인트를 연결하는 더 많은 방법이 있습니다.

ACH 알고리즘의 단계를 4에서 1로 반전시키면 다음 단계가 됩니다. *DHC(분할 계층적 클러스터링)*.

HCA는 분할 및 하향식이거나 응집 및 상향식일 수 있습니다. 하향식 DHC 접근 방식은 클러스터가 더 적지만 더 클 때 가장 잘 작동하므로 계산 비용이 더 많이 듭니다. 반면 상향식 AHC 접근 방식은 더 작은 클러스터가 많은 경우에 적합합니다. 계산상 더 간단하고 더 많이 사용되며 더 많이 사용 가능합니다.

참고 : 하향식이든 상향식이든 클러스터링 프로세스의 덴드로그램 표현은 기본 구조가 이진 트리인 경우 항상 둘로 나누는 것으로 시작하여 각 개별 포인트가 구별되는 것으로 끝납니다.

데이터의 계층적 관계를 시각화하기 위해 고객 데이터 덴드로그램을 플로팅해 보겠습니다. 이번에는 우리가 사용할 scipy 데이터세트에 대한 덴드로그램을 생성하기 위한 라이브러리:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

스크립트의 출력은 다음과 같습니다.

IMG

위의 스크립트에서 포인트가 있는 클러스터와 하위 클러스터를 생성하고 포인트가 연결되는 방식을 정의했습니다( ward 방법) 및 점 사이의 거리를 측정하는 방법(사용하여 euclidean 미터법).

덴드로그램의 플롯으로 DHC 및 AHC의 설명된 프로세스를 시각화할 수 있습니다. 하향식 접근 방식을 시각화하려면 덴드로그램의 상단에서 시작하여 아래로 이동하고 반대 작업을 수행하여 아래에서 위로 이동하여 상향식 접근 방식을 시각화합니다.

연결 방법

다른 많은 연결 방법이 있습니다. 작동 방식에 대해 더 많이 이해하면 필요에 따라 적절한 방법을 선택할 수 있습니다. 그 외에도 적용하면 각각 다른 결과가 나타납니다. 클러스터링 분석에는 정해진 규칙이 없습니다. 가능하면 문제의 본질을 연구하여 가장 적합한 것을 확인하고 다양한 방법을 테스트하고 결과를 확인하십시오.

연결 방법 중 일부는 다음과 같습니다.

  • 단일 연결: 라고도 함 가장 가까운 이웃(NN). 클러스터 간의 거리는 가장 가까운 구성원 간의 거리로 정의됩니다.

IMG

  • 완전한 연결: 라고도 함 가장 먼 이웃(FN), 가장 먼 점 알고리즘부어 히스 알고리즘. 클러스터 간의 거리는 가장 먼 구성원 간의 거리로 정의됩니다. 이 방법은 계산 비용이 많이 듭니다.

IMG

  • 평균 연결: 또한 ~으로 알려진 업그마 (산술 평균을 사용하는 비가중 쌍 그룹 방법). 각 군집의 점 개수 백분율은 두 군집이 병합된 경우 두 군집의 점 개수에 대해 계산됩니다.

IMG

  • 가중치 연결: 또한 ~으로 알려진 WPGMA (산술 평균을 사용하는 가중 쌍 그룹 방법). 두 클러스터의 개별 포인트는 더 작은 클러스터와 더 큰 클러스터 사이의 집계된 거리에 기여합니다.
  • 중심 연결: 라고도 함 UPGMC (Centroids를 사용한 가중치 없는 쌍 그룹 방법). 모든 점의 평균(중심)으로 정의된 점은 각 군집에 대해 계산되며 군집 사이의 거리는 각 중심 사이의 거리입니다.

IMG

  • 와드 연계: 또한 ~으로 알려진 미스큐 (제곱합의 최소 증가). 두 클러스터 사이의 거리를 지정하고, 제곱합 오차(ESS)를 계산하고, 더 작은 ESS를 기반으로 다음 클러스터를 연속적으로 선택합니다. Ward's Method는 각 단계에서 ESS의 증가를 최소화하고자 합니다. 따라서 오류를 최소화합니다.

IMG

거리 측정법

연결 외에도 가장 많이 사용되는 거리 측정항목을 지정할 수도 있습니다.

  • 유클리드: 라고도 함 피타고라스 또는 직선 거리. 공간에서 두 점 사이를 지나는 선분의 ​​길이를 측정하여 두 점 사이의 거리를 계산합니다. 그것은 피타고라스 정리를 사용하고 거리 값은 결과입니다 (C) 방정식의:

$$
c^2 = a^2 + b^2
$$

  • 맨해튼:라고도 함 시티 블록, 택시 거리. 두 점의 모든 차원에서 측정값 간의 절대 차이의 합입니다. 그 차원이 XNUMX이면 한 블록을 걸을 때 오른쪽과 왼쪽을 만드는 것과 유사합니다.

IMG

  • 민코프스키: 유클리드 거리와 맨해튼 거리의 일반화입니다. Minkowski 미터법 차수에 대한 절대 차이를 기반으로 거리를 계산하는 방법입니다. p. 모든 것에 대해 정의되어 있지만 p> 0, 1, 2, ∞(무한대) 이외의 값에는 거의 사용되지 않습니다. 민코프스키 거리는 맨하탄 거리와 같다. p = 1, 그리고 유클리드 거리와 같을 때 p = 2.

$$
Dleft(X,Yright) = 왼쪽(sum_{i=1}^n |x_i-y_i|^pright)^{frac{1}{p}}
$$

IMG

  • 체비 쇼프: 또한 ~으로 알려진 체스 판 거리. 민코프스키 거리의 극단적인 경우입니다. 매개변수 값으로 무한대를 사용할 때 피 (p = ∞), 우리는 거리를 좌표 간의 최대 절대 차이로 정의하는 메트릭으로 끝납니다.
  • 코사인: 두 개의 점 또는 벡터 시퀀스 사이의 각도 코사인 거리입니다. 코사인 유사도는 벡터의 내적을 길이의 곱으로 나눈 값입니다.
  • 자카드: 유한한 점 집합 간의 유사성을 측정합니다. 이는 각 세트(교차점)의 공통 포인트에 있는 총 포인트 수(카디널리티)를 두 세트(union)의 총 포인트 중 총 포인트 수(카디널리티)로 나눈 값으로 정의됩니다.
  • 젠슨-섀넌: Kullback-Leibler 발산을 기반으로 합니다. 포인트의 확률 분포를 고려하고 해당 분포 간의 유사성을 측정합니다. 확률 이론 및 통계에서 널리 사용되는 방법입니다.

우리는 선택했습니다 유클리드 가장 일반적으로 사용되는 방법 및 메트릭이기 때문에 덴드로그램의 경우. Ward는 오류 최소화를 기반으로 포인트를 연결하고 Euclidean은 낮은 차원에서 잘 작동하기 때문에 일반적으로 좋은 결과를 제공합니다.

이 예에서는 마케팅 데이터의 두 가지 기능(열)과 200개의 관찰 또는 행으로 작업하고 있습니다. 관측값의 수가 특징의 수보다 많기 때문에(200 > 2) 저차원 공간에서 작업하고 있습니다.

기능 수가 많을 때 (F) 관측치 수보다 큽니다. (N) – 주로 다음과 같이 작성 f >> 엔, 그것은 우리가 고차원 공간.

더 많은 속성을 포함하여 200개 이상의 기능이 있는 경우 유클리드 거리가 잘 작동하지 않을 수 있습니다. 즉, 유클리드 거리 접근 방식은 데이터 작업에 어려움이 있습니다. 희소성. 라고 하는 문제입니다 차원의 저주. 거리 값은 너무 작아져 마치 더 큰 공간에서 "희석"되어 0이 될 때까지 왜곡됩니다.

참고 : 다음과 같은 데이터 세트를 만난 경우 에 >> 피, 다음과 같은 다른 거리 측정항목을 사용할 것입니다. 마할라노비스 거리. 또는 다음을 사용하여 데이터세트 차원을 줄일 수도 있습니다. 주성분 분석 (PCA). 이 문제는 특히 생물학적 시퀀싱 데이터를 클러스터링할 때 자주 발생합니다.

우리는 이미 메트릭, 연결 및 각각이 결과에 미치는 영향에 대해 논의했습니다. 이제 덴드로그램 분석을 계속하여 데이터 세트의 클러스터 수를 나타내는 방법을 살펴보겠습니다.

덴드로그램에서 흥미로운 클러스터 수를 찾는 것은 수직선이 없는 가장 큰 수평 공간(가장 긴 수직선이 있는 공간)을 찾는 것과 같습니다. 이는 클러스터 간에 더 많은 분리가 있음을 의미합니다.

가장 긴 거리를 지나는 수평선을 그릴 수 있습니다.

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

IMG

수평선을 찾은 후 수직선이 수평선과 교차한 횟수를 계산합니다(이 예에서는 5회). 따라서 5는 클러스터 사이에 가장 거리가 먼 클러스터의 수를 나타내는 좋은 표시인 것 같습니다.

주의 사항: 덴드로그램은 클러스터 수를 선택하는 데 사용할 때 참고용으로만 고려해야 합니다. 그것은 쉽게 그 숫자를 벗어날 수 있으며 연결 유형 및 거리 측정항목에 완전히 영향을 받습니다. 심층 클러스터 분석을 수행할 때 서로 다른 연결 및 메트릭을 사용하는 덴드로그램을 살펴보고 클러스터 사이의 거리가 가장 먼 처음 세 줄에서 생성된 결과를 살펴보는 것이 좋습니다.

집합적 계층적 클러스터링 구현

원본 데이터 사용

지금까지 우리는 초기 분석 및 PCA 분석을 뒷받침하는 데이터 세트에 대해 제안된 클러스터 수를 계산했습니다. 이제 Scikit-Learn을 사용하여 응집형 계층적 클러스터링 모델을 만들 수 있습니다. AgglomerativeClustering 그리고 마케팅 포인트의 라벨을 찾아 labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

결과 :

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

우리는 이 지점에 도달하기 위해 많은 조사를 했습니다. 그리고 이 라벨은 무엇을 의미합니까? 여기에 0에서 4까지의 그룹으로 레이블이 지정된 데이터의 각 지점이 있습니다.

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

IMG

이것이 우리의 최종 클러스터화된 데이터입니다. XNUMX개의 클러스터 형태로 색상으로 구분된 데이터 포인트를 볼 수 있습니다.

오른쪽 하단의 데이터 포인트(레이블: 0, 보라색 데이터 포인트)는 급여는 높지만 지출이 적은 고객에 속합니다. 돈을 조심스럽게 쓰는 고객들입니다.

마찬가지로 오른쪽 상단의 고객(라벨: 2, 녹색 데이터 포인트), 높은 급여와 높은 지출을 가진 고객입니다. 이들은 기업이 목표로 삼는 고객 유형입니다.

중간에 있는 고객(라벨: 1, 파란색 데이터 포인트)는 평균 소득과 평균 지출이 있는 항목입니다. 가장 많은 수의 고객이 이 범주에 속합니다. 회사는 또한 이러한 고객이 엄청나게 많다는 사실을 감안할 때 이러한 고객을 대상으로 할 수 있습니다.

왼쪽 하단의 고객(라벨: 4, 빨간색)은 급여가 낮고 지출이 적은 고객인 경우 프로모션을 제공하여 유인할 수 있습니다.

마지막으로 왼쪽 상단의 고객(라벨: 3, 주황색 데이터 포인트)는 소득이 높고 지출이 적은 항목으로 마케팅의 이상적인 대상입니다.

PCA의 결과 사용

데이터의 차원을 줄여야 하는 다른 시나리오에 있었다면. 클러스터화된 PCA 결과를 쉽게 플롯할 수도 있습니다. 이는 또 다른 응집 클러스터링 모델을 생성하고 각 주성분에 대한 데이터 레이블을 획득하여 수행할 수 있습니다.

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

IMG

두 결과가 매우 유사함을 확인하십시오. 가장 큰 차이점은 원본 데이터를 사용한 첫 번째 결과가 설명하기 훨씬 쉽다는 것입니다. 고객을 연간 수입과 지출 점수에 따라 XNUMX개 그룹으로 나눌 수 있음을 알 수 있습니다. PCA 접근 방식에서 우리는 모든 기능을 고려하지만 각각에 의해 설명되는 차이를 볼 수 있는 한 특히 마케팅 부서에 보고할 때 이해하기 어려운 개념입니다.

데이터 변환은 최소한으로 할수록 좋습니다.

클러스터링 전에 차원 축소를 수행해야 하는 매우 크고 복잡한 데이터 세트가 있는 경우 각 기능과 해당 잔차 간의 선형 관계를 분석하여 PCA 사용을 뒷받침하고 프로세스의 설명성을 향상시키십시오. 기능 쌍별로 선형 모델을 만들면 기능이 상호 작용하는 방식을 이해할 수 있습니다.

데이터 볼륨이 너무 크면 기능 쌍을 플롯하는 것이 불가능하게 되며, 데이터 샘플을 가능한 한 균형 잡힌 정규 분포에 가깝게 선택하고 샘플에 대한 분석을 먼저 수행하고, 이해하고, 미세 조정합니다. 그리고 나중에 전체 데이터 세트에 적용합니다.

데이터의 특성(선형, 비선형)에 따라 항상 다양한 클러스터링 시각화 기술을 선택하고 필요한 경우 모든 기술을 결합하거나 테스트할 수 있습니다.

결론

클러스터링 기술은 레이블이 지정되지 않은 데이터와 관련하여 매우 편리할 수 있습니다. 실제 세계의 데이터 대부분은 레이블이 지정되지 않고 데이터에 주석을 추가하는 데 비용이 더 많이 들기 때문에 클러스터링 기술을 사용하여 레이블이 지정되지 않은 데이터에 레이블을 지정할 수 있습니다.

이 가이드에서는 클러스터링 기술이 마케팅 분석(및 생물학적 분석)에 주로 사용되기 때문에 실제 데이터 과학 문제를 가져왔습니다. 우리는 또한 좋은 계층적 클러스터링 모델에 도달하기 위한 많은 조사 단계와 덴드로그램을 읽는 방법을 설명하고 PCA가 필요한 단계인지 질문했습니다. 우리의 주요 목표는 계층적 클러스터링을 찾을 수 있는 몇 가지 함정과 다양한 시나리오를 다루는 것입니다.

즐거운 클러스터링!

타임 스탬프 :

더보기 스택카부스