(一)问题定义( 明确你要解决的问题或目标。确定你希望从数据中获得什么类型的信息,以及如何将其应用于实际场景。)
①项目选题与背景
本项目实现抖音用户浏览行为数据分析与挖掘。抖音是一款流行的短视频平台,用户在使用抖音时会产生大量的浏览行为数据,包括用户的观看视频、点赞、评论、分享等行为。本次项通过数据挖掘技术对抖音用户的浏览行为数据进行分析和挖掘,以获得有价值的信息和洞察,并将其应用于实际场景中,如用户个性化推荐、内容优化和广告定向投放等。
②项目意义
在数据挖掘的背景下,抖音用户浏览行为数据分析与挖掘具有重要的意义,对抖音用户浏览行为进行数据分析与挖掘,可以了解用户的兴趣和偏好,优化用户体验,提高内容的质量和吸引力,同时也可以为广告商提供更准确的定向投放服务,实现数据驱动的运营决策。
③项目需要解决的问题或目标
A.用户兴趣和喜好分析:通过分析抖音用户的浏览行为数据,了解用户对不同类型内容的偏好和兴趣。这可以帮助平台更好地了解用户需求,优化推荐算法,提供个性化的内容推荐,增加用户留存和活跃度。
B.内容优化和创新:通过数据挖掘,识别和分析受欢迎的内容类型、创意和趋势。这可以为内容创作者和平台运营者提供指导,优化现有内容,改进内容质量,吸引更多用户参与,并发现新的创意和趋势。
C.广告定向投放:利用用户浏览行为数据,了解用户的兴趣和偏好,为广告商提供精准的广告定向投放。通过分析用户行为模式,识别潜在的目标用户群体,并根据他们的兴趣和行为特征,将广告推送给最相关的用户,提高广告投放效果和转化率。
D.运营决策和业务优化:通过数据挖掘和分析,了解用户行为的变化趋势、活跃度和留存率等指标。这可以为抖音平台的运营决策提供依据,优化平台的功能设计、内容策略、资源分配和运营活动等,提升用户体验和平台的竞争力。
E.用户群体分析:利用用户浏览行为数据,对用户进行群体分析,识别不同用户群体的特征、行为模式和偏好。这可以帮助平台了解用户群体的多样性,为不同用户提供定制化的内容和服务,满足他们的个性化需求。
④从数据中获得什么类型的信息,以及如何将其应用于实际场景
从抖音用户浏览行为数据中希望获得的类型信息包括用户兴趣和喜好、内容类型和创意趋势、广告定向投放指导、用户行为指标和用户群体特征。这些信息可以应用于实际场景,包括个性化推荐算法的改进、内容创作和运营策略的优化、广告投放的精准定向、平台功能设计的优化和用户体验的提升。
(二)数据收集
首先,需要获取抖音用户的浏览行为的相关数据集,包括用户的观看记录、点赞记录、评论记录、分享记录等。这可以从数据库中提取数据、采集网络数据、使用API 访问数据源或与合作伙伴合作获得数据,也可以通过与抖音平台合作获得用户数据,使用API访问数据接口或其他合法的数据收集手段来实现。
①熟悉数据,查看数据结构和数据分布情况
数据集说明
字段名 | 解释 | 字段名 | 解释 | 字段名 | 解释 |
---|---|---|---|---|---|
uid | 用户id | user_city | 用户城市 | item_id | 作品id |
author_id | 作者id | item_city | 作者城市 | channel | 作品频道 |
finish | 是否看完 | like | 是否点赞 | music_id | 音乐id |
duration_time | 作品时长 | real_time | 具体发布时间 | H、date | 时、天(发布) |
数据集下载:抖音用户浏览行为数据集
②导入必要的Python Packages
首先导入需要的python包,其中包括NumPy、Pandas,导入这些包能够使用相应库和模块的函数、类和方法来处理和分析数据、进行机器学习模型的训练和评估。
③读入数据Read-In Data
加载并存储"douyin_dataset(1).csv“到一个名为"df"的DataFrame中,使用head()方法显示DataFrame的前几行数据。
④使用info()函数查看数据类型展示及缺失值分析,该数据集共有 1737312 条记录,包含 13 个字段,每个字段的非空值数量均为 1737312。其中,前 10 列是数值型变量(包括整型和浮点型),后两列是字符串型变量。数据集占用的内存大小为 172.3 MB
(三)数据预处理
在进行数据挖掘之前,我们需要对数据进行预处理和清洗,以确保数据的质量和一致性。
1) 数据去重
无重复数据
2) 缺失值查看
无缺失值
3) 变量类型转换
real_time 和 date 转为时间变量
id、城市编码转为字符串,并把小数点去掉
(四)特征指标构建——统计分析(分类)
根据问题的需求和数据的特点,进行特征选择、提取和转换。例如,可以从用户的浏览行为数据中提取特征,如观看时长、点赞数、评论数、分享数等,或者通过文本挖掘技术提取用户的评论内容特征,可以包括对原始特征进行数值化、编码分类变量、创建新特征等操作。
①用户特征统计分析
站在用户的角度,涉及到浏览量,点赞量,浏览的作品、作者、BGM的总数等
②作者特征统计分析
站在作者的角度,涉及到总浏览量,总点赞量等
③作品特征统计分析
站在作品的角度,简单分析
(五)可视化分析
可视化:可以通过line_chart绘制曲线图,pie_chart绘制饼图,fl_chart绘制折线图。
ps:pyecharts是Python中一个数据可视化库,可以用于生成种类型的图表。
打开命令行窗口,输入以下命令来安装pyecharts:
pip install pyecharts
绘图函数封装
line_chart绘制曲线图
pie_chart绘制饼图
fl_chart绘制折线图
①用户特征可视化分析
- 特征数据统计
- 用户浏览情况
绘制浏览量分布曲线:
- 按照浏览量从大到小将用户排序
- 依次计算前n个用户的浏览量之和占所有用户浏览量的比例
- 将人数n和前n人浏览量之和占总体比例绘制为图像
- 用户点赞情况
按照点赞量从大到小排序并求和,绘制曲线
- 用户完整观看情况
- 用户观看作品的平均完整时长分布
- 用户去过的城市数分布
②作者特征可视化分析
- 特征数据统计
- 作者浏览情况
- 作者点赞情况
- 作者去过的城市数
③作品特征可视化分析
- 特征数据统计
- 作品各日发布情况
- 作品浏览量情况
- 作品点量率情况
(六)模型选择与建立——聚类分析,关联规则
针对抖音用户浏览行为数据,我们可以选择使用各种适应的数据挖掘模型或算法,如关联规则挖掘、聚类分析、分类模型等。根据具体的问题和数据特点,选择合适的模型并进行训练和优化。
(1)聚类分析
聚类方法是一种将数据对象分组或聚集成具有相似特征的类别或簇的技术。聚类分析是无监督学习的一种常用方法,它不依赖于预先定义的类别标签,而是根据数据对象之间的相似性或距离度量来进行分组。
常见的聚类方法:
A.K均值聚类:将数据对象划分为K个簇,每个簇代表一个聚类中心,通过最小化数据对象与聚类中心之间的距离来进行优化。
B.层次聚类:基于不同的聚类合并或分裂策略,通过构建聚类树或聚类层次结构来划分数据对象。
C.密度聚类:通过密度可达性和密度相连性来识别高密度区域,将数据对象划分为簇。
D.谱聚类:通过数据对象之间的相似性矩阵或图表示,将数据对象划分为簇。
E.DBSCAN聚类:通过定义邻域半径和最小密度阈值,将数据对象划分为核心对象、边界对象和噪声对象。
针对用户和作者的数据特征,使用k-means聚类算法量化的将两个群体进行分类:
A.导入用于聚类分析的相关库和函数
B. 确保计算机上已安装Python和pip,并且已经配置好了正确的环境。
C.使用pd.read_csv()函数读取用户特征、作者特征的CSV文件
D.基于用户特征数据筛选出满足条件的用户数据,计算满足条件的用户数据占总用户数据的比例
用户聚类可以服务于平台对用户分级,探索性的分析用户特点,但在数据可视化分析中,可以看到有一部分用户使用程度平台低 ,浏览少,不点赞,对这样的用户进行聚类分析是无效多余的,增加筛选认为至少观看过一个完整短视频且有一定浏览量的用户才具有分析意义。
E. 基于作者特征数据筛选出满足条件的作者数据,计算满足条件的作者数据
总作者数据的比例
而在对作者的考量上,聚类的结果是服务于商务合作和广告投放,此时核心是浏览量,而大部分的作者总浏览量非常小,这些作者是无需考虑的,故进行筛选。
F. 定义K-means聚类算法的函数km
在函数内部,通过循环遍历K值的范围,
①初始化KMeans模型并进行聚类。
②预测数据的聚类结果。
③计算模型的评估指标,包括轮廓系数和SSE(Sum of Squared Errors)。
④保存聚类模型。
⑤存储评估指标。
⑥打印聚类计算完成的消息。
⑦保存评估指标,并返回存储了每个K值对应的轮廓系数和SSE的字典。
G. 定义绘制聚类效果图的函数draw(sse和sc曲线)
①创建一个Line图表对象,并设置图表的初始化选项,包括主题、宽度和高度。
②使用.add_xaxis()方法将K值作为X轴数据添加到图表中。
③使用.add_yaxis()方法分别将SSE和轮廓系数作为两条线的Y轴数据添加到图表中,并通过yaxis_index参数指定它们在不同的Y轴上。
④使用.extend_axis()方法添加一个额外的Y轴。
⑤使用.set_global_opts()方法设置图表的全局选项,包括标题、X轴和Y轴的选项。
⑥返回创建的图表对象。
H. 根据给定的用户数据进行聚类
①模型训练与保存:根据给定的用户数据进行聚类,并将聚类结果保存在user_score中
②聚类k值选择——通过综合肘部法则和sc值,选择作为用户聚类模型
③聚类结果
I. 根据给定的作者数据进行聚类
①模型训练与保存:根据给定的作者数据进行聚类,并将聚类结果保存在user_score中
②聚类k值选择——通过综合肘部法则和sc值,选择作为用户聚类模型
③聚类结果
聚类的结果解释性较为明显,其核心与浏览量相关,提供了一定数据特征下的量化分类作用。
(2)关联规则
A.根据 用户特征 的CSV文件使用Apriori算法进行关联规则挖掘并输出关联规则、置信度和支持度。
①确保已经安装了pandas和mlxtend库,并且已经将用户特征.CSV文件保存在Jupyter Notebook。
②使用pd.read_csv()函数读取作者特征的CSV文件
③对数据进行预处理,使用独热编码将数据转换为适用于关联规则挖掘的形式。
使用Pandas中的applymap()函数对user_df DataFrame进行转换,对每个元素进行操作。该lambda函数的逻辑是,如果元素大于0,则将其赋值为1,否则赋值为0。
④使用Apriori算法挖掘频繁项集,设置适当的min_support参数来控制最小支持度的阈值
⑤使用循环遍历rules的每一行,并输出满足条件的关联规则、支持度和置信度。
B. 根据 作者特征的 CSV文件使用Apriori算法进行关联规则挖掘并输出关联规则、置信度和支持度。
C. 根据 作品特征 的CSV文件使用Apriori算法进行关联规则挖掘并输出关联规则、置信度和支持度。
(七)模型评估与调优——二分类预测(浏览行为中的点赞预测)
-
导入必要的python软件包和模块
-
数据类型展示
读取数据,并保留用户特征、作品特征和是否点赞,其余无效字段如channel(不确定),finish(没有浏览行为时不存在), H、date(real_time中包括)。
- 数据抽样处理
为了减少训练成本,对数据集中的数据进行抽样训练通过等距抽样获取部分浏览信息作为训练数据(需要同时保证点赞数据的合理比例)。
- 时间数据处理
训练数据中的real_time字段包括的是字符串对象对应代表时间值,通过将其转化为与固定时间的差值(秒)来进行数值化。
-
数据集划分
-
模型训练函数
-
模型训练
-
绘制模型AUC曲线
综合准确率和AUC值表现,模型的效果不是很好,在数据抽样时扩大抽样规模会有效的提高auc值,同时点赞和不点赞的数据分布较为不均衡也是重要原因这里只做继续方法的演示,相对来说随机森林的效果比较好,所以选择随机森林作为二分类模型。
-
n_e优化
-
max_f优化
-
模型训练
虽然整体的效果不行,auc值比较低,但是可以看到有优化提升。
- 模型准确率
转换一下df中的时间,看看使用2.5%左右的数据训练出来的模型准确率能有多少。
预测点赞的模型准确率为99.6。
即使预测不点赞,模型准确率也高达99.3。
(八)结果解释与应用
该模型结果显示,通过对用户、作者和作品等主体的特征描述和数据分析方法的应用,可以服务于业务优化等目的。如下图所示。
该模型可以应用于对用户价值进行判定,比如第一类用户的浏览量、点赞、完播率都不怎么高,这类用户更多会关注到视频前半段的内容,兴趣点可通过停留时间进行判断,但使用时间相对较长,反映产品依赖性,一定程度上来说算是核心用户。可以利用停留时间判断喜好,优化推荐算法,重点推荐前半段内容吸引力大的。
该模型还可以应用于提高作者创作效率,如上图所示。可以看出,高浏览量、高点赞量、高观完量的作者通常都会比其他作者使用更多的配乐,发布的作品更多,去过的城市更多,说明作者需要积累大量的创作经验以及丰富的阅历才能创作出更多脍炙人口的视频。
这套模型的预测准确率高达99%,说明通过用户特征和作品特征,能够训练一个用于预测用户是否会点赞的二分类模型。在用户对作品的浏览过程中,是否点赞是一个非常重要的指标。通过点赞行为,我们可以判断出用户的喜好,评价作品的质量等。而这套模型可以应用于给自媒体公司提供一个内容优化和广告投放的手段。
(九) 异常问题与解决方法
异常问题:数据收集过程中出现错误或缺失数据。
解决方案:确保数据收集工具和方法正确无误,避免数据缺失或错误。如果数据缺失,可以尝试使用插值方法进行填充,或者重新进行数据收集。
异常问题:数据中存在异常值、重复值、缺失值等问题。
解决方案:进行数据清洗操作,包括处理异常值(例如使用统计方法或规则方法进行异常值检测和处理)、删除重复值、填充缺失值等。确保数据的质量和准确性。
异常问题:K均值聚类结果不理想,簇内差异大或簇间距离小。
解决方案:尝试调整聚类算法的超参数,如 K 值(簇的数量)、初始化方法、距离度量等。可以使用不同的聚类算法,如层次聚类、DBSCAN 等。还可以对数据进行特征缩放或降维,以改善聚类效果。
异常问题:发现的关联规则不具备实际意义,或者规则数量过多。
解决方案:调整关联规则挖掘算法的参数,如最小支持度和最小置信度阈值,以筛选出更有意义的规则。使用领域知识进行规则的解释和筛选,剔除不符合实际情况的规则。
异常问题:模型在二分类任务中的性能不佳,无法很好地进行预测。
解决方案:尝试不同的分类算法,如逻辑回归、支持向量机、决策树、随机森林等,并调整模型的超参数。进行特征选择和特征工程,选择对分类任务有意义的特征。还可以考虑使用集成学习方法,如随机森林和梯度提升树,以提高分类性能。
异常问题:选择的模型无法很好地适应数据或无法达到预期的性能。
解决方案:评估不同的模型算法,根据问题的特点选择合适的模型。考虑模型的复杂度、可解释性、计算效率等因素。使用交叉验证和网格搜索等技术选择最佳的模型参数。
异常问题:构建的特征指标无法很好地反映数据的特点或没有足够的区分度。
解决方案:深入了解数据的特征和领域知识,选择与问题相关的特征。进行特征工程,包括特征选择、特征变换和特征创造,以提取更有意义和有区分性的特征。
异常问题:模型评估结果不满足预期,模型性能无法达到要求。
解决方案:使用适当的评估指标(如准确率、召回率、F1 分数等)对模型进行评估。进行模型调优,包括调整模型参数、优化损失函数、增加训练数据量、改进特征工程等。使用交叉验证方法对模型的稳定性和泛化能力进行评估。
分录
数据预处理
# 导包
import pandas as pd
import numpy as np
# 1. 数据简单处理——读入数据
df = pd.read_csv('douyin_dataset.csv')
df.head()
del df['Unnamed: 0']#无效字段的删除[Unnamed:0]
# 数据基本信息基本信息
df.info(null_counts = True)
特征指标构建
# 2. 特征指标统计分析
## 2.1 用户特征统计分析
user_df = pd.DataFrame()
user_df['uid'] = df.groupby('uid')['like'].count().index.tolist() # 将所有用户的uid提取为uid列
user_df.set_index('uid', inplace=True) # 设置uid列为index,方便后续数据自动对齐
user_df['浏览量'] = df.groupby('uid')['like'].count() # 统计对应uid下的浏览量
user_df['点赞量'] = df.groupby('uid')['like'].sum() # 统计对应uid下的点赞量
user_df['观看作者数'] = df.groupby(['uid']).agg({'author_id':pd.Series.nunique}) # 观看作者数
user_df['观看作品数'] = df.groupby(['uid']).agg({'item_id':pd.Series.nunique}) # 观看作品数
user_df['观看作品平均时长'] = df.groupby(['uid'])['duration_time'].mean() # 浏览作品平均时长
user_df['观看配乐数'] = df.groupby(['uid']).agg({'music_id':pd.Series.nunique}) # 观看作品中配乐的数量
user_df['完整观看数'] = df.groupby('uid')['finish'].sum() # 统计对应uid下的完整观看数
# 统计对应uid用户去过的城市数量
user_df['去过的城市数'] = df.groupby(['uid']).agg({'user_city':pd.Series.nunique})
# 统计对应uid用户看的作品所在的城市数量
user_df['观看作品城市数'] = df.groupby(['uid']).agg({'item_city':pd.Series.nunique})
user_df.describe()
user_df.to_csv('用户特征.csv', encoding='utf_8_sig')
## 2.2 作者特征统计分析
author_df = pd.DataFrame()
author_df['author_id'] = df.groupby('author_id')['like'].count().index.tolist()
author_df.set_index('author_id', inplace=True)
author_df['总浏览量'] = df.groupby('author_id')['like'].count()
author_df['总点赞量'] = df.groupby('author_id')['like'].sum()
author_df['总观完量'] = df.groupby('author_id')['finish'].sum()
author_df['总作品数'] = df.groupby('author_id').agg({'item_id':pd.Series.nunique})
item_time = df.groupby(['author_id', 'item_id']).mean().reset_index()
author_df['作品平均时长'] = item_time.groupby('author_id')['duration_time'].mean()
author_df['使用配乐数量'] = df.groupby('author_id').agg({'music_id':pd.Series.nunique})
author_df['发布作品日数'] = df.groupby('author_id').agg({'real_time':pd.Series.nunique})
# pd.to_datetime(df['date'].max()) - pd.to_datetime(df['date'].min()) # 作品时间跨度为40,共计40天
author_days = df.groupby('author_id')['date']
_ = pd.to_datetime(author_days.max()) - pd.to_datetime(author_days.min())
author_df['创作活跃度(日)'] = _.astype('timedelta64[D]').astype(int) + 1
author_df['去过的城市数'] = df.groupby(['author_id']).agg({'item_city':pd.Series.nunique})
author_df.describe()
author_df.to_csv('作者特征.csv', encoding='utf_8_sig')
## 2.3 作品特征统计分析
item_df = pd.DataFrame()
item_df['item_id'] = df.groupby('item_id')['like'].count().index.tolist(