K-예제를 사용한 R의 클러스터링을 의미합니다.

클러스터 분석이란 무엇입니까?

클러스터 분석은 비지도 학습. 클러스터는 유사한 기능을 공유하는 데이터 그룹입니다. 클러스터링 분석은 예측보다는 발견에 더 가깝다고 말할 수 있습니다. 기계는 데이터의 유사성을 검색합니다. 예를 들어, 다음과 같은 클러스터 분석을 사용할 수 있습니다.wing 응용 프로그램 :

  • 고객 세분화: 고객 그룹 간의 유사성을 찾습니다.
  • 주식시장 클러스터링: 실적에 따른 그룹 주식
  • 유사한 값을 가진 관측치를 그룹화하여 데이터 세트의 차원성을 줄입니다.

클러스터링 분석은 구현하기가 그리 어렵지 않으며 비즈니스에 의미 있고 실행 가능합니다.

지도 학습과 비지도 학습의 가장 눈에 띄는 차이점은 결과에 있습니다. 비지도 학습은 새로운 변수인 레이블을 생성하는 반면 지도 학습은 결과를 예측합니다. 기계는 실무자가 밀접한 관련성을 기반으로 데이터에 레이블을 지정하는 데 도움을 줍니다. 그룹을 활용하고 이름을 지정하는 것은 분석가의 몫입니다.

클러스터링의 개념을 이해하기 위해 예를 만들어 보겠습니다. 단순화를 위해 우리는 XNUMX차원으로 작업합니다. 고객의 총 지출과 연령에 대한 데이터가 있습니다. 광고를 개선하기 위해 마케팅 팀은 더 많은 타겟 전자를 보내고 싶어합니다.mail고객에게.

팔로우에서wing 그래프에서는 총 지출과 고객의 연령을 표시합니다.

library(ggplot2)
df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),
    spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24)
)
ggplot(df, aes(x = age, y = spend)) +
    geom_point()

클러스터 분석

이 시점에서 패턴이 보입니다.

  1. 왼쪽 하단에는 구매력이 낮은 젊은층이 보입니다.
  2. 중상위는 더 많은 지출을 감당할 수 있는 직업을 가진 사람들을 반영합니다.
  3. 마지막으로, 예산이 적은 노년층입니다.

클러스터 분석

위 그림에서는 관측치를 직접 클러스터링하고 세 그룹을 각각 정의합니다. 이 예는 다소 간단하고 매우 시각적입니다. 새로운 관측치가 데이터 세트에 추가되면 원 안에 라벨을 붙일 수 있습니다. 당신은 우리의 판단에 따라 원을 정의합니다. 대신에 다음을 사용할 수 있습니다. 기계 학습 데이터를 객관적으로 그룹화합니다.

이 튜토리얼에서는 k- 평균 연산.

K-평균 알고리즘

K-평균은 의심할 여지 없이 가장 널리 사용되는 클러스터링 방법입니다. 연구원들은 수십 년 전에 알고리즘을 출시했으며 k-평균에 많은 개선이 이루어졌습니다.

알고리즘은 관측치 사이의 거리를 최소화하여 그룹을 찾으려고 시도합니다. 국소 최적 솔루션. 거리는 관측 좌표를 기준으로 측정됩니다. 예를 들어 XNUMX차원 공간에서 좌표는 단순하고 입니다.

K-평균 알고리즘

알고리즘은 다음과 같이 작동합니다.

  • 1단계: 기능 계획에서 무작위로 그룹 선택
  • 2단계: 군집 중심과 다양한 관측치 사이의 거리를 최소화합니다(중심). 관찰 결과가 있는 그룹이 생성됩니다.
  • 3단계: 초기 중심을 그룹 내 좌표의 평균으로 이동합니다.
  • 4단계: 새 중심에 따라 거리를 최소화합니다. 새로운 경계가 생성됩니다. 따라서 관찰은 한 그룹에서 다른 그룹으로 이동합니다.
  • 관찰이 그룹을 변경하지 않을 때까지 반복합니다.

K-평균은 일반적으로 특성과 특성 사이의 유클리드 거리를 사용합니다.

K-평균 알고리즘

