初赛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列)
- uid:用户的唯一标识
- appid:APP的唯一标识,与app_class文件中的第一列对应
- app_type:APP类型,可以是系统自带或用户安装
- start_day:使用起始天,取值范围为1-30。第一天数据的头两行的使用起始天取值为0,表示是在前一天开始使用的。
- start_time:使用起始时间
- end_day:使用结束天
- end_time:使用结束时间
- duration:使用时长(秒)
- up_flow:上行流量
- down_flow:下行流量
(一)根据用户常用所属的20类APP的数据对用户进行聚类,要求至少给出三种不同的聚类算法进行比较,选择合理的聚类数量K值,并分析聚类结果。
在对用户进行聚类之前,首先需要对数据进行预处理和特征选择。使用Python和一些常见的机器学习库(如NumPy、Pandas和Scikit-learn)。
K-means聚类
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聚类算法
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近邻和支持向量机这五种常用机器学习
更多请留意微信公众号,到时会及时更新: