基于 Python 的手机业务使用信息数据可视化分析系统
用数据驱动决策,让运营商看见每一位用户背后的故事。
写在前面
手机用户每天产生海量行为数据------通话时长、流量消耗、缴费习惯、入网时间......这些数据散落在运营商的系统中,很少有人能从中提炼出真正有价值的洞察。
本项目正是为了解决这个问题:将原始的手机业务数据转化为直观的可视化分析,并用机器学习预测潜在合约用户,帮助运营商做出更精准的业务决策。
一、项目背景与意义
1.1 为什么要做这个系统?
在通信行业,运营商面临的核心痛点包括:
- 用户流失预警难:无法提前识别有流失风险的用户
- 合约用户识别粗放:传统的用户分层方式依赖人工经验,缺乏数据支撑
- 数据孤岛:通话、流量、缴费等数据分散在不同系统,难以综合分析
- 决策依赖直觉:业务决策缺乏量化分析工具的支持
1.2 项目目标
本系统以"数据概览 → 多维度分析 → 统计检验 → 机器学习预测"为主线,实现:
- 对 10,000 条手机用户数据进行全景式可视化分析
- 从业务类型、通话时长、流量使用、缴费行为、用户价值、入网时长等 6 个维度进行交叉分析
- 运用统计检验方法验证数据假设
- 使用 6 种机器学习算法预测用户是否属于"潜在合约用户"
- 支持异常检测和聚类分析,发现隐藏的用户群体


















