K-significa Clustering in R con l'esempio

Che cos'è la Cluster analisi?

Cluster l'analisi fa parte del apprendimento senza supervisione. Un cluster è un gruppo di dati che condividono caratteristiche simili. Possiamo dire che l'analisi di clustering riguarda più la scoperta che una previsione. La macchina cerca somiglianze nei dati. Ad esempio, puoi usare l'analisi di cluster per la seguente applicazione:

  • Segmentazione della clientela: cerca somiglianze tra gruppi di clienti
  • Clustering del mercato azionario: azioni del gruppo in base alle performance
  • Ridurre la dimensionalità di un set di dati raggruppando osservazioni con valori simili

ClusterL'analisi non è troppo difficile da implementare ed è significativa e utilizzabile per il business.

La differenza più evidente tra l’apprendimento supervisionato e quello non supervisionato risiede nei risultati. L’apprendimento non supervisionato crea una nuova variabile, l’etichetta, mentre l’apprendimento supervisionato prevede un risultato. La macchina aiuta il professionista nel tentativo di etichettare i dati in base alla stretta correlazione. Spetta all'analista utilizzare i gruppi e dar loro un nome.

Facciamo un esempio per comprendere il concetto di clustering. Per semplicità, lavoriamo in due dimensioni. Hai dati sulla spesa totale dei clienti e sulla loro età. Per migliorare la pubblicità, il team di marketing vuole inviare email più mirate ai propri clienti.

Nel grafico seguente sono riportati la spesa totale e l'età dei clienti.

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 Analisi

A questo punto è visibile uno schema

  1. In basso a sinistra si vedono i giovani con un potere d’acquisto inferiore
  2. La parte medio-alta riflette le persone con un lavoro che possono permettersi e che spendono di più
  3. Infine, le persone anziane con un budget inferiore.

Cluster Analisi

Nella figura sopra, raggruppi manualmente le osservazioni e definisci ciascuno dei tre gruppi. Questo esempio è piuttosto semplice e altamente visivo. Se vengono aggiunte nuove osservazioni al set di dati, è possibile etichettarle all'interno dei cerchi. Tu definisci il cerchio in base al nostro giudizio. Invece, puoi usare machine Learning raggruppare i dati in modo oggettivo.

In questo tutorial imparerai come utilizzare il file k-significa algoritmo.

Algoritmo delle medie K

K-mean è, senza dubbio, il metodo di clustering più popolare. I ricercatori hanno pubblicato l’algoritmo decenni fa e sono stati apportati molti miglioramenti alle medie k.

L'algoritmo cerca di trovare gruppi minimizzando la distanza tra le osservazioni, chiamata ottimale locale soluzioni. Le distanze vengono misurate in base alle coordinate delle osservazioni. Ad esempio, in uno spazio bidimensionale, le coordinate sono semplici e .

K-significa Algoritmo

L'algoritmo funziona come segue:

  • Passaggio 1: scegli i gruppi nel piano di funzionalità in modo casuale
  • Passaggio 2: ridurre al minimo la distanza tra il centro dell'ammasso e le diverse osservazioni (baricentro). Il risultato sono gruppi con osservazioni
  • Passo 3: Shift il baricentro iniziale alla media delle coordinate all'interno di un gruppo.
  • Passaggio 4: ridurre al minimo la distanza in base ai nuovi centroidi. Si creano nuovi confini. Pertanto, le osservazioni si sposteranno da un gruppo all'altro
  • Ripetere finché nessuna osservazione cambia gruppo

K-means di solito prende la distanza euclidea tra la caratteristica e la caratteristica:

K-significa Algoritmo

Sono disponibili diverse misure come la distanza di Manhattan o la distanza di Minlowski. Tieni presente che la media K restituisce gruppi diversi ogni volta che esegui l'algoritmo. Ricordiamo che le prime ipotesi iniziali sono casuali e calcolano le distanze finché l'algoritmo non raggiunge un'omogeneità all'interno dei gruppi. Cioè, la media k è molto sensibile alla prima scelta e, a meno che il numero di osservazioni e gruppi non sia piccolo, è quasi impossibile ottenere lo stesso clustering.

Seleziona il numero di cluster

Un'altra difficoltà riscontrata con k-mean è la scelta del numero di cluster. Puoi impostare un valore elevato di , ovvero un numero elevato di gruppi, per migliorare la stabilità, ma potresti ritrovarti con sovradattamento di dati. L'overfitting significa che le prestazioni del modello diminuiscono sostanzialmente per i nuovi dati in arrivo. La macchina ha appreso i piccoli dettagli del set di dati e ha difficoltà a generalizzare il modello generale.

Il numero di cluster dipende dalla natura del set di dati, dal settore, dall'azienda e così via. Tuttavia, esiste una regola pratica per selezionare il numero appropriato di cluster:

Seleziona il Numero di Clusters

con uguale al numero di osservazioni nel set di dati.

In generale, è interessante dedicare del tempo alla ricerca del miglior rapporto qualità-prezzo per soddisfare le esigenze aziendali.

