Abwanderungsvorhersage

Foto von Mantas Hesthaven auf Unsplash

Kundenabwanderung, auch bekannt als Kundenabwanderung, tritt auf, wenn Kunden aufhören, mit einem Unternehmen Geschäfte zu machen. Die Unternehmen sind daran interessiert, Segmente dieser Kunden zu identifizieren, da der Preis für die Gewinnung eines neuen Kunden in der Regel höher ist als für die Beibehaltung des alten Kunden. Wenn Netflix beispielsweise ein Segment von Kunden kennt, bei denen das Risiko besteht, dass sie am laufenden Band sind, können Sie sie proaktiv mit Sonderangeboten ansprechen, anstatt sie einfach zu verlieren.

In diesem Beitrag erstellen wir ein einfaches Vorhersagemodell für die Abwanderung von Kunden mithilfe des Telco Customer Churn Datasets. Wir haben uns für einen Entscheidungsbaum entschieden, um abgewanderte Kunden zu modellieren, Pandas für das Daten-Crunching und matplotlib für Visualisierungen. Wir werden das alles oben in Python machen.
Der Code kann mit einem anderen Datensatz mit ein paar geringfügigen Anpassungen verwendet werden, um das Basismodell zu trainieren. Wir stellen auch einige Referenzen zur Verfügung und geben Ideen für neue Funktionen und Verbesserungen.

Sie können diesen Code ausführen, indem Sie dieses Jupyter-Notizbuch herunterladen.

Hier sind ein paar Links, die Sie interessieren könnten:

- 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

Einige der obigen Links sind Affiliate-Links, und wenn Sie sie durchgehen, um einen Kauf zu tätigen, verdiene ich eine Provision. Denken Sie daran, dass ich Kurse wegen ihrer Qualität verlinke und nicht wegen der Provision, die ich von Ihren Einkäufen erhalte.

Wir verwenden Pandas, um den Datensatz zu lesen und vorzuverarbeiten. Telco Dataset hat einen Kunden pro Zeile mit vielen Spalten (Features). Es gibt keine Zeilen mit allen fehlenden Werten oder Duplikaten (dies geschieht selten bei realen Datensätzen). Es gibt 11 Proben, die TotalCharges auf “ “ gesetzt haben, was wie ein Fehler in den Daten scheint. Wir entfernen diese Beispiele und setzen den Typ auf numeric (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)

Erste Beispiele im Datensatz für die Abwanderung von Telekommunikationskunden

Explorative Datenanalyse

Wir haben 2 Arten von Funktionen im Datensatz: kategorisch (zwei oder mehr Werte und ohne Reihenfolge) und numerisch. Die meisten Funktionsnamen sind selbsterklärend, mit Ausnahme von:

  • Partner: Ob der Kunde einen Partner hat oder nicht (Ja, Nein),
  • Abhängige: ob der Kunde Angehörige hat oder nicht (Ja, Nein),
  • OnlineBackup: Ob der Kunde ein Online-Backup hat oder nicht (Ja, Nein, Kein Internetdienst),
  • tenure: Anzahl der Monate, die der Kunde im Unternehmen geblieben ist,
  • MonthlyCharges: Der Betrag, der dem Kunden monatlich in Rechnung gestellt wird,
  • TotalCharges: Der Gesamtbetrag, der dem Kunden in Rechnung gestellt wird.

Der Datensatz enthält 7032 Kunden und 19 Features ohne CustomerID (nicht informativ) und Churn-Spalte (Zielvariable). Die meisten kategorialen Features haben 4 oder weniger eindeutige Werte.

Wir kombinieren Features in zwei Listen, damit wir sie gemeinsam analysieren können.

categorical_features = 
numerical_features =
target = "Churn”

Numerische Merkmalsverteilung

Numerische Zusammenfassungstechniken (Mittelwert, Standardabweichung usw.) zeigen Sie uns keine Spitzen, Formen von Verteilungen und es ist schwierig, Ausreißer damit zu beobachten. Aus diesem Grund verwenden wir Histogramme.

