当前位置:   article > 正文

如何评价2023年钉钉杯大学生大数据挑战赛A题?_24年钉钉杯a

24年钉钉杯a

初赛A:智能手机用户监测数据分析

近年来,随着智能手机的产生,发展到爆炸式的普及增长,不仅推动了中国智能手机市场的发展和扩大,还快速的促进手机软件的开发。近年中国智能手机市场品牌竞争进一步加剧,中国超越美国成为全球第一大智能手机市场。手机软件日新月异,让人们更舒适的使用手机,为人们的生活带来很多乐趣,也产生了新的群体“低头一族”。手机软件进入人们的生活,游戏、购物、社交、资讯、理财等等APP吸引着、方便着现代社会的人们,让手机成为人们出门的必备物品。

该数据来自某公司某年连续30天的4万多智能手机用户的监测数据,已经做脱敏和数据变换处理。每天的数据为1个txt文件,共10列,记录了每个用户(以uid为唯一标识)每天使用各款APP(以appid为唯一标识)的起始时间,使用时长,上下流量等。具体说明见表1。此外,有一个辅助表格,app_class.csv,共两列。第一列是appid,给出4000多个常用APP所属类别(app_class),比如:社交类、影视类、教育类等,用英文字母a-t表示,共20个常用得所属类别,其余APP不常用,所属类别未知。

问题一分析

2023钉钉杯A题问题一分析:关键信息如下:

有连续30天的智能手机用户监测数据,每天的数据存储在一个txt文件中,包含了10列的信息。下面是表格1的说明和每列的变量释义:

表1:每天的数据(10列)

  1. uid:用户的唯一标识
  2. appid:APP的唯一标识,与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:下行流量

