import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = ['SimHei'] # 显示中文,解决图中无法显示中文的问题
plt.rcParams['axes.unicode_minus']=False
# 导入数据
data = pd.read_csv('internet_service_churn.csv')
# 查看数据大小
data.shape
(72274, 11)
# 查看前五行
data.head()
id | is_tv_subscriber | is_movie_package_subscriber | subscription_age | bill_avg | reamining_contract | service_failure_count | download_avg | upload_avg | download_over_limit | churn | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 15 | 1 | 0 | 11.95 | 25 | 0.14 | 0 | 8.4 | 2.3 | 0 | 0 |
1 | 18 | 0 | 0 | 8.22 | 0 | NaN | 0 | 0.0 | 0.0 | 0 | 1 |
2 | 23 | 1 | 0 | 8.91 | 16 | 0.00 | 0 | 13.7 | 0.9 | 0 | 1 |
3 | 27 | 0 | 0 | 6.87 | 21 | NaN | 1 | 0.0 | 0.0 | 0 | 1 |
4 | 34 | 0 | 0 | 6.39 | 0 | NaN | 0 | 0.0 | 0.0 | 0 | 1 |
# 查看基本信息
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 72274 entries, 0 to 72273
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 72274 non-null int64
1 is_tv_subscriber 72274 non-null int64
2 is_movie_package_subscriber 72274 non-null int64
3 subscription_age 72274 non-null float64
4 bill_avg 72274 non-null int64
5 reamining_contract 50702 non-null float64
6 service_failure_count 72274 non-null int64
7 download_avg 71893 non-null float64
8 upload_avg 71893 non-null float64
9 download_over_limit 72274 non-null int64
10 churn 72274 non-null int64
dtypes: float64(4), int64(7)
memory usage: 6.1 MB
# 为特征重命名
data.columns = ['用户标识', '是否为电视订阅用户', '是否为电影包订阅用户', '客户年限', '平均账单金额',
'合同剩余年限', '投诉次数', '平均下载量', '平均上传量', '下载超过限制', '是否流失']
字段解释:
用户标识:唯一的用户id
是否为电视订阅用户:用户是否有电视订阅,是为1,否则为0
是否为电影包订阅用户:用户是否有电影套餐,是为1,否则为0
客户年限:客户使用我们的服务多少年
平均账单金额:过去3个月账单平均消费
合同剩余年限:客户合同还剩多少年?如果为空,代表客户没有合同。
投诉次数:过去3个月客户因服务失败,而呼叫服务中心的次数
平均下载量:过去3个月的互联网下载情况(GB)
平均上传量:过去3个月平均上传量(GB)
下载超过限制:大多数客户都有下载限制。如果他们达到了这个极限,他们必须为此付费
是否流失:用户是否取消了服务
# 查看缺失值
data.isnull().sum()
用户标识 0
是否为电视订阅用户 0
是否为电影包订阅用户 0
客户年限 0
平均账单金额 0
合同剩余年限 21572
投诉次数 0
平均下载量 381
平均上传量 381
下载超过限制 0
是否流失 0
dtype: int64
# 这里使用0进行填充,这里认为空值为没有合同,因此将合同剩余年限设置为0
# 下载量和上传量在0处分布最多,同样使用0进行填充
data = data.fillna(0)
# 观察数据是否有重复值
data.duplicated().sum()
0
# 对分类型变量和连续型变量进行区分
col_c = ['是否为电视订阅用户', '是否为电影包订阅用户', '投诉次数', '下载超过限制', '是否流失']
col_n = ['客户年限', '平均账单金额', '合同剩余年限', '平均下载量', '平均上传量']
# 查看分类型特征分布情况
for i in col_c:
plt.figure(figsize=(6,4))
sns.countplot(x=i, data=data)
# 查看连续型特征分布情况
fig, ax = plt.subplots(3,2,figsize=(10,8))
axes = ax.flatten()
for i in range(len(col_n)):
axes[i].hist(x=data[col_n[i]], bins=20)
axes[i].set_title(col_n[i])
plt.tight_layout()
# 用seaborn绘图
for i in col_n:
plt.figure(figsize=