前言:Customer Attribution——客户流失
Customerattribution ,又叫做Customer churn, Customer turnover或则Customer defection(客户流失), 是客户、消费者流失的意思。
电话运营商、网络服务上、付费电视公司、保险公司和预警监控服务公司,通常使用客户流失分析和客户流失率作为公司的关键运营指标之一,因为维护客户的成本比获取一个新客户的成本要低得多。这些公司一般开设有客户服务部门,部门工作之一是企图赢回已经流失的客户,因为从长远的角度来看,一个忠实客户的价值远高于一个新客户的价值。
公司一般将流失客户分为主动流失和被动流失两类。主动流失的客户是指那些自己决定转投其他公司或者使用其他服务的客户;被动流失的客户则多是由于受到跟基础环境变化、死亡或者搬家等外界话环境的影响而不得不放弃使用。通常,被动流失的客户不纳入分析模型里。客户流失分析倾向于专注对主动流失客户的分析,因为主动流失客户的流失原因一般跟公司-客户关系有关,而公司在某种程度上客户控制这种关系。比如,要如何控制账单或者如何继续宁售后服务。
通过使用客户流失模型可以评估客户的流失风险,从而进行客户流失分析。客户流失模型能够对潜在流失客户的优先级进行排序,因而模型能够对可能流失的客户群体实施有效的监控。
变量说明
变量 | 类型 | 变量内容 |
---|---|---|
customerID | 字符串 | 客户ID |
gender | 字符串 | 性别 |
SeniorCitizen | 数值型 | 客户是否老年人(是:1;否:0) |
Partner | 字符串 | 客户是否有合伙人(是:Yes;否:No) |
Dependents | 字符串 | 客户所使用服务是否有附属用户(是:Yes;否:No) |
tenure | 字符串 | 客户使用公司服务的月数(0-72之间) |
PhoneService | 字符串 | 客户是否办有电话服务(是:Yes;否:No) |
MultipleLines | 字符串 | 客户是否办理了多条电话服务渠道(是:Yes;否:No) |
InternetService | 字符串 | 客户的网络服务提供线路(DSL:数字用户线路, Fiber optic:光纤线路, No:未办理网络服务) |
OnlineSecurity | 字符串 | 客户是否使用网络安全服务(是:Yes;否:No;未开通网络:No internet service) |
OnlineBackup | 字符串 | 用户是否使用网络备份功能(是:Yes;否:No;未开通网络:No internet service) |
DeviceProtection | 字符串 | 客户是否开启设备保护(是:Yes;否:No;未开通网络:No internet service) |
TechSupport | 字符串 | 客户是否使用技术支持功能(是:Yes;否:No;未开通网络:No internet service) |
SteamingTV | 字符串 | 客户是否办理 数字电视功能(是:Yes;否:No;为开通网络:No internet service) |
SteamingMovies | 字符串 | 客户是否办理数字电影功能(是:Yes;否:No;为开通网络:No internet service) |
Contract | 字符串 | 客户的合约方式(每月签约:Month-to-month;一年:One year;两年:Two year) |
PaperlessBilling | 字符串 | 客户是否使用无纸化账单(是:Yes;否:No) |
PaymentMethod | 字符串 | 客户的付款方式(电子支票:Electronic check;邮寄支票:Mailed check;银行自动转账:Bank transfer(automatic);信用卡自动扣款:Credit card(automatic)) |
MonthlyuCharges | 数值型 | 客户的每月支出情况 |
TotalCharges | 数值型 | 客户从使用至今的总支出情况 |
Churn | 字符串 | 客户是否流失(已流失:Yes;未流失:No) |
1 Data:导入数据
导入所需库:
# import libraries
import numpy as np # 线性代数功能
import pandas as pd # 数据处理,加载csv文件
import os
import matplotlib.pyplot as plt # 数据可视化
from PIL import Image
%matplotlib inline
import seaborn as sns # 数据可视化
import itertools
import warnings
warnings.filterwarnings('ignore')
import io
import plotly.offline as py # 数据可视化
py.init_notebook_mode(connected=True) #数据可视化
import plotly.graph_objs as go # 数据可视化
import plotly.tools as tls # 数据可视化
import plotly.figure_factory as ff # 数据可视化
导入数据:
telcom = pd.read_csv('...WA_Fn-UseC_-Telco-Customer-Churn.csv')
# 查看前五行数据
telcom.head()
- 也可以用to_csv的方法,将head()的结果导入到一个文件种,方便查看。
1.1 Data overview:数据总览
# 数据总览:
print('Rows :', telcom.shape[0]) # 返回行数
print('Columns :', telcom.shape[1]) # 返回列数
print('\nFeatures:\n', telcom.columns.tolist()) # tolist()以列表的形式存储值
print('\nMissing values:\n', telcom.isnull().sum().values.sum())
print('\nUnique values: \n', telcom.nunique()) # 查看变量的唯一值个数
2 Data Manipulation:数据处理
# 2 数据预处理
# 将TotalCharges列中的空值全部替换为nan
telcom['TotalCharges'] = telcom['TotalCharges'].replace(' ', np.nan)
# 将TotalCharges列中的空值行全部删除,空值行占总行数的0.15%,予以删除
telcom = telcom[telcom['TotalCharges'].notnull()]
telcom = telcom.reset_index()[telcom.columns]
# 将值转变为浮点型
telcom['TotalCharges'] = telcom['TotalCharges'].astype(float)
# 将以下列中的‘No internet service’变为‘No’。
replace_cols = ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection',
'TechSupport', 'StreamingTV', 'StreamingMovies']
for i in replace_cols:
telcom[i] = telcom[i].replace({
'No internet service': 'No'})
# 替换值
telcom['SeniorCitizen'] = telcom['SeniorCitizen'].replace({
1:'Yes', 0:'No'})
# 将Tenure变量的值转变为分类值
def tenure_lab(telcom):
if telcom['tenure'] <= 12:
return 'Tenure_0_12'
elif (telcom['tenure'] > 12) & (telcom['tenure'] <= 24):
return 'Tenure_12_24'
elif (telcom['tenure'] > 24) & (telcom['tenure'] <= 48):
return 'Tenure_24_48'
elif (telcom['tenure'] > 48) & (telcom['tenure'] <= 60):
return 'Tenure_48_60'
elif telcom['tenure'] > 60:
return 'Tenure_gt_60'
telcom['tenure_group'] = telcom.apply(lambda telcom: tenure_lab(telcom), axis=1)
# 将流失与非流失客户分开为两个数据集
churn = telcom[telcom['C