R의 클러스터링
ggdendro 및 클러스터 사용
클러스터링이란 무엇입니까?
군집 분석은 사전 지식 없이 범주에 관찰을 할당합니다. 이는 교육 데이터의 예측 모델링을 사용하여 사전 지정된 범주에 관찰을 할당하는 분류 와 다릅니다 .
클러스터링은 기계 학습 및 데이터 마이닝에서 비지도 학습 방법으로 복잡한 데이터를 탐색 및 이해하고 데이터에서 의미 있는 패턴을 찾는 데 유용합니다.
이 기사에서
기본 생활용품 판매와 관련된 일부 데이터를 탐색하고 데이터에 관계가 있는지 확인하고 싶습니다. 나는 Hierarchical을 사용하고 또한 k는 클러스터링을 의미합니다.
클러스터링 과 관련된 몇 가지 기본 아이디어와 계층적 클러스터링 의 예 , k는 클러스터링을 의미하고 k-평균 클러스터링을 위한 최적의 클러스터 수를 찾는 방법에 대해 설명하겠습니다 .
거리 행렬
데이터는 데이터에서 구조 또는 패턴을 찾는 클러스터링의 목표로 동일한 그룹에 있는 개체 간의 유사성과 다른 그룹에 있는 개체 간의 비유사성을 기반으로 그룹으로 분할됩니다.
거리 매트릭스는 일반적으로 서로 다른 클러스터를 중재하는 데 사용됩니다.
거리는 고차원 공간에서 개체 간의 차이를 정량화하며 거리 측정의 선택은 클러스터링 결과에 영향을 미칩니다.
일반적인 거리 측정에는 다음이 포함됩니다.
- 유클리드 거리: 이것은 가장 일반적으로 사용되는 거리 측정이며 다차원 공간에서 두 점 사이의 직선 거리로 정의됩니다. 그것은 피타고라스 정리 의 일반화입니다 .
- 맨해튼 거리: 이 거리 측정값은 도시 블록 거리라고도 하며 두 지점의 좌표 간 절대 차이의 합으로 정의됩니다.
계층적 클러스터링
통계학에서의 군집분석은 미리 결정된 그룹 정의가 없는 데이터의 그룹화를 탐지하는 방법입니다.
계층적 클러스터링을 사용하려면 클러스터 간의 차이점을 정의해야 합니다.
다음을 사용할 수 있습니다.
단일 연결
가장 가까운 이웃 또는 최소 거리라고도 하며 두 클러스터의 두 지점 사이의 최단 거리로 정의됩니다. 두 군집 사이에서 가장 가까운 점 쌍으로 결정됩니다.
완전한 연계
두 군집 사이의 거리를 두 군집에서 임의의 두 점 사이의 최대 거리로 정의하는 방법입니다. 두 군집 사이의 거리는 두 군집 사이에서 가장 먼 지점 쌍에 의해 결정됩니다.
평균 차이
평균 연결 이라고도 하며 두 군집 간의 평균 비유사성을 계산하기 위해 두 군집의 모든 점 쌍 사이의 쌍별 거리의 평균을 구합니다.
k-평균 클러스터링
K-평균 군집화는 데이터 집합을 k 군집으로 분할하고 데이터 포인트와 할당된 군집 중심 사이의 거리 제곱합을 최소화하는 최적의 군집을 찾는 것을 목표로 합니다 .
K-평균 클러스터링은 다양한 애플리케이션에 사용할 수 있습니다.
- 이미지 분할
- 고객 세분화
- 범죄 탐지
- 마케팅 최적화 등…
내 설정
library(tidyverse)
library(knitr)
knitr::opts_chunk$set(message = FALSE)
knitr::opts_chunk$set( fig.retina=2,fig.dpi = 96)
knitr::opts_chunk$set(comment="", fig.align="center", tidy=TRUE , cache=TRUE)
library(broom)
library(ggdendro)
library(cluster)
library(patchwork)
data <- read.csv("C:/Data/household_goods.csv")
skimr::skim(data)
- 라이브러리를 로드할 필요 없이 skimr::skim(“your dataset”)을 실행하기만 하면 됩니다.
data %>% head(n=8)
df <- data %>% select(c(UnitsSold,UnitPrice,UnitCost)) %>% arrange()
df |> head(n=8)
data %>% ggplot() +
geom_point(mapping = aes(x= as.factor(ItemType) ,
y = UnitsSold , col = ItemType)) +
labs(title = "Items of basic necessity" ,
color = "items" , x = "Item" , y = "Units Sold") +
theme(axis.text.x = element_text( color="darkgrey",
size=12, angle=90),
axis.text.y = element_text( color="darkgrey",
size=12)) +
theme(text = element_text(face="bold",size = 12))
클러스터 사각형을 만들고 클러스터 1,6 및 13을 지정했습니다. k = 13 사양으로 인해 13개의 클러스터가 있습니다.
H <- hclust(dist(df))
plot(H)
rect.hclust(H, k=3, border="red")
rect.hclust(H, k=13, border="blue",
which = c(1,6, 13))
서로 다른 차이점이 있는 계층적 클러스터의 예를 만들겠습니다.
hc <- df %>%
dist() %>%
hclust()
hc1 <- df %>%
dist() %>%
hclust(method='single')
hc2 <- df %>%
dist() %>%
hclust(method='average')
hc3 <- df %>%
dist() %>%
hclust(method='complete')
hc4 <- df %>%
dist() %>%
hclust(method='centroid')
p1<-ggdendrogram(hc, segments = TRUE,
rotate = FALSE) +
labs(title = "Dendrogram")+
theme_dendro()
p2<-ggdendrogram(hc1, segments = TRUE,
rotate = FALSE) +
labs(title = "Single Linkage Dendrogram")+
theme_dendro()
p3<-ggdendrogram(hc2, segments = TRUE,
rotate = FALSE) +
labs(title = "Average Linkage Dendrogram")+
theme_dendro()
p4<-ggdendrogram(hc3, segments = TRUE,
rotate = FALSE) +
labs(title = "Complete Linkage Dendrogram")+
theme_dendro()
p5<-ggdendrogram(hc4, segments = TRUE,
rotate = FALSE) +
labs(title = "Centroid Linkage Dendrogram")+
theme_dendro()
p1 + p2 + p3 + p4 +p5 + plot_layout(ncol = 2, heights = 3) # use patchwork
사용된 비유사성에 따라 구조의 차이에 주목하십시오.
선택한 거리 측정과 관련하여 차이점도 있습니다.
dist <-dist(df,"euclidean")
clust.complete<-hclust(dist,method="complete")
p1<-ggdendrogram(clust.complete,labels = FALSE) +
labs(title = "Complete Linkage Dendrogram with euclidean distance")
dist1 <-dist(df,"manhattan")
clust.complete1<-hclust(dist1,method="complete")
p2<-ggdendrogram(clust.complete1,labels = FALSE) +
labs(title = "Complete Linkage Dendrogram with manhattan distance")
p1 + p2 + plot_layout(ncol = 2, heights = 1)
K-평균 클러스터링
여기서 df 의 데이터를 가져오고 5개의 클러스터 센터를 만듭니다.
clc <- kmeans(x = df, centers = 5)
df$cluster <- as.character(clc$cluster)
head(df)
clc$centers
- 플롯의 기본 R 버전
plot(df[c("UnitCost", "UnitsSold")], col = clc$cluster,
main = "K means clustering with data split into 5 clusters")
points(clc$centers[,c("UnitCost", "UnitsSold")],
col = "darkorange", pch = 16, cex = 1.5)
grid()
ggplot() +
geom_point(data = df,
mapping = aes(x = UnitPrice,
y = UnitsSold,
colour = cluster)) +
geom_point(mapping = aes(x = clc$centers[,'UnitPrice']
, y = clc$centers[,'UnitsSold']),color = "red", size = 4)+
theme_light() +
labs(title = "K means clustering with data split into 5 clusters")
km <- tibble(k = 1:10) %>%
mutate(
model = map(k, ~ kmeans(df, centers = ., nstart = 20)),
tidied = map(model, glance)
) %>%
unnest(tidied)
km
ggplot(km) +
geom_line(aes(x=k, y=tot.withinss))
cl <- kmeans(x = df, centers = 3)
df$cluster <- as.character(cl$cluster)
ggplot() +
geom_point(data = df,
mapping = aes(x = UnitPrice,
y = UnitsSold,
colour = cluster)) +
geom_point(mapping = aes(x = cl$centers[,'UnitPrice'] ,
y = cl$centers[,'UnitsSold'] ),color = "red", size = 4) +
labs(title = "K means clustering with 3 clusters")
위의 그래프에서 데이터 그룹의 개체 간의 유사점과 비 유사성이 서로 다른 데이터 파티션 또는 클러스터를 유발한다는 것을 알 수 있습니다.
거리는 그룹 구성원 여부를 결정하는 데 정말 큰 부분을 차지합니다.
위에 표시된 대로 제곱 거리의 합을 찾는 것은 k-평균에 대한 최적의 클러스터 수를 찾는 데 사용됩니다.
거리, 유사성 및 비유사성은 데이터 포인트의 그룹화를 결정합니다.
내 기사가 유용하고 즐거웠기를 바랍니다.
R, Julia, Python 및 응용 통계에 대한 더 많은 기사를 보려면 저를 팔로우하세요!
데이터 파이핑( %>% 또는 |> )에 대해 자세히 알고 싶다면 아래 내 기사를 확인하십시오.
R로 파이핑하기
![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































