数据获取,通过爬虫获取该合集视频的所有弹幕。
使用的工具是 jupyter notebook
1.数据处理:
将获取到的数据通过pandas库读取成DataFrame,对象
import pandas as pd
import os
# 读取用户等级
user_level = pd.read_excel('data_弹幕分析/user_level.xlsx',converters={'uid':str})
user_level
# 批量读取另外的五个文件
os.listdir('./data_弹幕分析')
excel_list = []
for item in os.listdir('./data_弹幕分析'):
if 'xlsx' in item and 'user_level' not in item:
excel_list.append(item)
excel_list
读取完所有的数据以后,我们对ctime也就是弹幕创建时间进行处理,将时间戳转换为正常的时间格式:
from datetime import datetime
# 将时间戳格式的数据转换为年月日时分秒格式
danmu['弹幕创建时间'] = danmu['ctime'].map(datetime.fromtimestamp)
# 将年,月,小时,周几分割出来
danmu['年'] = danmu['弹幕创建时间'].map(lambda x:x.year)
danmu['月份'] = danmu['弹幕创建时间'].map(lambda x:x.month)
danmu['星期'] = danmu['弹幕创建时间'].map(datetime.isoweekday)
danmu['小时'] = danmu['弹幕创建时间'].map(lambda x:x.hour)
danmu
2. 从时间这个维度对弹幕数据进行分析:
弹幕数量随月份走势图:
取到2022年一整年的弹幕数据进行绘制
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
danmu_year = danmu[danmu['年']==2022]
danmu_year
将数据按照月份聚合分组,生成折线图:
danmu_year.groupby('月份')[['id']].count().plot()
22年三月份的弹幕数量非常多,然后弹幕数量持续走低
此图并不能说明三月份的用户非常活跃,因为单人可以发送多条弹幕,不排除有人恶意刷弹幕
我们现在对发弹幕的用户做一个折线图
# 这里不再使用count做计数方法是因为一个人可以发多条弹幕,nunique方法可以对计数的进行去重,避免同一个uid被计算多次
danmu_year.groupby('月份')[['uid']].nunique().plot()
由此可见三月份发弹幕的人数也是最多的,那么是什么原因导致的弹幕数量激增呢?
看看星期几对弹幕数量的影响:
danmu_year.groupby('星期')[['id']].count().plot()
再绘制一个用户数量的折线图:
danmu_year.groupby('星期')[['uid']].nunique().plot()
综合两幅折线图,我们可以得出结论:周一到周四是弹幕最活跃的时间段
再绘制每月每周弹幕分布情况:
import pygwalker as pw
pw.walk(danmu_year)
从每月每周弹幕的分布情况看也坐实了上面的结论
接着绘制每天每小时的弹幕分布情况:
import pygwalker as pw
pw.walk(danmu_year)
观察图像,实际上不管是周几弹幕主要活跃的时间段都是,上午:9~11点,下午:14~17点,晚上:20~22点。看得出来大家都很喜欢上班时间学习,非常的勤奋。
3.用户画像:
统计用户弹幕数量:
danmu['弹幕数量'] = danmu.groupby('uid')['id'].transform('count')
danmu
将其和用户等级进行横向拼接:
danmu_level = pd.merge(danmu,user_level,on='uid',how='inner')
danmu_level
让我们看看哪些用户爱发弹幕:
danmu_level.groupby('uid')[['id']].count().sort_values('id',ascending=False)
具体看看这三个发弹幕最多的用户都发了些什么:
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='6653485828143602809']
仔细查看其弹幕内容,发现该用户的弹幕大多是用来回复UP主提出的问题,是好学的活跃用户呢!
看看排名第二的用户的弹幕具体内容:
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='6812827409839048297']
仔细查看其弹幕内容,发现该用户的弹幕很有礼貌情绪价值拉满,妥妥的氛围组选手。
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='-3260951504495839240']
该用户的弹幕文字很多,大都是发表对视频提问的解答,也是好学的选手。
等级分布:
danmu_level.groupby('level')[['id']].count().plot(kind='bar')
据上图猜测我们可以认为,爱发弹幕的是B站的粘性用户
我们再对不同等级的用户做一个柱状图,以此为验证
danmu_level.groupby('level')[['uid']].nunique().plot(kind='bar')
和弹幕数量的那幅图趋势几乎一样,结论合理
4.视频内容分析:
处理弹幕在视频的哪一秒发送的progress这个字段
from time import strftime
from time import gmtime
danmu
#由于progress这个字段单位是毫秒,所以需要除以1000变换为秒
danmu['progress'] = danmu['progress']/1000
danmu
danmu['progress'].map(gmtime)
danmu['视频进度'] = danmu['progress'].map(lambda x: strftime('%H:%M:%S',gmtime(x)))
danmu['视频进度【时分】'] = danmu['progress'].map(lambda x: strftime('%H:%M',gmtime(x)))
danmu
视频内容分析,看看每个弹幕数量多的时间点发生了什么
视频1
p1 = danmu[danmu['视频标题']=='1、系统认识数据分析.xlsx']
p1.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
由于开头和结尾大家都有发弹幕的习惯不做讨论,但是11分钟虽然弹幕很多但是视频内容并不特别但是9分钟时弹幕数量多的原因是因为UP进行了提问
我们来具体看看第11分钟的弹幕内容有什么
pd.set_option('display.max_rows',300)
p1[p1['视频进度【时分】']=='00:11']
根据弹幕内容我们发现,是有人带了节奏,并且有人回复导致了弹幕小高峰
视频2
p2 = danmu[danmu['视频标题']=='2、EXCEL基础操作.xlsx']
p2.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
在3小时7,6分到7分这个时间段,UP主表达了视频制作不易,得到了大家的认可,纷纷发弹幕响应
视频3
p3 = danmu[danmu['视频标题']=='3、Tableau数据可视化.xlsx']
p3.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
57分钟时,UP演示了怎样可以迅速吸引人们的注意,他假装视频卡住了,弹幕也是纷纷响应
视频4
p4 = danmu[danmu['视频标题']=='4、SQL从入门到实战.xlsx']
p4.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
01:09这个时间点UP提出了一个有争议的问题,用户发弹幕表达自己的意见
视频5
p5 = danmu[danmu['视频标题']=='5、Python.xlsx']
p5.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
21分Up放了一个鬼畜视频,折磨观众导致弹幕激增
至此内容分析完毕,我们在分析过程中发现了很多有趣的现象,比如用户的活跃时间等,也看到了UP主的内容对弹幕数量造成的影响,还有很多有趣的东西藏在数据当中 。