Churn voorspelling

Foto van Mantas hesthaven on Unsplash

klantverloop, ook bekend als klantverloop, vindt plaats wanneer klanten stoppen met zakendoen met een bedrijf. De bedrijven zijn geïnteresseerd in het identificeren van segmenten van deze klanten, omdat de prijs voor het verwerven van een nieuwe klant is meestal hoger dan het behoud van de oude. Als Netflix bijvoorbeeld een segment van klanten kende die het risico liepen om te draaien, konden ze hen proactief betrekken met speciale aanbiedingen in plaats van ze simpelweg te verliezen.

In dit bericht zullen we een eenvoudig customer churn voorspellingsmodel maken met behulp van Telco Customer Churn dataset. We kozen voor een beslissingsboom om klanten te modelleren, panda ‘ s voor data crunching en matplotlib voor visualisaties. We zullen dat allemaal hierboven in Python doen.
de code kan worden gebruikt met een andere dataset met enkele kleine aanpassingen om het basismodel te trainen. We geven ook een paar referenties en geven ideeën voor nieuwe functies en verbeteringen.

u kunt deze code uitvoeren door deze Jupyter notebook te downloaden.

Hier zijn een paar links die u zouden kunnen interesseren:

- 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

sommige van de bovenstaande links zijn affiliate links en als u ze gebruikt om een aankoop te doen, verdien ik een commissie. Houd er rekening mee dat ik cursussen koppelen vanwege hun kwaliteit en niet vanwege de Commissie die ik ontvang van uw aankopen.

we gebruiken panda ‘ s om de dataset te lezen en voor te bereiden. Telco dataset heeft één klant per regel met vele kolommen (functies). Er zijn geen rijen met alle ontbrekende waarden of duplicaten (dit gebeurt zelden met real-world datasets). Er zijn 11 samples die TotalCharges hebben ingesteld op””, wat lijkt op een fout in de gegevens. We verwijderen die monsters en stellen het type in op numeriek (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)

Eerste paar monsters in Telco klantbehoud dataset

Exploratieve Data-Analyse

Wij hebben 2 types van functies in de dataset: categorische (twee of meer waarden en zonder enige volgorde) en numeriek. De meeste functienamen spreken voor zich, behalve:

  • Partner: of de klant een partner heeft of niet (ja, nee),
  • afhankelijke personen: of de klant al dan niet afhankelijke personen heeft (Ja, Nee),
  • Onlineback-up: of de klant al dan niet een online back-up heeft (ja, nee, geen internetdienst),
  • tenure: aantal maanden dat de klant bij de onderneming is gebleven,
  • maandelijkse lasten: het bedrag dat de klant maandelijks in rekening wordt gebracht,
  • totale lasten: het totale bedrag dat de klant in rekening wordt gebracht.

er zijn 7032 klanten in de dataset en 19 functies zonder customerID (niet-informatief) en Churn kolom (doelvariabele). De meeste categorische kenmerken hebben 4 of minder unieke waarden.

dataset Summary

We combineren functies in twee lijsten zodat we ze gezamenlijk kunnen analyseren.

categorical_features = 
numerical_features =
target = "Churn”

numerieke kenmerken distributie

numerieke samenvattende technieken (gemiddelde, standaardafwijking, enz.) Toon ons geen spikes, vormen van distributies en het is moeilijk om uitschieters mee te observeren. Daarom gebruiken we histogrammen.

df.describe()

Overzicht van numerieke functies

Op het eerste gezicht zijn er geen uitschieters in de data. Geen enkel gegevenspunt is losgekoppeld van distributie of te ver van de gemiddelde waarde. Om te bevestigen dat we interquartile range (IQR) zouden moeten berekenen en laten zien dat de waarden van elke numerieke functie binnen de 1,5 IQR van het eerste en derde kwartiel liggen.

We kunnen numerieke kenmerken converteren naar ordinale intervallen. Bijvoorbeeld, tenure is numeriek, maar vaak geven we niet om kleine numerieke verschillen en in plaats daarvan groep tenure aan klanten met korte, middellange en lange termijn tenure. Een reden om het om te zetten zou zijn om het lawaai te verminderen, vaak kleine fluctuaties zijn gewoon lawaai.

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

Histogrammen van numerieke functies

kijken We naar distributies van numerieke functies in relatie tot de variabele. We kunnen zien dat hoe groter de totale lasten en tenure zijn, hoe minder de kans op Karn is.

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)

Numerieke functies in relatie tot de variabele

Categoriale functie distributie

Om het analyseren van categorische eigenschappen, gebruiken we staafdiagrammen. We zien dat senioren en klanten zonder telefoonservice minder vertegenwoordigd zijn in de gegevens.

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)

Distributie van categorische eigenschappen

De volgende stap is om te kijken naar categorische functies in relatie tot de variabele. We doen dit alleen voor contract functie. Gebruikers die een maand-tot-maand contract hebben meer kans om te churn dan gebruikers met lange termijn contracten.

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

Contract functie in relatie tot de variabele

variabele distributie

variabele verdeling laat zien dat we te maken hebben met een onevenwichtige probleem, want er zijn veel meer niet-gekarnd als gekarnd gebruikers. Het model zou een hoge nauwkeurigheid te bereiken als het zou meestal voorspellen meerderheid klasse-gebruikers die niet churn in ons voorbeeld.

weinig dingen die we kunnen doen om de invloed van onevenwichtige dataset te minimaliseren:
– resample data (imbalanced-learn),
– collect more samples,
– use precision and recall as accuracy metrics.

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

variabele distributie

Mogelijkheden

Telco dataset is al gegroepeerd per klantnummer dus het is moeilijk om nieuwe functies toe te voegen. Bij het werken aan de churn voorspelling krijgen we meestal een dataset die één ingang per klant sessie heeft (activiteit van de klant in een bepaalde tijd). Dan kunnen we functies toevoegen zoals:

  • aantal sessies voordat je iets koopt,
  • gemiddelde tijd per sessie,
  • tijdsverschil tussen sessies (frequente of minder frequente klant),
  • is slechts een klant in één land.

soms hebben we zelfs gegevens over klantgebeurtenissen, waardoor we patronen van klantgedrag kunnen vinden in relatie tot de uitkomst (churn).

coderingsfuncties

om de dataset voor te bereiden voor het modelleren van churn, moeten we categorische functies coderen naar getallen. Dit betekent coderen “ja”, ” nee ” naar 0 en 1, zodat algoritme kan werken met de gegevens. Dit proces wordt onehot codering genoemd.

One hot encoded categorical features

classifier

we gebruiken sklearn, een machine learning bibliotheek in Python, om een classifier te maken.
De sklearn manier is om pijpleidingen te gebruiken die feature processing en de classifier definiëren. In ons voorbeeld neemt de pijplijn een dataset in de invoer, het preprocess functies en traint de classifier.
wanneer getraind, neemt het dezelfde input en geeft het voorspellingen terug in de output.

in de pijplijn verwerken we afzonderlijk categorische en numerieke kenmerken. We onehot coderen categorische functies en schaal numerieke functies door het verwijderen van het gemiddelde en schalen ze naar eenheid variantie.
We kozen een beslissingsboommodel vanwege zijn interpreteerbaarheid en zetten de maximale diepte op 3 (willekeurig).

De pijplijn neemt een dataset in de input, het preprocesses functies en treinen de indeler

de Opleiding de model

We splitsen de dataset te trainen (75% monsters) en test (25% van de monsters). we trainen (passen) de pijplijn en maken voorspellingen. Met classification_report berekenen we precisie en recall met actuele en voorspelde waarden.

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)

het testen van het model

met classification_report berekenen we precisie en recall met actuele en voorspelde waarden.

voor klasse 1 (gekarnde gebruikers) model bereikt 0,67 precisie en 0,37 recall. Precisie vertelt ons hoeveel gekarnde gebruikers onze classifier correct voorspelde. Aan de andere kant, herinneren vertel ons hoeveel gekarnde gebruikers het gemist.

in lekentaal is de classifier niet erg nauwkeurig voor gekarnde gebruikers.

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

Indeling rapport voor de beslisboom-model

Model interpreteerbaarheid

beslisboom-model maakt gebruik van het Contract, MonthlyCharges, InternetService, TotalCharges, en mandaat heeft om een beslissing te maken als een klant churn of niet. Deze functies scheiden gekarnde klanten van anderen goed op basis van de split criteria in de beslissing boom.

elk klantenvoorbeeld doorkruist de boom en het uiteindelijke knooppunt geeft de voorspelling.
bijvoorbeeld, als Contract_Month-to-month is:

  • gelijk aan 0, Ga door de boom met True branch,
  • gelijk aan 1, Ga door de boom met False branch,
  • niet gedefinieerd, het voert de klasse 0 uit.

Dit is een geweldige benadering om te zien hoe het model een beslissing neemt of of er functies in ons model zijn geslopen die er niet zouden moeten zijn.

de Interpretatie van de beslisboom-model

Verder lezen

  1. Omgaan klasse onbalans in klantbehoud voorspelling — hoe kunnen we beter omgaan met klasse onbalans in de churn prediction.
  2. A Survey on customer Churn Prediction using Machine Learning Techniques] – dit artikel geeft een overzicht van de meest populaire machine learning algoritmen die door onderzoekers worden gebruikt voor het voorspellen van de churn.
  3. Telco klant churn op Kaggle-Churn analyse op Kaggle.
  4. WTTE-RNN-Hackless-churn-modeling-Event based Churn voorspelling.

voordat je gaat

Volg me op Twitter, waar ik regelmatig tweet over Data Science en Machine Learning.

Foto van Courtney Hedger op Unsplash

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.