Team I.A. Italia

8 min

K-means Cluster analysis : teoria e codice in Python

K-means è un algoritmo di clustering non supervisionato molto utilizzato in statistica e machine learning. Consiste in un metodo di suddivisione di un insieme di oggetti in K gruppi (o cluster) in modo da ottenere il massimo grado di somiglianza all'interno di ciascun cluster e il massimo grado di dissomiglianza tra gli elementi appartenenti a cluster diversi.

In questo articolo, esamineremo in dettaglio la teoria di base di K-means, la sua storia, gli utilizzi e i vantaggi di questo algoritmo, nonché le formule matematiche alla base del suo funzionamento. Inoltre, forniremo un esempio pratico di cluster analysis con Python, mostrando come eseguire un'analisi di cluster utilizzando K-means su un dataset di esempio.

Questo articolo è rivolto a chiunque sia interessato a conoscere meglio K-means e a imparare a utilizzarlo per eseguire analisi di cluster. Potrebbe essere particolarmente utile per chi studia statistica o machine learning o per chi lavora in ambiti in cui il clustering può essere applicato, come il marketing, la finanza, la biologia, etc.

Se sei un principiante in questi campi, non temere: in questo articolo spiegheremo tutto in modo semplice e accessibile, fornendo esempi pratici che ti aiuteranno a capire come funziona K-means e come utilizzarlo per risolvere problemi di clustering. Se sei già un esperto di K-means, questo articolo potrebbe comunque offrirti spunti interessanti e nuove prospettive sull'utilizzo di questo algoritmo.

Indice su K-means Cluster analysis:

  • Teoria di base di K-means

    1. Cos'è il clustering e a cosa serve

    2. Come funziona l'algoritmo di K-means

    3. Come si sceglie il numero di cluster K

    4. Vantaggi e svantaggi di K-means

  • Storia di K-means

    1. Chi è James MacQueen e come ha sviluppato l'algoritmo di K-means

    2. Come K-means è diventato popolare negli anni '90

  • Utilizzi di K-means

    1. Esempi di applicazioni di K-means in diverse aree, come il marketing, la finanza, la biologia, etc.ubunt

  • Formule di K-means

    1. Spiegazione delle formule matematiche alla base di K-means

  • Esempio di cluster analysis con Python

    1. Passi per eseguire un'analisi di cluster con K-means in Python

    2. Codice di esempio per eseguire un'analisi di cluster su un dataset di esempio

Cosa è K-means?

La teoria di base di K-means si basa sull'idea di suddividere un insieme di oggetti in K gruppi (o cluster) in modo da ottenere il massimo grado di somiglianza all'interno di ciascun cluster e il massimo grado di dissomiglianza tra gli elementi appartenenti a cluster diversi. Questo viene generalmente fatto utilizzando una misura di distanza, come ad esempio la distanza Euclidea.

Il processo di clustering viene effettuato utilizzando un algoritmo iterativo, che parte da K centroidi (punti rappresentativi) scelti in modo casuale e assegna ogni oggetto al cluster il cui centroide è più vicino. Una volta che tutti gli oggetti sono stati assegnati a un cluster, i centroidi vengono aggiornati come la media dei punti assegnati al cluster. Questo processo viene ripetuto finché i centroidi non convergono, ovvero finché non cambiano più significativamente.

Una volta che il processo di clustering è stato completato, ogni oggetto viene assegnato al cluster a cui appartiene in base alla distanza dal centroide. Il numero di cluster K viene solitamente scelto in base alla dimensione del dataset e al numero di cluster che si desidera ottenere. Esistono diverse tecniche per scegliere il numero ottimale di cluster, come ad esempio l'utilizzo della curva di Elbow o della metrica di Calinski-Harabasz.

K-means presenta alcuni vantaggi, come ad esempio la sua semplicità di implementazione e il suo tempo di esecuzione relativamente breve. Tuttavia, ha anche alcuni svantaggi, come la dipendenza dalla scelta dei centroidi iniziali e la difficoltà nel gestire cluster di forma irregolare o di densità variabile. Inoltre, K-means è sensibile alle outlier (punti anomali) e non è adatto a dati non linearmente separabili.

Quando è stato sviluppato K-means?

K-means è stato sviluppato negli anni '50 da James MacQueen, un matematico e statistico statunitense. MacQueen aveva bisogno di un metodo per suddividere un insieme di dati in gruppi omogenei in modo da poter studiare le relazioni tra le variabili e i gruppi. L'algoritmo di K-means che ha sviluppato utilizzava una misura di distanza per assegnare gli oggetti ai cluster e aggiornare i centroidi iterativamente fino a quando non si otteneva una convergenza.

Tuttavia, K-means non è diventato popolare fino agli anni '90, con l'avvento dei computers e dei software di data mining. In particolare, l'aumento della potenza di calcolo e la disponibilità di grandi quantità di dati hanno reso possibile l'applicazione di K-means su dataset di grandi dimensioni. Inoltre, l'interesse per il machine learning e il data mining ha contribuito a diffondere l'utilizzo di K-means in diverse aree, come il marketing, la finanza, la biologia, etc.