二、技术架构
2.1 整体架构
┌─────────────────────────────────────────────────────┐
│ 前端 (Vue 3) │
│ Element Plus + ECharts + TypeScript + Pinia │
│ ↓ HTTP / JSON │
├─────────────────────────────────────────────────────┤
│ 后端 (Django) │
│ DRF + PyJWT + PyMySQL (Raw SQL) │
│ ↓ Raw SQL Queries │
├─────────────────────────────────────────────────────┤
│ MySQL 数据库 │
│ design_152_carrier │
│ ↓ CSV Import │
├─────────────────────────────────────────────────────┤
│ 核心分析模块 (shared/) │
│ Pandas + Scikit-learn + XGBoost + SciPy │
│ 7 个纯 Python 分析模块,框架无关 │
└─────────────────────────────────────────────────────┘
2.2 技术选型
| 层级 | 技术 | 选型理由 |
|---|---|---|
| 前端框架 | Vue 3 + TypeScript | 响应式数据绑定,类型安全 |
| UI 组件库 | Element Plus | 企业级组件丰富,文档完善 |
| 图表库 | ECharts | 图表类型丰富,交互性强,适合大数据量可视化 |
| 状态管理 | Pinia | Vue 3 官方推荐,轻量简洁 |
| 后端框架 | Django 4.2 | 成熟稳定,生态完善 |
| 数据库 | MySQL 8.0 | 关系型数据库,适合结构化数据存储 |
| 数据访问 | PyMySQL (Raw SQL) | 不使用 ORM,直接 SQL 控制性能 |
| 认证 | JWT (PyJWT) | 无状态认证,适合前后端分离 |
| 密码加密 | bcrypt | 业界标准,安全可靠 |
| ML 框架 | scikit-learn + XGBoost + PyTorch TabNet | 覆盖传统 ML 到深度学习 |
| 数据处理 | Pandas + NumPy | 数据清洗、转换、分析 |
| 统计检验 | SciPy | t 检验、ANOVA、正态性检验 |
| 报告生成 | openpyxl + weasyprint | Excel 和 PDF 双格式导出 |
2.3 核心设计理念
配置驱动(Config-Driven) :整个系统的功能开关、数据字段、分析页面、算法列表均由 config.yaml 一个配置文件控制。修改配置文件即可增减功能,无需改动代码。
核心模块与 Web 层分离(shared/ 不变原则) :7 个核心分析模块位于 shared/ 目录,纯 Python/Pandas 实现,与 Web 框架完全解耦。Web 层只做路由转发和模板渲染,所有业务逻辑在核心模块中完成。
数据转换层:核心模块的返回格式与前端期望格式不同,路由层充当转换器,将共享模块的输出适配为前端可消费的格式。
三、数据集介绍
3.1 数据概况
系统使用的数据集包含 10,000 条手机用户记录 ,共 13 个字段:
| 字段 | 类型 | 说明 | 取值范围 |
|---|---|---|---|
| 用户标识 | numeric | 用户唯一 ID(排除在模型外) | 60000-69999 |
| 业务类型 | categorical | 用户使用的网络制式 | 2G / 3G / 4G |
| 主叫时长(分) | numeric | 用户主动拨打电话时长 | 19-178 分钟 |
| 被叫时长(分) | numeric | 用户接听电话时长 | 28-179 分钟 |
| 免费流量 | numeric | 套餐内免费流量(MB) | 356-438 |
| 计费流量 | numeric | 超额后计费流量(MB) | 0-255 |
| 月均上网时长(分) | numeric | 每月平均上网时长 | 28-211 分钟 |
| 入网时长(天) | numeric | 在该运营商入网天数 | 57-331 天 |
| 最近一次缴费金额(元) | numeric | 最近一次充值金额 | 0-143 元 |
| 总缴费金额(元) | numeric | 累计充值总金额 | 132-876 元 |
| 缴费次数 | numeric | 累计充值次数 | 0-21 次 |
| 余额 | numeric | 当前账户余额 | 0-152 元 |
| 是否潜在合约用户 | binary | 预测目标(0/1) | 50.03% 为正样本 |
3.2 数据导入
系统启动时自动检测 dataset_data 表是否为空,若为空则从 data/data_carrier.csv 自动导入。导入过程支持 UTF-8 / GBK 双编码自动检测,采用 500 条/批的 executemany 批量插入,确保大数据量下的导入效率。
四、功能模块详解
4.1 数据概览(Overview)
系统首页提供数据全景视图,帮助用户快速了解数据集的整体特征:
- 统计卡片:总记录数、特征数量、潜在合约用户数及占比
- 目标变量分布饼图:直观展示正负样本比例
- 数值特征均值水平条形图:一览各指标的平均水平
- 特征详情表格:每个特征的计数、均值、标准差、最小值、最大值
4.2 多维度交叉分析(6 个分析页面)
这是系统的核心分析能力,每个页面至少包含 2 个交叉维度图表:
业务类型分析
- 2G / 3G / 4G 用户分布饼图
- 各业务类型的合约用户转化率对比
- 业务类型 × 平均缴费金额 / 平均通话时长分组柱状图
通话时长分析
- 主叫 / 被叫时长分布直方图
- 按是否潜在合约用户分组的箱线图
- 主叫 × 被叫时长散点图(按目标着色,揭示通话行为与合约倾向的关系)
流量使用分析
- 免费流量 / 计费流量 / 月均上网时长分布
- 计费流量采用自定义分箱(0-10, 10-50, 50-100, 100-150, 150+),避免长尾分布导致的图表不可读
- 免费 × 计费流量散点图 + 按业务类型分组的流量对比
缴费行为分析
- 最近一次缴费 / 总缴费 / 缴费次数分布
- 总缴费金额箱线图(按目标分组)
- 总缴费 × 缴费次数散点图
用户价值画像
- 各特征与目标变量的相关性排名(水平条形图)
- 总缴费金额 / 入网时长箱线图
- 总缴费 × 入网时长散点图
入网时长分析
- 入网时长分布直方图
- 入网时长箱线图(按目标分组)
- 入网时长 × 总缴费散点图
4.3 统计检验(Statistical Analysis)
提供三种统计检验方法:
- 描述性统计:计数、均值、标准差、最小值、下四分位、中位数、上四分位、最大值、偏度、峰度
- 正态性检验:Shapiro-Wilk 检验,判断各数值列是否符合正态分布
- 独立样本 t 检验:按是否潜在合约用户分组,检验各特征在两组间是否存在显著差异
4.4 异常检测(Anomaly Detection)
采用三种方法进行异常值检测:
- IQR 法:基于四分位距识别超出 1.5×IQR 范围的异常值
- Z-Score 法:基于标准差的 3σ 准则
- Isolation Forest:基于孤立森林算法的 multivariate 异常检测
三种方法的检测结果综合展示,帮助识别异常用户行为模式。
4.5 聚类分析(Clustering)
- 最优 K 值搜索:同时展示肘部法(Inertia)和轮廓系数(Silhouette Score),辅助选择最佳聚类数
- K-Means 聚类:对用户进行分群,输出每个群体的特征画像
- 聚类散点图:二维可视化不同群体的分布
- 用户画像表:每个聚类的样本数、占比、各特征均值
4.6 预测分析(Prediction)
这是系统最具价值的模块,集成 6 种机器学习算法:
| 算法 | 类型 | 特点 |
|---|---|---|
| XGBoost | 集成学习 | 梯度提升树,通常表现最佳 |
| 随机森林 | 集成学习 | 抗过拟合,特征重要性可解释 |
| 梯度提升 | 集成学习 | 逐棵优化,精度高 |
| 逻辑回归 | 线性模型 | 可解释性强,速度快 |
| SVM | 核方法 | 适合高维空间分类 |
| TabNet | 深度学习 | 可解释的神经网络,可选 |
训练流程:
CSV 数据 → LabelEncoder 编码 → StandardScaler 标准化
→ train_test_split(0.2, stratified)
→ GridSearchCV(cv=5, scoring=f1) 自动调参
→ joblib 序列化保存到 model/ 目录
预测输出:
- 预测结果(是/否潜在合约用户)
- 预测概率 + 风险等级(高/中/低)
- 特征重要性排序(哪些因素最影响预测结果)
- 预测历史记录
系统会在首次预测请求时自动训练所有模型(_ensure_trained() 检查模型文件是否存在),后续请求直接加载已训练的模型,响应迅速。
4.7 数据管理(Data Management)
管理员专用模块:
- 数据浏览:分页展示所有用户记录,支持搜索过滤
- CRUD 操作:新增、编辑、删除单条记录
- CSV 批量导入:一键导入 CSV 文件,自动处理编码
- 所有列表查询采用 SQL 层 JOIN / WHERE IN 批量查询,杜绝 N+1 查询问题
4.8 用户管理(User Management)
- 用户列表 + 搜索
- 角色切换(user / admin)
- 账户状态管理(启用 / 禁用)
- 密码重置
- 仅 admin 角色可见
4.9 报告导出(Report Export)
- 支持 Excel 和 PDF 双格式
- 报告包含:数据概览、描述性统计、相关性矩阵、数据样本
- 一键生成,自动下载
4.10 管理控制台(Dashboard)
- 今日登录用户数(基于
last_login_at统计) - 7 日活跃用户数
- 系统总用户数
- 数据总记录数
五、技术亮点
5.1 配置驱动的全栈系统
整个系统的数据字段、分析页面、算法列表、功能开关均由 config.yaml 驱动。数据库表结构根据配置文件自动生成,前端路由和分析页面也根据配置动态加载。这意味着:
- 更换数据集只需修改
config.yaml中的字段定义 - 启用/禁用功能只需改一个布尔值
- 添加新的分析维度只需在配置中声明
5.2 核心模块的框架无关设计
shared/ 目录下的 7 个核心模块(analysis_core、predictor_core、stats_core、regression_core、anomaly_core、clustering_core、report_core)完全不依赖任何 Web 框架,纯 Python/Pandas/SciPy 实现,返回标准的 dict/list 结构。这意味着:
- 核心分析逻辑可以在任何 Python 环境中复用
- Web 层的改造不影响核心算法
- 便于单元测试和独立验证
5.3 六种算法的统一预测接口
系统封装了 6 种差异巨大的机器学习算法(XGBoost、随机森林、梯度提升、逻辑回归、SVM、TabNet),对外暴露统一的 predict(input_data, algorithm) 接口。每种算法都经过 GridSearchCV 超参数搜索(5 折交叉验证,F1 评分优化),并自动选择最佳参数。
5.4 数据转换层的严谨设计
核心模块的返回格式与前端期望格式往往不一致(例如聚类返回的 profile 是列表而非对象,回归返回的键名是 f_p_value 而非 f_pvalue)。系统在路由层建立了一个严谨的数据转换层 ,将核心模块的输出精确适配为前端期望的格式,所有转换规则记录在 docs/plan.md 和 docs/api.md 中。
5.5 长尾分布的自适应处理
计费流量等字段存在明显的长尾分布(大量 0 值,少量高值),系统在路由层检测长尾特征(p95/p50 > 3),自动切换为自定义分箱策略,确保直方图可读。所有散点图在传递给前端前都经过 1st/99th 百分位过滤,去除极端异常值的干扰。
5.6 15 条宪法条款的严格约束
项目建立了一套"宪法"(Constitution),包含 15 条开发规范,覆盖:
- 核心模块不变
- 禁止蓝紫渐变配色
- 禁止 N+1 查询
- 代码复用(3 处以上相似代码必须重构)
- CSS 设计系统
- 数据转换规范
- 中文标签
- 主题色一致性
- 图标可用性
- ECharts 规范
- 角色固定
- 文件所有权
- Vue CSS 变量
- 端口同步
- 跨栈适用
每条规范都有明确的 PASS/FAIL 验收标准。
六、前端设计
6.1 侧边栏布局
采用专业的侧边栏导航布局,240px 展开 / 64px 折叠:
首页
├── 数据分析 ▼(7 个分析页面)
├── 高级分析 ▼(统计检验、回归分析、异常检测、聚类分析、相关性分析)
├── 数据管理
├── 预测分析
├── 报告导出
└── 管理员 ▼(仅 admin 可见)
└── 用户管理
6.2 通信科技蓝主题
以 #1565C0(深蓝色)为主色调,同色系渐变从 #0D47A1(最深)到 #BBDEFB(最浅),符合通信行业的专业调性。所有卡片、按钮、阴影、焦点环均使用统一的 CSS 变量系统。
6.3 ECharts 可视化规范
- 每个页面顶部定义
chartColors数组,所有图表统一配色 grid.top >= 10%,避免 Y 轴标签被裁剪- 所有图表实例注册
ResizeObserver,在onUnmounted中清理 - 箱线图数据格式为
[min, q1, median, q3, max]五值数组 - 散点图数据经过异常值过滤后再渲染
七、项目统计
| 维度 | 数量 |
|---|---|
| 分析页面 | 10 个 |
| API 端点 | 20+ |
| 前端页面 | 19 个 Vue 组件 |
| 核心分析模块 | 7 个 |
| ML 算法 | 6 种 |
| 图表类型 | 10+ 种(饼图、柱状图、折线图、散点图、箱线图、热力图等) |
| 数据库表 | 6 张 |
| 数据集记录 | 10,000 条 |
| 特征维度 | 12 个 |
| 开发文档 | 9 份 |
八、技术栈总览
| 类别 | 技术 |
|---|---|
| 后端 | Django 4.2, PyJWT, PyMySQL, Pandas, NumPy |
| 前端 | Vue 3, TypeScript, Element Plus, ECharts, Pinia, Axios |
| 机器学习 | scikit-learn, XGBoost, PyTorch TabNet, SHAP |
| 统计分析 | SciPy (t-test, ANOVA, normality test) |
| 数据可视化 | ECharts (10+ 图表类型) |
| 报告导出 | openpyxl (Excel), weasyprint (PDF) |
| 密码安全 | bcrypt (passlib) |
| 序列化 | joblib (模型持久化) |
九、总结
这个项目不仅仅是一个数据分析工具,更是一个完整的端到端数据科学平台。从数据导入、清洗、探索性分析、统计检验、机器学习建模到报告导出,覆盖了数据分析的全流程。
项目的设计哲学是**"配置驱动 + 核心模块不变"**------通过 config.yaml 控制一切可变参数,通过 shared/ 目录隔离核心算法,通过严格的数据转换层连接前后端。这种架构使得系统具有良好的可扩展性和可维护性,也为后续接入新的数据集或添加新的分析模块提供了清晰的路径。
如果你对数据可视化、机器学习应用或全栈开发感兴趣,这个项目是一个很好的参考案例。
项目地址:F:\code\152-基于Python的手机业务使用信息数据可视化分析系统