【2023钉钉杯复赛】A题 智能手机用户监测数据分析 Python代码分析
1 题目
一、问题背景
近年来,随着智能手机的产生,发展到爆炸式的普及增长,不仅推动了中 国智能手机市场的发展和扩大,还快速的促进手机软件的开发。近年中国智能手 机市场品牌竞争进一步加剧,中国超越美国成为全球第一大智能手机市场。手机 软件日新月异,让人们更舒适的使用手机,为人们的生活带来很多乐趣,也产生 了新的群体“低头一族”。手机软件进入人们的生活,游戏、购物、社交、资讯、理财等等APP吸引着、方便着现代社会的人们,让手机成为人们出门的必备物 品。
该数据来自某公司某年连续30天的4万多智能手机用户的监测数据,已经做 了脱敏和数据变换处理。每天的数据为1个txt文件,共10列,记录了每个用户(以uid为唯一标识)每天使用各款APP(以appid为唯一标识)的起始时间,使 用时长,上下流量等。具体说明见表1。此外,有一个辅助表格app_class.csv,共两列。第一列是appid,给出4000多个常用APP所属类别(app_class),比如:社交类、影视类、教育类等,用英文字母a-t表示,共20个常用得所属类别,其余APP不常用,所属类别未知。
表 1
变量编号 | 变量名 | 释义 |
---|---|---|
1 | uid | 用户的id |
2 | appid | APP的id(与app_class文件中的第一列对应) |
3 | app_type | APP类型:系统自带、用户安装 |
4 | start_day | 使用起始天,取值1-30(注:第一天数据的头两行的使用起始天取 值为0,说明是在这一天的前一天开始使用的) |
5 | start_time | 使用起始时间 |
6 | end_day | 使用结束天 |
7 | end_time | 使用结束时间 |
8 | duration | 使用时长(秒) |
9 | up_flow | 上行流量 |
10 | down_flow | 下行流量 |
二、解决问题
- APP使用情况预测分析:要研究的问题是通过用户的APP使用记录预测用户未来是否使用APP所属类型(app_class),以及对应的具体类型(appid)( 多重分类问题)
(一)对用户使用APP的情况进行预测,根据用户第1~15天的常用所属20 类APP的使用情况,建立一个模型来预测用户在16~30天会使用哪些类的APP, 给出预测结果和真实结果相比的准确率。(注:测试集不能参与到训练和验证中,否则作违规处理)
(二)对用户使用APP的使用时长进行预测,根据用户第115天的常用所属20类APP的使用情况,建立一个模型来预测用户在1630天对于每一类APP的有效日均使用时长。评价指标选用NMSE. (注:测试集不能参与到训练和验证中,否则作违规处理)
- 由于APP数量众多,总量多达几万,绝大多数市场占用率极低,因此仅使用app_class.csv文件中给出的4000多个常用的并且用户数超过10个APP进行推荐。通过每个用户30天的手机app使用情况,建立一个推荐系统模型,对每一个用户推荐app,并且给出推荐系统模型的详细描述,推荐系统使用的模型参数量,以及对推荐系统的预测结果进行评价。
2 思路分析
2.1 问题一
在初赛的基础上,重新训练模型,重新预测一遍就行。
2.2 问题二
这是一个推荐系统开发的问题。
- 数据预处理:对数据进行清洗和预处理,包括去除重复值、缺失值填充、异常值处理、特征工程等。
- 特征提取:从数据中提取有用的特征,包括用户的历史使用记录、app所属类别、app类型等。
- 模型选择:基于内容的推荐、协同过滤推荐、深度学习推荐等推荐模型。
- 模型训练:将预处理后的数据输入到所选的机器学习模型中进行训练,得到模型参数。
- 模型评估:对训练好的模型进行评估,如准确率、召回率、F1值等。
- 模型优化:根据评估结果进行模型参数的调整和优化,模型改进、模型融合等方法。
我们可以考虑使用协同过滤推荐模型,模型参数包括用户偏好矩阵和物品偏好矩阵,参数量取决于用户和物品的数量。对于推荐系统的预测结果进行评价,可以使用交叉验证或者留出法等方法进行评估。
3 Python实现
3.1 数据预处理
import pandas as pd
import os
from tqdm import tqdm
import warnings
warnings.filterwarnings("ignore")
tqdm.pandas()
# 合并数据1-30天的数据
folder_path = '初赛数据集/'
dfs = []
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
csv_path = os.path.join(folder_path, filename)
tempdf = pd.read_csv(csv_path)
dfs.append(tempdf)
folder_path = '复赛数据集/'
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
csv_path = os.path.join(folder_path, filename)
tempdf = pd.read_csv(csv_path)
dfs.append(tempdf)
df = pd.concat(dfs,axis=0)
df.shape
import pandas as pd
import matplotlib.pyplot as plt
# 数据清洗
df.loc[df['start_day'] == 0, 'start_day'] = 1 # 将使用起始天为0的行,修改为1
df['start_time'] = pd.to_datetime(df['start_time']) # 转换为datetime类型
df['end_time'] = pd.to_datetime(df['end_time']) # 转换为datetime类型
df['usage_time'] = (df['end_time'] - df['start_time']) / pd.Timedelta(minutes=1) # 使用时长(分钟)
df['up_flow_mb'] = df['up_flow'] / 1024 / 1024 # 上行流量(MB)
df['down_flow_mb'] = df['down_flow'] / 1024 / 1024 # 下行流量(MB)
df = df[df['duration'] != 0] # 剔除使用时长为0的行
df = df[df['up_flow'] != 0] # 剔除上行流量为0的行
df = df[df['down_flow'] != 0] # 剔除下行流量为0的行
df
# 剔除使用时长和流量明显异常的行
# 剔除使用时长小于10秒的行
df = df[df['usage_time'] >= 10]
fig, axs = plt.subplots(1, 3, figsize=(10, 5))
axs[0].hist(df['usage_time'])
axs[0].set_title('Usage Time')
axs[0].set_xlabel('Time (minutes)')
axs[1].hist(df['up_flow_mb'])
axs[1].set_title('Up Flow')
axs[1].set_xlabel('Up Flow (MB)')
axs[2].hist(df['down_flow_mb'])
axs[2].set_title('Down Flow')
axs[2].set_xlabel('Down Flow (MB)')
plt.show()
# APP分类信息(可根据app_id和app_class文件进行关联)
cate_df_1 = pd.read_csv('初赛数据集/app_class.csv',header=None)
cate_df_2 = pd.read_csv('复赛数据集/app_class.csv',header=None)
cate_df = pd.concat([cate_df_1,cate_df_2],axis=0)
cate_df.columns = ['appid','letter']
# 定义字母编码映射字典
char_map = {chr(i + 96): i for i in range(1, 27)}
# 将'letter'列中的字母进行编码
cate_df['letter'] = cate_df['letter'].map(char_map)
cate_dict = dict(zip(cate_df['appid'],cate_df['letter']))
df['category'] = df['appid'].map(cate_dict)
df.to_excel('data/复赛数据集1-30day.xlsx',index=False)
3.2 推荐模型建立与评价
...略,请下载完整资料:betterbench.top/#/106/detail