赞
踩
初赛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列)
(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。
在对用户进行聚类之前,首先需要对数据进行预处理和特征选择。使用Python和一些常见的机器学习库(如NumPy、Pandas和Scikit-learn)。
K-means是一种常见的聚类算法,它需要指定聚类数量K值。可以使用肘部法(Elbow Method)来选择最合适的K值。
K-means算法的使用方法如下(示例):
- from sklearn.cluster import KMeans
- import matplotlib.pyplot as plt
- # 使用肘部法选择K值
- inertia = []
- k_values = range(2, 11)
- for k in k_values:
- kmeans = KMeans(n_clusters=k, random_state=42)
- kmeans.fit(scaled_data)
- inertia.append(kmeans.inertia_)
- # 绘制肘部法曲线
- plt.plot(k_values, inertia, 'bx-')
- plt.xlabel('Number of clusters (K)')
- plt.ylabel('Inertia')
- plt.title('Elbow Method')
- plt.show()
根据肘部法曲线,选择使得惯性(inertia)急剧下降后趋于平缓的K值。
层次聚类是一种自底向上的聚类方法,可以构建聚类层次结构。可以使用聚类树状图(Dendrogram)来帮助选择最合适的聚类数量。
- from scipy.cluster.hierarchy import dendrogram, linkage
-
- # 使用层次聚类
- linked = linkage(scaled_data, 'ward')
- plt.figure(figsize=(10, 6))
- dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
- plt.title('Hierarchical Clustering Dendrogram')
- plt.xlabel('Cluster Size')
- plt.ylabel('Distance')
- plt.show()
根据聚类树状图,选择合适的距离阈值或聚类数量K值。
DBSCAN是一种基于密度的聚类算法,不需要预先指定聚类数量。它通过指定邻域半径和最小样本数来确定密度。
- from sklearn.cluster import DBSCAN
- # 使用DBSCAN
- dbscan = DBSCAN(eps=0.5, min_samples=5)
- clusters = dbscan.fit_predict(scaled_data)
聚类结果分析是一个非常主观的过程,可以根据具体问题和数据特点选择适合的方法。可以使用各种评估指标(如轮廓系数)来评估聚类结果的质量,也可以进行可视化分析。
对常用APP所属类别聚类
- import pandas as pd
- from sklearn.preprocessing import StandardScaler, LabelEncoder
- from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
- from sklearn.metrics import silhouette_score
- from scipy.cluster.hierarchy import dendrogram
- import matplotlib.pyplot as plt
- import seaborn as sns
-
- # 读取辅助表格
- app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
-
- # 将类别转换为数值标签
- label_encoder = LabelEncoder()
- app_class_label = label_encoder.fit_transform(app_class.iloc[:, 1])
-
- # 标准化数据
- scaler = StandardScaler()
- scaled_data = scaler.fit_transform(app_class_label.reshape(-1, 1))
-
- # 聚类算法比较和分析
- k_values = range(2, 11) # 聚类数量的取值范围
-
- # K-means聚类算法
- kmeans_scores = []
- kmeans_silhouette_scores = []
- for k in k_values:
- kmeans = KMeans(n_clusters=k, random_state=42)
- kmeans.fit(scaled_data)
- kmeans_scores.append(kmeans.inertia_)
- silhouette_avg = silhouette_score(scaled_data, kmeans.labels_)
- kmeans_silhouette_scores.append(silhouette_avg)
-
- # 层次聚类算法
- agglomerative_silhouette_scores = []
- for k in k_values:
- agglomerative = AgglomerativeClustering(n_clusters=k)
- labels = agglomerative.fit_predict(scaled_data)
- silhouette_avg = silhouette_score(scaled_data, labels)
- agglomerative_silhouette_scores.append(silhouette_avg)
-
- # DBSCAN聚类算法
- eps_values = [0.1, 0.2, 0.3, 0.4, 0.5]
- (后略,完整代码见文末地址)
- from scipy.cluster.hierarchy import dendrogram, linkage
-
- # 绘制肘部法曲线
- plt.figure(figsize=(10, 5),dpi=300)
- plt.subplot(1, 2, 1)
- plt.plot(k_values, kmeans_scores, 'bx-', label='K-means')
- plt.xlabel('Number of clusters (K)')
- plt.ylabel('Inertia')
- plt.title('K-means Clustering - Inertia')
- plt.legend()
- 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'])将类别转换为数值标签。
- import pandas as pd
- from sklearn.preprocessing import StandardScaler, LabelEncoder
- from sklearn.cluster import KMeans
- import os
-
- # 读取辅助表格
- app_class = pd.read_csv('初赛数据集/app_class.csv', header=None)
-
- # 获取所有appid
- all_appids = set(app_class.iloc[:, 0])
-
- # 创建一个空的DataFrame来存储所有数据
- all_data = pd.DataFrame()
-
- # 遍历每个txt文件
- # for i in range(1, 22):
- for i in range(1, 2):
- # 构造文件名
- filename = f"day{i:02d}.txt"
- filepath = os.path.join('初赛数据集', filename)
-
- # 读取txt文件
- data = pd.read_csv(filepath, header=None)
- data.columns = ['uid', 'appid', 'app_type', 'start_day', 'start_time', 'end_day', 'end_time', 'duration', 'up_flow', 'down_flow']
-
- # 将数据添加到总的DataFrame中
- all_data = pd.concat([all_data, data], ignore_index=True)
-
- # 新建一个DataFrame来存储未知类别的appid的类别
- unknown_appids = set(all_data['appid']) - all_appids
- unknown_data = pd.DataFrame({'appid': list(unknown_appids), 'app_class': 'u'})
-
- app_class.columns = ['appid', 'app_class']
- app_class
-
- (完整代码见文末地址)
-
-
- # 统计该群体用户的特征,例如使用时长、流量等
- avg_duration = cluster_data['duration'].mean()
- avg_up_flow = cluster_data['up_flow'].mean()
- avg_down_flow = cluster_data['down_flow'].mean()
-
- # 输出该群体用户的特征
- print(f"Cluster {cluster_label} User Profile:")
- print(f"Average Duration: {avg_duration:.2f}")
- print(f"Average Up Flow: {avg_up_flow:.2f}")
- print(f"Average Down Flow: {avg_down_flow:.2f}")
- 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近邻和支持向量机这五种常用机器学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。