【BetterBench原创】2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛 赛道B 北京移动用户体验影响因素研究 建模方案及代码实现(更新中)

2022年12月21日 12:20 发布问题一、二思路及问题一的python代码实现
2022年12月22日 15:00 发布问题二python实现的代码
更新完毕
(1)问题一建模方案及代码实现
(2)问题二建模方案及代码实现
移动通信技术飞速发展,给人们带来了极大便利,人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设,网络覆盖越来越完善。各个移动运营商,越来越重视客户的网络使用体验,从而进一步提升网络服务质量。 客户满意度是客户对运营商产品服务的满意程度,反映了客户期望与实际感知的产品服务之间的差异。特别是在信息透明、产品同质化的今天, 客户满意度的表现成为各大运营商市场运营状况的重要体现。数字经济时代,各大运营商需要运用数字经济的管理理念和技术手段,建立客户体验生态的全方位系统性测评体系,实现客户满意度评测的数字化转型,让客户体验赋能商业决策,让商业决策真正服务客户,共同推动移动网络高质量可持续发展。 根据客户投诉,对影响用户体验的问题逐点解决,是传统提升客户满意度的方法。但是随着用户数量的大幅增加,移动产品的种类越来越丰富, 客户的需求越来越高,传统的方法已经难以有效提升客户的满意度。本研究拟通过分析影响用户满意度的各种因素,为决策提供依据,从而实现更早、更全面提升用户满意度。 中国移动通信集团北京公司,让客户根据自身在网络覆盖与信号强度、语音通话清晰度和语音通话稳定性三个方面的体验进行打分,同时还让客户根据语音通话的整体体验进行语音通话整体满意度的打分,并统计整理影响客户语音业务体验的因素,希望以此来分析客户语音业务满意度的主要影响因素,并提升客户语音业务满意度。同时,对于上网数据业务,中国移动北京公司让客户根据自身在网络覆盖与信号强度、手机上网速度、手机上网稳定性三个方面的体验进行打分,同时还让客户根据手机上网的整体体验进行手机上网整体满意度的打分,并统计整理影响客户上网体验的因素,希望以此可以分析影响客户上网业务体验的主要因素,并提升客户的上网体验。
初赛问题 基于以上背景,请你们的团队根据附件给出的数据,通过数据分析与建模的方法帮助中国移动北京公司解决以下问题:
问题 1:根据附件 1 和附件 2,分别研究影响客户语音业务和上网业务满意度的主要因素,并给出各因素对客户打分影响程度的量化分析和结果。附件 1、2 中各字段的解释说明见附件 5。
问题 2:结合问题 1 的分析,对于客户语音业务和上网业务分别建立客户打分基于相关影响因素的数学模型,并据此对附件 3、4 中的客户打分
进行预测研究,将预测结果分别填写在result.xlsx 的Sheet1“语音”和Sheet2“上网”两个工作表中,并上传到竞赛平台,说明你们预测的合理性。
附件
附件 1 语音业务用户满意度数据 附件 2 上网业务用户满意度数据 附件 3 语音业务用户满意度预测数据 附件 4 上网业务用户满意度预测数据附件 5 附件 1、2、3、4 的字段说明result.xlsx
这是相关性分析问题,分别对附件1和附件2计算所有因素与语音通话整体满意度和手机上网整体满意度的相关性。首先对数据集进行数据预处理和数据可视化分析,具体的分析过程看以下 部分python代码实现。查看异常值,去除异常值,查看数据分布,对分布进行抓换等处理。预处理完毕后,采用的相关性分析方法有
Pearson相关用于评估两个连续变量之间的线性关联强度。这种统计方法本身不区分自变量和因变量,但如果您根据研究背景已经对变量进行了区分,我们仍可以采用该方法判断相关性。
Spearman相关又称Spearman秩相关,用于检验至少有一个有序分类变量的关联强度和方向。
Kendall’s tau-b 相关系数是用于检验至少有一个有序分类变量关联强度和方向的非参数分析方法。该检验与Spearman相关的应用范围基本一致,但更适用于存在多种关联的数据(如列联表)。
卡方检验常用于分析无序分类变量之间的相关性,也可以用于分析二分类变量之间的关系。但是该检验只能分析相关的统计学意义,不能反映关联强度。因此,我们常联合Cramer’s V检验提示关联强度。
Fisher精确检验可以用于检验任何RC数据之间的相关关系,但最常用于分析22数据,即两个二分类变量之间的相关性。与卡方检验只能拟合近似分布不同的是,Fisher精确检验可以分析精确分布,更适合分析小样本数据。但是该检验与卡方检验一样,只能分析相关的统计学意义,不能反映关联强度。
这是一个多分类问题,1-10的评分,10分类问题。简单的机器学习问题。首先数据预处理,包括缺失值处理、异常值处理、类别特征编码,label 采用onehot编码或者数值编码。接下来是特征工程,特征工程的方法有,特征筛选、特征降维、特征交叉、特征标准化或归一化等等。接下来选择常用的机器学习分类模型
XGB、LGB一般效果更好。此比赛时间充足,可以多对比几种模型,看实验效果。此外还可以采用神经网络分类模型,耗时较长,效果更佳。
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as st
import warnings
%matplotlib inline
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['STSong']
file1 = pd.read_excel('./data/附件1语音业务用户满意度数据.xlsx')
file2 = pd.read_excel('./data/附件2上网业务用户满意度数据.xlsx')