Oggi, K-means è uno dei metodi di clustering più utilizzati in statistica e machine learning, e continua a essere uno strumento molto utile per esplorare e analizzare i dati. Grazie alla sua semplicità di implementazione e al suo tempo di esecuzione relativamente breve, K-means è spesso utilizzato come punto di partenza per l'analisi di cluster e come base per lo sviluppo di altri algoritmi di clustering più sofisticati.

Applicazioni di K-means:

K-means è uno degli algoritmi di clustering più utilizzati in diverse aree, grazie alla sua semplicità di implementazione e al suo tempo di esecuzione relativamente breve. Ecco alcuni esempi di come K-means viene utilizzato in diverse aree:

  • Marketing: K-means può essere utilizzato per segmentare i clienti in base alle loro caratteristiche demografiche, alle loro preferenze e ai loro comportamenti di acquisto. Ad esempio, un'azienda di abbigliamento potrebbe utilizzare K-means per suddividere i suoi clienti in gruppi in base al genere, all'età, alla frequenza di acquisto e al budget, al fine di creare campagne di marketing mirate a ciascun gruppo.

  • Finanza: K-means può essere utilizzato per identificare gruppi di investitori con caratteristiche simili, al fine di offrire loro prodotti finanziari adeguati. Ad esempio, una banca potrebbe utilizzare K-means per suddividere i suoi clienti in gruppi in base al reddito, all'età, alla propensione al rischio e alla diversificazione del portafoglio, al fine di offrire loro prodotti di investimento personalizzati.

  • Biologia: K-means può essere utilizzato per analizzare i dati di espressione genica e identificare gruppi di geni con espressione simile. Ad esempio, uno studio potrebbe utilizzare K-means per suddividere i geni in gruppi in base all'espressione in diversi tessuti o in risposta a diverse condizioni, al fine di identificare i geni coinvolti in specifiche funzioni biologiche.

Questi sono solo alcuni esempi di come K-means viene utilizzato in diverse aree. In generale, K-means è uno strumento molto utile per esplorare e analizzare i dati e scoprire relazioni e pattern nascosti.

Formule Matematiche di K-means

K-means è basato sulla minimizzazione di una funzione di costo che misura la somiglianza degli oggetti all'interno di ciascun cluster. Nello specifico, la funzione di costo di K-means è data dalla somma delle distanze quadrate (SSE, Sum of Squared Errors) degli oggetti dal centroide del cluster a cui appartengono:

SSE = ∑(x - μ)^2

dove x è l'oggetto i-esimo, μ è il centroide del cluster a cui appartiene l'oggetto x, e la somma viene effettuata su tutti gli oggetti del dataset. La funzione di costo viene minimizzata iterativamente aggiornando i centroidi come la media degli oggetti assegnati al cluster.

Per eseguire il clustering con K-means, il processo consiste nei seguenti passi:

  1. Scegliere K, il numero di cluster.

  2. Inizializzare i centroidi scegliendo K punti casuali dal dataset.

  3. Assegnare ogni oggetto al cluster il cui centroide è più vicino, utilizzando una misura di distanza come ad esempio la distanza Euclidea.

  4. Aggiornare i centroidi come la media degli oggetti assegnati al cluster.

  5. Ripetere i passi 3 e 4 finché i centroidi non convergono, ovvero finché non cambiano più significativamente.

Una volta che il processo di clustering è stato completato, ogni oggetto viene assegnato al cluster a cui appartiene in base alla distanza dal centroide.

Esempio di cluster analysis con Python

Per illustrare come utilizzare K-means per eseguire un'analisi di cluster, in questa sezione forniremo un esempio pratico utilizzando Python. Prima di iniziare, assicurati di avere i seguenti prerequisiti installati sul tuo computer:

  • Un ambiente di sviluppo Python, come ad esempio Anaconda o PyCharm.

  • La libreria NumPy per l'elaborazione dei dati in forma numerica.

  • La libreria Pandas per il caricamento e la manipolazione dei dati.

  • La libreria Matplotlib per la visualizzazione dei dati.

Una volta che hai installato queste librerie, sei pronto per iniziare a lavorare con K-means in Python. Per semplicità, useremo un set di dati fittizio su degli studenti e i loro voti. Immagina di avere un dataset che contiene le seguenti informazioni sugli studenti:

  • Nome

  • Genere (Maschio o Femmina)

  • Età

  • Numero di esami sostenuti

  • Voto medio

Per creare questo dataset fittizio, possiamo utilizzare la libreria Pandas e generare dei dati casuali. Ecco un esempio di come fare:


 
import pandas as pd
 
import numpy as np
 

 
# Crea un array di nomi casuali
 
nomi = ['Mario', 'Anna', 'Giovanni', 'Sara', 'Luca', 'Chiara', 'Francesco', 'Martina', 'Riccardo', 'Alessia']
 

 
# Crea un array di generi casuali
 
