【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 本文提供了2023年第二届钉钉杯大学生大数据挑战赛初赛A题"智能手机用户监测数据分析"的Python代码分析,包括数据预处理、特征工程、聚类分析等步骤,以及如何使用不同聚类算法进行用户行为分析。

2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

在这里插入图片描述

相关链接

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题一Python代码分析

【2023 年第二届钉钉杯大学生大数据挑战赛初赛】 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析

1 题目

2023 年第二届钉钉杯大学生大数据挑战赛初赛题目 初赛 A:智能手机用户监测数据分析

一、问题背景

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

二、解决问题

  1. 聚类分析

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

(二)根据聚类结果对不同类别的用户画像,并且分析不同群体用户的特征。(用户画 像定义:根据用户的属性,偏好,行为习惯等信息对用户打标签,用以描述不同群体的用户 行为,从而针对不同群体的用户推荐不同所属类别的APP产品。)

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

(一)对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预 测用户在第12~21天是否会使用该类APP。给出预测结果和真实结果相比的准确率。(注:测 试集不能参与到训练和验证中,否则作违规处理)

(二)对用户使用APP的情况进行预测,根据用户第1~11天的a类APP的使用情况,来预测 第12~21天用户使用a类APP的有效日均使用时长。评价指标选用NMSE。
$$MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}} $$

式中,yi​表示使用时长的实际值;$\hat{y_i}表示使用时长的预测值;\overline{y_i}$表示所有用户的实际使用时长的平均值。给出预测结果和真实结果之间的NMSE。(注:测试集不能参与到训练和验证中, 否则作违规处理)

2 建模思路

第一题:

  1. 数据预处理:对用户常用的20类APP数据,进行数据清洗和特征提取。可以使用PCA、LDA算法进行降维,减小计算复杂度。

  2. 聚类算法:
    a. K-means: 进行数据聚类时,选择不同的K值进行多次试验,选取最优的聚类结果。可以使用轮廓系数、Calinski-Harabaz指数等评价指标进行比较和选择。
    b. DBSCAN: 利用密度对数据点进行聚类,不需要预先指定聚类的数量。使用基于密度的聚类算法时,可以通过调整半径参数和密度参数来得到不同聚类效果。
    c. 层次聚类:可分为自顶向下和自底向上两种方式。通过迭代计算每个数据点之间的相似度,将数据点逐渐合并,最后得到聚类结果。

    d.改进的聚类算法

    e. 深度聚类算法

  3. 聚类结果分析:选择最优的聚类结果后,对不同类别用户进行画像。分析每个类别的用户行为特征(如使用时段、使用频率、使用时长、使用偏好等),根据用户画像为用户打标签。根据用户标签,推荐不同所属类别的APP产品。

第二题:

  1. 数据预处理:对用户APP使用记录数据,进行数据清洗和特征提取,例如统计用户每种APP的使用次数、时长等特征量。
  2. 分类问题预测:建立分类模型,利用用户1~11天的APP使用记录,采用特征工程对数据进行处理,并选择合适的分类算法进行训练和测试,如决策树、随机森林、支持向量机、改进的机器学习分类算法。最后使用测试集进行模型验证,评价模型的准确率。
  3. 回归问题预测:建立回归模型,利用用户1~11天的APP使用记录,采用特征工程对数据进行处理,并选择合适的回归算法进行训练和测试,如线性回归、决策树回归、神经网络回归。使用测试集进行模型验证,评价模型的准确性,可以使用NMSE评价指标。

3 问题一实现代码

3.1 数据清洗

导入包

import pandas as pd
from sklearn.cluster import Birch
from sklearn.cluster import AgglomerativeClustering
from sklearn.decomposition import PCA
import time
from sklearn import metrics
import os
from sklearn.cluster import MeanShift
from tqdm import tqdm
import numpy as np
import warnings
warnings.filterwarnings("ignore")
tqdm.pandas()

合并数据

# 合并数据
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)
df = pd.concat(dfs,axis=0)
df.shape

数据清洗:

  1. 对于start_day为0的行,将其start_day修改为1,表示第一天开始使用。
  2. 对于时间相关的特征(start_time、end_day、end_time),将其转换为datetime类型,并计算出每次使用的具体时间和日期,以及使用时长(分钟)、上行流量(MB)、下行流量(MB)。
  3. 剔除duration、up_flow和down_flow为0的行,因为这说明该用户对该APP只是打开了一下,并没有真正地使用。
  4. 根据使用时长的分布图,剔除使用时长和流量明显异常的行,如使用时长过于短(小于10秒)、流量过大/过小的行。
