Raggruppamento in R
con ggdendro e cluster
Cos'è il clustering?
L'analisi dei cluster cerca di assegnare le osservazioni a categorie senza alcuna conoscenza preliminare. Questo è diverso rispetto alla classificazione , che cerca di assegnare le osservazioni a categorie pre-specificate utilizzando la modellazione predittiva dai dati di addestramento.
Il clustering è un metodo di apprendimento non supervisionato nell'apprendimento automatico e nel data mining ed è utile per esplorare e comprendere dati complessi e trovare modelli significativi nei dati.
In questo articolo
Vorrei esplorare alcuni dati relativi alle vendite di articoli per la casa di base e vedere se ci sono relazioni tra i dati. Userò gerarchico e anche k significa clustering.
Spiegherò alcune idee di base relative al clustering ed esempi di clustering gerarchico, k significa clustering e come trovare il numero ottimale di cluster per k-means clustering.
Matrice delle distanze
I dati vengono suddivisi in gruppi in base alla somiglianza tra oggetti nello stesso gruppo e alla diversità tra oggetti in gruppi diversi con l'obiettivo del clustering di trovare una struttura o un modello nei dati.
Una matrice di distanza viene solitamente utilizzata per mediare diversi cluster.
La distanza quantifica la differenza tra gli oggetti in uno spazio ad alta dimensione e la scelta della misura della distanza influenzerà il risultato del raggruppamento.
Le misure di distanza comuni includono:
- Distanza euclidea: questa è la misura di distanza più comunemente usata ed è definita come la distanza in linea retta tra due punti in uno spazio multidimensionale. È una generalizzazione del teorema di Pitagora .
- Distanza da Manhattan: questa misura della distanza è anche nota come distanza dell'isolato urbano ed è definita come la somma delle differenze assolute tra le coordinate di due punti.
Clustering gerarchico
L'analisi dei cluster nelle statistiche è un metodo per rilevare raggruppamenti nei dati senza definizioni di gruppo predeterminate.
Per utilizzare il clustering gerarchico, è necessario definire le differenze tra i cluster.
Possiamo usare:
Collegamento singolo
Conosciuto anche come vicino più vicino o distanza minima, che è definita come la distanza più breve tra due punti qualsiasi nei due cluster. Determinato dalla coppia di punti più vicina tra i due cluster.
Collegamento completo
Questo è un metodo in cui la distanza tra due cluster è definita come la distanza massima tra due punti qualsiasi nei due cluster. La distanza tra due cluster è determinata dalla coppia di punti più lontana tra i due cluster.
Dissomiglianza media
Conosciuto anche come collegamento medio , e per calcolare la dissomiglianza media tra due cluster, prendiamo la media delle distanze a coppie tra tutte le coppie di punti nei due cluster.
k-significa raggruppamento
Il clustering K-significa suddivide un set di dati in k cluster e mira a trovare i cluster ottimali che riducono al minimo la somma delle distanze al quadrato tra i punti dati e il centro del cluster assegnato.
Il clustering K-means può essere utilizzato per una varietà di applicazioni:
- segmentazione dell'immagine
- segmentazione della clientela
- rilevazione del crimine
- ottimizzazione del marketing e altro...
la mia configurazione
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)
- Non è necessario caricare la libreria, è sufficiente eseguire 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))
Si noti che ho creato rettangoli di cluster e specificato i cluster 1,6 e 13. Ci sono 13 cluster a causa della specifica k = 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))
Creerò un esempio di cluster gerarchici con diverse differenze:
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
Notare la differenza nelle strutture a seconda della dissomiglianza utilizzata.
Ci sono anche differenze quando si tratta della misura della distanza selezionata:
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-significa raggruppamento
Qui prendo i dati in df e creo 5 centri cluster
clc <- kmeans(x = df, centers = 5)
df$cluster <- as.character(clc$cluster)
head(df)
clc$centers
- Una versione base R della trama
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")
Dai grafici sopra, possiamo vedere che le somiglianze e le differenze tra oggetti in gruppi di dati causano le diverse partizioni o cluster di dati.
Le distanze costituiscono una parte davvero importante nel determinare l'appartenenza al gruppo o meno.
Come mostrato sopra, trovare la somma delle distanze al quadrato viene utilizzato per trovare la quantità ottimale di cluster per k-medie.
Distanze, somiglianze e differenze determinano i raggruppamenti di punti dati.
Spero che ti sia piaciuto e che tu abbia trovato utile il mio articolo!
Seguimi per altri articoli su R, Julia, Python e statistiche applicate!
Se desideri saperne di più sul piping ( %>% o |> ) dei tuoi dati, dai un'occhiata al mio articolo qui sotto:
Piping con R
![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































