项目背景

数据为抖音用户浏览数据,此份数据指标以“作品发布时间”为准,是以作者/作品的角度研究分析出发的一份数据

  1. 合计1737357条数据,共计40天(不一定连续) ;
  2. 数据涉及59232名用户,分布在387个城市里面;
  3. 共计208187名作者,发布449472部作品,配音40761首,视频时长72种,4个频道,作者分布在411个城市;
  4. 播放完成率40%,点赞率只有1%

分析思路

数据字段描述

读取数据,数据预处理

data = pd.read_csv('./douyin_dataset.txt',encoding='gb18030')
data = data[[ 'uid', 'user_city', 'item_id', 'author_id', 'item_city','channel', 'finish', 'like', 'music_id', 'duration_time', 'real_time','H', 'date']]
data['user_city'] = data['user_city'].astype('str')
data['music_id'] = data['music_id'].astype('str')
data['real_time'] = pd.to_datetime(data['real_time'])
data_like = data[data['like']==1]

数据概览

播放完成率40%,点赞率只有1%

data.describe()

变量可视化

  1. 从数据的指标来看,此份数据以发布时间为准,那么就是以作者/作品的角度进行出发分析的数据
  2. 特殊的用户为ID30679,共计浏览1951个视频,浏览时长20601分钟,共计343个小时,每天看8.6小时视频,为重度用户/机器人
  3. 最高浏览量的作品、作者、城市、配乐均较为均衡
  4. 98%的作品来自0频道
  5. 大家更喜欢浏览9-10分钟的视频,或长或短的视频浏览量均没有上面2者高
  6. 晚间0-7点,下班时间18-24点,均为作品发布高峰,获取了比较多的浏览量
