Churn prediction

Foto di Mante Hesthaven su Unsplash

tasso di abbandono dei Clienti, noto anche come cliente di logoramento, si verifica quando i clienti di smettere di fare affari con una società. Le aziende sono interessate a identificare segmenti di questi clienti perché il prezzo per l’acquisizione di un nuovo cliente è solitamente superiore a quello di mantenere quello vecchio. Ad esempio, se Netflix conoscesse un segmento di clienti che erano a rischio di sfornare potrebbero coinvolgerli in modo proattivo con offerte speciali invece di semplicemente perderli.

In questo post, creeremo un semplice modello di previsione del churn del cliente utilizzando il set di dati del Churn del cliente Telco. Abbiamo scelto un albero decisionale per modellare i clienti sfornati, panda per lo scricchiolio dei dati e matplotlib per le visualizzazioni. Faremo tutto questo sopra in Python.
Il codice può essere utilizzato con un altro set di dati con alcune modifiche minori per addestrare il modello di base. Forniamo anche alcuni riferimenti e dare idee per nuove funzionalità e miglioramenti.

È possibile eseguire questo codice scaricando questo notebook Jupyter.

Ecco alcuni link che potrebbero interessarti:

- Labeling and Data Engineering for Conversational AI and Analytics- Data Science for Business Leaders - Intro to Machine Learning with PyTorch - Become a Growth Product Manager - Deep Learning (Adaptive Computation and ML series) - Free skill tests for Data Scientists & Machine Learning Engineers

Alcuni dei link sopra sono link di affiliazione e se li attraversi per effettuare un acquisto guadagnerò una commissione. Tieni presente che collego i corsi a causa della loro qualità e non a causa della commissione che ricevo dai tuoi acquisti.

Usiamo panda per leggere il set di dati e pre-elaborarlo. Telco dataset ha un cliente per linea con molte colonne (caratteristiche). Non ci sono righe con tutti i valori mancanti o duplicati (questo accade raramente con i set di dati del mondo reale). Ci sono 11 campioni che hanno TotalCharges impostato su””, che sembra un errore nei dati. Rimuoviamo questi campioni e impostiamo il tipo su numerico (float).

df = pd.read_csv('data/WA_Fn-UseC_-Telco-Customer-Churn.csv')df = df.dropna(how=”all”) # remove samples with all missing values
df = df # remove duplicatestotal_charges_filter = df.TotalCharges == " "
df = df
df.TotalCharges = pd.to_numeric(df.TotalCharges)

Primi campioni in Telco tasso di abbandono dei Clienti del set di dati

Analisi Esplorativa dei Dati

Ci sono 2 tipi di caratteristiche del set di dati: categorico (due o più valori e senza qualsiasi ordine) e numerico. La maggior parte dei nomi delle funzionalità sono autoesplicativi, ad eccezione di:

  • Partner: se il cliente ha un partner o meno (Sì, No),
  • Dipendenti: se il cliente non ha dipendenti o no (Sì, No),
  • OnlineBackup: Se il cliente dispone di un backup online o no (Sì, No, No internet service),
  • possesso: numero di mesi, il cliente è rimasto con l’azienda,
  • MonthlyCharges: l’importo addebitato al cliente mensili,
  • TotalCharges: l’importo totale a carico del cliente.

Ci sono 7032 clienti nel set di dati e 19 funzionalità senza customerID (non informativo) e colonna Churn (variabile target). La maggior parte delle caratteristiche categoriali hanno 4 o meno valori univoci.

set di dati di Riepilogo

Abbiamo le caratteristiche di combinare in due elenchi, in modo che possiamo analizzare congiuntamente.

categorical_features = 
numerical_features =
target = "Churn”

Distribuzione delle caratteristiche numeriche

Tecniche di riepilogo numerico (media, deviazione standard, ecc.) non mostrarci picchi, forme di distribuzioni ed è difficile osservare valori anomali con esso. Questo è il motivo per cui usiamo gli istogrammi.

