行销(Marketing)里客户流失
客户流失是指客户决定停止使用公司的服务,内容或产品。当我们讨论客户分析时,保留现有客户的成本要比获取新客户便宜得多,而且回头客的收入通常要比新客户高。在竞争激烈的行业中,企业面对许多竞争对手,因此获得新客户的成本甚至更高,因此保留现有客户对于此类企业而言变得越来越重要。客户离开公司有很多原因。客户流失的一些常见原因是不良的客户服务,无法在产品或服务中找到足够的价值,缺乏沟通和缺乏客户忠诚度。保留这些客户的第一步是监视一段时间内的客户流失率。如果客户流失率通常很高或随着时间的流逝而增加,那么最好花一些资源来改善客户保留率。
为了提高客户保留率,当务之急是更好地了解客户。我们可以调查已经流失的客户,以了解他们为什么离开。我们还可以调查现有客户,以了解他们的需求和痛苦点。例如,我们可以查看客户的网络活动数据,并了解他们在哪里花费最多的时间,他们正在查看的页面上是否有错误,或者他们的搜索结果是否未返回良好的内容。我们还可以查看客户服务呼叫日志,以了解他们的等待时间长短,他们的投诉是什么以及如何处理他们的问题。对这些数据点进行深入分析可以揭示企业在保留现有客户方面面临的问题。
在本文中, 我们来建立一个机器学习模型,该模型可以预测哪些客户可能流失,并锁定并留住这些较高流失风险的特定客户。我们会使用神经网络模型。人工神经网络(ANN)模型是一种机器学习模型,受人脑功能的启发。 ANN模型最近在图像识别,语音识别和机器人技术方面的成功应用证明了其在各种行业中的预测能力和实用性。您可能已经听说过“深度学习”一词。这是一种ANN模型,其中输入和输出层之间的层数很大。
此图显示了具有一个隐藏层的ANN模型的简单情况。此图中的圆圈表示人工神经元或节点,它们模拟人脑中的这些神经元。箭头表示信号如何从一个神经元传输到另一个神经元。如该图所示,ANN模型通过查找从每个输入神经元到下一层神经元的信号的模式或权重进行学习,从而最好地预测了输出。
下面我们还是用Kaggle数据集 WA_Fn-UseC_-Telco-Customer-Churn.csv 。然后我们用keras来构建一个神经网络。
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All"
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
/kaggle/input/telco-customer-churn/WA_Fn-UseC_-Telco-Customer-Churn.csv
Load the packages
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import roc_curve, auc
%matplotlib inline
Load the data
df = pd.read_csv('../input/telco-customer-churn/WA_Fn-UseC_-Telco-Customer-Churn.csv')
df.head(3)
customerID | gender | SeniorCitizen | Partner | Dependents | tenure | PhoneService | MultipleLines | InternetService | OnlineSecurity | ... | DeviceProtection | TechSupport | StreamingTV | StreamingMovies | Contract | PaperlessBilling | PaymentMethod | MonthlyCharges | TotalCharges | Churn | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 7590-VHVEG | Female | 0 | Yes | No | 1 | No | No phone service | DSL | No | ... | No | No | No | No | Month-to-month | Yes | Electronic check | 29.85 | 29.85 | No |
1 | 5575-GNVDE | Male | 0 | No | No | 34 | Yes | No | DSL | Yes | ... | Yes | No | No | No | One year | No | Mailed check | 56.95 | 1889.5 | No |
2 | 3668-QPYBK | Male | 0 | No | No | 2 | Yes | No | DSL | Yes | ... | No | No | No | No | Month-to-month | Yes | Mailed check | 53.85 | 108.15 | Yes |
3 rows ?? 21 columns
df.shape
(7043, 21)
Data Analysis & Preparation
Encoding target var: Churn
df['Churn'] = df['Churn'].apply(lambda x: 1 if x == 'Yes' else 0)
df.Churn.mean()
0.2653698707936959
Create TotalCharges
df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan).astype(float)
df = df.dropna()
Create Continuous Vars
df[['tenure', 'MonthlyCharges', 'TotalCharges']].describe()
tenure | MonthlyCharges | TotalCharges | |
---|---|---|---|
count | 7032.000000 | 7032.000000 | 7032.000000 |
mean | 32.421786 | 64.798208 | 2283.300441 |
std | 24.545260 | 30.085974 | 2266.771362 |
min | 1.000000 | 18.250000 | 18.800000 |
25% | 9.000000 | 35.587500 | 401.450000 |
50% | 29.000000 | 70.350000 | 1397.475000 |
75% | 55.000000 | 89.862500 | 3794.737500 |
max | 72.000000 | 118.750000 | 8684.800000 |
Normalize the variable
df['MonthlyCharges'] = np.log(df['MonthlyCharges'