df.describe()

Zusammenfassung der numerischen Merkmale

Auf den ersten Blick gibt es keine Ausreißer in den Daten. Kein Datenpunkt ist von der Verteilung getrennt oder zu weit vom Mittelwert entfernt. Um dies zu bestätigen, müssten wir den Interquartilbereich (IQR) berechnen und zeigen, dass die Werte jedes numerischen Merkmals innerhalb des 1,5 IQR vom ersten und dritten Quartil liegen.

Wir könnten numerische Merkmale in ordinale Intervalle umwandeln. Zum Beispiel ist die Amtszeit numerisch, aber oft kümmern wir uns nicht um kleine numerische Unterschiede und gruppieren die Amtszeit stattdessen auf Kunden mit kurz-, mittel- und langfristiger Amtszeit. Ein Grund, es umzuwandeln, wäre, das Rauschen zu reduzieren, oft sind kleine Schwankungen nur Rauschen.

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

Histogramme numerischer Merkmale

Wir betrachten Verteilungen numerischer Merkmale in Bezug auf die Zielvariable. Wir können beobachten, dass die Wahrscheinlichkeit einer Abwanderung umso geringer ist, je höher die Gesamtkosten und die Amtszeit sind.

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)

Numerische Merkmale in Bezug auf die Zielvariable

Kategoriale Merkmalsverteilung

Um kategoriale Merkmale zu analysieren, verwenden wir Balkendiagramme. Wir beobachten, dass Senioren und Kunden ohne Telefonservice in den Daten weniger vertreten sind.

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)

Verteilung der kategorialen Merkmale

Der nächste Schritt besteht darin, die kategorialen Merkmale in Bezug auf die Zielvariable zu betrachten. Wir tun dies nur für Vertragszwecke. Benutzer mit einem monatlichen Vertrag wechseln häufiger als Benutzer mit langfristigen Verträgen.

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

Diese Funktion in Bezug auf die Zielvariable

Zielvariablenverteilung

Zielvariablenverteilung zeigt, dass wir es mit einem unausgewogenen Problem zu tun haben, da es viel mehr nicht abwandernde als abwandernde Benutzer gibt. Das Modell würde eine hohe Genauigkeit erreichen, da es hauptsächlich Mehrheitsklassen—Benutzer vorhersagen würde, die in unserem Beispiel nicht abwanderten.

Einige Dinge, die wir tun können, um den Einfluss unausgeglichener Datensätze zu minimieren:
– Daten neu abtasten (unausgeglichen-lernen),
– mehr Proben sammeln,
– Präzision und Rückruf als Genauigkeitsmetriken verwenden.

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

Verteilung der Zielvariablen

Funktionen

Der Telco-Datensatz ist bereits nach Kunden-ID gruppiert, sodass es schwierig ist, neue Funktionen hinzuzufügen. Bei der Arbeit an der Abwanderungsvorhersage erhalten wir normalerweise einen Datensatz mit einem Eintrag pro Kundensitzung (Kundenaktivität in einer bestimmten Zeit). Dann könnten wir Funktionen hinzufügen wie:

  • Anzahl der Sitzungen vor dem Kauf,
  • durchschnittliche Zeit pro Sitzung,
  • Zeitunterschied zwischen Sitzungen (häufiger oder weniger häufiger Kunde),
  • ist ein Kunde nur in einem Land.

Manchmal haben wir sogar Kundenereignisdaten, die es uns ermöglichen, Muster des Kundenverhaltens in Bezug auf das Ergebnis (Churn) zu finden.

Encoding features

Um den Datensatz für die Modellierung der Abwanderung vorzubereiten, müssen wir kategoriale Features in Zahlen codieren. Dies bedeutet, dass „Ja“, „Nein“ auf 0 und 1 codiert wird, damit der Algorithmus mit den Daten arbeiten kann. Dieser Vorgang wird als Onehot-Codierung bezeichnet.

Classifier