Manhattan 거리나 Minlowski 거리와 같은 다양한 측정 방법을 사용할 수 있습니다. K-평균은 알고리즘을 실행할 때마다 다른 그룹을 반환합니다. 첫 번째 초기 추측은 무작위이며 알고리즘이 그룹 내에서 동질성에 도달할 때까지 거리를 계산한다는 점을 기억하세요. 즉, k-평균은 첫 번째 선택에 매우 민감하며, 관측치 수와 그룹 수가 적지 않으면 동일한 군집화를 얻는 것이 거의 불가능합니다.

클러스터 수 선택

k-평균에서 발견되는 또 다른 어려움은 클러스터 수를 선택하는 것입니다. 안정성을 향상시키기 위해 높은 값, 즉 다수의 그룹을 설정할 수 있지만 결과적으로 다음과 같은 문제가 발생할 수 있습니다. 과적 합 데이터. 과대적합은 새로 들어오는 데이터에 대해 모델 성능이 크게 저하됨을 의미합니다. 기계는 작은 de를 배웠습니다.tails 데이터 세트를 정리하고 전체 패턴을 일반화하는 데 어려움을 겪습니다.

클러스터 수는 데이터 세트의 성격, 산업, 비즈니스 등에 따라 다릅니다. 그러나 적절한 수의 클러스터를 선택하는 데에는 다음과 같은 경험 법칙이 있습니다.

클러스터 수 선택

데이터 세트의 관측치 수와 같습니다.

일반적으로 비즈니스 요구에 맞는 최고의 가치를 찾는 데 시간을 투자하는 것은 흥미롭습니다.

우리는 클러스터링 분석을 수행하기 위해 개인용 컴퓨터 가격 데이터세트를 사용할 것입니다. 이 데이터 세트에는 6259개의 관측치와 10개의 기능이 포함되어 있습니다. 데이터세트는 1993년부터 1995년까지 미국 내 486개 개인용 컴퓨터의 가격을 관찰합니다. 변수는 가격, 속도, 램, 화면, CD 등입니다.

다음과 같이 진행하게 됩니다:

  • 데이터 가져 오기
  • 모델 훈련
  • 모델 평가

데이터 가져 오기

K 평균은 거리를 기반으로 하고 이산값이 의미 있는 값을 반환하지 않기 때문에 요인변수에 적합하지 않습니다. 데이터 세트에서 세 가지 범주형 변수를 삭제할 수 있습니다. 게다가 이 데이터 세트에는 누락된 값이 없습니다.

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"
df <- read.csv(PATH) %>%
select(-c(X, cd, multi, premium))
glimpse(df)

산출

## Observations: 6, 259
## Variables: 7
## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2...
##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ...
##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210...
##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ...
##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ...
##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ...
## $ trend  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...

요약 통계를 보면 데이터의 값이 크다는 것을 알 수 있습니다. k 평균 및 거리 계산의 좋은 방법은 평균이 XNUMX과 같고 표준 편차가 XNUMX이 되도록 데이터 크기를 조정하는 것입니다.

summary(df)

출력:

##      price          speed              hd              ram        
##  Min.   : 949   Min.   : 25.00   Min.   :  80.0   Min.   : 2.000  
##  1st Qu.:1794   1st Qu.: 33.00   1st Qu.: 214.0   1st Qu.: 4.000  `
##  Median :2144   Median : 50.00   Median : 340.0   Median : 8.000  
##  Mean   :2220   Mean   : 52.01   Mean   : 416.6   Mean   : 8.287  
##  3rd Qu.:2595   3rd Qu.: 66.00   3rd Qu.: 528.0   3rd Qu.: 8.000  
##  Max.   :5399   Max.   :100.00   Max.   :2100.0   Max.   :32.000  
##      screen           ads            trend      
##  Min.   :14.00   Min.   : 39.0   Min.   : 1.00  
##  1st Qu.:14.00   1st Qu.:162.5   1st Qu.:10.00  
##  Median :14.00   Median :246.0   Median :16.00  
##  Mean   :14.61   Mean   :221.3   Mean   :15.93  
##  3rd Qu.:15.00   3rd Qu.:275.0   3rd Qu.:21.50  
##  Max.   :17.00   Max.   :339.0   Max.   :35.00