(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。

在对用户进行聚类之前,首先需要对数据进行预处理和特征选择。使用Python和一些常见的机器学习库(如NumPy、Pandas和Scikit-learn)。

K-means聚类

K-means是一种常见的聚类算法,它需要指定聚类数量K值。可以使用肘部法(Elbow Method)来选择最合适的K值。

K-means算法的使用方法如下(示例):

  1. from sklearn.cluster import KMeans
  2. import matplotlib.pyplot as plt
  3. # 使用肘部法选择K值
  4. inertia = []
  5. k_values = range(2, 11)
  6. for k in k_values:
  7. kmeans = KMeans(n_clusters=k, random_state=42)
  8. kmeans.fit(scaled_data)
  9. inertia.append(kmeans.inertia_)
  10. # 绘制肘部法曲线
  11. plt.plot(k_values, inertia, 'bx-')
  12. plt.xlabel('Number of clusters (K)')
  13. plt.ylabel('Inertia')
  14. plt.title('Elbow Method')
  15. plt.show()

根据肘部法曲线,选择使得惯性(inertia)急剧下降后趋于平缓的K值。

层次聚类算法

层次聚类是一种自底向上的聚类方法,可以构建聚类层次结构。可以使用聚类树状图(Dendrogram)来帮助选择最合适的聚类数量。

  1. from scipy.cluster.hierarchy import dendrogram, linkage
  2. # 使用层次聚类
  3. linked = linkage(scaled_data, 'ward')
  4. plt.figure(figsize=(10, 6))
  5. dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
  6. plt.title('Hierarchical Clustering Dendrogram')
  7. plt.xlabel('Cluster Size')
  8. plt.ylabel('Distance')
  9. plt.show()

根据聚类树状图,选择合适的距离阈值或聚类数量K值。

DBSCAN聚类算法

DBSCAN是一种基于密度的聚类算法,不需要预先指定聚类数量。它通过指定邻域半径和最小样本数来确定密度。

  1. from sklearn.cluster import DBSCAN
  2. # 使用DBSCAN
  3. dbscan = DBSCAN(eps=0.5, min_samples=5)
  4. clusters = dbscan.fit_predict(scaled_data)

聚类结果分析是一个非常主观的过程,可以根据具体问题和数据特点选择适合的方法。可以使用各种评估指标(如轮廓系数)来评估聚类结果的质量,也可以进行可视化分析。

对常用APP所属类别聚类

  1. import pandas as pd
  2. from sklearn.preprocessing import StandardScaler, LabelEncoder
  3. from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
  4. from sklearn.metrics import silhouette_score
  5. from scipy.cluster.hierarchy import dendrogram
  6. import matplotlib.pyplot as plt
  7. import seaborn as sns
  8. # 读取辅助表格
  9. app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
  10. # 将类别转换为数值标签
  11. label_encoder = LabelEncoder()
  12. app_class_label = label_encoder.fit_transform(app_class.iloc[:, 1])
  13. # 标准化数据
  14. scaler = StandardScaler()
  15. scaled_data = scaler.fit_transform(app_class_label.reshape(-1, 1))
  16. # 聚类算法比较和分析
  17. k_values = range(2, 11) # 聚类数量的取值范围
  18. # K-means聚类算法
  19. kmeans_scores = []
  20. kmeans_silhouette_scores = []
  21. for k in k_values:
  22. kmeans = KMeans(n_clusters=k, random_state=42)
  23. kmeans.fit(scaled_data)
  24. kmeans_scores.append(kmeans.inertia_)
  25. silhouette_avg = silhouette_score(scaled_data, kmeans.labels_)
  26. kmeans_silhouette_scores.append(silhouette_avg)
  27. # 层次聚类算法
  28. agglomerative_silhouette_scores = []
  29. for k in k_values:
  30. agglomerative = AgglomerativeClustering(n_clusters=k)
  31. labels = agglomerative.fit_predict(scaled_data)
  32. silhouette_avg = silhouette_score(scaled_data, labels)
  33. agglomerative_silhouette_scores.append(silhouette_avg)
  34. # DBSCAN聚类算法
  35. eps_values = [0.1, 0.2, 0.3, 0.4, 0.5]
  36. (后略,完整代码见文末地址)

肘部法曲线

  1. from scipy.cluster.hierarchy import dendrogram, linkage
  2. # 绘制肘部法曲线
  3. plt.figure(figsize=(10, 5),dpi=300)
  4. plt.subplot(1, 2, 1)
  5. plt.plot(k_values, kmeans_scores, 'bx-', label='K-means')
  6. plt.xlabel('Number of clusters (K)')
  7. plt.ylabel('Inertia')
  8. plt.title('K-means Clustering - Inertia')
  9. plt.legend()
  10. plt.show()

 

 

层次聚类树状图

(完整内容见文末地址)

考虑群体用户的特征的聚类

我们首先读取辅助表格app_class.csv,并使用LabelEncoder将类别转换为数值标签。然后,我们创建一个空的DataFrameall_data来存储所有数据。

接下来,我们遍历21个txt文件,逐个读取并加载数据。对于每个txt文件,我们将类别转换为数值标签,并将数据添加到总的DataFrameall_data中。

在加载和处理完所有数据后,我们使用StandardScaler对选定的特征进行标准化。然后,我们使用K-means聚类算法对标准化后的数据进行聚类。

最后,我们输出每个聚类的用户数量,并根据聚类结果分析不同群体用户的特征,例如使用时长、流量等。

将类别转换为数值标签的时候,如果直接使用

data['app_class_label'] = label_encoder.transform(data['appid'])就会报错,解决方法如下:

txt中的appid去重后就是所有的appid,这些appid减去csv表格中的第一列中的appid即得到其余位归类的APP的appid,这些appid统一为“u”类,其他已经分好类的APP的appid为用英文字母a-t表示,这样得到了一列有着所有appid所属类别的数据列,然后再使用LabelEncoder()进行处理,最后在使用label_encoder.transform(data['appid'])将类别转换为数值标签。

  1. import pandas as pd
  2. from sklearn.preprocessing import StandardScaler, LabelEncoder
  3. from sklearn.cluster import KMeans
  4. import os
  5. # 读取辅助表格
  6. app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
  7. # 获取所有appid
  8. all_appids = set(app_class.iloc[:, 0])
  9. # 创建一个空的DataFrame来存储所有数据
  10. all_data = pd.DataFrame()
  11. # 遍历每个txt文件
  12. # for i in range(1, 22):
  13. for i in range(1, 2):
  14. # 构造文件名
  15. filename = f"day{i:02d}.txt"
  16. filepath = os.path.join('初赛数据集', filename)
  17. # 读取txt文件
  18. data = pd.read_csv(filepath, header=None)
  19. data.columns = ['uid', 'appid', 'app_type', 'start_day', 'start_time', 'end_day', 'end_time', 'duration', 'up_flow', 'down_flow']
  20. # 将数据添加到总的DataFrame中
  21. all_data = pd.concat([all_data, data], ignore_index=True)
  22. # 新建一个DataFrame来存储未知类别的appid的类别
  23. unknown_appids = set(all_data['appid']) - all_appids
  24. unknown_data = pd.DataFrame({'appid': list(unknown_appids), 'app_class': 'u'})
  25. app_class.columns = ['appid', 'app_class']
  26. app_class
  27. (完整代码见文末地址)
  28. # 统计该群体用户的特征,例如使用时长、流量等
  29. avg_duration = cluster_data['duration'].mean()
  30. avg_up_flow = cluster_data['up_flow'].mean()
  31. avg_down_flow = cluster_data['down_flow'].mean()
  32. # 输出该群体用户的特征
  33. print(f"Cluster {cluster_label} User Profile:")
  34. print(f"Average Duration: {avg_duration:.2f}")
  35. print(f"Average Up Flow: {avg_up_flow:.2f}")
  36. print(f"Average Down Flow: {avg_down_flow:.2f}")
  37. print()

 

问题二分析

2023钉钉杯A题问题二分析:APP使用情况预测分析:要研究的问题是通过用户的APP使用记录预测用户未来是否使用APP(分类问题)及使用时长(回归问题)

(一)对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测用户在第12~21天是否会使用该类APP。给出预测结果和真实结果相比的准确率。

(二)对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测第12~21天用户使用a类APP的有效日均使用时长。评价指标选用NMSE。

从已有的数据计算每天a类APP的使用情况,包括是否使用APP及使用时长,可以根据start_day和end_day判断是否使用APP,根据对每天的duration进行求和得到每天的使用时长,形成一个新的数据表,进而进行是否使用APP(分类预测)及使用时长(回归预测)

当处理分类问题和回归问题时,我们使用逻辑回归、决策树、随机森林、K近邻和支持向量机这五种常用机器学习

 更多请留意微信公众号,到时会及时更新:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/898509
推荐阅读
相关标签
  

闽ICP备14008679号