Wir verwenden sklearn, eine Bibliothek für maschinelles Lernen in Python, um einen Klassifikator zu erstellen.
Der sklearn-Weg besteht darin, Pipelines zu verwenden, die die Merkmalsverarbeitung und den Klassifikator definieren. In unserem Beispiel verwendet die Pipeline einen Datensatz in der Eingabe, verarbeitet Features vor und trainiert den Klassifikator.
Wenn es trainiert wird, nimmt es die gleiche Eingabe und gibt Vorhersagen in der Ausgabe zurück.

In der Pipeline verarbeiten wir kategoriale und numerische Merkmale getrennt. Wir codieren Onehot kategoriale Merkmale und skalieren numerische Merkmale, indem wir den Mittelwert entfernen und sie auf die Einheitsvarianz skalieren.
Wir haben ein Entscheidungsbaummodell wegen seiner Interpretierbarkeit gewählt und die maximale Tiefe auf 3 (willkürlich) gesetzt.

Die Pipeline nimmt einen Datensatz in die Eingabe, verarbeitet Features vor und trainiert den Klassifikator

Training des Modells

Wir teilen den Datensatz auf, um zu trainieren (75% Stichproben) und zu testen (25% Stichproben).
Wir trainieren (fit) die Pipeline und machen Vorhersagen. Mit classification_report berechnen wir Genauigkeit und Rückruf mit tatsächlichen und vorhergesagten Werten.

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)

Testen des Modells

Mit classification_report berechnen wir Genauigkeit und Rückruf mit tatsächlichen und vorhergesagten Werten.

Für klasse 1 (churned benutzer) modell erreicht 0,67 präzision und 0,37 rückruf. Die Genauigkeit sagt uns, wie viele abgewanderte Benutzer unseren Klassifikator richtig vorhergesagt haben. Auf der anderen Seite, Bitte sagen Sie uns, wie viele Benutzer es verpasst haben.

Für Laien ist der Klassifikator für abgewanderte Benutzer nicht sehr genau.

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

Klassifizierungsbericht für das Entscheidungsbaummodell

Interpretierbarkeit des Modells

Das Entscheidungsbaummodell verwendet Vertrags-, Monats-, InternetService-, TotalCharges- und Tenure-Funktionen, um zu entscheiden, ob ein Kunde abwandert oder nicht. Diese Funktionen trennen abgewanderte Kunden basierend auf den aufgeteilten Kriterien im Entscheidungsbaum gut von anderen.

Jedes Kundenmuster durchläuft den Baum und der letzte Knoten gibt die Vorhersage ab.
Zum Beispiel, wenn Contract_Month-to-month ist:

  • gleich 0, weiter den Baum mit True Zweig durchqueren,
  • gleich 1, weiter den Baum mit False Zweig durchqueren,
  • nicht definiert, es gibt die Klasse 0.

Dies ist ein großartiger Ansatz, um zu sehen, wie das Modell eine Entscheidung trifft oder ob sich Funktionen in unser Modell eingeschlichen haben, die nicht vorhanden sein sollten.

Interpretation des Entscheidungsbaummodells

Weiterführende Literatur

  1. Umgang mit Klassenungleichgewichten in der Kundenabwanderungsvorhersage — Wie können wir besser mit Klassenungleichgewichten in der Abwanderungsvorhersage umgehen.[/li>
  2. A Survey on Customer Churn Prediction using Machine Learning Techniques] – In diesem Artikel werden die beliebtesten Algorithmen für maschinelles Lernen vorgestellt, die von Forschern zur Vorhersage der Abwanderung verwendet werden.
  3. Telco customer churn auf Kaggle — Churn-Analyse auf Kaggle.
  4. WTTE-RNN-Hackless-churn-modeling — Ereignisbasierte Abwanderungsvorhersage.

Before you go

Folgen Sie mir auf Twitter, wo ich regelmäßig über Data Science und maschinelles Lernen twittere.

Foto von Courtney Hedger auf Unsplash

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.