Научная статья на тему 'Использование библиотек языка программирования Python для анализа оттока клиентов банка'

Использование библиотек языка программирования Python для анализа оттока клиентов банка Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
739
140
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
КЛИЕНТЫ БАНКА / АНАЛИЗ ДАННЫХ / ПРОГНОЗИРОВАНИЕ / ЛОГИСТИЧЕСКАЯ РЕГРЕССИЯ / НАИВНЫЙ БАЙЕС / ДЕРЕВЬЯ РЕШЕНИЙ / АЛГОРИТМ БЛИЖАЙШЕГО СОСЕДА / СЛУЧАЙНЫЙ ЛЕС / PYTHON / BANK CUSTOMERS / DATA ANALYSIS / FORECASTING / LOGISTIC REGRESSION / GUASSIAN NAIVE BAYES / DECISION TREES / KNN / RANDOM FOREST

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Белова Елизавета Евгеньевна, Толстель Олег Владимирович

В настоящее время борьба за клиентов среди банков обостряется. Показатель оттока клиентов очень важен для анализа деятельности банка и планировании дальнейшей работы. В статье использованы пять алгоритмов для расчета оттока клиентов банка. Кодыпрограмм написаны на Python.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Using Python Libraries for Analysis of the Customer Churn Rate of a Bank

At the present time, competition for customers among banks is escalating. The indicator of customer churn is very important for the analysis and planning bank work. Five algorithms for calculating the outflow of bank customers are used in this article. Program codes are written in Python.

Текст научной работы на тему «Использование библиотек языка программирования Python для анализа оттока клиентов банка»

УДК 004

Е. Е. Белова, О. В. Толстель

ИСПОЛЬЗОВАНИЕ БИБЛИОТЕК ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON ДЛЯ АНАЛИЗА ОТТОКА КЛИЕНТОВ БАНКА

В настоящее время борьба за клиентов среди банков обостряется. Показатель оттока клиентов очень важен для анализа деятельности банка и планировании дальнейшей работы. В статье использованы пять алгоритмов для расчета оттока клиентов банка. Коды программ написаны на Python.

At the present time, competition for customers among banks is escalating. The indicator of customer churn is very important for the analysis and planning bank work. Five algorithms for calculating the outflow of bank customers are used in this article. Program codes are written in Python.

Ключевые слова: клиенты банка, анализ данных, прогнозирование, логистическая регрессия, наивный Байес, деревья решений, алгоритм ближайшего соседа, случайный лес, Python.

Keywords: bank customers, data analysis, forecasting, logistic regression, Guas-sian naive Bayes, decision trees, KNN, random forest, Python.

Отток клиентов (англ. churn) — это потеря клиентов, выраженная в отсутствии покупок или платежей в течение определенного периода времени.

Показатель оттока крайне важен для компаний с подписной и тран-закционной моделями бизнеса, подразумевающими регулярные платежи в сторону компании [1].

Данный показатель зависит от выбранной методики расчета. Существенным параметром является величина периода времени неактивности клиента, чтобы считать данного клиента потерянным для банка. Если данный параметр выбрать неверно, то это приведет к искажениям в оценке и трактовке оттока.

Базовая формула для расчета оттока имеет следующий вид:

lk

Ц = —,

sk

где ц — коэффициент оттока клиентов; lk — количество потерянных клиентов за интервал времени; sk — общее количество клиентов на начало периода измерения.

Интервал времени, на котором измеряется отток, должен выбираться с учетом специфики бизнеса (сезонность, стадия жизненного цикла продукта, является ли данный товар или услуга новыми и т. д.).

21

© Белова Е. Е., Толстель О. В., 2019

Вестник Балтийского федерального университета им. И. Канта. Сер.: Физико-математические и технические науки. 2019. № 4. С. 21 — 30.

22

Для полноты картины сам по себе коэффициент оттока является малоинформативным показателем. Важно понимать структуру оттока:

1) какие сегменты клиентов в первую очередь подвержены оттоку и почему;

2) какие факторы чаще всего служат причиной потери клиентов;

3) какова динамика оттока и тенденции по его структуре.

