Raggruppamento in R

Feb 28 2023
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.

con ggdendro e cluster

Foto di Pierre Bamin su Unsplash

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