# 浏览量前十的用户
df1 = data.groupby(['uid'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 浏览量前十的作者
df2 = data.groupby(['author_id'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 浏览量前十的作品\
df3 = data.groupby(['item_id'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 浏览量前十的城市
df4 = data.groupby(['user_city'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 频道浏览情况
df5 = data.groupby(['channel'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 浏览前十的配乐
df6 = data.groupby(['music_id'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 作品时长分布(浏览)
df7 = data.groupby(['duration_time'])['uid'].agg({'count'}).sort_values(by=['count'],ascending=False)[:10]
# 发布时间分布(浏览)
df8 = data.groupby(['H'])['uid'].agg({'count'}).sort_index()
def bar_lan(x,y,title,title_pos):    bar1 = (Bar().add_xaxis(x).add_yaxis("", y).set_series_opts(label_opts=opts.LabelOpts(is_show=False,distance=30)).set_global_opts(title_opts=opts.TitleOpts(title=title,pos_left=title_pos[0],pos_top=title_pos[1],title_textstyle_opts=opts.TextStyleOpts(color='#ea513f',font_family='cursive',font_size=19)),xaxis_opts=opts.AxisOpts(is_scale=True,axislabel_opts={'rotate': '75'})))return bar1
bar1 = bar_lan(df1.index.tolist(),df1['count'].tolist(),'浏览量前十的用户',['5%', '2%'])
bar2 = bar_lan(df2.index.tolist(),df2['count'].tolist(),'浏览量前十的作者',['55%', '2%'])
bar3 = bar_lan(df3.index.tolist(),df3['count'].tolist(),'浏览量前十的作品',['5%', '27%'])
bar4 = bar_lan(df4.index.tolist(),df4['count'].tolist(),'浏览量前十的城市',['55%', '27%'])
bar5 = bar_lan(df5.index.tolist(),df5['count'].tolist(),'浏览量前十的频道',['5%', '52%'])
bar6 = bar_lan(df6.index.tolist(),df6['count'].tolist(),'浏览量前十的配乐',['55%', '52%'])
bar7 = bar_lan(df7.index.tolist(),df7['count'].tolist(),'浏览量前十的视频时长',['5%','77%'])
bar8 = bar_lan(df8.index.tolist(),df8['count'].tolist(),'浏览量前十的时间',['55%', '77%'])
# 使用 Grid 进行图表排列
grid = (Grid(init_opts=opts.InitOpts(width="800px", height='1200px')).add(bar1, grid_opts=opts.GridOpts(pos_left="10%", pos_right="60%" ,pos_top="5%", pos_bottom="83%")).add(bar2, grid_opts=opts.GridOpts(pos_left="60%", pos_right="10%" ,pos_top="5%", pos_bottom="83%")).add(bar3, grid_opts=opts.GridOpts(pos_left="10%", pos_right="60%", pos_top="30%", pos_bottom="58%")).add(bar4, grid_opts=opts.GridOpts(pos_left="60%", pos_right="10%", pos_top="30%", pos_bottom="58%")).add(bar5, grid_opts=opts.GridOpts(pos_left="10%", pos_right="60%", pos_top="55%", pos_bottom="33%")).add(bar6, grid_opts=opts.GridOpts(pos_left="60%", pos_right="10%", pos_top="55%", pos_bottom="33%")).add(bar7, grid_opts=opts.GridOpts(pos_left="10%", pos_right="60%", pos_top="80%", pos_bottom="8%")).add(bar8, grid_opts=opts.GridOpts(pos_left="60%", pos_right="10%", pos_top="80%", pos_bottom="8%"))
)# 使用 Page 进行页面组合
page = Page(layout=Page.SimplePageLayout)
page.add(grid)
page.render_notebook()

点赞分析

# 点赞数多的作品/点赞率
df_like1 = data.groupby(['item_id'])['like'].agg({'点赞率':'mean','点赞数':'sum'}).sort_values(by=['点赞数'],ascending=False)
# 那个城市的人喜欢点赞
df_like2 = data.groupby(['user_city'])['like'].agg({'点赞数':'sum'}).sort_values(by=['点赞数'],ascending=False)

80%的点赞来自?%的人

点赞也是存在头部效应,符合5-96法则

df_like3 = data.groupby(['uid'])['like'].agg({'点赞数':'sum'}).sort_values(by=['点赞数'],ascending=False).reset_index()
df_like3['累加'] = df_like3['点赞数'].cumsum()
df_like3['点赞占比'] = df_like3['累加']/ df_like3['点赞数'].sum()
df_like3['用户数占比'] = (df_like3.index+1)/ df_like3['点赞数'].count()
df_like3.head()

k =0.1
for i,j in zip(df_like3['点赞占比'],df_like3['用户数占比']):if k >=0.9:breakif i>=k:print('{}的用户点了{}的赞'.format(format(j,'.2%'),format(i,'.2%')))k = k + 0.1

def line_chart(t, data):chart = (Line(init_opts = opts.InitOpts(theme='light', width='500px', height='300px')).add_xaxis([i[0] for i in data]).add_yaxis('',[i[1] for i in data],is_symbol_show=False,areastyle_opts=opts.AreaStyleOpts(opacity=1, color="cyan")).set_global_opts(title_opts=opts.TitleOpts(title=t),xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=True),yaxis_opts=opts.AxisOpts(type_="value",axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),))return chart
df = df_like3['点赞占比'].reset_index().values.tolist()
line_chart('用户点赞量', df).render_notebook()

那种视频播放量大 ,受欢迎(点赞多)

df_like6 = data_like.groupby(['duration_time'])['like'].agg({'like':'count'}).sort_values(by=['like'],ascending=False).head(20)
duration_time_like_plt = (Bar().add_xaxis(df_like6.index.tolist()).add_yaxis("like", df_like6['like'].values.tolist()).set_global_opts(title_opts=opts.TitleOpts(title="视频时长分布(点赞)"),))
duration_time_like_plt.render_notebook()

分段分析(上班、下班、睡觉)

去掉长尾作品(浏览量=1)、长尾观看用户(浏览量<=4),那段时间发布视频,作品能得到最终比较好的点赞效果,或播放效果

bins = [0,8,18,24]
labels=['睡觉','上班','下班']
data['time_cut'] = pd.cut(data['H'],bins=bins,labels=labels,include_lowest=True)
# 去掉长尾作品(浏览量=1)、长尾观看用户(浏览量<=4),那段时间发布视频,作品能得到最终比较好的点赞效果,或播放效果
item_long_tail = df_item[df_item['count']==1].index.tolist()
use_long_tail = df_use[df_use['count']==1].index.tolist()
long_tail_excluding_df = data[(~data['item_id'].isin(item_long_tail))&(~data['uid'].isin(use_long_tail))]
#部分用户的数据删除后导致作品浏览量=1,再删除这部分数据
mask = long_tail_excluding_df.duplicated(subset=['item_id'], keep=False)
df_filtered = long_tail_excluding_df[mask]
df_filtered.head()

看下数据极值,分位数

df_long_tail = df_filtered.groupby(['time_cut','item_id'])['uid','like'].agg({'uid':'count','like':'sum'}).reset_index()
df_long_tail.dropna(inplace=True)
re_long_tail_qu = df_long_tail.groupby(['time_cut'])['uid','like'].quantile([0.25, 0.5, 0.75])
re_long_tail_max_min =df_long_tail.groupby(['time_cut'])['uid','like'].agg({'max','min'})
pd.DataFrame(re_long_tail_qu)


TOP3000作品分析可视化

更多的头部作者更愿意在睡觉时间发布视频,并且这些视频均取得了不错的播放量

df_bar = df_long_tail.sort_values(by=['uid'],ascending=False).head(3000)
red_bar = df_bar[df_bar.time_cut=='上班']['uid'].tolist()
blue_bar =  df_bar[df_bar.time_cut=='下班']['uid'].tolist()
green_bar= df_bar[df_bar.time_cut=='睡觉']['uid'].tolist()
import pyecharts.options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode# 颜色的RGBA值,透明度范围是0到1
red_color = JsCode("new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0, color: 'rgba(255, 0, 0, 0.8)'},{offset: 1, color: 'rgba(255, 0, 0, 0.2)'}], false)")
blue_color = JsCode("new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0, color: 'rgba(0, 0, 255, 0.4)'},{offset: 1, color: 'rgba(0, 0, 255, 0.2)'}], false)")
green_color = JsCode("new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0, color: 'rgba(0, 255, 0, 0.2)'},{offset: 1, color: 'rgba(0, 255, 0, 0.2)'}], false)")category = ["{}".format(i) for i in range(0,1600)]bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(xaxis_data=category).add_yaxis(series_name="上班", y_axis=red_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=red_color)).add_yaxis(series_name="下班", y_axis=blue_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=blue_color)).add_yaxis(series_name="睡觉", y_axis=green_bar, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=green_color)).set_global_opts(title_opts=opts.TitleOpts(title="头部视频分布(观看量)"),xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=False)),yaxis_opts=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),)
#     .render("bar_chart_display_delay.html")
)
bar.render_notebook()

作者归类

根据作者的播放量、点赞量、作品量,对作者进行归类

# 根据作者的播放量、点赞量、作品量,对作者进行归类
df_author = df_filtered.groupby('author_id')['author_id','like','item_id'].\agg({'author_id':'count','like':'sum','item_id':'nunique'})
df_author.columns = ['page_views','like','item_id']
df_author.reset_index(inplace=True)
## 数据标准化
model_scaler = MinMaxScaler()
data_scaled = model_scaler.fit_transform(df_author[['page_views','like','item_id']])
K = range(1, 10)
meandistortions = []
for k in K:kmeans = KMeans(n_clusters=k)kmeans.fit(data_scaled)meandistortions.append(sum(np.min(cdist(data_scaled, kmeans.cluster_centers_, 'euclidean'), axis=1))/data_scaled.shape[0])
plt.plot(K, meandistortions, marker='o')
plt.xlabel('K')
plt.ylabel('Average distortion degree')
plt.title('Use the Elbow Method to select the best K value')
plt.show()

Kmeans = KMeans(n_clusters=4,max_iter=50)
Kmeans.fit(data_scaled)
cluster_labels_k = Kmeans.labels_  #输出归类结果
cluster_labels = pd.DataFrame(cluster_labels_k, columns=['clusters'])
res = pd.concat((df_author, cluster_labels), axis=1)
# 计算各个聚类类别内部最显著特征值
cluster_features = []
for line in range(4):label_data = res[res['clusters'] == line]part_data = label_data.iloc[:, 1:4]part_desc = part_data.describe().round(3)merge_data = part_desc.iloc[2, :]cluster_features.append(merge_data)
df_clusters = pd.DataFrame(cluster_features)
num_sets_max_min  = model_scaler.fit_transform(df_clusters).tolist()
c = (Radar(init_opts=opts.InitOpts()).add_schema(schema=[opts.RadarIndicatorItem(name="page_views",max_=1.2),opts.RadarIndicatorItem(name="like", max_=1.2),opts.RadarIndicatorItem(name="item_id", max_=1.2),],splitarea_opt=opts.SplitAreaOpts(is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)),textstyle_opts=opts.TextStyleOpts(color="#000000"),).add(series_name="第1类作者",data=[num_sets_max_min[0]],areastyle_opts=opts.AreaStyleOpts(color="#FF0000",opacity=0.2), # 区域面积,透明度).add(series_name="第2类作者",data=[num_sets_max_min[1]],areastyle_opts=opts.AreaStyleOpts(color="#00BFFF",opacity=0.2), # 区域面积,透明度).add(series_name="第3类作者",data=[num_sets_max_min[2]],areastyle_opts=opts.AreaStyleOpts(color="#00FF7F",opacity=0.2), # 区域面积,透明度).add(series_name="第4类作者",data=[num_sets_max_min[3]],areastyle_opts=opts.AreaStyleOpts(color="#007F7F",opacity=0.2), # 区域面积,透明度).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="各聚类类别显著特征对比"),)
)
c.render_notebook()

作者归类三维可视化

res1 = res.reset_index()[['page_views','like','item_id','clusters','index']]
import asyncio
from aiohttp import TCPConnector, ClientSession
from pyecharts.charts import Scatter3Dsymbol_list = ['circle', 'rect', 'roundRect', 'triangle']# 配置 config
config_xAxis3D = 'page_views'
config_yAxis3D = 'like'
config_zAxis3D = 'item_id'
config_color = "clusters"
# # config_symbolSize = "vitaminc"
res2 = res1.to_dict(orient='records')
# # 构造数据
data = [[item[config_xAxis3D],item[config_yAxis3D],item[config_zAxis3D],item[config_color],
#         item[config_yAxis3D],
#         item['index'],]for item in res2
]c = (Scatter3D()  # bg_color="black".add(series_name="",data=data,xaxis3d_opts=opts.Axis3DOpts(name=config_xAxis3D,type_="value",textstyle_opts=opts.TextStyleOpts(color="#E03D30"),),yaxis3d_opts=opts.Axis3DOpts(name=config_yAxis3D,type_="value",textstyle_opts=opts.TextStyleOpts(color="#FCC320"),),zaxis3d_opts=opts.Axis3DOpts(name=config_zAxis3D,type_="value",textstyle_opts=opts.TextStyleOpts(color="#279846"),),grid3d_opts=opts.Grid3DOpts(width=100, height=100, depth=100),) .set_global_opts(visualmap_opts=[opts.VisualMapOpts(type_="color",is_calculable=True,dimension=3,pos_top="10",max_=8 / 2,range_color=["#1710c0","#0b9df0","#00fea8","#00ff0d",],),
#             opts.VisualMapOpts(
#                 type_="size",
#                 is_calculable=True,
#                 dimension=4,
#                 pos_bottom="10",
#                 max_=80 / 2,
#                 range_color=[
#                     "#1710c0",
#                     "#0b9df0",
#                     "#00fea8",
#                     "#00ff0d",
#                 ],
#             ),]).render("scatter3d.html")
)

![

抖音用户浏览行为分析(作者聚类)相关推荐

  1. 中忻嘉业科技:怎样分析抖音用户群体画像

    想要在抖音上面做生意,那么就需要了解抖音平台主要是哪些人在玩,需要进行用户画像分析,在抖音平上才能更加精准的找到自己的精准客户,也能知道自己想要售卖的商品到底适不适合抖音这个平台,那么小编将给大家分享 ...

  2. 小红书用户画像分析_抖音用户画像分析及活跃时间点

    今天小编来和大家分享一下,抖音用户画像的分析和抖音用户的活跃时间点, 1.重点的画像,是抖音受众人群高低线及分布率. 2.查询数据的技巧,如果是产品的话参考到阿里指数上查看,如果查行业的话,可以在百度 ...

  3. 需求分析报告应该包含哪些部分_2020最新抖音用户画像分析报告:粉丝都有哪些特点和需求?...

    本文相关:抖音用户画像分析.抖音用户画像报告.2020最新抖音用户画像分析等 不管是做抖音运营还是抖音直播,了解粉丝,了解用户的需求是非常重要的!做任何事情,对症下药你才能事半功倍!比如你的粉丝想要梨 ...

  4. 抖音用户行为分析 (SQL)

    最近在寻找一些sql的项目实践,所以虽然此类分析用python会更加的便捷,但是仍旧选用SQL进行.另:文本粘贴 代码格式可能会不标准有误,用powerBI 绘图 1. 通过sql sever 任务  ...

  5. Python分析抖音用户行为数据,看看发什么样的视频才会爆!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python分析抖音用户行为数据视频讲解地址 https://www.bilibili.co ...

  6. python数据分析及可视化(十五)数据分析可视化实战篇(抖音用户数据分析、二手房数据分析)

    python数据分析的实战篇,围绕实例的数据展开分析,通过数据操作案例来了解数据分析中的频繁用到的知识内容. 抖音用户数据分析 1.理解数据 数据字段含义 了解数据内容,确保数据来源是正常的,安全合法 ...

  7. python抓取抖音用户画像,摩羯天蝎居然刷得最多?

    日刷抖音三百条,悠悠一笑乐逍遥,夜深忽醒窗外事,不知今夕是何年. 要从上个月说起,那天晚上准备睡觉了,然后朋友突然发来一个抖音热门视频. 一向一本正经苟于工作的我,竟然沉醉于小姐姐的甜蜜的笑容,加之想 ...

  8. 抖音python真的那么好吗_python看抖音用户画像,摩羯天蝎居然刷得最多?

    日刷抖音三百条,悠悠一笑乐逍遥,夜深忽醒窗外事,不知今夕是何年. 要从上个月说起,那天晚上准备睡觉了,然后朋友突然发来一个抖音热门视频. 一向一本正经苟于工作的我,竟然沉醉于小姐姐的甜蜜的笑容,加之想 ...

  9. 抖音数据统计_2019年抖音数据报告的分析探究

    不看抖音的我看完2019抖音数据报告后,我不得不赞叹抖音的覆盖面以及其发展潜力,从抖音的数据我们也能了解到当下的热点和新的趋势,本文我将从十个方面来分析这份数据. 01 抖音日活跃用户增长 在这份报道 ...

  10. 抖音数据统计_通过对抖音用户的大数据分析,我总结了一些经验

    最近一直在研究短视频创作,这里为大家总结一些经验. 短视频创业选好平台是关键,不同的短视频在不同的平台上会得到不一样的结果. 如何正确选择合适的平台,需要先搞清楚各家短视频平台的用户特征. 今天我们就 ...

最新文章

  1. 2021年大数据Flink(三十二):​​​​​​​Table与SQL案例准备 API
  2. 机器学习:多分类的logistic回归
  3. Kinect学习(一):开发环境搭建
  4. codeblock 显示 no such file(头文件)
  5. 音频管理_人力资源管理师考试历年真题试卷+视频教程+音频讲义合集分享
  6. Codeforces Round #462 (Div. 2)
  7. Github上LeakCanary编译报错CreateProcess error=2的解决方法
  8. 使用 ABAP 读取每个月的月份名称和编号
  9. Linux的实际操作:文件目录类实用指令(压缩gzip tar -zcvf和解压缩gunzip tar -zxvf)
  10. 大数据之-Hadoop完全分布式_集群中分发脚本xsync_集群环境中同时配置大量主机---大数据之hadoop工作笔记0033
  11. python语音信号快速傅里叶变换
  12. HADOOP再进阶:本地Yum软件源安装Cloudera Manager 5
  13. win10启动修复_在win10桌面建立高级启动选项快捷方式,修复电脑故障不用愁
  14. 基础计算机考试题,计算机基础考试题库含答案.doc
  15. Java代理和动态代理机制分析和应用
  16. html5 canvas画彩虹,HTML5 Canvas彩虹连接点动画
  17. html电子邮件签名_有关HTML电子邮件的知识
  18. HTML5菜单栏特效
  19. o7_dictionary_accessibility 参数
  20. # 使用 DHCP 动态管理主机地址##

热门文章

  1. 【转载】小公司如何管理
  2. 跨域问题很难吗?来!教你使用 Nginx 反向代理轻松解决
  3. 打击学历造假问题有妙招
  4. django +mysql电子档管理系统源码28265
  5. H5页面直接扫码二维码插件
  6. 拼多多一二三面面经(2020.4.28更新)(已凉)
  7. unicode字符编码区间表
  8. Uni-app与接口的应用
  9. mac遇到的问题-可以访问外网但无法访问部分内网
  10. 计算机技术在美术绘画的应用,新形势下美术学创新发展在高中美术中的运用