抖音数据分析(基于播放、点赞、投稿、背景音乐)–pyecharts可视化

项目指导

数据为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可视化

赞 (0)

相关推荐

    暂无内容!