如何评价2023年钉钉杯大学生大数据挑战赛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算法的使用方法如下(示例):

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近邻和支持向量机这五种常用机器学习

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

 

 

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微信公众号:数模0error

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值