互联网服务客户流失分析(个人练习+源代码)

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=
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值