Для полного анализа необходимо дать оценку оттока в денежном выражении. Эта оценка возможна при моделировании денежных потоков, которые получила бы компания, если бы клиент продолжал пользоваться ее услугами. Формула оценки ущерба компании от оттока клиентов имеет вид

У = к ■ Р-V,

где у — ущерб от оттока; lk — количество потерянных клиентов; p — средний чек (размер платежа); v — частота совершения покупок (количество платежей) за интервал времени.

Рассмотрим модель расчета оттока клиентов банка с использованием Python. Задача состоит в том, чтобы найти параметры, максимально влияющие на отток клиентов банка, и создать гипотезу, которая предсказывала бы отток клиентов банка.

В выборку данных для этой модели войдут возраст, пол и количество денежных средств на счету клиента.

Будем использовать следующие инструменты:

— NumPy — это расширение языка Python, добавляющее поддержку больших многомерных массивов и матриц;

— Pandas — программная библиотека на языке Python для обработки и анализа данных (строится поверх NumPy);

— Sklearn (Scikit-learn) — бесплатная библиотека машинного обучения для языка Python;

— Matplotlib — библиотека для визуализации данных.

Перечень входных данных [2] приведен в таблице 1.

Таблица 1

Входные данные

Название Расшифровка

RowNumber Номер строки

CustomerId Ы пользователя

Surname Фамилия клиента

CreditScore Кредитный рейтинг

Geography Откуда клиент

Gender Пол клиента

Age Возраст клиента

Tenure Срок пребывания клиента в компании

Balance Баланс клиента

NumOfProducts Количество продуктов, используемых клиентом

HasCrCard Имеющаяся кредитная карта

IsActiveMember Является ли клиент активным пользователем

EstimatedSalary Оценка заработной платы

Exited Клиент покинул банк

Импорт библиотек

Перед началом анализа данных необходимо импортировать все нужные библиотеки:

from sklearn import metrics, svm, datfiseta from sklearn.datasets import make_classification from sklearn. ensemble import Randoir.ForestClassif ier from sklearn. linear_ir.odel import LogisticRegression from sklearn.model selection import train test split from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, roc_curve, auc from sklearn. naiT/e_fcayes import GaussianNB from sklearn.neignfcors import KNelgnfcorsClassifier from sklearn.tree import DecisionTreeClassifier

23

Импорт данных

Считаем входные данные. Выведем первые 10 строк данных:

dataset = pd.read_csv('Churn_ModeUing.csv') dataset.head(10)

RowNumber cjslomerld surname creeitscore Geography Gender дде Tenure Balance NumOfPraducts Hascrcard IsAcflveMenber Estimatedsalary E:

1 15634602 Hargrave 619 France Female 42 2 0.00 1 1 1 101348.88

2 15647311 Hill 608 Spain Female 41 1 83807.36 1 0 1 112542.58

3 15619304 Onio 502 France Female 42 8 159660.30 3 1 0 113931.57

4 15701354 Borii 699 France Female 39 1 0.00 2 0 0 93826.63

5 15737883 Mitchell 850 Spain Female 43 2 125510.82 1 1 1 79084.10

6 15574012 Chu 645 Spain Male 44 8 113755.78 2 1 0 149756.71

7 15592531 Bartlett 822 France Male 50 7 0.00 2 1 1 10062.80

8 15656143 Obinna 376 Germany Female 29 4 115046.74 4 1 0 119346.88

9 15792365 He 501 France Male 44 4 142051.07 2 0 1 74940.50

10 15592389 H? 684 France Male 27 2 134603.38 1 1 1 71725.73

Можно посмотреть информацию по этим данным, используя команду info(). Полученный список содержит все столбцы, их типы данных и количество ненулевых значений:

dataaet.Infс (}

-idaas 'pandas.core.fr Hangeindex: lOQQO entr Data columns [tctal 14 RowNumoer 100

Customerld 100

Surname 100

DrsditSccre 100

Seogra^hy 100

Sender 100

ame.DataFrame1> ea, 0 to 9999 columns} :

00 non-null int64

00 non-null int64

00 non-null object

00 non-null int64

00 non-null object

00 non-null object

Age

Tenure

Balance