import pandas as pd
import datetime
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的行

# 剔除使用时长和流量明显异常的行
# 剔除使用时长小于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()
df

在这里插入图片描述

3.2 特征工程

  1. 通过对APP的分析,提取出APP的分类信息,如游戏、社交、生活等。
  2. 统计每个用户使用的APP数量、使用总时长、总流量、平均每次使用时长、平均流量等特征。
  3. 统计每种APP…
  4. 。。。略
  5. 。。。略
  6. 。。。略
# APP分类信息(可根据app_id和app_class文件进行关联)
cate_df = pd.read_csv('初赛数据集/app_class.csv',header=None)
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)

# 用户的使用次数、使用总时长、总流量、平均每次使用时长、平均流量等特征
user_agg = df.groupby('uid').agg({'appid': 'nunique', 'usage_time': ['sum', 'mean'], 
                                  'up_flow_mb': ['sum', 'mean'], 'down_flow_mb': ['sum', 'mean']})
user_agg.columns = ['num_apps', 'total_usage_time', 'avg_usage_time', 
                    'total_up_flow', 'avg_up_flow', 'total_down_flow', 'avg_down_flow']

# APP的使用次数、使用总时长、总流量、平均每次使用时长、平均流量等特征
app_agg = df.groupby('appid').agg({'uid': 'nunique', 'usage_time': ['sum', 'mean'], 
                                   'up_flow_mb': ['sum', 'mean'], 'down_flow_mb': ['sum', 'mean']})
app_agg.columns = ['num_users', 'total_usage_time', 'avg_usage_time', 
                   'total_up_flow', 'avg_up_flow', 'total_down_flow', 'avg_down_flow']
app_agg['category'] = app_agg.index.map(cate_dict)
app_agg

在这里插入图片描述

。。。略
app_agg['category'] = app_agg.index.map(cate_dict)
app_agg

在这里插入图片描述

。。。略
user_daily_agg.columns = ['avg_num_apps', 'avg_daily_usage_time', 'avg_daily_up_flow', 'avg_daily_down_flow']
user_daily_agg['total_days'] = user_dates
user_daily_agg

在这里插入图片描述

。。。略
user_app_dates_agg.columns = ['min_app_dates', 'avg_app_dates', 'max_app_dates']
user_app_dates_agg

在这里插入图片描述

。。。略
app_daily_agg['total_days'] = app_dates.groupby('appid').size()
app_daily_agg

在这里插入图片描述

# 合并特征
merged_df_uid = pd.concat([user_agg,user_daily_agg,user_app_dates_agg], axis=1, join='inner')
merged_df_appid = pd.concat([app_agg,app_daily_agg], axis=1, join='inner')
raw_df = df[['uid','appid']]
all_df = pd.merge(raw_df,merged_df_uid,on='uid')
all_df = pd.merge(all_df,merged_df_appid,on='appid')
all_df = all_df.drop_duplicates(subset='uid')
all_df = all_df.dropna()
# 输出结果
all_df.to_excel('初赛数据集/all_df.xlsx', index=False)

3.3 问题一:聚类分析

3.3.1 KMeans

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

# 对df进行归一化

df = pd.read_excel('初赛数据集/all_df.xlsx')
df = df.drop(columns=['uid','appid'])
scaler = MinMaxScaler()
weight = scaler.fit_transform(df)
start = time.time()
trainingData = weight
SSE = []  # 存放每次结果的误差平方和
k1 = 2
k2 = 10
for k in range(k1, k2):
    pca = PCA(n_components=k)
    trainingData = pca.fit_transform(weight)
    estimator = KMeans(n_clusters=k, max_iter=10000, init="k-means++", tol=1e-6)
    estimator.fit(trainingData)
    SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
end = time.time()
print(f'耗时:{end-start}s')
X = range(k1,k2)
plt.figure(figsize=(8,6))
plt.xlabel('k',fontsize=20)
plt.ylabel('SSE',fontsize=20)
plt.plot(X, SSE, 'o-')
plt.savefig('img/pca降维-手肘法.png',dpi=300)
plt.show()

在这里插入图片描述

