Segmentazione Clienti con Python: Guida Completa al Marketing Comportamentale (K-means, PCA, t-SNE)

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Segmentazione

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.

 👉 Le tecniche di segmentazione comportamentale più efficaci per rispondere al “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.
Forse potrebbe interessarti anche:  Prevedere le Tendenze con le Onde: l'Uso delle Funzioni Sinusoidali per la Stagionalità

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:

  1. 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.
  2. 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

Confronto segmentazione Clienti

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)

 👉K-Means Clustering

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

Forse potrebbe interessarti anche:  Matrice BCG e Data Science: Come l'Analisi Dati Trasforma la Strategia Aziendale

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 Email “Professioniste fidelizzate”
Cluster 1 Inattivo da mesi 25-34 Social DM “Millennial distratti”
Cluster 2 Nuovo + attivo 18-24 App notifiche “Giovani esploratori digitali”
Esempio di segmentazione clienti basata su clustering.

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

Forse potrebbe interessarti anche:  Multi‑Armed Bandit: Epsilon‑Greedy vs Thompson Sampling

👉 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-learn e seaborn per 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()

matrice di transizione tra cluster

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.

Pubblicità