
In questo articolo vorrei analizzare una branca del machine learning (o forse no) molto utilizzata nel quotidiano, semplice da realizzare e con risultati “immediati”.
Molte attività come negozi all’ingrosso, supermercati, centri commerciali, e-commerce, ma anche siti internet, applicazioni web come Spotify*, Rotten Tomatoes oppure Amazon* hanno spesso la necessità di ricercare patterns tra i loro clienti, ovvero creare categorie dove vengono raggruppati “oggetti” simili. Questa serie di tecniche fanno parte di quello che si chiama clustering, oppure unsupervised learning.
(*) Sono decisamente sicuro che queste due aziende utilizzano tecniche di clustering più efficaci ed avanzate di quella descritta in questo articolo, ad esempio con l’aiuto di tecnologie come ElasticSearch.
In questo articolo ho a disposizione un dataset contenente informazioni raccolte in un database dal management di un centro commerciale, il database, oltre contenere informazioni di tipo PII (Personally identifiable information – Informazioni di identificazione personale) per ogni cliente raccoglie gli acquisti effettuati e l’ammontare degli stessi; per questo articolo ho deciso (e potuto) utilizzare solo due colonne dello stesso:
- La spesa totale nell’ultimo mese e la percentuale della stessa spesa in CPG (Consumer Packaged Goods – Beni di Consumo Confezionati, es. merendine, gelati, bibite ecc.) .
- La percentuale è stata calcolata dividendo la spesa totale con l’ammontare speso in alcuni negozi specializzati in CPG (supermercati, panetterie, profumerie, ecc.).

CPG, ovvero bibite gassate in un supermercato
Lo strumento che permettere di raggruppare oggetti simili in categorie si chiama K-Means, una volta specificato a priori il numero di categorie k che l’algoritmo dovrà ricercare si verificano 4 steps:
- L’algoritmo sceglie in maniera casuale k baricentri nel dataset
- Ogni osservazione vicina al baricentro viene assegnata alla categoria k più vicina
- Ogni baricentro k viene spostato il più possibile al centro della categoria assegnata
- Gli steps vengono ripetuti fino a che l’assegnazione ad una categoria non cambia, oppure fino a che un limite fissato dall’utente non viene raggiunto o un numero massimo di iterazioni è stato raggiunto
Di seguito una gif che aiuta a capire il funzionamento:
Ma come viene misurata la “similarità” tra due osservazioni?
Con il termine similarità ci si può riferire al contrario di distanza, ovvero più due osservazioni sono vicine l’una all’altra più hanno qualcosa in comune. Per questo una tecnica molto comune per misurare la distanza corrisponde al computare il quadrato della distanza euclidea tra due punti in uno spazio di ndimensioni:

j si riferisce alla j-esima dimensione del dataset, ovvero alle coordinate x e y che rappresentano ogni punto nel dataset.
Basandosi sulla distanza euclidea si può concludere che l’algoritmo K-Means ha ben poco di machine learning, in quanto consiste in un semplice problema di ottimizzazione:
Per approfondire il funzionamento di questo tool consiglio vivamente di leggere il blog di Oracle.
Implementazione in Python:
Per implementare questo algoritmo utilizzerò il linguaggio Python affiancato alla libreria sklearn
. Dopo aver fatto una query al database ed ottenuto i dati necessari ho calcolato la percentuale spesa in CPG e proiettato i dati su un grafico:
Dovendo specificare a priori il numero di clusters per i quali si vuole effettuare la segmentazione esistono diverse tecniche per stabilire il numero ideale di categorie, ma come a volte accade, le categorie sono piuttosto evidenti già dopo aver semplicemente proiettato i dati su un grafico.
In altri casi, ad esempio decidere a che categoria un film appartiene basandosi solo sulla trascrizione dell’audio, è necessario utilizzare tecniche che aiutano a trovare il numero ideale di clusters; è importante sottolineare che esistono anche casi nei quali il management propone un numero di categorie alle quali ci si deve attenere.
Essendo in questo caso evidenti quattro diversi “gruppi” di osservazioni opterò per individuare quattro diverse categorie, la libreria sklearn
permette di implementare questo algoritmo in maniera piuttosto semplice:
dopodichè posso proiettare le categorie previste dall’algoritmo assegnando ogni cluster un colore diverso ed identificando con il simbolo “+” il baricentro di ogni categoria:
Lo scopo finale dell’algoritmo K-Means, non è di certo quello di generare un grafico con tanti colori, la tecnica descritta in questo articolo è da considerarsi un punto di partenza, e spesso viene utilizzata proprio per questo:
- Avendo a disposizione una raccolta di dati non categorizzati, si può assegnarli a delle categorie, per poi eventualmente effettuare altre analisi o costruire modelli.
- Una volta categorizzati, i dati, possono essere utilizzati come dati di input in una rete neurale per creare un modello in grado di determinare a che categoria un singolo cliente (osservazione) appartiene, questo permetterebbe di creare campagne di marketing su misura.
Un’altra osservazione importante che ci tengo a fare è far notare come in questo articolo ho utilizzato soltanto due diverse misure: il totale speso e la percentuale spesa in CPG, questo mi ha permesso di generare grafici 2D, ma è importante far notare come prendendo ad esempio un terzo parametro, l’eta del cliente, la situazione cambia:
Questo per far notare come il clustering consista in una serie di tecniche dove è difficile poter mettere “nero su bianco” cosa è giusto e cosa è sbagliato, ma bensì una branca nella quale spesso è necessario fare diversi tentativi, e dove quasi ogni caso è uno studio a sé.
A volte, inoltre, alcune delle decisioni “tecniche” che vengono prese durante l’utilizzo di questi modelli non deriva al 100% dal risultato di metodi di ottimizzazione puramente matematica, ma bensì dalle necessità del cliente.
In questo notebook creato dal team di ProfessionAI puoi vedere come implementare il k-means in Python utilizzando sciki-learn per risolvere un semplice problema di clustering.
Grazie per essere arrivato fin qui! Se sei interessato ad altri miei progetti puoi controllare la mia pagina oppure seguirmi su LinkedIn!