赛道 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,2
biner = {'是':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].values
sns.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))