dplyr 라이브러리의 scale() 함수를 사용하여 변수의 크기를 조정합니다. 변환을 통해 이상값의 영향이 줄어들고 단일 관측치를 평균과 비교할 수 있습니다. 표준화된 값(또는 z- 점수)이 높으면 이 관측치가 실제로 평균보다 높다고 확신할 수 있습니다. 큰 z-점수는 이 점이 표준 편차 측면에서 평균에서 멀리 떨어져 있음을 의미합니다. z-점수가 2라는 것은 값이 XNUMX 표준임을 나타냅니다. 평균에서 벗어난 편차 참고로, z-점수는 가우스 분포를 따르며 평균을 기준으로 대칭입니다.

rescale_df <- df % > %
mutate(price_scal = scale(price),
    hd_scal = scale(hd),
    ram_scal = scale(ram),
    screen_scal = scale(screen),
    ads_scal = scale(ads),
    trend_scal = scale(trend)) % > %
select(-c(price, speed, hd, ram, screen, ads, trend))

R 베이스에는 k 평균 알고리즘을 실행하는 기능이 있습니다. k 평균의 기본 기능은 다음과 같습니다.

kmeans(df, k)
arguments:
-df: dataset used to run the algorithm
-k: Number of clusters

모델 훈련

그림 XNUMX에서는 알고리즘 작동 방식을 자세히 설명했습니다. Yi Hui(Knit for Rmarkdown 제작자이기도 함)의 훌륭한 패키지 빌드를 통해 각 단계를 그래픽으로 볼 수 있습니다. 패키지 애니메이션은 conda 라이브러리에서 사용할 수 없습니다. install.packages(“animation”)를 사용하여 패키지를 설치하는 다른 방법을 사용할 수 있습니다. Anaconda 폴더에 패키지가 설치되어 있는지 확인할 수 있습니다.

install.packages("animation")

라이브러리를 로드한 후 kmeans 뒤에 .ani를 추가하고 R 모든 단계를 계획할 것입니다. 설명을 위해 세 개의 클러스터가 있는 재조정된 변수 hd 및 ram을 사용하여 알고리즘만 실행합니다.

set.seed(2345)
library(animation)
kmeans.ani(rescale_df[2:3], 3)

코드 설명

  • kmeans.ani(rescale_df[2:3], 3): rescale_df 데이터 세트의 열 2와 3을 선택하고 k 세트를 3으로 사용하여 알고리즘을 실행합니다. 애니메이션을 플롯합니다.

모델 훈련

모델 훈련

애니메이션을 다음과 같이 해석할 수 있습니다.

  • 1단계: R은 무작위로 세 점을 선택합니다.
  • 2단계: 유클리드 거리를 계산하고 클러스터를 그립니다. 왼쪽 하단에 녹색 클러스터 하나가 있고, 오른쪽에 검은색으로 표시된 큰 클러스터 하나가 있으며, 그 사이에 빨간색 클러스터가 있습니다.
  • 3단계: 중심, 즉 클러스터의 평균 계산
  • 데이터가 변경되지 않을 때까지 반복 클러스터

알고리즘은 XNUMX번의 반복 후에 수렴되었습니다. XNUMX개의 클러스터가 있는 데이터세트에서 k-평균 알고리즘을 실행하고 이를 pc_cluster라고 부를 수 있습니다.

pc_cluster <-kmeans(rescale_df, 5)
  • pc_cluster 목록에는 XNUMX가지 흥미로운 요소가 포함되어 있습니다.
  • pc_cluster$cluster: 각 관찰의 클러스터를 나타냅니다.
  • pc_cluster$centers: 클러스터 센터
  • pc_cluster$totss: squ의 총합ares
  • pc_cluster$withinss: 제곱합 이내. 반환되는 구성요소의 수는 'k'와 같습니다.
  • pc_cluster$tot.withinss: 내부 합계
  • pc_clusterbetweenss: 총 제곱합 빼기 제곱합 내
  • pc_cluster$size: 각 클러스터 내의 관측치 수

최적의 클러스터 수 k를 계산하기 위해 내부 제곱합(예: tot.withinss)의 합을 사용합니다. k를 찾는 것은 실제로 상당한 작업입니다.

최적의 k