from sklearn.cluster import KMeans
start = time.time()
pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)
# trainingData = weight
clf = KMeans(n_clusters=4,max_iter=10000, init="k-means++", tol=1e-6)
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
CHI = metrics.calinski_harabasz_score(trainingData, label)
print("CHI: ", CHI)

在这里插入图片描述

3.3.2 AGG聚类

start = time.time()
pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)
# 使用层次聚类
clf = AgglomerativeClustering(n_clusters=4, linkage='ward', affinity='euclidean')
result = clf.fit(trainingData)
source = list(clf.labels_)
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
CHI = metrics.calinski_harabasz_score(trainingData, label)
print("CHI: ", CHI)

3.3.3 MeanShift聚类

start = time.time()
pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)
# 进行PCA降维
pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)

# 使用均值漂移聚类
clf = MeanShift(bandwidth=0.9)
result = clf.fit(trainingData)
source = list(clf.labels_)

end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
CHI = metrics.calinski_harabasz_score(trainingData, label)
print("CHI: ", CHI)

3.3.3 DBSCAN 聚类

from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
import time
from sklearn import metrics
start = time.time()
pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)
trainingData = weight
clf = DBSCAN(eps=0.08, min_samples=7)
result = clf.fit(trainingData)
source = list(clf.fit_predict(trainingData))
end = time.time()
label = clf.labels_

print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
CHI = metrics.calinski_harabasz_score(trainingData, label)
print("CHI: ", CHI)

在这里插入图片描述

3.3.4 Birch聚类

pca = PCA(n_components=10)
trainingData = pca.fit_transform(weight)
trainingData = weight
clf = Birch(n_clusters=5, branching_factor=10, threshold=0.01)
start = time.time()
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
CHI = metrics.calinski_harabasz_score(trainingData, label)
print("CHI: ", CHI)

在这里插入图片描述

4 下载

见知乎文章底部

zhuanlan.zhihu.com/p/643785015

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
59 2
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
150 4
|
2月前
|
机器学习/深度学习 算法 数据挖掘
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛A题的Python代码分析,涉及智能手机用户监测数据分析中的聚类分析和APP使用情况的分类与回归问题。
72 0
2023 年第二届钉钉杯大学生大数据挑战赛初赛 初赛 A:智能手机用户监测数据分析 问题二分类与回归问题Python代码分析
|
18天前
|
机器学习/深度学习 数据采集 数据可视化
数据分析之旅:用Python探索世界
数据分析之旅:用Python探索世界
20 2
|
1月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
【9月更文挑战第2天】数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
53 5
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
【2023钉钉杯复赛】A题 智能手机用户监测数据分析 Python代码分析
本文介绍了2023钉钉杯复赛A题的智能手机用户监测数据分析,包括数据预处理、特征提取、推荐模型建立与评价的Python代码实现,旨在通过用户使用记录预测APP使用情况并建立推荐系统。
65 0
【2023钉钉杯复赛】A题 智能手机用户监测数据分析 Python代码分析
|
2月前
|
数据采集 算法 数据挖掘
【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析
本文介绍了2023年第二届钉钉杯大学生大数据挑战赛初赛B题的Python代码分析,涉及美国纽约公共自行车使用量的时间序列预测、网络分析和聚类分析。
38 0
【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题三时间序列预测Python代码分析
|
2月前
|
供应链 数据可视化 数据挖掘
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
本文详细介绍了第十一届泰迪杯数据挖掘挑战赛B题的解决方案,涵盖了对产品订单数据的深入分析、多种因素对需求量影响的探讨,并建立了数学模型进行未来需求量的预测,同时提供了Python代码实现和结果可视化的方法。
109 3
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二
本文提供了第十一届泰迪杯数据挖掘挑战赛B题问题二的详细解题步骤,包括时间序列预测模型的建立、多元输入时间预测问题的分析、时间序列预测的建模步骤、改进模型的方法,以及使用Python进行SARIMA模型拟合和预测的具体实现过程。
65 1
|
3月前
|
数据挖掘 PyTorch TensorFlow
Python数据分析新纪元:TensorFlow与PyTorch双剑合璧,深度挖掘数据价值
【7月更文挑战第30天】随着大数据时代的发展,数据分析变得至关重要,深度学习作为其前沿技术,正推动数据分析进入新阶段。本文介绍如何结合使用TensorFlow和PyTorch两大深度学习框架,最大化数据价值。
93 8