赛道 B:北京移动用户体验影响因素研究
移动通信技术飞速发展,给人们带来了极大便利,人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设,网络覆盖越来越完善。各个移动运营商,越来越重视客户的网络使用体验,从而进一步提升网络服务质量。客户满意度是客户对运营商产品服务的满意程度,反映了客户期望与实际感知的产品服务之间的差异。特别是在信息透明、产品同质化的今天,客户满意度的表现成为各大运营商市场运营状况的重要体现。数字经济时代,各大运营商需要运用数字经济的管理理念和技术手段,建立客户体验生态的全方位系统性测评体系,实现客户满意度评测的数字化转型,让客户体验赋能商业决策,让商业决策真正服务客户,共同推动移动网络高质量可持续发展。
下面给出整体思路代码:
首先对所有指标进行数据处理,进行缺失值和重复值检查。假设附件一和附件二的数据是对用户的真实情况记录,未对异常值进行处理。将object型数据进行编码处理,本文使用3种编码形式,包括lable编码、有序编码等。删除缺失值大于百分之 80的指标。考虑到变量的取值特征,本文将变量分为连续型变量和离散型变量两部分,分别运用相关分析和方差选择的方法,选择了与满意度在相关关系较强的20个连续型和26个离散型因素。对这50多个自变量与满意度建立LightGBM回归模型,并且对自变量的贡献度进行排序,找到前23个显著影响满意度的因素。考虑到这23个自变量之间可能存在多重共线性,为保证变量有较高的解释程度,计算自变量之间的相关系数,剔除自变量之间相关性较高的变量,最终得到对满意度最具显著影响的20个分子描述符变量。最后对选取的变量计算MIC和Spearman值,结果表明,选取的变量之间相关关系较弱,具有很好的独立性。同时,选取的20个变量具有很好的可解释性,说明20个变量的选取是合理的。
针对问题一(全套代码):
1、导入数据:
path1 = r"F:\mathorcup大数据出思路\2022年MathorCup大数据竞赛-赛道B初赛"
yuyin = pd.read_excel(path1+"/附件1语音业务用户满意度数据.xlsx")
inter = pd.read_excel(path1+"/附件2上网业务用户满意度数据.xlsx")
2、数据清洗(经过数据分析需要使用多种编码方式,包括lable编码、有序编码、计数编码):
#找到object列
types = pd.DataFrame(yuyin.dtypes).reset_index()
types[types[0]=='object']['index'].to_list()from tqdm import tqdm
for i in tqdm(['用户描述','用户描述.1','语音方式','客户星级标识']):enc=preprocessing.LabelEncoder()yuyin[i]=enc.fit_transform(yuyin[i])#训练LabelEncoder,将电脑,手表,手机编码为0,1,2biner = {'是':1,'否':0}
for i in tqdm(['是否关怀用户','是否去过营业厅','是否4G网络客户(本地剔除物联网)','是否5G网络客户','是否实名登记用户']):yuyin[i] = yuyin[i].map(biner)
mnso.matrix(yuyin_clear)
plt.show()nan_percent = 100*(df.isnull().sum()/len(df))# df.isnull().sum()统计每一列的缺失值数量# 再除上len()得到每一列的缺失值比例——小数形式# *100得到百分数nan_percent = nan_percent[nan_percent > 0].sort_values()# 得到每列的缺失值的占比,升序排序# >0是为了筛掉没有缺失值的列,只返回有缺失值的return nan_percent
print(missing_percent(yuyin_clear))
3、初步数据分析(单个变量与满意度分析)
def get_random_color():r1 = lambda: random.randint(0,255)return '#%02X%02X%02X' % (r1(),r1(),r1())def get_histplot_central_tendency(df: dict, fields: list):for field in fields:f, (ax1) = plt.subplots(1, 1, figsize=(15, 5))v_dist_1 = df[field].valuessns.histplot(v_dist_1, ax=ax1, color=get_random_color(), kde=True)mean=df[field].mean()median=df[field].median()mode=df[field].mode().values[0]
def get_scatter(df: dict, fields: list):ylim = (0, 12)for field in fields:df_copy = pd.concat([df['语音通话整体满意度'], df[field]], axis=1)
def get_headmap(df: dict):corr = df.corr()plt.figure(figsize=(20, 20))
4、因素分析
4.1 熵值法
from tqdm import tqdm
for ye in tqdm([0,1]):df1 = df.interpolate()df333 = df.drop(['用户id','语音通话整体满意度'],axis=1)data = df333# 总指标数n = list(data.columns)# 最优指标,(x-min)/(max-min)# 最劣指标 (max-x)/(max-min)# 如果指标体系存在最优指标和最劣指标,采用下面的形式for i in n:# 获取各个指标的最大值和最小值Max = np.max(data[i])Min = np.min(data[i])data[i] = (Max - data[i])/(Max - Min)# 建立数据比重矩阵for i in n:# 计算指标总和Sum = np.sum(data[i])# 计算各地区某一指标占比data[i] = data[i]/Sum# 地区总数m = len(data)E = []# 计算信息熵值for i in n:K = 1/np.log(m)e = - K * np.sum(data[i] * np.log(data[i]))E.append(e)# 转换为数组形式E = np.array(E)
4.2 机器学习模型训练
model_lgb = lgb.LGBMRegressor(objective='regression_l1',metric='mse',learning_rate=0.02,subsample = 0.8,colsample_bytree = 0.8,subsample_freq = 5,)
4.3 计量模型(最小二乘)
# Coding method 2
import statsmodels.api as sm
# print the ols summary
x = sm.add_constant(train_x.fillna(0))