2022年MathorCup高校数学建模挑战赛—大数据竞赛
B题 北京移动用户体验影响因素研究
原题再现:
移动通信技术飞速发展,给人们带来了极大便利,人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设,网络覆盖越来越完善。各个移动运营商,越来越重视客户的网络使用体验,从而进一步提升网络服务质量。
客户满意度是客户对运营商产品服务的满意程度,反映了客户期望与实际感知的产品服务之间的差异。特别是在信息透明、产品同质化的今天,客户满意度的表现成为各大运营商市场运营状况的重要体现。数字经济时代,各大运营商需要运用数字经济的管理理念和技术手段,建立客户体验生态的全方位系统性测评体系,实现客户满意度评测的数字化转型,让客户体验赋能商业决策,让商业决策真正服务客户,共同推动移动网络高质量可持续发展。
根据客户投诉,对影响用户体验的问题逐点解决,是传统提升客户满意度的方法。但是随着用户数量的大幅增加,移动产品的种类越来越丰富,客户的需求越来越高,传统的方法已经难以有效提升客户的满意度。本研究拟通过分析影响用户满意度的各种因素,为决策提供依据,从而实现更早、更全面提升用户满意度。
中国移动通信集团北京公司,让客户根据自身在网络覆盖与信号强度、语音通话清晰度和语音通话稳定性三个方面的体验进行打分,同时还让客户根据语音通话的整体体验进行语音通话整体满意度的打分,并统计整理影响客户语音业务体验的因素,希望以此来分析客户语音业务满意度的主要影响因素,并提升客户语音业务满意度。同时,对于上网数据业务,中国移动北京公司让客户根据自身在网络覆盖与信号强度、手机上网速度、手机上网稳定性三个方面的体验进行打分,同时还让客户根据手机上网的整体体验进行手机上网整体满意度的打分,并统计整理影响客户上网体验的因素,希望以此可以分析影响客户上网业务体验的主要因素,并提升客户的上网体验。
初赛问题
基于以上背景,请你们的团队根据附件给出的数据,通过数据分析与建模的方法帮助中国移动北京公司解决以下问题:
问题 1:根据附件 1 和附件 2,分别研究影响客户语音业务和上网业务满意度的主要因素,并给出各因素对客户打分影响程度的量化分析和结果。附件 1、2 中各字段的解释说明见附件 5。
问题 2:结合问题 1 的分析,对于客户语音业务和上网业务分别建立客户打分基于相关影响因素的数学模型,并据此对附件 3、4 中的客户打分进行预测研究,将预测结果分别填写在 result.xlsx 的 Sheet1“语音”和Sheet2“上网”两个工作表中,并上传到竞赛平台,说明你们预测的合理性。
附件
附件 1 语音业务用户满意度数据
附件 2 上网业务用户满意度数据
附件 3 语音业务用户满意度预测数据
附件 4 上网业务用户满意度预测数据
附件 5 附件 1、2、3、4 的字段说明
整体求解过程概述(摘要)
随着移动通信技术的迅猛发展和网络工程的不断建设,在信息透明、产品同质化的今天,提升语音通话及网络服务的质量,满足用户对高质量语音通话、网络服务的需求显得尤为重要。本文旨在建立一个基于多模型调参优化的 Stacking 集成学习,完善且合理地预测用户评分的普适性模型,从已有数据中心获得有效信息,更高效地提升服务质量,从而完善业务服务体系。
针对问题一,主要需要对用户语音及上网业务评分影响因素的程度进行量化分析。本文首先对数据集进行统一处理,包括:初步剔除相关列数据、学习数据与预测数据指标一致化、指标规范化、空缺值处理、标签编码、特征构造、数据标准化、学习数据与预测数据一致化、学习数据训练集与测试集划分。之后在处理好的数据集上建立熵权法、灰色关联度分析、随机森林分类模型,多方面综合考虑,量化分析各影响因素对评分的影响程度,最终结果见表 2、表 3及表 4,并依此来确定影响用户两项业务满意度的主要因素。量化结果接近于实际生活,效果良好,且可为后续问题奠定基础。
针对问题二,主要需要根据已有影响因素对用户的评分进行预测,并解释预测的合理性。本文首先结合问题一量化结果以及建立主成分分析模型,对数据累计方差进行解释,确定特征个数;之后建立 XGBoost 模型,并得出各影响因素的重要性,与随机森林模型结合分析,确定特征的选择;再建立 KNN、SVM、LightGBM 以及多分类逻辑回归模型,对数据进行学习分析;随后,对各个模型进行超参数调优,模型准确率均有大幅度提升,如随机森林较原先提升了 11.69%,最高提升较原先可达到 14.25%,效果良好。再者,以模型的准确率、平均绝对误差、均方误差为标准,选择表现较优的模型作为 Stacking 集成学习的基模型,同时选择余下的一个模型作为第二层模型,在提升准确率的同时,避免过拟合。同时对其采用五折交叉验证,验证其稳健性。Stacking 集成学习结果符合预期效果,各评分预测模型效果见表 10,明显优于单一模型。在保证准确率的同时,预测的平均绝对误差、均方误差均有一定优化,同时本文还注重结果的可解释性及模型的现实意义。最后,本文进行可视化分析,绘制原始数据及预测数据评分人数南丁格尔玫瑰图,查看数据分布,绘制模型的混淆矩阵热力图、分类报告、ROC/AUC 曲线,多方面评估模型效果及解释模型的合理性。综合上述分析,可以确认模型效果良好,具有良好的稳健性、泛化能力。
最后,本文对所建立的模型的优缺点进行了中肯的评价、提出了模型的改进措施以及对模型进行了一定推广。
模型假设:
• 假设一:语音与上网业务的八项评分中,存在个别用户乱评、错评现象;
• 假设二:除个别用户的部分评分外,其余所有数据真实且符合实际情况;
• 假设三:用户评分还受到除附件中因素之外的因素的影响;
• 假设四:给定的数据集可全面体现用户整体情况;
• 假设五:对于同一业务,学习数据与预测数据的内在规律是一致的。
问题分析:
问题的整体分析
该题是一个关于移动用户对语音及上网业务体验评分的数据分析、预测类问题。从分析目的看,本题需要分析用户对语音与上网业务的评分及各个影响因素,筛选出影响用户评分的主要因素,并量化结果。同时需要对用户的评分进行预测及研究,为运营商提供参考,从而提升用户语音及上网的优质体验。因此本题主要需完成两方面任务:其一,研究影响用户语音及上网业务满意度的主要因素,并对各因素进行量化分析;其二,根据上述的分析,建立合理模型,对用户的评分进行预测及研究,确保分类模型的准确性、稳健性、可靠性,并有一定的泛化能力,且能够包容用户真实评分的主观性。
从数据来源、特征看,本题的数据来源于北京移动用户的语音与上网业务评分数据,数据包括用户对语音业务下“语音通话整体满意度”“网络覆盖与信号强度”“语音通话清晰度”“语音通话稳定性”,上网业务下“手机上网整体满意度”“网络覆盖与信号强度”“手机上网速度”“手机上网稳定性”方面的评分,以及相关的影响评分的因素。评分数据具有主观性,影响因素数据具有高维、多样、标准体系不一致、量纲不一致等特点,且数据量较大。因此,本题数据相对特殊且复杂,需要对数据进行一定的预处理,以便于后续的分析。从模型的选择看,本题数据量较大、维度较高,且分析目的是分析影响用户评分的主要因素,并对用户的评分进行预测及研究。本文将评分视为多分类,且评分具有一定主观性、分类种类多,因此,在模型的选择上,本文结合多种分类预测模型,构建集成学习模型,尽可能多地学习到用户评分特点,提升模型的准确性、稳健性及可泛化性能。从软件的选择看,本题为数据类型,且需要进行大量的数据分析、预测等,因此我们选择 Python Jupyter 对问题进行求解,其交互式的编程范式,方便且高效。
问题一的分析
问题一的核心目的在于研究并量化分析影响用户对语音及上网业务满意度的主要因素。对于已给的数据集,数据在完整度、指标标准等方面存在一定缺陷。这导致在原数据上我们不可直接进行分析,需要对原数据集进行数据的预处理。此外附件数据集在语音及上网业务中,每一业务均有四项评分,因此我们需要对每一项评分进行分析,对各因素进行量化。结合数据来源、与特征方面,我们综合皮尔逊相关系数、熵权法、灰色关联度分析、随机森林分类,构建多元量化分析模型,尽可能准确挖掘到影响用户评分的因素,为构建后续预测模型提供优质依据。
问题二的分析
问题二的核心目的在于建立基于影响用户评分影响因素的数学模型,并依据附件 3、4中相关因素对用户评分进行预测,并解释模型预测的合理性。但是在附件 1 与附件 2,附件 3与附件 4 中,影响因素存在不配对的情况。这导致在给定用户评分的数据中,部分因素不可作为模型建立的基础特征数据,因此在数据预处理的同时,还需要对附件 1 与附件 2,附件3 与附件 4 中的影响因素列取交集,使得学习数据与预测数据的特征数据一致。此外,在已给的存在用户评分的数据集中,用户对每一项的评分均为整数,不存在小数,且评分范围为[1, 10]。因此,我们在建立预测模型时,应尽量避免使用回归模型,而应使用分类模型,但部分分类模型需要分类标签量值从 0 开始,因此需要对所有评分进行标签编码,规范数据。同时分类种类较多,对于单一模型,其预测准确率较低,平均绝对误差较高、泛化能力较弱……因此,本文结合多种机器学习模型,构建集成学习模型,尽可能准确预测用户评分。最后,在此基础上,结合模型的分类混淆矩阵热力图、分类报告、ROC/AUC 曲线等对于预测结果进行解释,叙述模型的合理性,同时考虑集成学习模型对预测误差的包容性,对模型的泛化能力进行分析。
模型的建立与求解整体论文缩略图
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
import pandas as pd
import numpy as np
import missingno as msno
import scipy.stats as st
import matplotlib.pyplot as plt
import seaborn as sns# 设置图像样式
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')
# 设置图像字体
plt.rcParams['font.sans-serif'] = ['STSong']# 忽略警告
import warnings
warnings.filterwarnings('ignore')# 显示pd所有列
pd.set_option('display.max_columns', None)
# 导入数据
data1=pd.read_csv('./data/附件1语音业务用户满意度数据.csv', index_col= '用户id')
# 查看前五行
data1.head()
import numpy as np
#判断数据类型函数2
def pd_sjlx(data):#object,float64,int64 fds=[]#浮点数lb=[]#类别中,英文zs=[]#整数for name in data.columns.tolist():if(data[name].dtype==object):lb.append(name)if(data[name].dtype==np.float64 or data[name].dtype==np.float32):fds.append(name)if(data[name].dtype==np.int64 or data[name].dtype==np.int32):if((len(data[name].unique())>10)):#设置阈值为10,判断是否为整数类型的连续数值变量fds.append(name)else:zs.append(name) return lb,fds,zs
lb,fds,zs=pd_sjlx(data1.iloc[:,4:])
print('类别列',lb)
print()
print('数值列',fds)
print()
print('类别数值列',zs)
dis_cols = 5 #一行几个
dis_rows = len(fds)
plt.figure(figsize=(7*dis_cols, 4* dis_rows))for i in range(len(fds)):ax = plt.subplot(dis_rows, dis_cols, i+1)ax = sns.kdeplot(data1.loc[:,fds[i]], shade= True)ax.set_xlabel(fds[i],fontsize= 15)ax.set_ylabel("Frequency", fontsize= 15)
plt.tight_layout()
plt.show()
# 查看各因变量的类别频数
fig = plt.figure(figsize = (16,9), dpi= 100)
fig.add_subplot(2,2,1)
sns.countplot(x='语音通话整体满意度',data=data1)
fig.add_subplot(2,2,2)
sns.countplot(x='网络覆盖与信号强度',data=data1)
fig.add_subplot(2,2,3)
sns.countplot(x='语音通话清晰度',data=data1)
fig.add_subplot(2,2,4)
sns.countplot(x='语音通话稳定性',data=data1)
# plt.savefig('./图片/满意度各类别频数统计图',formate='png',dpi=500)