Przewidywanie rezygnacji

zdjęcie Mantas hesthaven na Unsplash

utrata klientów, znana również jako ścieranie klientów, występuje, gdy klienci przestają robić interesy z firmą. Przedsiębiorstwa są zainteresowane identyfikacją segmentów tych klientów, ponieważ cena za pozyskanie nowego klienta jest zwykle wyższa niż utrzymanie starego. Na przykład, jeśli Netflix znał segment klientów, którzy byli narażeni na ryzyko ubijania, mogli aktywnie angażować ich w oferty specjalne, zamiast po prostu ich tracić.

w tym poście stworzymy prosty model przewidywania utraty klientów za pomocą zestawu danych dotyczących utraty klientów Telco. Wybraliśmy drzewo decyzyjne do modelowania wzburzonych klientów, pandy do chrupania danych i matplotlib do wizualizacji. Zrobimy to wszystko powyżej w Pythonie.
kod może być używany z innym zestawem danych z kilkoma drobnymi korektami, aby trenować model bazowy . Zapewniamy również kilka referencji i podajemy pomysły na nowe funkcje i ulepszenia.

możesz uruchomić ten kod, pobierając ten notatnik Jupyter.

oto kilka linków, które mogą Cię zainteresować:

- 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

niektóre z powyższych linków są linkami partnerskimi i jeśli je przejdziesz, aby dokonać zakupu, zarobię prowizję. Pamiętaj, że łączę kursy Ze względu na ich jakość, a nie ze względu na prowizję, którą otrzymuję od twoich zakupów.

używamy pand do odczytu danych i wstępnego ich przetwarzania. Telco dataset ma jednego klienta na linię z wieloma kolumnami (funkcjami). Nie ma żadnych wierszy z brakującymi wartościami lub duplikatami (rzadko zdarza się to w rzeczywistych zestawach danych). Istnieje 11 próbek, które mają TotalCharges ustawione na” „, co wydaje się błędem w danych. Usuwamy te próbki i ustawiamy Typ NA numeryczny (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)

kilka pierwszych próbek w zbiorze danych klienta telco

analiza danych eksploracyjnych

mamy 2 typy funkcji w zbiorze danych: kategoryczne (dwie lub więcej wartości i bez kolejności) i numeryczne. Większość nazw funkcji jest oczywista, z wyjątkiem:

  • Partner: czy klient ma partnera, czy nie (tak, nie),
  • zależni: niezależnie od tego, czy klient ma na utrzymaniu, czy nie (tak, nie),
  • OnlineBackup: czy klient ma kopię zapasową online, czy nie (tak, nie, brak usługi internetowej),
  • kadencja: liczba miesięcy, w których klient przebywał w firmie,
  • Miesięcznycharges: kwota pobierana od klienta miesięcznie,
  • TotalCharges: całkowita kwota pobierana od klienta.

w zbiorze danych jest 7032 klientów i 19 funkcji bez customerID (nieinformacyjnych) i kolumny Churn (zmienna docelowa). Większość cech kategorycznych ma 4 lub mniej unikalnych wartości.

Dataset podsumowanie

funkcje łączymy w dwie listy, dzięki czemu możemy je wspólnie analizować.

categorical_features = 
numerical_features =
target = "Churn”

rozkład funkcji numerycznych

techniki sumowania liczb (średnia, odchylenie standardowe itp.) Nie pokazuj nam kolców, kształtów rozkładów i trudno jest z nimi zaobserwować wartości odstające. Dlatego używamy histogramów.

df.describe()

podsumowanie cech liczbowych

na pierwszy rzut oka w danych nie ma żadnych wartości odstających. Żaden punkt danych nie jest odłączony od dystrybucji lub zbyt daleko od średniej wartości. Aby potwierdzić, że musimy obliczyć zakres międzykwartylowy (IQR) i pokazać, że wartości każdej funkcji numerycznej mieszczą się w 1.5 IQR od pierwszego i trzeciego kwartylu.

możemy konwertować funkcje liczbowe na przedziały porządkowe. Na przykład etat jest numeryczny, ale często nie dbamy o małe różnice liczbowe i zamiast tego grupujemy etat dla klientów z krótko, średnio i długoterminowym etatem. Jednym z powodów do konwersji byłoby zmniejszenie hałasu, często małe wahania są tylko hałas.

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

histogramy cech numerycznych

przyglądamy się rozkładom cech numerycznych w stosunku do zmiennej docelowej. Możemy zauważyć, że im większe są łączne opłaty i etat, tym mniejsze jest prawdopodobieństwo odejścia.

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)

cechy numeryczne w odniesieniu do zmiennej docelowej

rozkład cech kategorycznych

do analizy cech kategorycznych używamy wykresów słupkowych. Zauważamy, że seniorzy i klienci bez usług telefonicznych są mniej reprezentowani w danych.

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)

rozkład cech kategorycznych

następnym krokiem jest przyjrzenie się cechom kategorycznym w odniesieniu do zmiennej docelowej. Robimy to tylko dla funkcji kontraktu. Użytkownicy, którzy mają miesięczny kontrakt, są bardziej narażeni na odejście niż użytkownicy z długoterminowymi kontraktami.

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