file1.info()


msn.matrix(file1)
plt.savefig('img/附件1缺失值查看.png',dpi=300)

isnull_df = pd.DataFrame(file1.isnull().any())
print(isnull_df[file1.isnull().any()==True])

附件1中,用户描述,用户描述.1,重定向次数,重定向驻留时长 ,是否关怀用户,是否去过营业厅,缺失值较多,可以直接不要这个字段的列
是否4G网络客户(本地剔除物联网),终端品牌,终端品牌类型,外省流量占比,是否5G网络客户,是否实名登记用户,客户星级标识,当月欠费金额,前第3个月欠费金额,缺失值较少,可以选择填充或者删除该行缺失值
msn.matrix(file2)
plt.savefig('img/附件2缺失值查看.png',dpi=300)

isnull_d2 = pd.DataFrame(file2.isnull().any())
print(isnull_d2[file2.isnull().any()==True])

# 对浮点型数据,查看数据分布
fig = plt.figure(figsize=(80,60),dpi=75)
i=0
for s in file1.columns:
if file1[s].dtype==float:
...略
# plt.savefig('img/附件1箱线图查看.png',dpi=300)
plt.show()

# 对浮点型数据,查看数据分布
fig = plt.figure(figsize=(80,60),dpi=75)
i=0
for s in file2.columns:
if file2[s].dtype==float:
...略
plt.savefig('img/附件2箱线图查看.png',dpi=300)
plt.show()

# 所有浮点型字段的分布
dist_cols = 4
dist_rows = len(file1.columns)
plt.figure(figsize=(4*dist_cols,4*dist_rows))
i = 1
for col in file1.columns:
if file1[col].dtype==float:
...略
# plt.savefig('img/附件1所有浮点型字段分布.png',dpi=300)
plt.show()

# 所有int型字段的分布
dist_cols = 4
dist_rows = len(file1.columns)
plt.figure(figsize=(4*dist_cols,4*dist_rows))
i = 1
for col in file1.columns:
if file1[col].dtype==int:
...略
# plt.savefig('img/附件1所有整型字段分布.png',dpi=300)
plt.show()


# 附件2所有浮点型字段的分布
dist_cols = 4
dist_rows = len(file2.columns)
plt.figure(figsize=(4*dist_cols,4*dist_rows))
i = 1
for col in file2.columns:
if file2[col].dtype==float:
...略
# plt.savefig('img/附件2所有浮点型字段分布.png',dpi=300)
plt.show()

# 附件2所有浮点型字段的分布
dist_cols = 4
dist_rows = len(file2.columns)
plt.figure(figsize=(4*dist_cols,4*dist_rows))
i = 1
for col in file2.columns:
if file2[col].dtype==int:
...略
i+=1
# plt.savefig('img/附件2所有整型字段分布.png',dpi=300)
plt.show()

