Отток клиентов

Из «Бета-Банка» стали уходить клиенты. Каждый месяц. Немного, но заметно. Банковские маркетологи посчитали: сохранять текущих клиентов дешевле, чем привлекать новых.

Нужно спрогнозировать, уйдёт клиент из банка в ближайшее время или нет. Вам предоставлены исторические данные о поведении клиентов и расторжении договоров с банком.

Постройте модель с предельно большим значением F1-меры. Чтобы сдать проект успешно, нужно довести метрику до 0.59. Проверьте F1-меру на тестовой выборке самостоятельно.

Дополнительно измеряйте AUC-ROC, сравнивайте её значение с F1-мерой.

Источник данных: https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling

(... загрузка данных и библиотек ...)

1. Подготовка данных

In [6]:
# просмотр первых трех строк новой таблицы
df.head(3)
Out[6]:
CreditScore Geography Gender Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
0 619 France Female 42 2.0 0.00 1 1 1 101348.88 1
1 608 Spain Female 41 1.0 83807.86 1 0 1 112542.58 0
2 502 France Female 42 8.0 159660.80 3 1 0 113931.57 1
In [7]:
# общие характеристики и проверка на наличие выбивающихся значений
df.describe()
Out[7]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
count 10000.000000 10000.000000 9091.000000 10000.000000 10000.000000 10000.00000 10000.000000 10000.000000 10000.000000
mean 650.528800 38.921800 4.997690 76485.889288 1.530200 0.70550 0.515100 100090.239881 0.203700
std 96.653299 10.487806 2.894723 62397.405202 0.581654 0.45584 0.499797 57510.492818 0.402769
min 350.000000 18.000000 0.000000 0.000000 1.000000 0.00000 0.000000 11.580000 0.000000
25% 584.000000 32.000000 2.000000 0.000000 1.000000 0.00000 0.000000 51002.110000 0.000000
50% 652.000000 37.000000 5.000000 97198.540000 1.000000 1.00000 1.000000 100193.915000 0.000000
75% 718.000000 44.000000 7.000000 127644.240000 2.000000 1.00000 1.000000 149388.247500 0.000000
max 850.000000 92.000000 10.000000 250898.090000 4.000000 1.00000 1.000000 199992.480000 1.000000
  • Первое, на что обращаешь внимание, это 25% клиентов с нулевым балансом на счете. Это достаточно много. Если эти люди все еще клиенты банка, то они не приносят денег банку. Потенциально, эти люди могут покинуть банк, если еще не ушли.
  • Крупных выбивающихся значений не обнаружено (есть клиент возрастом 92 года)
  • Есть странное минимальное значение предполагаемой зарплаты 11.58 при средней и близкой к ней медианной чуть больше 100 000
  • Интересно, что для кредитного рейтинга, количества недвижимости и предполагаемой зарплаты медиана и среднее очень близки по значению 5, что указывает на симметричное распределение данных в этих колонках
In [8]:
# оценка корреляций признаков
df.corr()
Out[8]:
CreditScore Age Tenure Balance NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
CreditScore 1.000000 -0.003965 -0.000062 0.006268 0.012238 -0.005458 0.025651 -0.001384 -0.027094
Age -0.003965 1.000000 -0.013134 0.028308 -0.030680 -0.011721 0.085472 -0.007201 0.285323
Tenure -0.000062 -0.013134 1.000000 -0.007911 0.011979 0.027232 -0.032178 0.010520 -0.016761
Balance 0.006268 0.028308 -0.007911 1.000000 -0.304180 -0.014858 -0.010084 0.012797 0.118533
NumOfProducts 0.012238 -0.030680 0.011979 -0.304180 1.000000 0.003183 0.009612 0.014204 -0.047820
HasCrCard -0.005458 -0.011721 0.027232 -0.014858 0.003183 1.000000 -0.011866 -0.009933 -0.007138
IsActiveMember 0.025651 0.085472 -0.032178 -0.010084 0.009612 -0.011866 1.000000 -0.011421 -0.156128
EstimatedSalary -0.001384 -0.007201 0.010520 0.012797 0.014204 -0.009933 -0.011421 1.000000 0.012097
Exited -0.027094 0.285323 -0.016761 0.118533 -0.047820 -0.007138 -0.156128 0.012097 1.000000

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

In [9]:
# визуализация корреляций
sns.pairplot(data=df, hue = 'Exited')
Out[9]:
<seaborn.axisgrid.PairGrid at 0x7f749c8f5cf8>