NumOfFroduc-s

Ha3CrCard

IaActiveHember

Estima-edSalary

Exited

d^ypes: float64(2] menory usage: 1.1-

10000 non-10000 non-10000 non-10000 non-10000 non-10000 non-10000 non-10000 non, int64(9), MB

null 1пт64 null 1пт64 null flciat64 null ±пт64 null 1пт64 null 1пт64 null flciat64 null ±пт64 сОэ;ect (3)

24

Следует отметить, что нулевых значений нет, что свидетельствует о полноте данных.

Выведем описательную статистику. С помощью команды describe() можно посмотреть минимальные / максимальные и средние значения для столбцов, а также другую информацию:

dataset.describe()

RowNumber Customerld CreditScore

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Balance NumOfProducts HasCrCard IsActiveMember Estimated Salary

count 10000.00000 1.000000e*04 10000.000000 10000.000000 10000.000000 10000.000000

mean 5000.50000 1.569094e «-07 650.528800 38.921800

std 2886.89568 7.193619e+04 96.653299 10.487806

min 1.00000 1.556570e «-07 350.000000 18.000000

25% 2500.75000 1,562853e«-07 584.000000 32.000000

50% 5000.50000 1.569074e «-07 652.000000 37.000000

75% 7500.25000 1.575323e «-07 718.000000 44.000000

max 10000.00000 1.581569e«-07 350.000000 92.000000

5.012800 76485.889288

2.892174 62397.405202

0.000000 O.OQOOOO

3.000000 0.000000

5.000000 97198.540000

7.000000 127644.240000

10.000000 250898.090000

10000.000000 10000.00000 1.530200 0.70550

0.581654 1.000000 1.000000 1.000000 2.000000 4.000000

0.45584 0.00000 0.00000 1.00000 1.00000 1.00000

10000.000000 0.515100 0.499797 0.000000 0.000000 1.000000 1.000000 1.000000

10000.000000 100090.239881 57510.492818 11.580000 51002.110000 100193.915000 149388.247500 199992.480000

Анализ данных

Проанализируем данные. Например, выведем информацию о возрасте:

Также выведем количество людей, разделенных по географическому признаку:

dataset[1 Geography'] .value_count3(J

Посмотрим, в каком соотношении находятся мужчины и женщины:

25

Для правильной работы классификатора необходимо преобразование категориального признака в числовой. Нам нужно изменить 2 столбца: Gender и Geography. Преобразование выглядит следующим образом:

data3et[1 Geography1].replace("France", 1, inplace= True) data3et[1 Geography1].replace("Germany", 2, inplace=Tnie) data3et[1 Geography1].replace("Spain", 3, inplace = True) dataaet['Gender'].replace("Female", 0, inplace = True) dataaet['Gender 1] .replace["Male", 1, inplace=True)

Создадим корреляционную матрицу, то есть таблицу, в строках и столбцах которой записан коэффициент корреляции между соответствующими параметрами. Данная квадратная матрица симметрична относительно главной диагонали.

correlation = dataset.corr() plt.figure(figsize = (15, 15))

sns.heatmap(correlation, vmax = 1, square = True, annot = True, cmap = 'cubehelix')

plt.title('Коррелядионная матрица') plt.show()

Корреляционная матрица показывает, какие параметры будут влиять на результат. Сразу можно выделить 4 положительные корреляции: Balance, Age, Geography и EstimatedSalary.

■ОЛШГ.нлШ ГгисН'ч-ог-р ОыцгарГи

26

Ълип ОБ апсе ti-irölPudLcrs Itjstrtiircl ЫсШчМнлЬег

Ehttcd

Предварительная обработка данных

Разобьем набор данных на две части (x — независимые переменные, y — зависимые переменные):

fircdn зк1еа.гг..ргерг oes з sing import Labe lEncoder, OneHotEncoder

onehotencader = OneSotEncoder (categori.cel_feature3 = [1] ) X = onehotencoder. f it_tran3 f om(X) . toarray { )

Разделим наш набор данных. Это поможет избежать проблем с переобучением:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, ran-dom_state = 0)

COM2 ааВЕ-5 4.01 COM D.K"J7B -0.DM5 fl.OKl 0.0072 ftWK 0.412 О COS -0.01?

Ü'PLS Q.PU tfCl' flflM ttCUl-f OClb Q.Q№

acií -3.MH5 о.ог& -о.мн -o.oz?

ii:Vií7 0 069 OCIH л Itoíis i>0ñhT <i úi:¡ ¿ niíyi,

"J'DLü C.D12 «KSg 0.42.'- -0 MD1 «,11

401 оэ?я ,1M) ii i! f¡£- -o ocr;- o»