최선의 k를 선택하는 한 가지 기술은 다음과 같습니다. 팔꿈치 방법. 이 방법은 그룹 내 동질성 또는 그룹 내 이질성을 사용하여 변동성을 평가합니다. 즉, 각 클러스터가 설명하는 분산의 백분율에 관심이 있습니다. 클러스터 수에 따라 변동성이 증가하거나 이질성이 감소할 것으로 예상할 수 있습니다. 우리의 과제는 수익 감소를 넘어서는 k를 찾는 것입니다. 설명할 정보가 거의 남지 않기 때문에 새 클러스터를 추가해도 데이터의 변동성은 개선되지 않습니다.

이 튜토리얼에서는 이질성 측정을 사용하여 이 점을 찾습니다. squ의 클러스터 내 합계 합계ares kmean()이 반환한 목록의 tot.withinss입니다.

다음과 같이 팔꿈치 그래프를 구성하고 최적의 k를 찾을 수 있습니다.

  • 1단계: squ의 클러스터 합계 내에서 합계를 계산하는 함수 구성ares
  • 2단계: 알고리즘 시간 실행
  • 3단계: 알고리즘 결과로 데이터 프레임 만들기
  • 4단계: 결과 도표화

단계 1) squ의 클러스터 합계 내에서 합계를 계산하는 함수를 구성합니다.ares

k-평균 알고리즘을 실행하는 함수를 만들고 squ의 클러스터 합계 내에 합계를 저장합니다.ares

kmean_withinss <- function(k) {
    cluster <- kmeans(rescale_df, k)
    return (cluster$tot.withinss)
}

코드 설명

  • function(k): 함수의 인수 개수를 설정합니다.
  • kmeans(rescale_df, k): 알고리즘을 k번 실행합니다.
  • return(cluster$tot.withinss): squ의 클러스터 합계 내에 합계를 저장합니다.ares

2와 동일하게 함수를 테스트할 수 있습니다.

출력:

## Try with 2 cluster
kmean_withinss(2)

출력:

## [1] 27087.07

단계 2) 알고리즘을 n번 실행

sapply() 함수를 사용하여 k 범위에 대해 알고리즘을 실행합니다. 이 기술은 루프를 생성하고 값을 저장하는 것보다 빠릅니다.

# Set maximum cluster 
max_k <-20 
# Run algorithm over a range of k 
wss <- sapply(2:max_k, kmean_withinss)

코드 설명

  • max_k <-20: 최대 개수를 20으로 설정합니다.
  • sapply(2:max_k, kmean_withinss): 2:max_k 범위, 즉 2에서 20까지 kmean_withinss() 함수를 실행합니다.

단계 3) 알고리즘 결과로 데이터 프레임 생성

함수 생성 및 테스트 후에는 2에서 20 사이의 범위에서 k-평균 알고리즘을 실행하고 tot.withinss 값을 저장할 수 있습니다.

# Create a data frame to plot the graph
elbow <-data.frame(2:max_k, wss)

코드 설명

  • data.frame(2:max_k, wss): wss에 알고리즘 저장소의 출력으로 데이터 프레임을 생성합니다.

단계 4) 결과 플롯

팔꿈치 지점이 어디에 있는지 시각화하기 위해 그래프를 플롯합니다.

# Plot the graph with gglop
ggplot(elbow, aes(x = X2.max_k, y = wss)) +
    geom_point() +
    geom_line() +
    scale_x_continuous(breaks = seq(1, 20, by = 1))

최적의 k

그래프에서 최적의 k가 XNUMX이라는 것을 알 수 있습니다. 여기서 곡선은 수익이 감소하기 시작합니다.

최적의 k를 얻으면 k가 7인 알고리즘을 다시 실행하고 클러스터를 평가합니다.

클러스터 검사

pc_cluster_2 <-kmeans(rescale_df, 7)

이전에 언급했듯이 kmean()이 반환한 목록에 있는 나머지 흥미로운 정보에 액세스할 수 있습니다.

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

평가 부분은 주관적이며 알고리즘 사용에 따라 달라집니다. 여기서 우리의 목표는 비슷한 기능을 가진 컴퓨터를 모으는 것입니다. 컴퓨터 전문가는 자신의 전문 지식을 바탕으로 손으로 작업을 수행하고 그룹 컴퓨터로 작업을 수행할 수 있습니다. 그러나 프로세스에는 많은 시간이 걸리고 오류가 발생하기 쉽습니다. K-평균 알고리즘은 클러스터를 제안하여 현장을 준비할 수 있습니다.

