将使用师兄自学课程2.0从2021.8~2022.12的弹幕数据进行内容分析
从时间、用户、视频内容三个角度去进行分析
已有数据包括:
1-5表主要是每门课程的弹幕数据,以表1为例,主要包括以下字段:
user_level是用户等级相关信息,主要包括以下字段:
1.数据处理
import pandas as pd
import os
#导入表格数据
user_level = pd.read_excel('user_level.xlsx')
#批量读取表格1-5
excel_list=[]
#返回指定路径下都有哪些文件
for item in os.listdir('./'):
if 'xlsx' in item and 'user_level' not in item:
excel_list.append(item)
#拼接表格1-5
danmu = pd.DataFrame()
for item in excel_list:
excel=pd.read_excel(item,converters={'uid':str,'id':str})
excel['视频标题']=item#得知每一行数据来自哪个表格
danmu=pd.concat([danmu,excel],axis=0)
此处单独导入了user_level表,将1-5个表批量导入,并拼接在了一起(每个表的字段都相同),结果如下
2.时间
2.1时间处理
from datetime import datetime
#fromtimestamp将时间戳转化为时间
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)
结果如下:
2.2时间分析
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
此处是为了让中文可被识别,图形上中文不乱码
2.2.1月份
danmu_year=danmu[danmu['年']==2022]
danmu_year
基于2022年的弹幕数据进行时间分析
danmu_year.groupby('月份')[['id']].count().plot()
结果图如下
由图可分析出,22年,3月份的弹幕非常活跃
再来分析每个月份发弹幕的人数:
danmu_year.groupby('月份')[['uid']].nunique().plot()#nunique不会重复计算
由图可知22年,3月份,发弹幕的人也是最多的----->进行思考,为什么呢?
假设1:季节?
假设2:视频进入了推流池子?
2.2.2星期
继续分析寻找答案!
#发弹幕数量
danmu_year.groupby('星期')[['id']].count().plot()
#发弹幕人数
danmu_year.groupby('星期')[['uid']].nunique().plot()
惊奇的发现,工作日1-4,周天,弹幕是最活跃的;周五或者周六活跃度会下降
#导入pygwalker模块,是python的一个可视化工具,画图分析数据非常方便
import pygwalker as pyg
pyg.walk(danmu_year)
得出每个星期弹幕数量的折线图,再分析每个小时的(这里数据给的有问题,按理说小时也有折线图,但是做出了没有点,大概趋势同星期差不多)
chart2折线表没数据,可能是原表数据给的不对少了一部分。 按照师兄视频显示,
按照小时分析可得出,大家白天摸鱼看视频、晚上也看很勤奋
3. 用户画像
主要是用户属性分析(年龄、性别、地理位置、行为数据...)以及参与发送弹幕用户的b站等级
3.1用户处理
#按照用户uid进行分组,并计算出id数量
danmu['用户弹幕数']=danmu.groupby('uid')['id'].transform('count')
danmu
结果如下
根据uid合并danmu表和user_level表,注意合并时两个表的uid字段类型要一样,否则报错
user_level['uid']=user_level['uid'].astype(str)#因为danmu['uid']是str类型,二者要连接故需转化
danmu_level =pd.merge(danmu,user_level,on='uid',how='inner')
3.2弹幕内容
danmu_level.groupby('uid')[['id']].count().sort_values('id',ascending=False)
首先,得出每个用户发的弹幕数量,按照降序排列,得出结果如下
分析发的弹幕数最多的uid的具体弹幕内容
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='6653485828143602809']
结果如下:
老大总共发了214条弹幕,具体内容可以发现,是一个上课非常积极的人,师兄在课程内有问,老大必有答--建议纳为《学习课代表》
#接下来分析第二多弹幕数用户的弹幕内容
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='6812827409839048297']
老二,发了187条弹幕,具体内容可以发现老二很有礼貌,嘴很甜,发了夸师兄的弹幕同时非常爱笑,建议纳为《课堂氛围组组长》
#第三多弹幕数用户的弹幕内容
pd.set_option('display.max_rows',300)
danmu_level[danmu_level['uid']=='-3260951504495839240']
老三一共发了176条弹幕,是一个实操小能手,还是个小黑子,发了一条:%o__o% 像不像师兄 黑师兄了,哈哈哈叫他卷王我觉得都二刷了我一刷还没看完呢
3.3 等级分布
#根据用户等级进行分组的,并画出不同等级所发弹幕数的柱状图
danmu_level.groupby('level')[['id']].count().plot(kind='bar')
可知大部分弹幕主要来自于4、5级用户,自学课程大部分发弹幕的观众,都是B站的粘性用户
#分析发弹幕的不同用户等级的用户uid,并画出不同等级的uid数量柱状图
danmu_level.groupby('level')[['uid']].nunique().plot(kind='bar')
4 视频内容
4.1 视频内容处理
from time import strftime
from time import gmtime
#progress为进度条,单位是毫秒,得除以1000
danmu['progress']=danmu['progress']/1000
#将弹幕进度条转化为00:00:00的格式
danmu['视频进度']=danmu['progress'].map(lambda x : strftime('%H:%M:%S',gmtime(x)))
#分析进度不用精准到秒,所以只考虑小时和分钟00:00
danmu['视频进度【时分】']=danmu['视频进度'].str[:5]
danmu
结果如下:
4.2 视频内容分析
对五个视频对应的五个表进度视频内容分析
4.2.1 p1、系统认识数据分析
#将不同视频进度的弹幕数据统计出来,降序排序
p1=danmu[danmu['视频标题']=='1、系统认识数据分析.xlsx']
p1.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
结果如下:
去掉开头和结尾(因为开头和结尾都有发弹幕的习惯) 11分钟时有100条弹幕,但似乎并没有什么特殊的视频内容; 9分钟,是因为ppt内有提问,大家在互动,所以弹幕数量很多
p1[p1['视频进度【时分】']=='00:11']
出现了节奏弹幕(在看的举个手),诱发了弹幕激增
4.2.2 p2 、excel基础操作
p2=danmu[danmu['视频标题']=='2、EXCEL基础操作.xlsx']
p2.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
在3小时06~07分,弹幕表达了对师兄excel课程的认可,满意度非常高,故弹幕数量非常多
4.2.3 p3、tableau数据可视化
p3=danmu[danmu['视频标题']=='3、Tableau数据可视化.xlsx']
p3.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
57分钟师兄画面卡住了,导致弹幕的激增
4.2.4 p4、 sql从入门到实战
p4=danmu[danmu['视频标题']=='4、SQL从入门到实战.xlsx']
p4.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
1小时9分,是一个有争议的问答环节,大家各抒己见
4.2.5 p5、python
p5=danmu[danmu['视频标题']=='5、Python.xlsx']
p5.groupby('视频进度【时分】')[['id']].count().sort_values('id',ascending=False)
21分,师兄在折磨观众,导致弹幕激增
总结
时序
现象or猜想
1、从月份角度看,3月份参与互动的用户积极度最高,也有可能3月得到了B站大量的曝光
2、从星期维度的角度看,大家每周的状态be like:周一都在忙着开会和工作,周二、三四都在狠狠の摸鱼!周五、六在疯狂爽玩,周天逐渐找回一点学习状态
3、从小时维度来看:自学2.0,发送弹幕的人,似乎能够分为2or3类不同的人群
用户
结论
自学课程2.0主要的活跃用户都是由4、5级用户组成,师兄的粉丝有可能大部分都是B站的高度用户(当然有可能DY和B站都玩)(6级大佬我就不多提了)
备注
1、如果师兄的粉丝和观众真的大部分都是B站的高度用户,那么能否去进一步评估站外引流的空间有多大、以及可行性
2、在此畅想猜测,B站的用户等级分布 是否也呈现两头窄、中间宽的情况?
内容
结论
1、优质的视频内容是一定能够得到大家的认可的
2、弹幕的氛围与活跃度,可以直观的衡量教学类内容的视频节奏、以及知识的传达情况