Utilizzeremo il set di dati Prezzi dei personal computer per eseguire la nostra analisi di clustering. Questo set di dati contiene 6259 osservazioni e 10 caratteristiche. Il set di dati osserva il prezzo dal 1993 al 1995 di 486 personal computer negli Stati Uniti. Le variabili sono prezzo, velocità, ram, schermo, cd tra le altre.

Procederai come segue:

  • Importa le date
  • Allena il modello
  • Valuta il modello

Importa le date

K significa non è adatto per le variabili fattore perché si basa sulla distanza e i valori discreti non restituiscono valori significativi. Puoi eliminare le tre variabili categoriali nel nostro set di dati. Inoltre, non ci sono valori mancanti in questo set di dati.

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)

Uscita

## 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...

Dalle statistiche di riepilogo, puoi vedere che i dati hanno valori grandi. Una buona pratica con il calcolo della media k e della distanza consiste nel riscalare i dati in modo che la media sia uguale a uno e la deviazione standard sia uguale a zero.

summary(df)

Produzione:

##      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

Ridimensioni le variabili con la funzione scale() della libreria dplyr. La trasformazione riduce l'impatto dei valori anomali e consente di confrontare un'unica osservazione con la media. Se un valore standardizzato (o z-score) è alto, puoi essere certo che questa osservazione è effettivamente superiore alla media (un punteggio z elevato implica che questo punto è lontano dalla media in termini di deviazione standard. Un punteggio z pari a due indica che il valore è 2 standard deviazioni dalla media. Nota: il punteggio z segue una distribuzione gaussiana ed è simmetrico attorno alla media.

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 base ha una funzione per eseguire l'algoritmo k media. La funzione base di k media è:

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

Allena il modello

Nella figura tre, hai spiegato in dettaglio come funziona l'algoritmo. Puoi vedere ogni passaggio graficamente con l'ottimo pacchetto creato da Yi Hui (creatore anche di Knit for Rmarkdown). L'animazione del pacchetto non è disponibile nella libreria conda. Puoi utilizzare l'altro modo per installare il pacchetto con install.packages ("animazione"). Puoi verificare se il pacchetto è installato nella nostra cartella Anaconda.

install.packages("animation")

Dopo aver caricato la libreria, aggiungi .ani dopo kmeans e R traccerà tutti i passaggi. A scopo illustrativo, esegui l'algoritmo solo con le variabili riscalate hd e ram con tre cluster.

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

Spiegazione del codice

  • kmeans.ani(rescale_df[2:3], 3): seleziona le colonne 2 e 3 del set di dati rescale_df ed esegui l'algoritmo con k set su 3. Traccia l'animazione.

Allena il modello

Allena il modello

Puoi interpretare l'animazione come segue:

  • Passaggio 1: R sceglie casualmente tre punti
  • Passaggio 2: calcola la distanza euclidea e disegna i cluster. Hai un grappolo verde in basso a sinistra, un grande grappolo colorato in nero a destra e uno rosso tra di loro.
  • Passo 3: Calcola il baricentro, cioè la media dei cluster
  • Ripetere fino a quando nessun dato cambia nel cluster

L'algoritmo è convergente dopo sette iterazioni. Puoi eseguire l'algoritmo k-mean nel nostro set di dati con cinque cluster e chiamarlo pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • L'elenco pc_cluster contiene sette elementi interessanti:
  • pc_cluster$cluster: indica il cluster di ciascuna osservazione
  • pc_cluster$centers: i centri del cluster
  • pc_cluster$totss: La somma totale dei quadrati
  • pc_cluster$withinss: entro la somma dei quadrati. Il numero di componenti restituiti è uguale a "k".
  • pc_cluster$tot.withinss: somma dei entross
  • pc_clusterbetweenss: somma totale dei quadrati meno la somma interna dei quadrati
  • pc_cluster$size: numero di osservazioni all'interno di ciascun cluster

Utilizzerai la somma dei quadrati inside (ovvero tot.withinss) per calcolare il numero ottimale di cluster k. Trovare k è davvero un compito impegnativo.

K ottimale

Una tecnica per scegliere il k migliore è chiamata the metodo del gomito. Questo metodo utilizza l'omogeneità all'interno del gruppo o l'eterogeneità all'interno del gruppo per valutare la variabilità. In altre parole, ti interessa la percentuale della varianza spiegata da ciascun cluster. Puoi aspettarti che la variabilità aumenti con il numero di cluster, in alternativa, l'eterogeneità diminuisce. La nostra sfida è trovare il k che va oltre i rendimenti decrescenti. L'aggiunta di un nuovo cluster non migliora la variabilità dei dati perché restano pochissime informazioni da spiegare.

In questo tutorial, troviamo questo punto usando la misura di eterogeneità. La somma dei quadrati totale all'interno dei cluster è il tot.withinss nell'elenco restituito da kmean().

Puoi costruire il grafico del gomito e trovare il k ottimale come segue:

  • Passaggio 1: costruire una funzione per calcolare la somma totale dei quadrati all'interno dei cluster
  • Passaggio 2: esegui l'algoritmo volte
  • Passaggio 3: crea un frame di dati con i risultati dell'algoritmo
  • Passaggio 4: tracciare i risultati

Passo 1) Costruisci una funzione per calcolare la somma totale dei quadrati all'interno dei cluster