generi = ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F']
 

 
# Crea un array di età casuali
 
età = np.random.randint(18, 26, size=10)
 

 
# Crea un array di numero di esami sostenuti casuali
 
esami = np.random.randint(1, 10, size=10)
 

 
# Crea un array di voti medi casuali
 
voti = np.random.randint(60, 101, size=10)

Una volta che abbiamo generato i nostri dati fittizi, possiamo creare un dataframe Pandas utilizzando questi array:


 
# Crea il dataframe Pandas
 
df = pd.DataFrame({'Nome': nomi, 'Genere': generi, 'Età': età, 'Esami': esami, 'Voto': voti})
 

 
# Mostra le prime 5 righe del dataframe
 
df.head()
 

Il risultato dovrebbe essere simile a questo:

Ora che abbiamo il nostro dataset, possiamo procedere con l'analisi di cluster utilizzando K-means. Per fare questo, dobbiamo prima importare il modulo di K-means dalla libreria scikit-learn:

from sklearn.cluster import KMeans

A questo punto, possiamo creare un'istanza di KMeans specificando il numero di cluster che vogliamo ottenere (in questo caso, 2):

# Crea un'istanza di KMeans con 2 cluster
 
kmeans = KMeans(n_clusters=2)
 

Infine, possiamo utilizzare il metodo fit() per addestrare il modello di K-means sul nostro dataset:


 
# Addestra il modello di K-means sul dataset
 
kmeans.fit(df[['Età', 'Esami', 'Voto']])
 

Il modello di K-means ora è stato addestrato e può essere utilizzato per assegnare ogni oggetto del dataset a uno dei due cluster. Possiamo ottenere le etichette dei cluster assegnate ad ogni oggetto utilizzando il metodo predict():


 
# Assegna le etichette dei cluster a ogni oggetto del dataset
 
df['Cluster'] = kmeans.predict(df[['Età', 'Esami', 'Voto']])
 

 
# Mostra le prime 5 righe del dataframe con la colonna Cluster aggiunta
 
df.head()
 

Il risultato dovrebbe essere simile a questo:

Come puoi vedere, ogni oggetto del dataset è stato assegnato a uno dei due cluster (0 o 1) in base alle sue caratteristiche (età, numero di esami sostenuti, voto medio). A questo punto, possiamo utilizzare queste informazioni per esplorare le caratteristiche dei due cluster e scoprire eventuali pattern o relazioni interessanti.

A questo punto, possiamo utilizzare le informazioni ottenute dal modello di K-means per esplorare le caratteristiche dei due cluster e scoprire eventuali pattern o relazioni interessanti. Ad esempio, possiamo utilizzare la libreria Matplotlib per visualizzare i dati in un grafico a dispersione e ottenere una rappresentazione visiva dei due cluster:


 
import matplotlib.pyplot as plt
 

 
# Crea un grafico a dispersione dei dati utilizzando le colonne Età e Voto
 
plt.scatter(df['Età'], df['Voto'], c=df['Cluster'], cmap='viridis')
 
plt.xlabel('Età')
 
plt.ylabel('Voto')
 
plt.show()
 

Il grafico dovrebbe mostrare i due cluster in colori diversi, in base all'etichetta assegnata dal modello di K-means. In questo modo, è possibile visualizzare visivamente le caratteristiche dei due cluster e scoprire eventuali pattern o relazioni interessanti.

Questo è solo un esempio di come utilizzare K-means per eseguire un'analisi di cluster con Python. Naturalmente, ci sono molti altri aspetti da considerare nell'utilizzo di K-means, come ad esempio la scelta del numero di cluster ottimale, la selezione delle caratteristiche da utilizzare per il clustering, o la valutazione della qualità dei cluster ottenuti. Tuttavia, spero che questo esempio ti abbia fornito un'idea di come utilizzare K-means in Python e ti abbia ispirato a esplorare ulteriormente questo algoritmo.

Conclusione

In conclusione, K-means è un algoritmo di clustering molto popolare e versatile che viene utilizzato in diverse aree, come il marketing, la finanza, la biologia e molte altre. Basato sulla minimizzazione di una funzione di costo che misura la somiglianza degli oggetti all'interno di ciascun cluster, K-means viene eseguito iterativamente aggiornando i centroidi come la media degli oggetti assegnati al cluster. In questo articolo, abbiamo visto come utilizzare K-means per eseguire un'analisi di cluster con Python, utilizzando un semplice esempio di dataset fittizio su degli studenti e i loro voti. Spero che questo articolo ti sia stato utile e ti abbia fornito una buona comprensione della teoria e dell'utilizzo di K-means.

Grazie per aver letto questo articolo!

Se ti è piaciuto e vuoi rimanere aggiornato sui nostri contenuti, ti invitiamo a iscriverti al nostro sito. In questo modo potrai ricevere notifiche ogni volta che pubblichiamo nuovi articoli e rimanere sempre informato sui nostri contenuti. Grazie ancora e a presto!