基于python的抖音短视频数据分析与可视化
噗-噗 2024-06-16 14:35:02 阅读 62
基于python的抖音短视频数据分析与可视化
一、前言
抖音是一个非常流行的短视频平台,每天都有大量的用户在抖音上分享和观看视频。为了更好地了解抖音用户的行为和兴趣,我们可以使用Python进行数据分析与可视化。
在本文中,我们将介绍如何使用Python进行抖音数据分析与可视化。首先,我们将使用Python获取抖音的数据,然后使用pandas和matplotlib等库对数据进行可视化。
1.数据获取
抖音的数据可以通过API接口获取。我们可以使用Python的requests库来发送HTTP请求,获取抖音的数据。
2..数据可视化
处理完数据后,我们可以使用matplotlib等库对数据进行可视化。例如,可以使用matplotlib绘制条形图、饼图、折线图等。
3.可视化结果分析
通过可视化结果,我们可以分析抖音用户的行为和兴趣。例如,可以分析用户关注的人的类型、观看的视频类型等。
二、数据获取
数据来自于第三方监测,一共是有5000+抖音大V的数据信息。
主要包含博主们的昵称、性别、地点、类型、点赞数、粉丝数、视频数、评论数、分享数、关注数、毕业学校、认证、简介等信息。
其中粉丝最多的是人民日报,接近1.2亿。其次是央视新闻,也破亿了。
三、数据可视化
首先导入相关库,然后读取数据【如何导入 看最后】
from pyecharts.charts import Pie, Bar, TreeMap, Map, Geofrom wordcloud import WordCloud, ImageColorGeneratorfrom pyecharts import options as optsimport matplotlib.pyplot as pltfrom PIL import Imageimport pandas as pdimport numpy as npimport jiebadf = pd.read_csv('douyin.csv', header=0, encoding='utf-8-sig')print(df)
1.性别分布情况
可视化代码如下:
def create_gender(df): df = df.copy() # 修改数值 df.loc[df.gender == '0', 'gender'] = '未知' df.loc[df.gender == '1', 'gender'] = '男性' df.loc[df.gender == '2', 'gender'] = '女性' # 根据性别分组 gender_message = df.groupby(['gender']) # 对分组后的结果进行计数 gender_com = gender_message['gender'].agg(['count']) gender_com.reset_index(inplace=True) # 饼图数据 attr = gender_com['gender'] v1 = gender_com['count'] # 初始化配置 pie = Pie(init_opts=opts.InitOpts(width="800px", height="400px")) # 添加数据,设置半径 pie.add("", [list(z) for z in zip(attr, v1)], radius=["40%", "75%"]) # 设置全局配置项,标题、图例、工具箱(下载图片) pie.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V性别分布情况", pos_left="center", pos_top="top"), legend_opts=opts.LegendOpts(orient="vertical", pos_left="left"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}})) # 设置系列配置项,标签样式 pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}:{d}%")) pie.render("抖音大V性别分布情况.html")
整体上看,男女比例差别不大,除去未知的数据,基本是1:1。
2.点赞数 、点赞分布情况
可视化代码如下:
def create_likes(df): # 排序,降序 df = df.sort_values('likes', ascending=False) # 获取TOP10的数据 attr = df['name'][0:10] v1 = [float('%.1f' % (float(i) / 100000000)) for i in df['likes'][0:10]] # 初始化配置 bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) # x轴数据 bar.add_xaxis(list(reversed(attr.tolist()))) # y轴数据 bar.add_yaxis("", list(reversed(v1))) # 设置全局配置项,标题、工具箱(下载图片)、y轴分割线 bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V点赞数TOP10(亿)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) # 设置系列配置项,标签样式 bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) bar.reversal_axis() bar.render("抖音大V点赞数TOP10(亿).html")
可视化代码如下:
def create_cut_likes(df): # 将数据分段 Bins = [0, 1000000, 5000000, 10000000, 25000000, 50000000, 100000000, 5000000000] Labels = ['0-100', '100-500', '500-1000', '1000-2500', '2500-5000', '5000-10000', '10000以上'] len_stage = pd.cut(df['likes'], bins=Bins, labels=Labels).value_counts().sort_index() # 获取数据 attr = len_stage.index.tolist() v1 = len_stage.values.tolist() # 生成柱状图 bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(attr) bar.add_yaxis("", v1) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V点赞数分布情况(万)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black")) bar.render("抖音大V点赞数分布情况(万).html")
3. 粉丝数、粉丝分布情况
可视化代码如下:
def create_fans(df): df = df.sort_values('fans', ascending=False) attr = df['name'][0:10] v1 = ['%.1f' % (float(i) / 10000) for i in df['fans'][0:10]] bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(list(reversed(attr.tolist()))) bar.add_yaxis("", list(reversed(v1))) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V粉丝数TOP10(万)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) bar.reversal_axis() bar.render("抖音大V粉丝数TOP10(万).html")create_fans(df)
「人民日报」和「央视新闻」粉丝都破亿了。
可视化代码如下:
def create_cut_fans(df): Bins = [0, 1500000, 2000000, 5000000, 10000000, 25000000, 200000000] Labels = ['0-150', '150-200', '200-500', '500-1000', '1000-2500', '5000以上'] len_stage = pd.cut(df['fans'], bins=Bins, labels=Labels).value_counts().sort_index() attr = len_stage.index.tolist() v1 = len_stage.values.tolist() bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(attr) bar.add_yaxis("", v1) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V粉丝数分布情况(万)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black")) bar.render("抖音大V粉丝数分布情况(万).html")create_cut_fans(df)
5000万以上56个,妥妥的大佬。200w~500w的人数最多,好多一时爆火的博主,一段时间后也基本不怎么涨粉了
4. 评论数
可视化代码如下:
def create_comments(df): df = df.sort_values('comments', ascending=False) attr = df['name'][0:10] v1 = ['%.1f' % (float(i) / 100000000) for i in df['comments'][0:10]] bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(list(reversed(attr.tolist()))) bar.add_yaxis("", list(reversed(v1))) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V评论数TOP10(亿)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) bar.reversal_axis() bar.render("抖音大V评论数TOP10(亿).html")create_comments(df)
抖音视频的评论区也是比较有意思的地方。比如刷剧催更的,「赶紧去更新,都过了十几分钟了,生产队的驴都不敢休息这么久」,总的来说,媒体类的视频评论较多。
5.分享数
可视化代码如下:
def create_shares(df): df = df.sort_values('shares', ascending=False) attr = df['name'][0:10] v1 = ['%.1f' % (float(i) / 100000000) for i in df['shares'][0:10]] bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(list(reversed(attr.tolist()))) bar.add_yaxis("", list(reversed(v1))) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V分享数TOP10(亿)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) bar.reversal_axis() bar.render("抖音大V分享数TOP10(亿).html")create_shares(df)
抖音的分享是视频对外传播的一个方法,可以让更多的人看到视频。从数据上看,大家还是比较喜欢分享新闻类以及美食类的视频。
6.各类型点赞数/粉丝数汇总分布图
可视化代码如下:
def create_type_likes(df): # 分组求和 likes_type_message = df.groupby(['category']) likes_type_com = likes_type_message['likes'].agg(['sum']) likes_type_com.reset_index(inplace=True) # 处理数据 dom = [] for name, num in zip(likes_type_com['category'], likes_type_com['sum']): data = {} data['name'] = name data['value'] = num dom.append(data) print(dom) # 初始化配置 treemap = TreeMap(init_opts=opts.InitOpts(width="800px", height="400px")) # 添加数据 treemap.add('', dom) # 设置全局配置项,标题、工具箱(下载图片) treemap.set_global_opts(title_opts=opts.TitleOpts(title="各类型抖音大V点赞数汇总图", pos_left="center", pos_top="5"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), legend_opts=opts.LegendOpts(is_show=False)) treemap.render("各类型抖音大V点赞数汇总图.html")create_type_likes(df)def create_type_fans(df): dom = [] fans_type_message = df.groupby(['category']) fans_type_com = fans_type_message['fans'].agg(['sum']) fans_type_com.reset_index(inplace=True) for name, num in zip(fans_type_com['category'], fans_type_com['sum']): data = {} data['name'] = name data['value'] = num dom.append(data) print(dom) treemap = TreeMap(init_opts=opts.InitOpts(width="800px", height="400px")) treemap.add('', dom) treemap.set_global_opts(title_opts=opts.TitleOpts(title="各类型抖音大V粉丝数汇总图", pos_left="center", pos_top="5"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), legend_opts=opts.LegendOpts(is_show=False)) treemap.set_series_opts(treemapbreadcrumb_opts=opts.TreeMapBreadcrumbOpts(is_show=False)) treemap.render("各类型抖音大V粉丝数汇总图.html")create_type_fans(df)
抖音这个产品是消磨你时间的,而不是节约时间,技术稍微深一点的视频基本上生存不下去。由上面的矩形树图可以知道,大家都喜欢「美女」类型的视频,毕竟谁不喜欢漂亮妹子呢~
7.平均视频点赞数/粉丝数
可视化代码如下:
def create_avg_likes(df): # 筛选 df = df[df['videos'] > 0] # 计算单个视频平均点赞数 df.eval('result = likes/(videos*10000)', inplace=True) df['result'] = df['result'].round(decimals=1) df = df.sort_values('result', ascending=False) # 取TOP10 attr = df['name'][0:10] v1 = ['%.1f' % (float(i)) for i in df['result'][0:10]] # 初始化配置 bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) # 添加数据 bar.add_xaxis(list(reversed(attr.tolist()))) bar.add_yaxis("", list(reversed(v1))) # 设置全局配置项,标题、工具箱(下载图片)、y轴分割线 bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V平均视频点赞数TOP10(万)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) # 设置系列配置项 bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) # 翻转xy轴 bar.reversal_axis() bar.render("抖音大V平均视频点赞数TOP10(万).html")create_avg_likes(df)def create_avg_fans(df): df = df[df['videos'] > 0] df.eval('result = fans/(videos*10000)', inplace=True) df['result'] = df['result'].round(decimals=1) df = df.sort_values('result', ascending=False) attr = df['name'][0:10] v1 = ['%.1f' % (float(i)) for i in df['result'][0:10]] bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(list(reversed(attr.tolist()))) bar.add_yaxis("", list(reversed(v1))) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V平均视频粉丝数TOP10(万)", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black")) bar.reversal_axis() bar.render("抖音大V平均视频粉丝数TOP10(万).html")create_avg_fans(df)
8. 抖音大V分布情况
可视化代码如下:
def create_province_map(df): # 筛选数据 df = df[df["country"] == "中国"] df1 = df.copy() # 数据替换 df1["province"] = df1["province"].str.replace("省", "").str.replace("壮族自治区", "").str.replace("维吾尔自治区", "").str.replace("自治区", "") # 分组计数 df_num = df1.groupby("province")["province"].agg(count="count") df_province = df_num.index.values.tolist() df_count = df_num["count"].values.tolist() # 初始化配置 map = Map(init_opts=opts.InitOpts(width="800px", height="400px")) # 中国地图 map.add("", [list(z) for z in zip(df_province, df_count)], "china") # 设置全局配置项,标题、工具箱(下载图片)、颜色图例 map.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V省份分布情况", pos_left="center", pos_top="0"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), # 设置数值范围0-600,is_piecewise标签值连续 visualmap_opts=opts.VisualMapOpts(max_=600, is_piecewise=False)) map.render("抖音大V省份分布情况.html")create_province_map(df)def create_city_map(df): df1 = df[df["country"] == "中国"] df1 = df1.copy() df1["city"] = df1["city"].str.replace("市", "") df_num = df1.groupby("city")["city"].agg(count="count").reset_index().sort_values(by="count", ascending=False) df_city = df_num["city"].values.tolist() df_count = df_num["count"].values.tolist() # 初始化配置 geo = Geo(init_opts=opts.InitOpts(width="800px", height="400px")) # 中国地图 geo.add("", [list(z) for z in zip(df_city, df_count)], "china") # 设置全局配置项,标题、工具箱(下载图片)、颜色图例 geo.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V城市分布情况", pos_left="center", pos_top="0"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), # 设置数值范围0-600,is_piecewise标签值连续 visualmap_opts=opts.VisualMapOpts(is_piecewise=True)) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) map.render("抖音大V城市分布情况.html")# create_city_map(df)def create_city(df): df1 = df[df["country"] == "中国"] df1 = df1.copy() df1["city"] = df1["city"].str.replace("市", "") df_num = df1.groupby("city")["city"].agg(count="count").reset_index().sort_values(by="count", ascending=False) df_city = df_num[:10]["city"].values.tolist() df_count = df_num[:10]["count"].values.tolist() bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(df_city) bar.add_yaxis("", df_count) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V城市分布TOP10", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black")) bar.render("抖音大V城市分布TOP10.html")create_city(df)def create_abroad(df): # 筛选数据 df = df[(df["country"] != "中国") & (df["country"] != "") & (df["country"] != "暂不设置") & (df["country"] != "China")] df1 = df.copy() # 数据替换 df1["country"] = df1["country"].str.replace("United States", "美国").replace("大韩民国", "韩国") # 分组计数 df_num = df1.groupby("country")["country"].agg(count="count").reset_index().sort_values(by="count", ascending=False) df_country = df_num[:8]["country"].values.tolist() df_count = df_num[:8]["count"].values.tolist() # 初始化配置 bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px")) bar.add_xaxis(df_country) bar.add_yaxis("", df_count) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V国外分布TOP10", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black")) bar.render("抖音大V国外分布TOP10.html")# create_abroad(df)
北京遥遥领先,大V的聚集地。杭州盛产网红的城市,位列第二。
广东、浙江、四川位列前三。
美国居第一,不少在美国的华人会分享他们在美国生活的一些事情。国内也有人感兴趣这方面的东西,看看国外的月亮究竟圆不圆。
9.抖音大V毕业学校
def create_school(df): df1 = df[(df["school"] != "") & (df["school"] != "已毕业") & (df["school"] != "未知")] df1 = df1.copy() df_num = df1.groupby("school")["school"].agg(count="count").reset_index().sort_values(by="count", ascending=False) df_school = df_num[:10]["school"].values.tolist() df_count = df_num[:10]["count"].values.tolist() # 初始化配置 bar = Bar(init_opts=opts.InitOpts(width="1200px", height="400px")) bar.add_xaxis(df_school) bar.add_yaxis("", df_count) bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V毕业学校TOP10", pos_left="center", pos_top="18"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}), yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True))) bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black")) bar.render("抖音大V毕业学校TOP10.html")create_school(df)
北影、中传、浙传、中戏、上戏、央美,妥妥的演艺圈大佬。
这里 通过代码查询一下大V们的认证情况:
df1 = df[(df["custom_verify"] != "") & (df["custom_verify"] != "未知")]df1 = df1.copy()df_num = df1.groupby("custom_verify")["custom_verify"].agg(count="count").reset_index().sort_values(by="count", ascending=False)print(df_num[:20])
得到结果如下:
10. 抖音大V简介词云
可视化代码如下:
def create_wordcloud(df, picture): words = pd.read_csv('chineseStopWords.txt', encoding='gbk', sep='\t', names=['stopword']) # 分词 text = '' df1 = df[df["signature"] != ""] df1 = df1.copy() for line in df1['signature']: text += ' '.join(jieba.cut(str(line).replace(" ", ""), cut_all=False)) # 停用词 stopwords = set('') stopwords.update(words['stopword']) backgroud_Image = plt.imread('douyin.png') # 使用抖音背景色 alice_coloring = np.array(Image.open(r"douyin.png")) image_colors = ImageColorGenerator(alice_coloring) wc = WordCloud( background_color='white', mask=backgroud_Image, font_path='方正兰亭刊黑.TTF', max_words=2000, max_font_size=70, min_font_size=1, prefer_horizontal=1, color_func=image_colors, random_state=50, stopwords=stopwords, margin=5 ) wc.generate_from_text(text) # 看看词频高的有哪些 process_word = WordCloud.process_text(wc, text) sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True) print(sort[:50]) plt.imshow(wc) plt.axis('off') wc.to_file(picture) print('生成词云成功!')
四、注意事项
1.所有的代码放到同一个py文件中
2.在数据可视化过程中,难免会需要导入不同的库,这里建议使用WIN+R打开命令提示符,并使用国内镜像安装库(下载快),比如安装wordcloud库是,使用下列代码:
pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple/
这里用的是清华的镜像,其他镜像:
企业贡献:
(1).网易开源镜像站:http://mirrors.163.com/
(2).华为开源镜像站:https://mirrors.huaweicloud.com/
(3).阿里开源镜像站:https://developer.aliyun.com/mirror/
大学教学:
(1).清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/
(2).浙江大学开源镜像站:http://mirrors.zju.edu.cn/
(3).东北大学开源镜像站:http://mirror.neu.edu.cn/
安装库的时候,建议更新一下你的pip库,命令:
python -m pip install --upgrade pip
3.最后运行成功后会自动生成.html文件,如果你想要看到图,这时你就需要把.html文件拉到桌面上,用浏览器打开
如果需要源码,可在评论区说。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。