사전 평가로 클러스터의 크기를 검사할 수 있습니다.

pc_cluster_2$size

출력:

## [1] 608 1596 1231  580 1003  699  542

첫 번째 클러스터는 608개의 관측값으로 구성되는 반면 가장 작은 클러스터인 4에는 컴퓨터가 580대만 있습니다. 클러스터 간에 동질성을 갖는 것이 좋을 수 있지만, 그렇지 않은 경우 더 얇은 데이터 준비가 필요할 수 있습니다.

중앙 구성요소를 사용하면 데이터를 더 자세히 살펴볼 수 있습니다. 행은 클러스터의 숫자를 나타내고 열은 알고리즘에서 사용하는 변수를 나타냅니다. 값은 관심 열에 대한 각 클러스터의 평균 점수입니다. 표준화하면 해석이 더 쉬워집니다. 양수 값은 특정 클러스터의 z-점수가 전체 평균보다 높음을 나타냅니다. 예를 들어 클러스터 2는 모든 클러스터 중에서 평균 가격이 가장 높습니다.

center <-pc_cluster_2$centers
center

출력:

##   price_scal    hd_scal     ram_scal screen_scal   ads_scal trend_scal
## 1 -0.6372457 -0.7097995 -0.691520682  -0.4401632  0.6780366 -0.3379751
## 2 -0.1323863  0.6299541  0.004786730   2.6419582 -0.8894946  1.2673184
## 3  0.8745816  0.2574164  0.513105797  -0.2003237  0.6734261 -0.3300536
## 4  1.0912296 -0.2401936  0.006526723   2.6419582  0.4704301 -0.4132057
## 5 -0.8155183  0.2814882 -0.307621003  -0.3205176 -0.9052979  1.2177279
## 6  0.8830191  2.1019454  2.168706085   0.4492922 -0.9035248  1.2069855
## 7  0.2215678 -0.7132577 -0.318050275  -0.3878782 -1.3206229 -1.5490909

ggplot으로 히트맵을 생성하면 카테고리 간의 차이를 강조하는 데 도움이 됩니다.

ggplot의 기본 색상은 RColorBrewer 라이브러리를 사용하여 변경해야 합니다. 콘다를 사용할 수 있습니다 도서관 터미널에서 실행할 코드는 다음과 같습니다.

콘다 설치 -cr r-rcolorbrewer

열 지도를 만들려면 다음 세 단계를 진행하세요.

  • 중심의 값으로 데이터 프레임을 구축하고 클러스터의 번호로 변수를 생성합니다.
  • tidyr 라이브러리의 Gather() 함수를 사용하여 데이터의 모양을 변경합니다. 데이터를 넓은 형식에서 긴 형식으로 변환하려고 합니다.
  • 색상으로 색상 팔레트 만들기Ramp팔레트() 함수

단계 1) 데이터 프레임 구축

모양 변경 데이터세트를 만들어 보겠습니다.

library(tidyr)

# create dataset with the cluster number

cluster <- c(1: 7)
center_df <- data.frame(cluster, center)

# Reshape the data

center_reshape <- gather(center_df, features, values, price_scal: trend_scal)
head(center_reshape)

출력:

##   cluster   features     values
## 1       1 price_scal -0.6372457
## 2       2 price_scal -0.1323863
## 3       3 price_scal  0.8745816
## 4       4 price_scal  1.0912296
## 5       5 price_scal -0.8155183
## 6       6 price_scal  0.8830191		

단계 2) 데이터 재구성

아래 코드는 히트 맵을 그리는 데 사용할 색상 팔레트를 만듭니다.

library(RColorBrewer)
# Create the palette
hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

3단계) ​​시각화

그래프를 그려서 클러스터가 어떻게 보이는지 확인할 수 있습니다.

# Plot the heat map
ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +
    scale_y_continuous(breaks = seq(1, 7, by = 1)) +
    geom_tile() +
    coord_equal() +
    scale_fill_gradientn(colours = hm.palette(90)) +
    theme_classic()

클러스터 검사

요약

아래 표에 k-평균 알고리즘을 요약할 수 있습니다.

묶음 목표 함수 논의
기지 k-평균 훈련 kmeans () df, k
클러스터에 액세스 kmeans()$클러스터
클러스터 센터 kmeans()$센터
크기 클러스터 kmeans()$크기