асмь;- í' (JL!> а с и и-и l: cu jr l» □ -> u.u: и.du оси ■jwj сидз íwb и.un

-qmidi -0 012 aooei ообз ош оо?з -оачз -о з -dolí -o.oi о аз он

№№72 ОСП (lim 0004 4 ОН 4 051 ООП ОН I ■ fl«33 ОСИ Л ГМЙ

CCQÚS -0 014 -С С ОБ:- -О МВБ CODES J].01¡ v 02 3 43.035 OOQ32 ^K^l ^ úl- -0 МЭЭ -С.ООТЗ

ooi? опт? опгь оа»? о orí -о-»я -oai аанб -ам? ■ ■ осп -o it

«сое C-CL5 С С014 -Jcaí- .Q.0K1 í.flOT2 С.ЭС-7В D.D13 OCH 0.0039 {.Oil ^Ш^Я D.012

«017 -омег л.агт оозе ли а» -олн -ззэ лыв -o.wi -o.ig оси

Моделирование

Данную модель будем реализовывать с помощью 5 алгоритмов.

1. Логистическая регрессия (Logistic Regression) — метод построения линейного классификатора, который позволяет оценивать апостериорные вероятности принадлежности объектов классам.

print(1 Logistic Regression:1)

logr = LogisticRegression()

logr.fit(X_train, y_train)

predictions_lr — logr .predict (X_test)

print{classification_report{y_test, predictions_lr))

print {confusion_matrix {y_testf prediction>s_lr) )

print{1 Logistic Regression =Tr accuracy_score(y_test.

27

predictions_lr))

Logi3tic Еедгеззюл:

precis icn

0 :

accuracy Mcro avg weighted avg

0. SO 0. 36

0.58 0. 71

recal1

0. 97 0. 07

0. 52 0. 79

score support

0.83 1555

0.12 405

0.79 2000

0.50 2000

0.72 2000

[[1545 50]

[ 377 28]] Logistic Regression

0.7365

2. Наивный Байес (Guassian Naive Bayes) — алгоритм классификации, который основан на теореме Байеса с допущением о независимости признаков. Будем использовать нормальное распределение.

print{1Guassian Naive Bayes:') gnb = GaussianNB{)

predi wtions_gnb = gnb . f it (X_train, print(cla3sificatian_repDrt(y_test,

y_train) . predict (X_tes^) predicticna_gnb) )

print {cozifusion_matrisi {y_test, print{1Guassian Naive Bayes =1

Gua3sian Naive Вауеэ:

pre с л

accuracy г\асго avg weighted, avg

0.El

0. 37

0. 5S 0. 72

predictiona_gni:) ) г ас eu га. с у_а с ore : 7

test, predictions_gnb))

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

recall f1-score support

0 . Э6 0. .88 1535

0.09 0. ,14 405

0. ,75 2Э00

0 . 52 0. ,51 2 Э00

0 . 79 0. .73 2 300

[ [1535

SO]

[ 370 35]] Gua33ian Naive Bayes = 0.7Ё5

3. Деревья решений (Decision Trees).

28

d^rse = DecisionTreeCIlaaaif ier (irLax_lsa.f_node3 = 10) d^rse . fit [X_3rainj, y_train)

DecisionTreeClassif ier (clas s_weight=None, cri3ericr.= 1 gini 1 , nax_depTh-NcreJ max features^Wone, r"_ax leaf nodes=10f

mill_impurity_decrease=0 . 0 r min_impurity_apli3=None,

min_saiciples_leaf=l, min._aain.ples_split=2 ,

mill weight, fraction leaf=Q.Or preaort=ralse r r a n dnm_ state—None, splitter^ best1 }

print{TDecision Trees:1)

predictions_dtree = dtree.predict<X_test)

