参考
https://work.datafountain.cn/forum?id=72&type=2&source=1
任务描述:随着电信行业的不断发展,运营商们越来越重视如何扩大其客户群体。据研究,获取新客户所需的成本远高于保留现有客户的成本,因此为了满足在激烈竞争中的优势,保留现有客户成为一大挑战。对电信行业而言,可以通过数据挖掘等方式来分析可能影响客户决策的各种因素,以预测他们是否会产生流失(停用服务、转投其他运营商等)。
数据集:本案例所使用数据集来自Kaggle平台,可以从这里下载。数据集一共提供了7043条用户样本,每条样本包含21列属性,由多个维度的客户信息以及用户是否最终流失的标签组成,客户信息具体如下:
基本信息:包括性别、年龄、经济情况、入网时间等;
开通业务信息:包括是否开通电话业务、互联网业务、网络电视业务、技术支持业务等;
签署的合约信息:包括合同年限、付款方式、每月费用、总费用等。
github地址
https://github.com/wang-hui-shan/User_churn_prediction_analysis
百度网盘
链接:https://pan.baidu.com/s/1kj08ykE-e4-H8_fbcfRI3A
提取码:wupz
# -*- coding: utf-8 -*-
"""
Created on Tue May 4 10:56:49 2021
"""
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
train_data = pd.read_csv('datasets/Telco-Customer-Churn.csv')
"""
21列原始属性中,除了最后一列Churn表示该数据集的目标变量(Churn)外
其余20列按照原始数据集中的排列顺序刚好可以分为三类特征群:
即客户的基本信息(customerID-tenure)、开通业务信息(PhoneService-StreamingMovies)、签署的合约信息(Contract-TotalCharges)。
"""
pd.set_option('display.max_columns', None) # 显示所有列
train_data.head(10)
# 数据集中就有这样一列TotalCharges特征,存在样本,其特征值为空格字符(' ')
# convert_numeric如果为True,则尝试强制转换为数字,不可转换的变为NaN
# train_data[train_data['TotalCharges']==' '][['TotalCharges','MonthlyCharges','Churn']]
train_data['TotalCharges'] = pd.to_numeric(train_data['TotalCharges'],errors='coerce')
from MyUtils import DataProcessing
# 类需要实例化
DataProcessing = DataProcessing()
# 只检查np.nan形式的缺失值
numericalCols,categoricalCols = DataProcessing.preView(data=train_data)
"""
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values = np.nan, strategy='median')
imputer.fit_transform()
更进一步的,可以发现缺失样本中tenure特征(表示客户的入网时间)均为0,
且在整个数据集中tenure为0与TotalCharges为缺失值是一一对应的。
结合实际业务分析,这些样本对应的客户可能入网当月就流失了,
但仍然要收取当月的费用,因此总费用即为该用户的每月费用(MonthlyCharges)。
因此本案例最终采用MonthlyCharges的数值对TotalCharges进行填充。
"""
# 填充缺失值
train_data['TotalCharges'] = train_data['TotalCharges'].fillna(train_data['MonthlyCharges'])
"""
Tableaud数据可视化分析
什么样的客户在流失?(流失客户占比26.54%)
基本信息:
客户流失和性别没有太大关系,男女流失率差不多。
流失客户大部分入网时间不长。
老年客户的占总客户比例小,但是流失率最高,达到了40%。
没有亲人的独居客户流失率较大。
业务信息:
业务办理越少的客户流失率越大。
合约信息:
退网用户多为短期(月期)合约,并且付款方式多采用电子支票。
月支出在70-100消费之间的流失率较高
初入网用户不稳定,流失率大。
"""
"""
import seaborn as sns
import matplotlib.pyplot as plt
# 月支出核密度分布函数
# 月支出在70-100消费之间的流失率较高
plt.figure()
sns.displot(x='MonthlyCharges',hue = 'Churn',data = train_data,kind='kde')
plt.show()
# 总支出核密度分布函数
plt.figure()
sns.displot(x='TotalCharges',hue = 'Churn',data = train_data,kind='kde')
plt.show()
"""
"""
特征工程:特征工程利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征。
1.特征构建 :从原始数据中人工的构建新的特征。
对于MonthlyCharges,TotalCharges两个连续特征,构建两个分桶特征量。
2.特征提取 :动地构建新的特征