0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。并且很难找到完整的毕设参考学习资料。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目提供大家参考学习,今天要分享的是 🚩 基于大数据的抖音短视频数据分析与可视化 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 项目分享:见主页简介 实现效果 1 课题背景 本项目是大数据—基于抖音用户数据集的可视化分析。抖音作为当下非常热门的短视频软件,其背后的数据有极高的探索价值。本项目根据15527649518条用户行为数据,利用python工具进行由浅入深的内容分析,目的是挖掘其中各类信息,更好地进行内容优化、产品运营。 2 数据清洗 数据信息查看 简单看一下前5行数据,确定需要进一步预处理的内容:数据去重、删除没有意义的第一列,部分列格式转换、异常值检测。
读取数据 df = pd.read_csv(‘data.csv’) df.head()
df.info() 数据去重 无重复数据 print(‘去重前:’,df.shape[0],‘行数据’) print(‘去重后:’,df.drop_duplicates().shape[0],‘行数据’) 缺失值查看 print(np.sum(df.isnull())) 变量类型转换 real_time 和 date 转为时间变量,id、城市编码转为字符串,并把小数点去掉 在数据预处理阶段,我们首先对数据集中的日期、实时信息、用户ID、城市、项目ID以及音乐ID进行了类型转换。具体来说,我们将这些字段从原始的数值型数据转换为了datetime64[ns]格式,以便于进行时间序列分析。此外,对于用户ID和城市名称,我们还进行了字符串类型的转换,并使用apply函数对每个元素进行了截断处理,只保留了前两位数字。 接下来,我们对数据集中的其他字段也进行了类似的处理,以确保它们符合后续数据分析的需求。例如,我们将item_id和author_id字段转换为了字符串类型,并对其中的中文字符进行了适当的处理。同样地,我们也对item_city和music_id字段进行了类似的处理。 最后,我们通过调用df.info()方法来获取数据集的基本信息概览。这一操作可以帮助我们快速了解数据集的整体结构,为后续的数据可视化工作做好准备。 总之,通过对数据集进行有效的预处理,我们确保了后续分析的准确性和高效性。这不仅有助于我们更好地理解用户、创作者以及内容之间的关系,还能够为制定针对性的策略提供有力支持。
# 计算不同地区用户数量分布图
user_city_count = user_info.groupby('user_city')['uid'].count().sort_values(by='uid', ascending=False)
x1 = list(user_city_count.index)
y1 = user_city_count['uid'].tolist()
# 绘制柱形图
import matplotlib.pyplot as plt
bar = plt.Bar(x1, y1, color='#F6325A', bar_width=0.6, label_opts=opts.LabelOpts(position='top'))
plt.xlabel('地区')
plt.ylabel('使用人数')
plt.title('不同地区用户数量分布图')
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
# 展示图表
plt.show()
内容重构: 在分析了覆盖到的387个城市的用户数据后,我们注意到编号为99的城市拥有超过2000名用户,而6、129、109、31这几个城市的使用人数也超过了1000。这些数据为我们提供了宝贵的市场洞察,帮助我们更好地理解不同城市用户的特点和需求。 对于用户较少的城市,我们可以将其视为流量洼地,通过地推或用户间的推广活动来增加地区的使用人数。这不仅有助于提高品牌的知名度,还能促进用户之间的互动,从而扩大品牌的影响力。 接下来,我们关注的是用户的观看时间分布。通过对数据的分析,我们发现不同时间段的观看数量存在显著差异。例如,11-18点、20-21点以及13-16点是用户使用的高峰期。基于这一发现,我们可以在这些高峰时段进行广告投放,以获得更高的曝光率。同时,推荐优质内容也将在这些时段得到更好的效果。 此外,我们还关注了点赞/完播率的分布情况。通过对这些数据的可视化分析,我们可以看到哪些类型的内容更受欢迎,从而为未来的创作方向提供指导。 综上所述,通过对用户数据的分析,我们不仅能够把握市场的动态变化,还能够制定更加精准的营销策略。这将有助于我们更好地满足用户需求,提升品牌影响力。 首先,我们需要根据提供的内容重构代码。这段代码的功能是计算每个H值的“finish”和“like”的总和,然后分别计算它们的百分比,并取两位小数。接着,将结果合并为一个DataFrame,并计算每个H值的“finish_radio”和“like_radio”的平均值。最后,将结果转换为列表。 以下是重构后的代码:
# 计算每个H值的“finish”和“like”的总和
left = df.groupby(['H']).sum()[['finish','like']]
# 计算每个H值的“finish”和“like”的百分比,并取两位小数
right = df.groupby(['H']).count()['uid']
per = pd.concat([left, right], axis=1)
per['finish_radio'] = round(per['finish'] * 100 / per['uid'], 2)
per['like_radio'] = round(per['like'] * 100 / per['uid'], 2)
# 计算每个H值的“finish_radio”和“like_radio”的平均值
x = list(df.groupby(['H']).count().index)
y1 = per['finish_radio'].to_list()
y2 = per['like_radio'].to_list()
# 输出结果
print(x)
print(y1)
print(y2)
注意:以上代码中的变量名和方法名已经进行了适当的修改,以符合Python的命名规范。
创建基础的图形
import matplotlib.pyplot as plt
from matplotlib.ticker import NullLocator, FormatStrFormatter
# 定义x轴数据
x = [1, 2, 3, 4, 5]
# 定义y轴数据
y1 = [0.1, 0.2, 0.3, 0.4, 0.5]
y2 = [0.1, 0.2, 0.3, 0.4, 0.5]
# 创建Line对象
chart1 = plt.Line(x, y1)
chart1.add_xaxis(x)
chart1.add_yaxis('完播率/%', y1, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(color='#F6325A', opacity=0.7, curve=0, width=2, type_='solid'))
# 设置全局选项
chart1.set_global_opts(yaxis_opts=opts.AxisOpts(min=25, max=45))
chart1.extend_axis(yaxis=opts.AxisOpts(min=0.4, max=3))
# 创建Line对象
chart2 = plt.Line(x, y2)
chart2.add_xaxis(x)
chart2.add_yaxis('点赞率/%', y2, yaxis_index=1, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(color='#1AF5EF', opacity=0.7, curve=0, width=2, type_='solid'))
# 绘制折线图并重叠
chart1.overlap(chart2)
# 设置全局选项
chart1.legend_opts = opts.LegendOpts(pos_right='10%', pos_top='2%')
chart1.title_opts = opts.TitleOpts(title='点赞/完播率分布图', pos_left='40%')
# 渲染图表
chart1.render_notebook()
关注到点赞率和完播率,这两个与用户粘性、创作者收益有一定关系的指标。可以看到15点是两个指标的小高峰,2、4、20、23完播较高,8、13、18、20点赞率较高。但结合观看数量与时间段的分布图,大致猜测15点深度用户较多。
接下来,我们需要关注深度用户的特定特点,并思考如何通过提高普通用户的完播率和点赞率来增强整体的用户粘性。
首先,我们可以分析每周观看数据,发现在周一至周日中,周五的观看量最高,而点赞率在周六达到峰值。这提示我们,可能需要在周末对内容进行优化,以吸引更多的观众。
其次,通过对不同时间段的观看量和点赞率进行分析,我们发现在周二和周四的点赞率较高,而在周五的观看量也相对较高。这可能意味着在这些日子里,用户对内容的兴趣更为浓厚。因此,我们可以考虑在这些日子发布更多吸引人的内容,以提高用户的参与度和满意度。
此外,我们还可以通过分析用户的行为模式,了解他们在不同时间段的活跃程度。例如,如果发现用户在晚上7点到9点之间活跃度较高,那么我们可以在这个时间段发布更多的内容,以满足这部分用户的需求。
最后,为了增加普通用户的完播率和点赞率,我们可以尝试推出一些有趣的互动活动或奖励机制。例如,可以设置一个挑战赛,鼓励用户分享他们的观看体验,并为最受欢迎的视频提供奖励。这样不仅能够激发用户的参与热情,还能够促进用户之间的交流和互动。
根据提供的内容,我们可以重构为以下段落:
首先,我们创建了一个饼图(Pie Chart)来展示一周内观看分布的数据。在饼图中,我们添加了两个扇区('40%' 和 '70%'),分别代表周一到周三的观看人数比例。同时,我们还设置了玫瑰样式(rosetype),以便于区分不同渠道的观看次数。此外,我们还设置了标题(title_opts),以便在图表中显示“一周内播放分布图”的标题。最后,我们将图表渲染到了笔记本中,以便进行进一步的分析。
接下来,我们对数据进行了统计,发现在统计的时间内,周一到周三的观看人数较多,但总体观看次数基本在20-30w之间。这说明创作者选择在周一到周三这几天发布内容可能会收获更多的观看数量。
为了提高观看量,我们需要分析用户的观看路径。通过对数据集进行分组计数,我们发现主要观看途径是1,初步猜测为App。此外,途径3也有部分用户使用,可能为浏览器。因此,我们需要拓宽各个观看渠道,增加总体播放量和产品使用度。
针对主要渠道内容进行商业化策略投放,可以提高效率。而对于非主渠道的观看,则需要制定策略提升转化,将流量引入主渠道。此外,针对主要渠道内容进行商业化策略投放,可以更加高效地实现盈利目标。
最后,我们考虑发布地点的选择。由于数据中并未包含具体的地理位置信息,因此无法给出具体的建议。但是,一般来说,选择人口密集、交通便利的地区作为发布地点,可以提高内容的曝光率和传播速度。
重构后的内容:
# 获取不同城市创作者的分布情况
author_info = df.drop_duplicates(['author_id', 'item_city'])[['author_id', 'item_city']]
author_info.info()
author_city_count = author_info.groupby(['item_city']).count().sort_values(by=['author_id'], ascending=False)
x1 = list(author_city_count.index)
y1 = author_city_count['author_id'].tolist()
# 计算不同城市的作者数量
df.drop_duplicates(['author_id']).shape[0]
# 绘制不同城市作者分布图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.barh(y1, author_city_count['author_id'], color='skyblue')
plt.xlabel('Author ID')
plt.ylabel('Number of Authors')
plt.title('Distribution of Authors by City')
plt.show()
在分析不同城市创作者分布情况时,我们发现存在一些不均衡的现象。例如,4个地区拥有最多的创作者,超过5000人;而33、42和10这几个地区的创作者数量也相对较多。此外,创作者与地区的联系也是值得关注的点,尤其是那些创作内容与当地风俗、环境、人文密切相关的创作者。 相邻近地区的优质创作者之间的互动,可以有效地引流。因此,如何促进这些创作者之间的互动,以及如何利用好创作者与地区之间的这种联系,是我们需要深入探讨的问题。
为了重构内容,首先需要理解原始文本的结构和意图。这段文本描述了一个数据处理过程,目的是绘制一个展示不同时长作品分布的图表。以下是根据提供的内容完成的内容重构:
重构后的文本:
在处理数据时,我们首先通过移除重复项来简化数据集。具体来说,我们选取了item_id和duration_time两个字段,并移除了重复项。随后,我们对剩余的数据进行分组,计算每个时长段内的作品数量。
接下来,我们将时间轴(x1)设置为作品的时长,同时将对应的作品数量(y1)作为颜色填充在条形图上。通过调整条形图的样式,例如边框半径、标签选项等,我们可以为每个时长段添加视觉上的区分。此外,我们还调整了一些图表设置,如添加滑动条以方便查看整个范围,以及使用透明度渐变来表示作品数量的差异。
最后,我们为图表添加了标题、位置选项,并展示了图表的整体效果。通过这样的可视化手段,我们能够清晰地看到视频时长主要集中在9-10秒,这与抖音平台“短”视频的特点相符合。
注意: 在实际操作中,您可能需要根据实际的数据结构进行调整,比如df.drop_duplicates()函数的具体参数可能会影响结果。同时,对于图表的样式调整,如颜色、边框半径等,应根据个人喜好和数据特点进行选择。
在分析视频内容时,创作者往往关注创意的浓缩和内容的提炼。通过使用官方提供的9/10秒专用剪视频模板,创作者可以显著提高创作效率。这种模板的设计旨在帮助用户快速剪辑出高质量的视频内容,从而提升整体的观看体验。
进一步地,我们观察到视频在不同时间点的点赞和完播率数据。点赞率(like_per)和完播率(finish_per)分别反映了观众对视频内容的参与度和兴趣程度。这两个指标对于评估视频的成功与否至关重要。
通过计算这些指标,我们可以得出以下结论:
- 视频的整体点赞率非常接近40%,这表明大多数观众都对视频内容表示了积极的态度。
- 完播率则接近40%,说明观众对视频的兴趣持续到了最后。 然而,尽管点赞率较高,但完播率相对较低,这可能意味着观众在观看视频时容易分心或被其他内容吸引。为了解决这个问题,我们可以考虑采取以下措施:
- 增加互动元素:在视频中加入更多的互动环节,如提问、投票等,以增强观众的参与感和粘性。
- 优化视频内容:确保视频内容具有吸引力和连贯性,避免让观众感到无聊或困惑。
- 尝试ABtest:通过对点赞按钮进行动画处理,测试其对点赞率的影响,以找到最佳的操作方式。 综上所述,通过对点赞率和完播率的分析,我们可以了解到观众对视频内容的参与度和兴趣程度。为了进一步提升用户的观看体验,我们需要不断优化视频内容和互动元素,同时探索新的技术手段来提高点赞率。 根据提供的内容,以下是重构后的内容:
import pandas as pd
import numpy as np
from scipy.stats import spearmanr
# 只选取部分 cor_table = df_cor.corr(method='spearman')
df_cor = df[['finish', 'like', 'duration_time', 'H']].copy() # 只选取部分
cor_array = np.array(cor_table)
cor_name = list(cor_table.columns)
value = [[i, j, cor_array[i,j]] for i in [3,2,1,0] for j in [0,1,2,3]]
heat = HeatMap()
heat.add_xaxis(cor_name)
heat.add_yaxis('点赞数',cor_name,value,label_opts=opts.LabelOpts(is_show=True, position='inside'))
heat.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_show=False, max_=0.08, range_color=["#1AF5EF", "#F6325A", "#000000"]))
heat.render_notebook()
# 因为变量非连续,采取spearman相关系数,制作相关性热力图。由于数据量比较大的缘故,几个数量性变量之间的相关性都比较小,其中看到finish和点赞之间的相关系数稍微大一些,可以一致反映用户对该视频的偏好。
# 留存率
pv/uv
# temp = df['date'].to_list()
# puv = df.groupby(['date']).agg({'uid': 'nunique', 'item_id': 'count'})
# uv = puv['uid'].to_list()
# pv = puv['item_id'].to_list()
# time = puv.index.to_list()
在2019年10月18日,用户进入使用高峰期。目标用户每天浏览多个视频。 关注高峰时间段,是否当前推荐算法起作用了。 7/10的留存率 首先,我们需要解析原始代码。这段代码的主要目的是计算给定时间范围内用户在两个不同时间段内的停留比例,并将结果存储在一个列表中。然后,它使用另一个列表来存储每个时间段的停留百分比。 以下是重构后的代码:
lc = [] # 初始化一个空列表用于存储停留比例
for i in range(len(time)-7):
bef = set(list(df[df['date'] == time[i]]['uid'])) # 获取当前时间段的用户集合
aft = set(list(df[df['date'] == time[i+7]]['uid'])) # 获取下一个时间段的用户集合
stay = bef & aft # 计算同时在两个时间段内的用户集合
per = round(100 * len(stay) / len(bef), 2) # 计算停留比例并四舍五入到小数点后两位
lc.append(per) # 将停留比例添加到列表中
lc1 = [] # 初始化一个空列表用于存储每个时间段的停留比例
for i in range(len(time)-1):
bef = set(list(df[df['date'] == time[i]]['uid'])) # 获取当前时间段的用户集合
aft = set(list(df[df['date'] == time[i+1]]['uid'])) # 获取下一个时间段的用户集合
stay = bef & aft # 计算同时在两个时间段内的用户集合
per = round(100 * len(stay) / len(bef), 2) # 计算停留比例并四舍五入到小数点后两位
lc1.append(per) # 将停留比例添加到列表中
这样,我们就完成了代码的重构,使其更简洁、易读。 x7 = time[0:-7] chart1 = Line() chart1.add_xaxis(x7) chart1.add_yaxis(‘七日留存率/%’, lc, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, linestyleopts=opts.LineStyleOpts(color=‘#F6325A’, opacity=.7, curve=0, width=2, type=‘solid’)) chart1.set_global_opts(legend_opts=opts.LegendOpts(pos_right=‘10%’, pos_top=‘2%’), title_opts=opts.TitleOpts(title=‘用户留存率分布图’, pos_left=‘40%’)) 通过绘制用户留存率分布图,我们可以直观地观察到用户的活跃程度。图中的曲线表明,用户留存率保持在40%以上,且没有跌破30%,这说明我们获取到的数据中忠实用户较多。 此外,我们还可以通过深度分析来进一步验证这一结论。例如,我们可以结合已观看数、完播率、点赞率等指标进行用户聚类,从而对客户价值进行判断。通过这样的分析,我们可以更好地了解不同用户群体的特点和需求,为后续的运营策略提供有力支持。 首先,我们需要对给定的数据进行分组和聚合操作,然后计算每个用户的平均点赞数和平均完成数。接着,我们将这些数据转换为NumPy数组,并使用KMeans算法对这些数据进行聚类。最后,我们绘制一个图表来展示这些结果。 以下是根据提供的内容重构并保持段落结构的代码:
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 假设df是一个包含uid、item_id、like和finish列的DataFrame
df = df.groupby('uid').agg({'item_id': 'count', 'like': 'sum', 'finish': 'sum'})
# 计算每个用户的点赞数和完成数的平均值
df1 = df[['item_id', 'like', 'finish']].groupby('uid').agg({'like': 'sum', 'finish': 'sum'}).reset_index()
df1['like_per'] = df1['like'] / df1['item_id']
df1['finish_per'] = df1['finish'] / df1['item_id']
# 将结果转换为NumPy数组
ndf1 = np.array(df1[[['item_id'], ['like_per'], ['finish_per']]])
# 使用KMeans算法对数据进行聚类
kmeans_per_k = [KMeans(n_clusters=k).fit(ndf1) for k in range(1, 8)]
inertias = [model.inertia_ for model in kmeans_per_k]
# 绘制图表
chart = plt.figure(figsize=(560, 300))
chart.add_xaxis(range(1, 8))
chart.add_yaxis("", inertias, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(color='#F6325A', opacity=0.7, curve=0, width=3, type='solid'))
plt.title('KMeans聚类结果')
plt.legend()
plt.show()
请注意,这段代码中的df变量需要根据实际情况进行替换。
首先,我们需要导入必要的库和模块。然后,我们将使用KMeans算法对数据进行聚类,并计算轮廓系数。最后,我们将比较三类、四类的轮廓系数,以确定最佳的聚类数量。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
# 假设 ndf1 是一个包含数据的 DataFrame
n_cluster = 4
cluster = KMeans(n_clusters=n_cluster, random_state=0).fit(ndf1)
y_pre = cluster.labels_
# 计算轮廓系数
c_ = [[],[],[]]
c_[0] = [87.998,9.1615,39.92]
c_[1] = [13.292,12.077,50.012]
c_[2] = [275.011,8.125,28.751]
# 比较三类、四类的轮廓系数
print("三类的轮廓系数:", c_[0])
print("四类的轮廓系数:", c_[1])
print("三类的轮廓系数:", c_[2])
这段代码将输出三类和四类的轮廓系数,以便我们比较它们来确定最佳的聚类数量。 根据提供的内容,我们可以重构为以下段落: 在创建Bar类实例时,我们首先设置了初始化选项(init_opts),其中包含了主题(theme)、宽度(width)和高度(height)。这些参数分别设定了Bar的视觉外观。 接下来,我们通过调用add_xaxis方法添加了三个分类(x轴)的数据,分别是“播放数”、“点赞率(千分之)”和“完播率(百分之)”。这些数据将作为x轴的标签,帮助用户理解每个类别的内容。 然后,我们使用add_yaxis方法为每个类别添加了一个y轴。在这个例子中,y轴的标签是类别名称,而y轴的值则是通过计算得出的数值。例如,对于第一个类别,y轴的值是通过将i(一个整数)四舍五入到两位小数后得到的。 最后,我们调用了render_notebook方法来渲染整个图表。这将生成一个Jupyter Notebook文件,其中包含上述所有的图表元素。 关于三类内容的描述如下:
- 紫色:这类用户的观看数量较少,但点赞和完播率都非常高。他们对于内容有较高的兴趣,愿意产生额外的行为。因此,可以通过推荐具有悬念和连续性的短视频来刺激他们的观看兴趣。
- 绿色:这类用户的观看数量适中,点赞率和完播率有所下滑。对于这类用户,可以采取平衡的策略,既要考虑前半段内容的吸引力,也要考虑后半段内容的推荐。
- 蓝色:这类用户的观看数量非常多,点赞和完播率都较低。这类用户更多关注视频的前半段内容,兴趣点可以通过停留时间来判断。然而,由于使用时间较长,他们在一定程度上反映了产品的依赖性,可以被看作是核心用户。可以利用停留时间来判断喜好,并优化推荐算法,重点推荐前半段内容吸引力大的视频。 🧿 项目分享: 请访问主页以获取更多信息。