Questo articolo si addentra nel cuore del “CHI?” del modello di Abell, svelando come le aziende possano comprendere in profondità la propria base clienti attraverso l’analisi comportamentale. Partendo dall’obiettivo di decifrare i profili dei clienti e segmentarli in gruppi omogenei, esploreremo un’implementazione pratica in Python che sfrutta tecniche avanzate come il clustering K-means e il confronto tra riduzione dimensionale lineare (PCA) e non lineare (t-SNE) per una segmentazione ottimale, validata dal robusto Silhouette Score.
Ma la segmentazione è solo il primo passo. Questo articolo non si ferma qui: ti guiderà nell’interpretazione dei cluster emersi, collegandoli a segmenti di clienti reali e suggerendo azioni di marketing mirate. Inoltre, esploreremo come arricchire questi segmenti comportamentali incrociandoli con dati demografici e psicografici, trasformando i cluster in vere e proprie personas di marketing.
Infine, comprenderemo l’importanza cruciale del monitoraggio dinamico dei cluster. Attraverso l’analisi delle matrici di transizione implementata in Python, scopriremo come tracciare l’evoluzione dei clienti nel tempo, identificare tendenze, valutare l’efficacia delle campagne e attivare azioni di customer nurturing o recovery tempestive.
Vediamo come implementare in Python una logica per suddividere i clienti in gruppi omogenei, un passo fondamentale per decisioni di marketing più precise ed efficaci. Ci concentreremo sulle tecniche di segmentazione comportamentale più utili per definire il “CHI?” del modello di Abell.
Vediamolo in dettaglio.
Obiettivo Gestionale del Codice
1. Comprendere meglio la base clienti
Utilizzando dati storici (es. frequenza d’acquisto, valore medio degli ordini, sconti usati…), il codice trasforma una massa di dati grezzi in insight utili. Il fine è rispondere alla domanda:
“Quanti e quali profili di clienti esistono nel mio database?”
2. Segmentare i clienti in gruppi omogenei
Con tecniche di clustering (K-means), i clienti vengono automaticamente divisi in segmenti, senza bisogno di pre-etichettarli. Ad esempio, potremmo ottenere:
-
Cluster 1: clienti fedeli e ad alto valore
-
Cluster 2: clienti occasionali con alto numero di resi
-
Cluster 3: clienti nuovi con ordini piccoli ma frequenti
Questi segmenti possono essere usati per:
-
Campagne marketing personalizzate (email, promo, upselling)
-
Programmi di fidelizzazione differenziati
-
Analisi delle performance e marginalità per cluster
3. Scegliere la miglior tecnica di riduzione dimensionale per la segmentazione
Il codice confronta due tecniche:
-
PCA (Principal Component Analysis): riduzione lineare e interpretabile
-
t-SNE (t-distributed Stochastic Neighbor Embedding): riduzione non lineare e utile per trovare pattern complessi
Il confronto si basa sul Silhouette Score, che misura la coerenza interna dei cluster. Più è alto, più i clienti sono ben raggruppati.
Silhouette Score: Valutare la Qualità di un Clustering
Prima di passare all’implementazione pratica con il codice, comprendiamo la teoria alla base del Silhouette Score, una metrica fondamentale per valutare l’efficacia di un algoritmo di clustering.
Teoria: Cos’è il Silhouette Score?
Il Silhouette Score è una metrica utilizzata per valutare la qualità dei risultati ottenuti da un algoritmo di clustering (come K-Means, DBSCAN, etc.). Fornisce un’indicazione di quanto bene ogni punto dati si adatti al proprio cluster di appartenenza e quanto sia ben separato dagli altri cluster.
In sostanza, misura la coesione all’interno dei cluster e la separazione tra i cluster.
Il punteggio Silhouette per un singolo punto dati varia tra -1 e +1. L’interpretazione generale dei valori è la seguente:
- Vicino a +1: Indica che il punto dati è ben raggruppato all’interno del proprio cluster (alta coesione) e ben separato dagli altri cluster (alta separazione). Questo suggerisce un buon clustering.
- Vicino a 0: Indica che il punto dati è vicino al confine tra due cluster. I cluster sono indifferenti o c’è una significativa sovrapposizione tra di essi. Il clustering potrebbe non essere ottimale.
- Vicino a -1: Indica che il punto dati potrebbe essere stato assegnato al cluster sbagliato, essendo più simile ai punti di un altro cluster rispetto a quelli del proprio cluster di appartenenza.
Il Silhouette Score complessivo per una partizione di cluster è la media dei punteggi Silhouette individuali di tutti i punti dati. Un punteggio medio più alto indica un clustering migliore.
Come si Calcola
Il Silhouette Score per un singolo punto dati [math]i[/math] viene calcolato utilizzando due distanze medie:
- Calcola [math]a(i)[/math]: Questa è la distanza media del punto [math]i[/math] da tutti gli altri punti all’interno dello stesso cluster a cui [math]i[/math] appartiene.
- Misura la coesione del punto [math]i[/math] con il suo cluster.
- Un valore basso di [math]a(i)[/math] indica che [math]i[/math] è ben raggruppato nel suo cluster.
- Calcola [math]b(i)[/math]: Questa è la distanza media del punto [math]i[/math] da tutti i punti nel cluster più vicino (il cluster a cui [math]i[/math] non appartiene ma per il quale la distanza media è minima rispetto a tutti gli altri cluster).
- Misura la separazione del punto [math]i[/math] dagli altri cluster.
- Un valore alto di [math]b(i)[/math] indica che [math]i[/math] è ben separato dal cluster più vicino.
Il punteggio Silhouette [math]s(i)[/math] per il punto dati [math]i[/math] viene quindi calcolato con la formula:
[math]s(i) = \frac{b(i) – a(i)}{\max(a(i), b(i))}[/math]
Come si può notare dalla formula:
- Se [math]b(i)[/math] è significativamente maggiore di [math]a(i)[/math], significa che il punto [math]i[/math] è molto più vicino al suo cluster rispetto al cluster più vicino. Questo si traduce in un numeratore positivo e un punteggio [math]s(i)[/math] vicino a +1, indicando un buon posizionamento.
- Se [math]a(i)[/math] è maggiore di [math]b(i)[/math], significa che il punto [math]i[/math] è più vicino a un altro cluster che al proprio. Questo si traduce in un numeratore negativo e un punteggio [math]s(i)[/math] negativo, suggerendo un’assegnazione errata.
- Se [math]a(i)[/math] e [math]b(i)[/math] sono approssimativamente uguali, il punteggio [math]s(i)[/math] sarà vicino a 0.
Il Silhouette Score complessivo per l’intera partizione di cluster è semplicemente la media dei punteggi [math]s(i)[/math] calcolati per tutti i punti dati nell’insieme.
4. Facilitare la visualizzazione e la comunicazione ai decision maker
Attraverso grafici bidimensionali colorati per cluster, il team marketing o direzionale può:
-
Capire visivamente la segmentazione
-
Condividere strategie data-driven in modo chiaro
-
Supportare decisioni strategiche (es. budget, targeting, posizionamento).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 1. Dataset sintetico
np.random.seed(42)
n_clienti = 300
data = pd.DataFrame({
'frequenza_acquisti': np.random.poisson(10, n_clienti),
'valore_medio_ordine': np.random.normal(60, 15, n_clienti),
'sconto_medio_usato': np.random.uniform(0, 0.4, n_clienti),
'giorni_dall_ultimo_ordine': np.random.randint(1, 180, n_clienti),
'numero_resi': np.random.poisson(1, n_clienti),
'durata_relazione_mesi': np.random.randint(1, 48, n_clienti)
})
# 2. Standardizzazione
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data)
# 3. PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 4. t-SNE
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# 5. K-means
kmeans_pca = KMeans(n_clusters=3, random_state=42)
labels_pca = kmeans_pca.fit_predict(X_pca)
kmeans_tsne = KMeans(n_clusters=3, random_state=42)
labels_tsne = kmeans_tsne.fit_predict(X_tsne)
# 6. Silhouette score
sil_pca = silhouette_score(X_pca, labels_pca)
sil_tsne = silhouette_score(X_tsne, labels_tsne)
print(f"Silhouette Score (PCA): {sil_pca:.3f}")
print(f"Silhouette Score (t-SNE): {sil_tsne:.3f}")
# 7. Visualizzazione comparata
fig, axs = plt.subplots(1, 2, figsize=(14, 6))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=labels_pca, palette='Set2', ax=axs[0], s=60)
axs[0].set_title(f'PCA + K-means\nSilhouette: {sil_pca:.2f}')
axs[0].set_xlabel('PC1')
axs[0].set_ylabel('PC2')
axs[0].legend(title='Cluster')
axs[0].grid(True)
sns.scatterplot(x=X_tsne[:, 0], y=X_tsne[:, 1], hue=labels_tsne, palette='Set2', ax=axs[1], s=60)
axs[1].set_title(f't-SNE + K-means\nSilhouette: {sil_tsne:.2f}')
axs[1].set_xlabel('t-SNE 1')
axs[1].set_ylabel('t-SNE 2')
axs[1].legend().remove()
axs[1].grid(True)
plt.suptitle('Confronto Segmentazione Clienti: PCA vs t-SNE', fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
Silhouette Score (PCA): 0.358
Silhouette Score (t-SNE): 0.378

L’immagine mostra un confronto tra due approcci di segmentazione clienti: PCA + K-means (a sinistra) e t-SNE + K-means (a destra), con i rispettivi valori di silhouette come metrica di validazione.
Vediamoli nel dettaglio:
PCA + K-means (sinistra)
-
Tecniche usate:
-
PCA (Principal Component Analysis) per ridurre la dimensionalità e proiettare i dati in 2 dimensioni principali (PC1 e PC2).
-
K-means per la segmentazione (clusterizzazione).
-
-
Silhouette score: 0.36
-
Buono, ma non eccellente. Indica una discreta separazione tra cluster, con qualche sovrapposizione.
-
-
Osservazioni grafiche:
-
I cluster sono vicini e mostrano una certa sovrapposizione, soprattutto tra il cluster arancione (1) e quello verde (0).
-
PCA tende a preservare la massima varianza lineare ma non enfatizza le separazioni non lineari tra i gruppi.
-
t-SNE + K-means (destra)
-
Tecniche usate:
-
t-SNE (t-distributed Stochastic Neighbor Embedding) per ridurre la dimensionalità preservando la struttura locale e le separazioni non lineari.
-
K-means come metodo di clustering.
-
-
Silhouette score: 0.38
-
Leggermente più alto: suggerisce una migliore coesione e separazione tra i cluster rispetto a PCA.
-
-
Osservazioni grafiche:
-
I cluster sono molto ben separati e più compatti.
-
t-SNE è più efficace nel catturare strutture complesse e non lineari nei dati.
-
Considerazioni finali:
-
Il metodo t-SNE + K-means risulta leggermente superiore in termini di coesione/separazione (silhouette 0.38 vs 0.36).
-
Tuttavia, t-SNE è una tecnica di visualizzazione più che una riduzione dimensionale interpretabile: le distanze e gli assi non hanno un significato diretto come in PCA.
-
PCA è più interpretabile, utile se serve spiegare il contributo delle variabili originali ai cluster.
Quando scegliere l’uno o l’altro?
-
PCA + K-means: Se vuoi interpretabilità e visualizzazione basata su variabili originarie.
-
t-SNE + K-means: Se cerchi la massima separazione visiva tra cluster anche a costo di perdere interpretabilità.
Immaginiamo che tu stia segmentando i clienti di un e-commerce o di un’azienda B2C basandoti su variabili come:
-
Frequenza di acquisto
-
Valore medio dell’ordine
-
Recency (quanto tempo è passato dall’ultimo acquisto)
-
Tipo di prodotto acquistato
-
Attività sul sito/app
Supponiamo di avere 3 cluster (come da grafico) e colleghiamoli a segmenti reali:
Cluster 0 – “Clienti fedeli e attivi”
-
Comportamento:
-
Elevata frequenza di acquisto
-
Alto valore medio dell’ordine
-
Interazione frequente con il sito o app
-
Ultimo acquisto recente
-
-
Azioni consigliate:
-
Programmi fedeltà personalizzati
-
Upselling su prodotti premium
-
Accesso anticipato a promozioni
-
Cluster 1 – “Clienti dormienti”
-
Comportamento:
-
Bassa frequenza
-
Ultimo acquisto molto lontano nel tempo
-
Pochi o nessun accesso recente
-
-
Azioni consigliate:
-
Email di re-engagement con sconti speciali
-
Reminder con articoli simili a quelli acquistati in passato
-
Survey per capire cause dell’inattività
-
Cluster 2 – “Nuovi clienti promettenti”
-
Comportamento:
-
1 o 2 acquisti recenti
-
Buon valore medio, ma ancora pochi dati
-
Interazione positiva con i contenuti
-
-
Azioni consigliate:
-
Onboarding con guida ai prodotti/servizi
-
Offerte mirate per fidelizzazione
-
Inviti a iscriversi a newsletter o referral program
-
Cosa puoi fare in più?
-
Etichettare dinamicamente i cluster nel CRM/CRM-based marketing.
-
Incrociare questi segmenti con dati demografici o comportamentali.
-
Monitorare nel tempo se i clienti passano da un cluster all’altro (es. da “nuovo” a “fedele”).
Perché incrociare cluster con altri dati?
Incrociare i cluster comportamentali con dati demografici o psicografici ti permette di passare da segmenti “numerici” a personas di marketing complete e attivabili.
Ecco come e perché farlo:
Tipologie di dati da incrociare
✅ Dati demografici
-
Età
-
Genere
-
Localizzazione geografica
-
Reddito stimato o status socioeconomico
👉 Esempio: se il Cluster 0 (“clienti fedeli”) è composto per l’80% da donne 35-44 anni del Nord Italia, puoi creare campagne geotargettizzate e demograficamente mirate.
✅ Dati psicografici/comportamentali
-
Stile di vita, valori, interessi (es. “green”, “tech lover”, “pratico”)
-
Device utilizzati (mobile vs desktop)
-
Attività social (es. follower, condivisioni)
-
Canali preferiti (email, WhatsApp, push, SMS)
👉 Esempio: se il Cluster 2 (“nuovi promettenti”) interagisce soprattutto via mobile e clicca su notifiche push, puoi automatizzare una campagna con offerte last-minute su quell’app.
✅ Fonti da cui derivare i dati
-
CRM (nome, età, CAP, storico ordini)
-
Web analytics (pagine viste, canali d’ingresso)
-
Social login (età, interessi)
-
Survey e quiz (preferenze dirette)
Mappatura combinata: esempio pratico
| Cluster | Comportamento | Età | Canale preferito | Segmento finale |
| Cluster 0 | Alto valore + alta fedeltà | 35-44 | “Professioniste fidelizzate” | |
| Cluster 1 | Inattivo da mesi | 25-34 | Social DM | “Millennial distratti” |
| Cluster 2 | Nuovo + attivo | 18-24 | App notifiche | “Giovani esploratori digitali” |
Monitoraggio Dinamico dei Cluster: Come e Perché
Monitorare il passaggio dei clienti da un cluster all’altro è cruciale per valutare l’efficacia delle tue strategie di marketing e per attivare azioni di customer nurturing o recovery al momento giusto.
Ti spiego come farlo in pratica:
Obiettivo
Capire come evolvono i clienti nel tempo tra i cluster. Esempio:
-
Passano da “nuovo” a “fedele”?
-
Stanno scivolando verso lo stato di “inattivo”?
-
Quali campagne hanno spinto la transizione?
Setup tecnico: segmentazione rolling
Per implementarlo, usa un sistema di segmentazione ricorrente nel tempo, ad esempio:
-
Frequenza di aggiornamento: settimanale, mensile o trimestrale.
-
Tecniche: ricalcolo dei cluster con K-means, DBSCAN, o classificazione supervised (una volta definiti i cluster iniziali).
👉 Struttura i tuoi dati così:
| Cliente ID | Data | Cluster assegnato |
|---|
| A123 | Jan | Cluster 2 (nuovo) |
| A123 | Feb | Cluster 0 (fedele) |
| A123 | Mar | Cluster 0 (fedele) |
Visualizzazione: Matrici di Transizione
Usa una matrice di transizione per vedere il flusso tra cluster:
| From \ To | Nuovo | Fedele | Dormiente |
|---|---|---|---|
| Nuovo | 60% | 35% | 5% |
| Fedele | 2% | 95% | 3% |
| Dormiente | 10% | 20% | 70% |
Questo ti mostra:
-
Tassi di fidelizzazione
-
Tassi di decadimento
-
Effetto delle campagne su ciascun segmento
Use case pratici
✅ Trigger automatizzati
-
Se un cliente passa da fedele a dormiente: attiva un’email win-back.
-
Se uno nuovo è rimasto tale per troppo tempo: offrigli un incentivo.
✅ Valutazione delle campagne
-
Misura l’impatto delle campagne sul passaggio tra cluster.
-
Es. Campagna “Benvenuto PRO” → quanti nuovi clienti sono diventati fedeli dopo 30 giorni?
Strumenti consigliati
-
CRM avanzati: Salesforce, HubSpot, Klaviyo (con moduli RFM)
-
Data warehouse + SQL: BigQuery, Snowflake
-
Notebook Python con librerie come
pandas,scikit-learneseabornper grafici evolutivi
Ecco uno script Python che calcola e visualizza la matrice di transizione tra cluster nel tempo. Ogni cella mostra la probabilità (%) che un cliente passi da uno stato all’altro, ad esempio da “Nuovo” a “Fedele”.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# Esempio dati clienti con evoluzione dei cluster nel tempo
data = {
"Cliente_ID": ["A", "A", "A", "B", "B", "C", "C", "C", "D", "D", "E", "E"],
"Data": ["2025-01", "2025-02", "2025-03", "2025-01", "2025-02",
"2025-01", "2025-02", "2025-03", "2025-01", "2025-02",
"2025-01", "2025-02"],
"Cluster": ["Nuovo", "Fedele", "Fedele", "Nuovo", "Dormiente",
"Dormiente", "Dormiente", "Nuovo", "Fedele", "Dormiente",
"Nuovo", "Nuovo"]
}
df = pd.DataFrame(data)
# Ordinare i dati per Cliente e Data
df['Data'] = pd.to_datetime(df['Data'])
df = df.sort_values(by=["Cliente_ID", "Data"])
# Creare una tabella con i passaggi tra cluster consecutivi
df['Cluster_next'] = df.groupby('Cliente_ID')['Cluster'].shift(-1)
# Rimuovere righe dove il passaggio non è definito
transitions = df.dropna(subset=['Cluster_next'])
# Costruire la matrice di transizione
transition_matrix = pd.crosstab(transitions['Cluster'], transitions['Cluster_next'], normalize='index')
# Visualizzazione con heatmap
plt.figure(figsize=(8, 6))
sns.heatmap(transition_matrix, annot=True, cmap="Blues", fmt=".1%", cbar=True)
plt.title("Matrice di Transizione tra Cluster")
plt.ylabel("Da")
plt.xlabel("A")
plt.tight_layout()
plt.show()

Questa matrice di transizione tra cluster mostra le probabilità che i clienti passino da uno stato (o cluster) a un altro tra due periodi temporali (es. da un mese all’altro). Ecco come interpretarla:
Struttura della matrice
-
Righe = stato iniziale del cliente (da quale cluster proviene)
-
Colonne = stato finale del cliente (a quale cluster è andato)
-
Valori (%) = percentuali di transizione tra stati
Interpretazione dei dati
1. Da Dormiente
-
50% restano Dormiente
-
0% diventano Fedele
-
50% tornano Nuovo
👉 Questo suggerisce instabilità tra i dormienti: metà si risvegliano e tornano attivi, metà restano inattivi.
2. Da Fedele
-
50% diventano Dormiente
-
50% restano Fedele
-
0% tornano Nuovo
👉 Qui c’è un potenziale rischio di perdita di clienti fedeli: la metà si disimpegna e scivola verso l’inattività.
3. Da Nuovo
-
Circa 33.3% restano Nuovo
-
33.3% diventano Fedele
-
33.3% diventano Dormiente
👉 I nuovi clienti sono distribuiti in modo uniforme: un terzo si fidelizza, un terzo si perde, un terzo resta incerto.
Cosa ci dice questa matrice
-
C’è una buona capacità di recupero dei dormienti (50% diventano attivi).
-
I clienti fedeli sono a rischio di perdere interesse (50% diventano dormienti).
-
I nuovi clienti si dividono in modo equilibrato: serve ottimizzare l’onboarding per aumentare la conversione verso la fedeltà.
Prossimi passi strategici
-
Automazioni di retention per prevenire il passaggio da “Fedele” a “Dormiente”
-
Campagne di riattivazione mirate verso “Dormienti”
-
Segmentazione dei Nuovi in base al comportamento iniziale per agire in modo personalizzato
Conclusione
Questo tipo di analisi permette di:
-
Monitorare l’evoluzione dei clienti lungo il ciclo di vita;
-
Identificare criticità (es. tanti clienti “Fedele” che diventano “Dormiente”);
-
Valutare l’efficacia delle strategie di retention o riattivazione.