df.describe()

Riassunto delle caratteristiche numeriche

A prima vista, non ci sono valori anomali nei dati. Nessun punto dati è disconnesso dalla distribuzione o troppo lontano dal valore medio. Per confermare che avremmo bisogno di calcolare intervallo interquartile (IQR) e mostrare che i valori di ogni caratteristica numerica sono all’interno del 1,5 IQR dal primo e terzo quartile.

Potremmo convertire le caratteristiche numeriche in intervalli ordinali. Ad esempio, il mandato è numerico, ma spesso non ci interessano le piccole differenze numeriche e invece il mandato di gruppo per i clienti con un mandato a breve, medio e lungo termine. Un motivo per convertirlo sarebbe quello di ridurre il rumore, spesso piccole fluttuazioni sono solo rumore.

df.hist(bins=30, figsize=(10, 7))

Istogrammi delle caratteristiche numeriche

guardiamo distribuzioni di caratteristiche numeriche in relazione alla variabile target. Possiamo osservare che maggiore è il totalecarichi e mandato, minore è la probabilità di churn.

fig, ax = plt.subplots(1, 3, figsize=(14, 4))
df.hist(bins=30, color="blue", alpha=0.5, ax=ax)
df.hist(bins=30, color="red", alpha=0.5, ax=ax)

caratteristiche Numeriche in relazione alla variabile target

Categorico distribuzione delle funzioni

analizzare categorico caratteristiche, utilizzare grafici a barre. Osserviamo che gli anziani e i clienti senza servizio telefonico sono meno rappresentati nei dati.

ROWS, COLS = 4, 4
fig, ax = plt.subplots(ROWS, COLS, figsize=(18, 18))
row, col = 0, 0
for i, categorical_feature in enumerate(categorical_features):
if col == COLS - 1:
row += 1
col = i % COLS
df.value_counts().plot('bar', ax=ax).set_title(categorical_feature)

Distribuzione di categorico caratteristiche

Il passo successivo è quello di guardare categorico caratteristiche in relazione alla variabile target. Facciamo questo solo per caratteristica contratto. Gli utenti che hanno un contratto mensile sono più propensi a sfornare rispetto agli utenti con contratti a lungo termine.

feature = ‘Contract’
fig, ax = plt.subplots(1, 2, figsize=(14, 4))
df.value_counts().plot(‘bar’, ax=ax).set_title(‘not churned’)
df.value_counts().plot(‘bar’, ax=ax).set_title(‘churned’)

Contratto di funzione in relazione alla variabile target

Target variabile di distribuzione

Target variabile di distribuzione di spettacoli che abbiamo a che fare con uno squilibrato problema in quanto ci sono molte più camere non-zangolato di creme come zangolato di utenti. Il modello otterrebbe un’elevata precisione in quanto prevederebbe per lo più gli utenti di classe di maggioranza che non hanno sfornato nel nostro esempio.

Poche cose che possiamo fare per ridurre al minimo l’influenza del set di dati squilibrato:
– ricampiona i dati (squilibrato-impara),
– raccogli più campioni,
– usa precisione e richiamo come metriche di precisione.

df.value_counts().plot('bar').set_title('churned')

Target variabile di distribuzione

Caratteristiche

Telco set di dati è già raggruppati per customerID così è difficile aggiungere nuove funzionalità. Quando si lavora sulla previsione churn di solito otteniamo un set di dati che ha una voce per sessione del cliente (attività del cliente in un determinato periodo di tempo). Quindi potremmo aggiungere funzionalità come:

  • numero di sessioni prima di acquistare qualcosa,
  • tempo medio per sessione,
  • differenza di tempo tra le sessioni (cliente frequente o meno frequente),
  • è un cliente solo in un paese.

A volte abbiamo anche i dati degli eventi del cliente, che ci permette di trovare modelli di comportamento del cliente in relazione al risultato (churn).