Si crea la funzione che esegue l'algoritmo k-mean e si memorizza il totale all'interno della somma dei quadrati dei cluster

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

Spiegazione del codice

  • funzione(k): imposta il numero di argomenti nella funzione
  • kmeans(rescale_df, k): esegue l'algoritmo k volte
  • return(cluster$tot.withinss): Memorizza il totale all'interno della somma dei quadrati dei cluster

Puoi testare la funzione con uguale a 2.

Produzione:

## Try with 2 cluster
kmean_withinss(2)

Produzione:

## [1] 27087.07

Passo 2) Esegui l'algoritmo n volte

Utilizzerai la funzione sapply() per eseguire l'algoritmo su un intervallo di k. Questa tecnica è più veloce della creazione di un ciclo e della memorizzazione del valore.

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

Spiegazione del codice

  • max_k <-20: imposta un numero massimo su 20
  • sapply(2:max_k, kmean_withinss): esegue la funzione kmean_withinss() nell'intervallo 2:max_k, ovvero da 2 a 20.

Passo 3) Crea un frame di dati con i risultati dell'algoritmo

Dopo aver creato e testato la nostra funzione, puoi eseguire l'algoritmo k-mean su un intervallo compreso tra 2 e 20, memorizzare i valori tot.withinss.

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

Spiegazione del codice

  • data.frame(2:max_k, wss): crea un frame di dati con l'output dell'archivio dell'algoritmo in wss

Passo 4) Traccia i risultati

Traccia il grafico per visualizzare dove si trova il punto del gomito

# 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 ottimale

Dal grafico puoi vedere che il k ottimale è sette, dove la curva inizia ad avere un rendimento decrescente.

Una volta ottenuto il nostro k ottimale, riesegui l'algoritmo con k uguale a 7 e valuti i cluster.

Esaminando il cluster

pc_cluster_2 <-kmeans(rescale_df, 7)

Come menzionato prima, puoi accedere alle restanti informazioni interessanti nell'elenco restituito da kmean().

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

La parte di valutazione è soggettiva e si basa sull'uso dell'algoritmo. Il nostro obiettivo qui è raccogliere computer con caratteristiche simili. Un informatico può svolgere il lavoro manualmente e raggruppare i computer in base alla sua esperienza. Tuttavia, il processo richiederà molto tempo e sarà soggetto a errori. L'algoritmo K-mean può preparare il campo per lui/lei suggerendo cluster.

Come valutazione preventiva, è possibile esaminare la dimensione dei cluster.

pc_cluster_2$size

Produzione:

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

Il primo cluster è composto da 608 osservazioni, mentre il cluster più piccolo, il numero 4, conta solo 580 computer. Potrebbe essere utile avere omogeneità tra i cluster, altrimenti potrebbe essere necessaria una preparazione dei dati più snella.

Puoi dare uno sguardo più approfondito ai dati con il componente centrale. Le righe si riferiscono alla numerazione dei cluster e le colonne alle variabili utilizzate dall'algoritmo. I valori rappresentano il punteggio medio di ciascun cluster per la colonna interessata. La standardizzazione facilita l'interpretazione. I valori positivi indicano che il punteggio z per un dato cluster è superiore alla media complessiva. Ad esempio, il cluster 2 ha il prezzo medio più alto tra tutti i cluster.

center <-pc_cluster_2$centers
center

Produzione:

##   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

Puoi creare una mappa termica con ggplot per aiutarci a evidenziare la differenza tra le categorie.

I colori predefiniti di ggplot devono essere modificati con la libreria RColorBrewer. Puoi usare il conda biblioteca e il codice da avviare nel terminale:

conda install -cr r-rcolorbrewer

Per creare una mappa termica si procede in tre passaggi:

  • Costruisci un frame di dati con i valori del centro e crea una variabile con il numero del cluster
  • Rimodellare i dati con la funzione raccogli() della libreria tidyr. Vuoi trasformare i dati da ampi a lunghi.
  • Crea la tavolozza dei colori con il coloreRampFunzione tavolozza()

Passo 1) Costruisci un frame di dati

Creiamo il set di dati di rimodellamento

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)

Produzione:

##   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		

Passo 2) Rimodellare i dati

Il codice seguente crea la tavolozza di colori che utilizzerai per tracciare la mappa termica.

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

Passaggio 3) Visualizza

Puoi tracciare il grafico e vedere come appaiono i cluster.

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

Esaminando il Cluster

Sommario

Possiamo riassumere l'algoritmo k-mean nella tabella seguente

CONFEZIONE Obiettivo Funzione Argomento
base Treno k-significa kmeans () df, k
Raggruppamento di accesso kmeans()$cluster
Cluster centri kmeans()$centri
Gruppo di dimensioni kmeans()$dimensione