🧑 博主简介:曾任某智慧城市类企业算法总监,CSDN / 稀土掘金 等平台人工智能领域优质创作者。
目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。
一、引言
在电信行业,用户流失是一个关键问题,因为它直接影响到公司的收入和市场份额。通过分析用户流失的原因,我们可以制定有效的策略来减少流失率,提高用户满意度和忠诚度。本文将使用 Python 和 Pyecharts 对电信用户流失数据进行可视化分析,并构建一个炫酷的组合大屏。

二、数据集介绍
数据集包含以下字段:
customerID
:用户IDgender
:性别SeniorCitizen
:是否是老年人(1代表是)Partner
:是否有配偶(Yes or No)Dependents
:是否经济独立(Yes or No)tenure
:用户入网时间PhoneService
:是否开通电话业务(Yes or No)MultipleLines
:是否开通多条电话业务(Yes、No or No phoneservice)InternetService
:是否开通互联网服务(No、DSL数字网络或fiber optic光线网络)OnlineSecurity
:是否开通网络安全服务(Yes、No or No internetservice)OnlineBackup
:是否开通在线备份服务(Yes、No or No internetservice)DeviceProtection
:是否开通设备保护服务(Yes、No or No internetservice)TechSupport
:是否开通技术支持业务(Yes、No or No internetservice)StreamingTV
:是否开通网络电视(Yes、No or No internetservice)StreamingMovies
:是否开通网络电影(Yes、No or No internetservice)Contract
:合同签订方式(按月、按年或者两年)PaperlessBilling
:是否开通电子账单(Yes or No)PaymentMethod
:付款方式(bank transfer、credit card、electronic check、mailed check)MonthlyCharges
:月度费用TotalCharges
:总费用Churn
:是否流失(Yes or No)
三、环境准备
在开始之前,请确保安装了以下库:
pip install pandas pyecharts
四、数据预处理
我们首先读取数据,并进行必要的清洗和转换。
python
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
# 读取数据
df = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
# 将列名转换为中文
df.columns = [
'用户ID', '性别', '是否老年人', '是否有配偶', '是否经济独立', '用户入网时间',
'是否开通电话业务', '是否开通多条电话业务', '是否开通互联网服务', '是否开通网络安全服务',
'是否开通在线备份服务', '是否开通设备保护服务', '是否开通技术支持业务', '是否开通网络电视',
'是否开通网络电影', '合同签订方式', '是否开通电子账单', '付款方式', '月度费用',
'总费用', '是否流失'
]
# 将总费用列转换为浮点型
df['总费用'] = pd.to_numeric(df['总费用'], errors='coerce').fillna(0)
# 将是否流失列转换为数值型
df['是否流失'] = df['是否流失'].map({'Yes': 1, 'No': 0})
五、可视化分析
接下来,我们将从多个角度对数据进行可视化分析。
5.1 用户流失率
我们首先查看整体的用户流失率。
ini
# 用户流失率
churn_rate = df['是否流失'].mean() * 100
# 绘制饼图
pie = (
Pie(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add("", [("未流失", 100 - churn_rate), ("流失", churn_rate)])
.set_global_opts(title_opts=opts.TitleOpts(title="用户流失率"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)

分析: 从饼图中可以看到,约 26.5% 的用户已经流失,这是一个值得关注的问题。
5.2 不同性别用户流失率
接下来,我们查看不同性别的用户流失率。
less
# 不同性别用户流失率
gender_churn = df.groupby('性别')['是否流失'].mean().reset_index()
# 绘制柱状图
bar_gender = (
Bar(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(gender_churn['性别'].tolist())
.add_yaxis("流失率", gender_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="不同性别用户流失率"))
)

分析: 从柱状图中可以看到,女性用户的流失率略高于男性用户。
5.3 不同合同类型用户流失率
我们再看看不同合同类型对用户流失率的影响。
less
# 不同合同类型用户流失率
contract_churn = df.groupby('合同签订方式')['是否流失'].mean().reset_index()
# 绘制柱状图
bar_contract = (
Bar(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(contract_churn['合同签订方式'].tolist())
.add_yaxis("流失率", contract_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="不同合同类型用户流失率"))
)

分析: 从柱状图中可以看到,按月签约的用户流失率最高,而两年签约的用户流失率最低。
5.4 用户入网时间与流失率
接下来,我们查看用户入网时间与流失率的关系。
less
# 用户入网时间与流失率
tenure_churn = df.groupby('用户入网时间')['是否流失'].mean().reset_index()
# 绘制折线图
line_tenure = (
Line(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(tenure_churn['用户入网时间'].tolist())
.add_yaxis("流失率", tenure_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="用户入网时间与流失率"))
)

分析: 从折线图中可以看到,用户入网时间越短,流失率越高。特别是入网时间在 20 个月以内的用户,流失率较高。
5.5 月度费用与流失率
我们再看看月度费用对用户流失率的影响。
less
# 月度费用与流失率
monthly_charges_churn = df.groupby(pd.cut(df['月度费用'], bins=10))['是否流失'].mean().reset_index()
# 绘制折线图
line_monthly = (
Line(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(monthly_charges_churn['月度费用'].astype(str).tolist())
.add_yaxis("流失率", monthly_charges_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="月度费用与流失率"))
)

分析: 从折线图中可以看到,月度费用高于110,流失率会降低。特别是月度费用在 70-100 元之间的用户,流失率较高。
5.6 总费用与流失率
我们再看看总费用对用户流失率的影响。
less
# 总费用与流失率
total_charges_churn = df.groupby(pd.cut(df['总费用'], bins=10))['是否流失'].mean().reset_index()
# 绘制折线图
line_total = (
Line(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(total_charges_churn['总费用'].astype(str).tolist())
.add_yaxis("流失率", total_charges_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="总费用与流失率"))
)

分析: 从折线图中可以看到,总费用较低的用户流失率较高,而总费用较高的用户流失率较低。
5.7 不同付款方式用户流失率
我们再看看不同付款方式对用户流失率的影响。
less
# 不同付款方式用户流失率
payment_churn = df.groupby('付款方式')['是否流失'].mean().reset_index()
# 绘制柱状图
bar_payment = (
Bar(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(payment_churn['付款方式'].tolist())
.add_yaxis("流失率", payment_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="不同付款方式用户流失率"))
)

分析: 从柱状图中可以看到,使用电子支票付款的用户流失率最高,而使用银行转账付款的用户流失率最低。
5.8 不同互联网服务类型用户流失率
最后,我们看看不同互联网服务类型对用户流失率的影响。
less
# 不同互联网服务类型用户流失率
internet_churn = df.groupby('是否开通互联网服务')['是否流失'].mean().reset_index()
# 绘制柱状图
bar_internet = (
Bar(init_opts=opts.InitOpts(theme='dark', bg_color='#000'))
.add_xaxis(internet_churn['是否开通互联网服务'].tolist())
.add_yaxis("流失率", internet_churn['是否流失'].round(2).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title="不同互联网服务类型用户流失率"))
)

分析: 从柱状图中可以看到,未开通互联网服务的用户流失率最高,而开通光纤互联网服务的用户流失率最低。
六、组合大屏
最后,我们将所有图表组合成一个炫酷的大屏。
scss
# 组合大屏
page = Page(layout=Page.DraggablePageLayout)
page.add(pie, bar_gender, bar_contract, line_tenure, line_monthly, line_total, bar_payment, bar_internet)
page.render("telecom_churn_dashboard.html")
print("✅ 已生成 telecom_churn_dashboard.html")

七、总结
通过上述可视化分析,我们可以清晰地看到电信用户流失的多个关键因素:
- 用户入网时间:入网时间越短,流失率越高。
- 月度费用:月度费用70-100元之间,流失率高,当月度费用高于110元时,流失率大幅度降低。
- 总费用:总费用较低的用户流失率较高。
- 合同类型:按月签约的用户流失率最高,而两年签约的用户流失率最低。
- 付款方式:使用电子支票付款的用户流失率最高,而使用银行转账付款的用户流失率最低。
- 互联网服务类型:未开通互联网服务的用户流失率最高,而开通光纤互联网服务的用户流失率最低。
基于这些分析结果,我们可以制定以下策略来降低用户流失率:
- 优化合同策略:鼓励用户签订长期合同,如两年合同,以降低流失率。
- 调整费用结构:对于新用户,提供优惠的月度费用和总费用套餐,以吸引他们入网并长期使用。
- 改善付款方式:提供更多的付款方式选择,特别是银行转账和信用卡支付,以提高用户满意度。
- 增强互联网服务:为用户提供高质量的互联网服务,特别是光纤互联网服务,以提高用户忠诚度。
希望这篇文章能帮助你更好地理解和分析电信用户流失数据。为后续的客户的流失预测奠定基础,如果你有任何问题或建议,欢迎在评论区留言!🎉
如果您在人工智能领域遇到技术难题,或是需要专业支持,无论是技术咨询、项目开发还是个性化解决方案,我都可以为您提供专业服务,如有需要可站内私信或添加下方VX名片(ID:xf982831907)
期待与您一起交流,共同探索AI的更多可能!