Caratteristiche di codifica

Per preparare il set di dati per la modellazione churn, abbiamo bisogno di codificare le caratteristiche categoriali ai numeri. Ciò significa codificare “Sì”,” No ” su 0 e 1 in modo che l’algoritmo possa funzionare con i dati. Questo processo è chiamato codifica onehot.

Una calda codificato categorico caratteristiche

Classificazione

usiamo sklearn, una Macchina di Apprendimento libreria in Python, per creare un classificatore.
Il modo sklearn è quello di utilizzare le pipeline che definiscono l’elaborazione delle funzionalità e il classificatore. Nel nostro esempio, la pipeline prende un set di dati nell’input, pre-elabora le funzionalità e allena il classificatore.
Quando addestrato, prende lo stesso input e restituisce le previsioni nell’output.

Nella pipeline, elaboriamo separatamente le caratteristiche categoriali e numeriche. Noi onehot codifichiamo le caratteristiche categoriali e ridimensioniamo le caratteristiche numeriche rimuovendo la media e ridimensionandole alla varianza unitaria.
Abbiamo scelto un modello di albero di decisione a causa della sua interpretabilità e impostare la profondità massima a 3 (arbitrariamente).

pipeline prende un set di dati di input, si preprocesses caratteristiche e treni classificazione

modello di Formazione

dividere il set di dati per treno (il 75% dei campioni) e test (25% dei campioni).
Ci alleniamo (fit) la pipeline e fare previsioni. Con classification_report calcoliamo precisione e richiamo con valori effettivi e previsti.

from sklearn.model_selection import train_test_splitdf_train, df_test = train_test_split(df, test_size=0.25, random_state=42)pipeline.fit(df_train, df_train)
pred = pipeline.predict(df_test)

Testando il modello

Con classification_report calcoliamo precisione e richiamo con valori effettivi e previsti.

Per classe 1 (utenti zangolati) modello raggiunge 0.67 precisione e 0.37 richiamo. La precisione ci dice quanti utenti agitati hanno predetto correttamente il nostro classificatore. Dall’altro lato, recall ci dice quanti utenti agitati ha perso.

In termini profani, il classificatore non è molto preciso per gli utenti sfornati.

from sklearn.metrics import classification_reportprint(classification_report(df_test, pred))

report di Classificazione per l’Albero di Decisione modello

Modello interpretabilità

Albero di Decisione del modello di Contratto, MonthlyCharges, InternetService, TotalCharges ed il possesso di caratteristiche a fare una decisione se un cliente sfornerà o non. Queste caratteristiche separano i clienti agitati dagli altri in base ai criteri di divisione nell’albero decisionale.

Ogni campione di cliente attraversa l’albero e il nodo finale fornisce la previsione.
Ad esempio, se Contract_Month-to-month è:

  • uguale a 0, continua a attraversare l’albero con un ramo Vero,
  • uguale a 1, continua a attraversare l’albero con un ramo falso,
  • non definito, emette la classe 0.

Questo è un ottimo approccio per vedere come il modello sta prendendo una decisione o se alcune funzionalità si sono insinuate nel nostro modello che non dovrebbero essere lì.

Interpretazione del modello di albero Decisionale

bibliografia

  1. Gestione della classe squilibrio nel tasso di abbandono dei clienti di previsione — come possiamo gestire meglio la classe squilibrio della varianza di stima.
  2. A Survey on Customer Churn Prediction using Machine Learning Techniques] — Questo documento esamina i più popolari algoritmi di apprendimento automatico utilizzati dai ricercatori per churn predicting.
  3. Cliente Telco churn on Kaggle-Analisi Churn su Kaggle.
  4. WTTE-RNN-Hackless-churn-modeling — Evento basato churn prediction.

Prima di andare

Seguimi su Twitter, dove tweet regolarmente sulla scienza dei dati e sull’apprendimento automatico.

Foto di Courtney Operatore su Unsplash

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.