项目指导
数据为9-21至10-30的抖音互动记录,年份经过特殊处理(显示为2067)。 具体字段说明如下:
第一列没有标注(类似序列ID,但是不连续,估计数据集已经被筛选了)
uid:用户ID
·:用户所在城市
·:工作编号
id:作者id
·:工作城市
·:查看作品来源
·:您是否浏览完作品
·喜欢:是否喜欢该工作
·音乐ID:音乐ID
: 设备ID
·时间:作品发布时间
· time:工作持续时间抖音数据分析报告,单位为s
分析目的:对网红及平台运营提出建议
数据处理
import pandas as pd
import numpy as np
import time
from pyecharts.charts import Line,Pie,Grid,Bar,Page
import pyecharts.options as opts
data=pd.read_table('douyin.txt',header=None)
#补充值字段名称
data.columns = ['uid','user_city','item_id','author_id','item_city','channel','finish','like','music_id','device','time','duration_time']
data.head()
data.info()
缺失值处理
无缺失值
data.isnull().sum()
重复值处理
#删除重复值
print('重复值个数:',data.duplicated().sum())
data.drop_duplicates(inplace=True)
重复值数量:4924
#数据是进行过脱敏的数据,无法观察原有情况,不过可以推断其中的-1是缺失值,转换后直接删除即可。
data[data==-1] = np.nan
data.dropna(inplace=True)
#本次分析中不会使用到device列,和多余Unnamed: 0列,删除
del data['device']
数据转换
#time列是时间戳,修改成正常时间
data.time=data.time.astype('str')
.apply(lambda x:x[1:])
.astype('int64')
#将时间戳转换为普通的日期格式
real_time = []
for i in data['time']:
stamp = time.localtime(i)
strft = time.strftime("%Y-%m-%d %H:%M:%S", stamp)
real_time.append(strft)
data['real_time'] = pd.to_datetime(real_time)
#time列无用了,删除
del data['time']
#为数据添加H:小时,和date:日期列
data['H'] = data.real_time.dt.hour
data['date']=data.real_time.dt.date
data=data[data.real_time>pd.to_datetime('2067-09-20')]
data.head()
数据分析 日播放量、用户量、作者量、提交量
#日播放量
ids=data.groupby('date')['date'].count()
#日用户量
uids=data.groupby('date')['uid'].nunique()
#日作者量
author=data.groupby('date')['author_id'].nunique()
#日作品量
items=data.groupby('date')['item_id'].nunique()
#日播放量
line1 = (
Line()
.add_xaxis(ids.index.tolist())
.add_yaxis('日播放量', ids.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='日播放量变化趋势',pos_left="20%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='日播放量'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
#日用户量
line2 = (
Line()
.add_xaxis(uids.index.tolist())
.add_yaxis('日用户量', uids.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='日用户量变化趋势',pos_right="20%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='日用户量'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
#日作者量
line3 = (
Line()
.add_xaxis(author.index.tolist())
.add_yaxis('日作者量', author.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='日作者量变化趋势',pos_top="50%",pos_left="20%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='日作者量'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
#日作品量
line4 = (
Line()
.add_xaxis(items.index.tolist())
.add_yaxis('日投稿量', items.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='日投稿量变化趋势',pos_top="50%", pos_right="20%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='日投稿量'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
grid1 = (
Grid()
.add(line1, grid_opts=opts.GridOpts(pos_bottom="60%",pos_right="55%"))
.add(line2, grid_opts=opts.GridOpts(pos_bottom="60%",pos_left="55%"))
.add(line3, grid_opts=opts.GridOpts(pos_top="60%",pos_right="55%"))
.add(line4, grid_opts=opts.GridOpts(pos_top="60%",pos_left="55%"))
)
grid1.render_notebook()
10日-21日之前,日播放量、日用户量、日作者量、日提交量随时间推移基本持平:稳定增长;
10-21至10-30这段时间,各项指标先是大幅上涨,后企稳,随后又回落至正常水平。 猜测平台在这个时间点已经进行了促销活动。
但可以明显看出,用户数并没有夸大播放量的增长。 而且抖音数据分析报告,作者和贡献数量的增长也快于用户数量的增长。 初步猜测是有人利用平台规则漏洞,大量新建账户,利用机器人刷单牟利。
不幸的是,由于缺乏更长时间的数据,很难评估这项活动的效果。 但您可以尝试查看机器人帐户。
exception=data.groupby(['uid','date'])['uid'].count()[data.groupby(['uid','date'])['uid'].count()>1].unstack().T
exception.index=exception.index.astype('datetime64[ns]')
exception.head()
#(预测)活动开始前后每人平均观看量的变化倍数
times = exception.query('date>datetime(2067,10,21) and date<datetime(2067,10,29)').mean() / exception.query('date<datetime(2067,10,21)').mean()
times.describe([0.25,0.5,0.75,0.8,0.85,0.9,0.95,0.99])
#机器人(绝大多数人的变化倍数在0-3倍之间故选取3倍)
robot = times[times>3].index.tolist()
len(robot)
4267
new=data.query('real_time>datetime(2067,10,21) & real_time<datetime(2067,10,29)')['uid']
old=data.query('real_time<datetime(2067,10,21)')['uid']
print('10-21到10-29日活动新增用户数为:',new.nunique()-new[new.isin(old)].nunique())
10-21至10-29新增用户数为:5739
结论:疑似机器人有4267个,本次活动新增用户数仅为5739个,进一步证明当前网络以股市为主。 如果你想吸引新的创作者和用户,你可能需要去海外等新市场,或者抖音以外的市场可能更有效。
播放量来源分布
channel = data.groupby('channel')['uid'].count()
pie1=(
Pie()
.add('播放量', [list(z) for z in zip(channel.index.tolist(), channel.values.tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title='播放量来源分布',pos_left='20%'),legend_opts=opts.LegendOpts(is_show=False))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
)
pie1.render_notebook()
虽然没有明确说明,但作为一个算法驱动的短视频平台,很明显“0”是算法推荐的视频。 那么抖音获得播放量的关键就是获得算法推荐,进入更大的流量池。
工作时长
#作品时长与播放量
duration_uid = data.groupby('duration_time')['uid'].count()
#查看时长与完播率和点赞率之间的关系
time_finish = data[['duration_time','finish','like']].groupby('duration_time').mean()
#只统计各时长内播放量超过100的作品
num_100=time_finish[data[['duration_time','finish','like']].groupby('duration_time').count()>100]
num_100.dropna(inplace=True)
#作品时长与作品数量
duration_nums = data.groupby('duration_time')['item_id'].nunique()
line5=(
Line()
.add_xaxis(duration_uid.index.tolist())
.add_yaxis('播放量', duration_uid.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='作品时长与播放量的关系',pos_left="15%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='播放量'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line6=(
Line()
.add_xaxis(duration_nums.index.tolist())
.add_yaxis('投稿数', duration_nums.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='作品时长与投稿数的关系',pos_right="15%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='投稿数'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line7=(
Line()
.add_xaxis(num_100.index.tolist())
.add_yaxis('完播率', num_100.finish.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='作品时长与完播率的关系',pos_top="50%",pos_left="15%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='完播率',min_=0.35,max_=0.55),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line8=(
Line()
.add_xaxis(num_100.index.tolist())
.add_yaxis('点赞率', num_100.like.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='作品时长与点赞率的关系',pos_top="50%", pos_right="15%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='点赞率',min_=0.004,grid_index=4),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
grid2 = (
Grid()
.add(line5, grid_opts=opts.GridOpts(pos_bottom="60%",pos_right="55%"))
.add(line6, grid_opts=opts.GridOpts(pos_bottom="60%",pos_left="55%"))
.add(line7, grid_opts=opts.GridOpts(pos_top="60%",pos_right="55%"))
.add(line8, grid_opts=opts.GridOpts(pos_top="60%",pos_left="55%"))
)
grid2.render_notebook()
观察结果:
大部分作品的时长在7-10秒之间。 一般来说,0s-22s之间的提交有一定数量,22s以上的提交很少。
播放量的时长分布与作品数量的分布基本一致。
2s-27s内完成率一般在40%以上,27s后在37%-45%之间剧烈波动。
2s-14s内点赞率基本维持在1%以内,14s-20s间点赞率在0.7%-1.1%之间波动,20s后数据变化波动完全无规律。
结论:视频时长最好是7-10s,其次是0-6s和23s以内,最长不建议超过40s(没有播放超过100个视频超过50s的记录)
每小时
#每时播放量
H_num = data.groupby('H')['uid'].count()
#每时投稿数
H_item = data.groupby('H')['item_id'].nunique()
#作品发布时间与点赞完播率之间的关系
H_f_l = data.groupby('H')[['finish','like']].mean()
line9=(
Line()
.add_xaxis(H_num.index.tolist())
.add_yaxis('播放量', H_num.values.tolist())
.extend_axis(yaxis=opts.AxisOpts(name="投稿数",position="right")) #min_=0,max_=25,
.set_global_opts(
title_opts=opts.TitleOpts(title='24小时内播放量与投稿数的变化'),
yaxis_opts=opts.AxisOpts(name="播放量"), #,min_=0.35
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line10=(
Line()
.add_xaxis(H_item.index.tolist())
.add_yaxis('投稿数', H_item.values.tolist(),yaxis_index=1)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
overlap1=line9.overlap(line10)
overlap1.render_notebook()
line11=(
Line()
.add_xaxis(H_f_l.index.tolist())
.add_yaxis('finish', H_f_l.finish.tolist())
.extend_axis(yaxis=opts.AxisOpts(name="点赞率",position="right",min_=0.008))
.set_global_opts(
title_opts=opts.TitleOpts(title='作品发布时间与点赞完播率之间的关系'),
yaxis_opts=opts.AxisOpts(name="完播率",min_=0.35),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line12=(
Line()
.add_xaxis(H_f_l.index.tolist())
.add_yaxis('like', H_f_l.like.tolist(),yaxis_index=1)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
overlap2=line11.overlap(line12)
overlap2.render_notebook()
结论:整体播放量和提交量基本持平,晚上19:00到次日5:00期间播放量会略高。 不同时间段发布的作品好评率和完成率不会有太大变化。
如果投稿的最佳时间是晚上19:00到次日5:00,那么完成率和点赞率并没有什么特别的优势。
背景音乐
#前100名热门歌曲播放量差异
music_100=data.groupby('music_id')['uid'].count().sort_values(ascending=False).iloc[:100,].sort_values(ascending=False)
#背景音乐总播放量累积累积占比分布图
music_cum=data['music_id'].value_counts().sort_values(ascending=False).cumsum()/len(data['uid'])
x=range(len(music_cum)+1)
line13 = (
Line()
.add_xaxis(x)
.add_yaxis('累积播放量占比', music_cum.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='音乐累积播放量占比变化趋势',pos_left="40%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='累积播放量占比'),
xaxis_opts=opts.AxisOpts(name='音乐数目'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line13.render_notebook()
结论:对于视频配乐,推荐当时最流行的歌曲,比其他歌曲更容易获得高播放量。
#播放量前十的歌曲点赞率和完播率
top_10=data.groupby('music_id')[['finish','like']].mean()
.loc[data.groupby('music_id')['uid'].count().sort_values(ascending=False).iloc[:10,].index.tolist()]
.sort_values('finish',ascending=False)
#播放量大于10的歌曲的平均完播率和点赞率
avg_10=data.groupby('music_id')[['finish','like']].mean()[data.groupby('music_id')['uid'].count()>10].mean()
bar1=(
Bar()
.add_xaxis(top_10.index.tolist())
.add_yaxis('finish', top_10.finish.tolist())
.extend_axis(yaxis=opts.AxisOpts(name="点赞率",position="right",min_=0.005))
.add_yaxis('like', top_10.like.tolist(),yaxis_index=1)
.set_global_opts(
title_opts=opts.TitleOpts(title='播放量前十歌曲的点赞率和完播率'),
yaxis_opts=opts.AxisOpts(name="完播率",min_=0.38),
)
.set_series_opts (
label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(name="平均完播率",y = avg_10.finish),
opts.MarkLineItem(name="平均点赞率",y = avg_10.like)
],
label_opts=opts.LabelOpts(), #不显示数据标签
),
)
)
bar1.render_notebook()
可以看到,最受欢迎歌曲的点赞率和听完率都没有超过平均水平。 可见,使用流行歌曲并不能提高一个人的完成率和点赞率。
#热门歌曲每日播放量变化图
top_date=data.groupby(['music_id','date'])['uid'].count()
.loc[data.groupby('music_id')['uid'].count().sort_values(ascending=False).iloc[:10,].index.tolist()]
.unstack().T
line14=(
Line()
.add_xaxis(top_date.index.tolist())
.add_yaxis(str(top_date.columns[0]), top_date.iloc[:,:1].values.tolist())
.add_yaxis(str(top_date.columns[1]), top_date.iloc[:,1:2].values.tolist())
.add_yaxis(str(top_date.columns[2]), top_date.iloc[:,2:3].values.tolist())
.add_yaxis(str(top_date.columns[3]), top_date.iloc[:,3:4].values.tolist())
.add_yaxis(str(top_date.columns[4]), top_date.iloc[:,4:5].values.tolist())
.add_yaxis(str(top_date.columns[5]), top_date.iloc[:,5:6].values.tolist())
.add_yaxis(str(top_date.columns[6]),top_date.iloc[:,6:7].values.tolist())
.add_yaxis(str(top_date.columns[7]), top_date.iloc[:,7:8].values.tolist())
.add_yaxis(str(top_date.columns[8]), top_date.iloc[:,8:9].values.tolist())
.add_yaxis(str(top_date.columns[9]), top_date.iloc[:,9:10].values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='播放量前十歌曲播放量变化趋势',pos_left="38%"),
legend_opts=opts.LegendOpts(pos_top='20%',pos_left='15%',orient='vertical'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line14.render_notebook()
从10-21到10-29,每首歌曲的播放量都有所增加,ID为22、220、68、25的歌曲有暴涨的趋势。
作品及作者
#各作者id总播放量累积数量分布图
item_cum=data['author_id'].value_counts().sort_values(ascending=False).cumsum()/len(data['uid'])
x=range(len(item_cum)+1)
line15 = (
Line()
.add_xaxis(x)
.add_yaxis('累积播放量占比', item_cum.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='各作者累积播放量占比变化趋势',pos_left="50%"),
legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(name='累积播放量占比'),
xaxis_opts=opts.AxisOpts(name='作者数目'),
)
.set_series_opts (label_opts=opts.LabelOpts(is_show=False))
)
line15.render_notebook()
结论:可以看出,抖音整体的用户播放量非常符合帕累托分布,极少数的制作者吸引了整个平台的绝大多数流量。 如果想在此基础上再次提升,培养顶尖创作者,或者从其他平台挖掘顶尖创作者,是比单纯奖励产出更有效的方法。 具体效果还需要更多数据支持才能得出结论。
总结 影响者推荐
1、抖音98%以上的流量都会流向算法推荐的视频。 获得算法推荐是获得更多浏览量的关键。
2、视频时长最好是7-10s,其次是0-6s,23s以内,最长视频时长不建议超过40s。
3、获得浏览量的最佳提交时间为晚上9:00至次日凌晨5:00,但完成率和点赞率无明显时间偏好。
4、背景音乐最好选择当下最流行的歌曲,这样才能吸引点播,但最重要的始终是主题的选择。
平台运营建议
1、抖音活动期间机器人数量较多,需要决定是否清除(疑似机器人的[uid]存储在“机器人”列表中)。
2、网站上的活动一开始不错,但去掉机器人后,没有实质性的增长,收入很低。 再次持有时需谨慎。
3.平台用户正在稳定增长,但如果想增长很多,考虑其他渠道,或者开拓新市场是更好的选择。
4、前20%的视频制作者占据了整个平台80%以上的流量。 培养或挖掘现有的优秀视频制作者是未来维持流量的关键。
BI 简单看板
未经允许不得转载:新动力营销圈 » 抖音数据分析(基于播放、点赞、投稿、背景音乐)–pyecharts可视化