funkcja kontraktu w odniesieniu do zmiennej docelowej

rozkład zmiennej docelowej

rozkład zmiennej docelowej pokazuje, że mamy do czynienia z niezrównoważonym problemem, ponieważ istnieje o wiele więcej niezrównoważonych użytkowników. Model osiągnąłby wysoką dokładność, ponieważ przewidywałby głównie większość użytkowników klas, którzy nie odeszli w naszym przykładzie.

kilka rzeczy, które możemy zrobić, aby zminimalizować wpływ niezrównoważonego zbioru danych:
– resample danych (imbalanced-learn),
– collect more samples,
– use precision and recall as accuracy metrics.

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

rozkład zmiennych docelowych

funkcje

zbiór danych telco jest już pogrupowany według CustomerID, więc trudno jest dodać nowe funkcje. Podczas pracy nad prognozą churn Zwykle otrzymujemy zestaw danych, który ma jeden wpis na sesję klienta (aktywność klienta w określonym czasie). Następnie możemy dodać funkcje takie jak:

  • liczba sesji przed zakupem czegoś,
  • średni czas na sesję,
  • różnica czasu między sesjami (częsty lub rzadziej klient),
  • jest klientem tylko w jednym kraju.

czasami mamy nawet dane o zdarzeniach klienta, które pozwalają nam znaleźć wzorce zachowań klientów w stosunku do wyniku (churn).

funkcje kodowania

aby przygotować zestaw danych do modelowania, musimy zakodować funkcje kategoryczne do liczb. Oznacza to kodowanie „tak”,” nie ” na 0 i 1, aby algorytm mógł pracować z danymi. Proces ten nazywa się onehot encoding.

One hot zakodowane funkcje kategoryczne

klasyfikator

do tworzenia klasyfikatora używamy sklearn, biblioteki uczenia maszynowego w Pythonie.
sposobem sklearn jest użycie potoków, które definiują przetwarzanie funkcji i klasyfikator. W naszym przykładzie, rurociąg pobiera zestaw danych wejściowych, wstępnie przetwarza funkcje i trenuje klasyfikator.
podczas treningu przyjmuje to samo wejście i zwraca predykcje na wyjściu.

w rurociągu przetwarzamy oddzielnie cechy kategoryczne i numeryczne. My onehot kodujemy cechy kategoryczne i skalujemy cechy liczbowe, usuwając średnią i skalując je do wariancji jednostkowej.
wybraliśmy model drzewa decyzyjnego ze względu na jego interpretowalność i ustawiliśmy maksymalną głębokość na 3 (arbitralnie).

rurociąg pobiera zestaw danych na wejściu, wstępnie przetwarza funkcje i trenuje klasyfikator

szkolenie modelu

dzielimy zestaw danych na trening (75% próbek) i test (25% próbek).
trenujemy (dopasowujemy) rurociąg i przewidujemy. Dzięki classification_report obliczamy precyzję i przywoływamy wartości rzeczywiste i przewidywane.

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)

testowanie modelu

z classification_report obliczamy precyzję i przywoływamy z wartościami rzeczywistymi i przewidywanymi.

dla modelu klasy 1 (użytkowników) osiąga 0,67 precyzji i 0,37 przypomnienia. Precyzja mówi nam, ilu urwanych użytkowników przewidział nasz klasyfikator poprawnie. Z drugiej strony Przypomnij nam, ilu ubijanych użytkowników przegapiło.

w kategoriach laików klasyfikator nie jest zbyt dokładny dla użytkowników.

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

raport klasyfikacji dla modelu drzewa decyzyjnego

interpretacja modelu

model drzewa decyzyjnego wykorzystuje umowy, Miesięczne obciążenia, internetservice, totalcharges i funkcje etatu, aby podjąć decyzję, czy klient odejdzie, czy nie. Cechy te oddzielają urwanych klientów od innych w oparciu o kryteria podziału w drzewie decyzyjnym.

każda próbka klienta przemierza drzewo, a końcowy węzeł daje prognozę.
na przykład, jeśli Contract_Month-to-month wynosi:

  • równe 0, Kontynuuj przemierzanie drzewa z prawdziwą gałęzią,
  • równe 1, Kontynuuj przemierzanie drzewa z fałszywą gałęzią,
  • nie zdefiniowano, wypisuje klasę 0.

jest to świetne podejście, aby zobaczyć, jak model podejmuje decyzję lub czy w naszym modelu zakradły się jakieś cechy, których nie powinno tam być.

model drzewa decyzyjnego

Czytaj dalej

  1. obsługa nierównowagi klas w prognozowaniu utraty klientów — jak lepiej radzić sobie z nierównowagą klas w prognozowaniu utraty klientów.
  2. a Survey on customer Churn Prediction using Machine Learning Techniques] — w artykule omówiono najpopularniejsze algorytmy uczenia maszynowego wykorzystywane przez naukowców do przewidywania churn.
  3. Telco customer churn on Kaggle — Analiza Churn on Kaggle.
  4. WTTE-RNN-Hackless-churn-modeling — Event based churn prediction.

zanim pójdziesz

Śledź mnie na Twitterze, gdzie regularnie tweetuję o nauce danych i uczeniu maszynowym.

żywopłot na Unsplash

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.