print{classification_report{y_test, predicticr_a_dtree) J print(confusion_matrix <y_test, predictiona_dtree))

printDecision Trees =1, accuracy_3core (y_test, prec.ictions_dcree) ) Decision Trees:

precisicr.

recall fl-score

support

0.S3 0.73

0.95 0. 50

0. 92 0. 59

1555 4C5

accuracy глсго avg weighted avg

0. SO 0. S5

0. 72 0.86

0.86 0.75 0.85

2 000 2 000 2 000

[[1520 75]

[ 204 201]] Decision Trees = 0.8605

4. Алгоритм ближайшего соседа (KNN) выделяет из всех наблюдений к известные объекты (к -ближайших соседей), похожие на новый неизвестный ранее объект. На основе классов ближайших соседей выносится решение касательно нового объекта.

accuracy ivacro avg weighted avg

[[1553 2]

[ 405 0]] КИЪГ = 0. 7ЭЙ5

0.40 С.50

0.64 С.80

0.80 2000 0.44 2000

0.71 2000

5. Случайный лес (Random Forest) — множество решающих деревьев, rf = RandomlTorsstClassif is г {n._egtimatQjrs = 100) гf.fit{X_train, y_3rain)

RandcniForestClassif ier {boot 3trap=Trus r clas3 veight^K^ne, c~iteri on= 1 gini 1 ,

max depth=Moner max features = 1 auto 1 , max leaf nodea=None, min i три г i : у de ere a s e = 0 . 0 , min impurity splic.=tIone, min samples lsa£=l, min samples split=2, min weight fraction leaf— 0.0, n eatiirators — 1 C'C , n ]эЬа=Ыопе, оэЪ score=False, rs.r-.dom stats=Nons, verbcse=0r warm 3^art=Fal3e)

print{*Random Fcreat:1]

predictions_rf = r£.predict(X_teat)

print{classification_report{y_test, predictions_rf))

print(confusion matrix(y teat, predictions rf))

print{ 1 Random Fcreat =1 f accuracy score{y te3t, predictions rf))

29

Random Forest:

precis Lcr_

recall fl-score

support

0. 89 0. 77

С . Эй 0. 52

0.32 0. 62

1595 4С5

accuracy ivacro avg weighted avg

0. S3 0. 36

С . 7 4 0.87

0.87 0.77 0.86

2000 2000 2000

[[1531 64]

[ 134 211]] Random Forest = 0.371

Выводы и сравнения алгоритмов

В таблице 2 представлены результаты точности предсказаний.

Таблица 2

Результаты точности предсказаний

Алгоритм Результат предсказания

Логистическая регрессия 0,7865

Наивный Байес 0,785

Деревья решений 0,8605

Алгоритм ближайшего соседа 0,7965

Случайный лес 0,871

Реальная статистика: из 10 000 клиентов ушло 2037 человек.

Вывод. Из пяти представленных алгоритмов наилучший результат показал случайный лес. Точность предсказания составляет 87,1 %.

Список литературы

1. Что такое отток клиентов и как с ним бороться // NGM. URL: https:// ngmsys.com/blog/churn-management (дата обращения: 01.12.2019).

2. Bank-Customer-Churn-Modeling // Kaggle: Your Machine Learning and Data Science Community. URL: https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling (дата обращения: 23.11.2019).

Об авторах

Елизавета Евгеньевна Белова — магистрант, Балтийский федеральный университет им. И. Канта, Россия.

E-mail: el_liza_belova@mail.ru

Олег Владимирович Толстель — канд. техн. наук, доц., Балтийский федеральный университет им. И. Канта, Россия.

E-mail: oleg77764@mail.ru

The authors

Elizaveta E. Belova, Master's Student, I. Kant Baltic Federal University, Russia.

E-mail: el_liza_belova@mail.ru

Dr Oleg V. Tolstel', Associate Professor, I. Kant Baltic Federal University, Russia. E-mail: oleg77764@mail.ru

i Надоели баннеры? Вы всегда можете отключить рекламу.