K- 평균 Cluster예를 들어 R로 작성하기

Cluster 분석?

Cluster 분석은 다음 중 일부입니다. 비지도 학습. 클러스터는 유사한 특징을 공유하는 데이터 그룹입니다. 클러스터링 분석은 예측보다 발견에 더 가깝다고 할 수 있습니다. 머신은 데이터에서 유사성을 검색합니다. 예를 들어, 다음 애플리케이션에 클러스터 분석을 사용할 수 있습니다.

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

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

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

클러스터링 개념을 이해하기 위한 예를 들어보겠습니다. 단순화를 위해 두 가지 차원에서 작업합니다. 고객의 총 지출과 연령에 대한 데이터가 있습니다. 마케팅 팀은 광고를 개선하기 위해 고객에게 보다 타겟팅된 이메일을 보내고자 합니다.

다음 그래프에서는 총 지출과 고객의 연령대를 표시합니다.

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()

Cluster 분석

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

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

Cluster 분석

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

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

K-평균 알고리즘

K-mean은 의심할 여지 없이 가장 인기 있는 클러스터링 방법입니다. 연구자들은 수십 년 전에 알고리즘을 발표했고, k-means에 많은 개선이 이루어졌습니다.

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

K-평균 알고리즘

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

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

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

K-평균 알고리즘

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

클러스터 수를 선택하세요

k-mean에서 발견된 또 다른 어려움은 클러스터 수의 선택입니다. 안정성을 개선하기 위해 높은 값, 즉 많은 수의 그룹을 설정할 수 있지만 결국 다음과 같은 문제가 발생할 수 있습니다. 과적 합 데이터의 과적합은 모델의 성능이 새로운 데이터에 대해 상당히 감소한다는 것을 의미합니다. 기계는 데이터 세트의 작은 세부 사항을 학습하고 전체 패턴을 일반화하는 데 어려움을 겪습니다.

클러스터 수는 데이터 세트의 특성, 산업, 사업 등에 따라 달라집니다. 그러나 적절한 클러스터 수를 선택하는 데는 경험칙이 있습니다.

수를 선택하십시오 Clusters

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

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

우리는 클러스터링 분석을 수행하기 위해 개인용 컴퓨터 가격 데이터 세트를 사용할 것입니다. 이 데이터 세트에는 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단계: 중심점(즉, 클러스터의 평균)을 계산합니다.
  • 데이터가 변경되지 않을 때까지 반복합니다.

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

pc_cluster <-kmeans(rescale_df, 5)
  • pc_cluster 목록에는 흥미로운 요소가 7개 포함되어 있습니다.
  • pc_cluster$cluster: 각 관찰의 클러스터를 나타냅니다.
  • pc_cluster$centers: 클러스터 센터
  • pc_cluster$totss: 제곱의 총합
  • pc_cluster$withinss: 제곱의 합 내. 반환되는 구성 요소의 수는 `k`와 같습니다.
  • pc_cluster$tot.withinss: withinss의 합계
  • pc_clusterbetweenss: 제곱의 총합에서 제곱의 내 합을 뺀 값
  • pc_cluster$size: 각 클러스터 내 관찰 수

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

최적의 k

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

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

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

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

단계 1) 클러스터 내 총 제곱합을 계산하는 함수를 구성하세요.

k-평균 알고리즘을 실행하고 제곱합의 클러스터 내 총계를 저장하는 함수를 생성합니다.

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

코드 설명

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

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()

검사 Cluster

요약

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

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