结论:如果出现某个特征的分布不符合正态分布,后续需要通过对数据进行转换,针对右偏和左偏的转换方法不一样
查看label 分布
# 取1-10之间
y_p = file1[(file1['语音通话整体满意度']<=10) & (file1['语音通话整体满意度']>=1)]['语音通话整体满意度']
## 3) 查看预测值的具体频数
...略
plt.savefig('img/语音通话整体满意度分布.png',dpi=300)
plt.show()

# 取1-10之间
y_p = file2[(file2['手机上网整体满意度']<=10) & (file2['手机上网整体满意度']>=1)]['手机上网整体满意度']
## 3) 查看预测值的具体频数
...略
plt.savefig('img/手机上网整体满意度分布.png',dpi=300)
plt.show()

以符合左偏分布的重定向次数,对数转换举例
clear_file1 = file1[(file1['语音通话整体满意度']<=10) & (file1['语音通话整体满意度']>=1)]
plt.figure(figsize=(20, 6))
y = clear_file1['重定向次数']
plt.subplot(121)
plt.title('johnsonsu分布拟合',fontsize=20)
plt.xlabel('重定向次数',fontsize=15)
sns.distplot(y, kde=False, fit=st.johnsonsu, color='Red')
plt.subplot(121)
y2 = clear_file1['重定向次数']
plt.subplot(122)
st.probplot(y2, dist="norm", plot=plt)
plt.title('重定向次数 Q-Q图',fontsize=20)
plt.xlabel('X分位数',fontsize=15)
plt.ylabel('Y分位数',fontsize=15)
plt.savefig('img/重定向次数未转换前的分布.png',dpi=300)
plt.show()

plt.figure(figsize=(20, 6))
y = np.log1p(clear_file1['重定向次数'])
plt.subplot(121)
plt.title('johnsonsu分布拟合',fontsize=20)
plt.xlabel('重定向次数',fontsize=15)
sns.distplot(y, kde=False, fit=st.johnsonsu, color='Red')
plt.subplot(121)
y2 = np.log1p(clear_file1['重定向次数'])
plt.subplot(122)
st.probplot(y2, dist="norm", plot=plt)
plt.title('重定向次数 Q-Q图',fontsize=20)
plt.xlabel('X分位数',fontsize=15)
plt.ylabel('Y分位数',fontsize=15)
plt.savefig('img/重定向次数转换后的分布.png',dpi=300)
plt.show()
结论:重定向次数是属于数值特征,存在异常值,数据分布不符合正态分布,需要对数转换后,便可以近似为正态分布。
plt.rcParams['font.sans-serif'] = ['STSong']
corr = clear_file1.corr().abs()
k = 10
col = corr.nlargest(k,'语音通话整体满意度')['语音通话整体满意度'].index
plt.subplots(figsize = (10,10))
...略
plt.savefig('img/附件1-Top10相关性热图.png',dpi=300)
plt.show()

plt.rcParams['font.sans-serif'] = ['STSong']
corr = clear_file2.corr().abs()
k = 10
col = corr.nlargest(k,'手机上网整体满意度')['手机上网整体满意度'].index
plt.subplots(figsize = (10,10))
...略
plt.savefig('img/附件2-Top10相关性热图.png',dpi=300)
plt.show()

结论:影响语音通话整体满意度的关键因素有,语音通话清晰度, 网络覆盖与信号强度, 语音通话稳定性, 是否遇到过网络问题, 居民小区, 手机没有信号, 有信号无法拨通, 通话过程中突然中断, 办公室。
影响手机上网整体满意度的关键因素有手机上网速度, 网络覆盖与信号强度, 手机上网稳定性, 网络信号差/没有信号, 手机上网速度慢, 上网过程中网络时断时续或时快时, 打开网页或APP图片慢, 居民小区, 显示有信号上不了网
https://www.betterbench.top/#/17/detail
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD