B站2020跨年晚会,被弹幕刷屏的节目是哪个,发弹幕最多的人又是谁?
作者 | CDA数据分析师
本以为薛之谦粉丝会觉得不妥给C君留言指正,没想到却是被数据分析爱好者从内容上提出了严厉的批评。
垃圾标题党。。。我以为收集的数据是与春晚观看人数,成本之类的对比,结果搞了个收集评论。还起了个这个的标题,误人子弟。
我们听取了这位朋友的意见,首先就让我们来看看B 站晚会跟各卫视晚会的收视对比:
1
收视率对比播放率
截至2020年1月7日,B站跨年晚会在B站评分为9.9,播放量达6900万。而据CSM统计,湖南卫视跨年晚会未去重播放量约为两亿、江苏卫视为3,456万、浙江卫视为3,314万。
这么看起来,第一次办跨年晚会的 B 站成功挤进前三名,实力不容小觑!
2
春晚播放对比B站晚会
如果再放到跟春晚比比的话。2019年春晚通过电视、广播、互联网、社交媒体多渠道多终端传播,海内外收视观众总规模达11.73亿人。
在老大哥春晚面前,B 站还是个弟弟,不过C君觉得春晚很多时候都是大家开着在那儿当背景音乐的,要的就是那个氛围。
好啦,收视率播报完毕。
接下来,还是说回这位听众的回复:
垃圾标题党。。。我以为收集的数据是与春晚观看人数,成本之类的对比,结果搞了个收集评论。还起了个这个的标题,误人子弟。
末尾这句「误人子弟」,必须要在这里纠正一下。
数据≠数字
C君相信这也是很多朋友的一个误区,就是:数据就是数字。
但其实在数据分析所指的数据,不只是观看人数1234万,收视率12.34%,或者成本1234亿,除了这些阿拉伯数字还包括文本数据,像是评论,弹幕,都是非常好的数据。
而且C君相信 B 站这场跨年晚会做的这么成功的原因也是在这方面的数据分析做的特别好,因为你可以通过播放量看到某某明星视频特别火,但是具体火的梗是什么,你得去分析文本数据,然后结合这些梗来做设计更能打动观众。
这一期,C君特意加了一些代码讲解,顺便也给各位春晚导演们上一堂基础 Python 数据分析课,我们看看 B 站是怎么戳中观众内心的!
3
弹幕最多的节目是?
首先,我们先看结果。这是我们对 B 站跨年晚会《第一章:日落》的数据分析可视化展示:
大家猜猜弹幕最多的节目是什么?
公布答案:
弹幕最多的节目是《钢铁洪流进行曲》。第二多的是演奏名侦探柯南主题曲的时候。
4
弹幕最多的时候,大家在说什么?
比如「红」,比如「中国」,比如「云飞兄」,比如「此生无悔入华夏」等等。
那整个第一章,最多的弹幕是什么呢?
最多的词有像「吸吸」、「红」、「补课」
「吸吸」是什么时候出现的呢?
我们可以看到是2400秒的时候。那会儿正是冯提莫唱《好运来》的时候。
5
谁最喜欢发弹幕?
我们看到他发的内容,是「基德」「琴酒」「柯南」等等,我基本就可以判断他是个柯南迷。
我们看一下他的主页,你可以看到确实是看了晚会,投很多币,然后还收藏着柯南的视频。
那这些到底怎么实现的?
6
我们来打开软件实操看一下。比如实现词云的方法:
# 文本分析工具包
import pandas as pd
import collections
from bs4 import BeautifulSoup
import os
import time
# 画图工具包
from pyecharts.charts import Line
import pyecharts.options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.charts import Page
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
from pyecharts.globals import ThemeType
# 分词工具包
import jieba
import jieba.analyse
# 文件路径
data_path='HTMLFiles/chapter_01/'
danmu_files = os.listdir(data_path)
# 获取弹幕
def get_danmu(danmu_file):
path = data_path+danmu_file
htmlfile = open(path, 'r', encoding='utf-8')
htmlhandle = htmlfile.read
soup = BeautifulSoup(htmlhandle, 'lxml')
results = soup.find_all('d')
# print(results)
# exit
# p 标签的数据全部内容
comments_info = [info.attrs['p'] for info in results]
# 分别取出所有数据内容
danmu_time_from_begin = [info.attrs['p'].split(',')[0] for info in results]
danmu_time_to_send = [info.attrs['p'].split(',')[4] for info in results]
danmu_user_id = [info.attrs['p'].split(',')[6] for info in results]
danmu_id = [info.attrs['p'].split(',')[7] for info in results]
comments = [comment.text for comment in results]
# 将数据内容直接存入数据库或者以 pandas DataFrame 的形式打印出来
comments_dict = {'comments': comments, 'danmu_time_from_begin': danmu_time_from_begin, 'danmu_user_id':danmu_user_id,'danmu_time_to_send': danmu_time_to_send, 'danmu_id': danmu_id}
df = pd.DataFrame(comments_dict)
return df
def get_all_danmu:
all_df = pd.DataFrame
for danmu_file in danmu_files:
df = get_danmu(danmu_file)
all_df = pd.concat([all_df, df], ignore_index=True)
print('全部弹幕数据数据加载中……')
return all_df
# 弹幕内容分词
df = get_all_danmu
# print(df.head)
# df['comments']
# exit
def bili20_wordcloud(df,mytitle='B 站2020跨年晚会弹幕词云图'):
# 加载自己的词库
jieba.load_userdict('CSVFiles/danmu_words_dict.txt') #filename为文件路径
# jieba.analyse.set_stop_words('CSVFiles/stop_words.txt')
stopwords = [line.strip for line in open('CSVFiles/stop_words.txt').readlines]
# print(stopwords)
# exit
# stopwords = ['啊啊啊']
replace_words={'吸':'吸吸','报到':'报道','二号':'2号','红红':'红',
'周董':'周杰伦','牛批':'牛逼','牛b':'牛逼','牛B':'牛逼','nb':'牛逼','NB':'牛逼','流批':'牛逼','牛':'牛逼','太牛':'牛逼','牛哔':'牛逼',
'゜':'(゜ -゜)つロ 乾杯~','乾杯':'(゜ -゜)つロ 乾杯~','bilibili':'B站','b站':'B站','打Call':'打call','打CALL':'打call','打电话':'打call'
}
# 保存全局分词,用于词频统计
segments =
for index, row in df.iterrows:
content = row[0]
# print(content)
#TextRank 关键词抽取,只获取固定词性
words = jieba.__lcut(content)
# words = jieba.analyse.textrank(content, topK=20,withWeight=False)
splitedStr = ''
for word in words:
word = word.strip
#停用词判断,如果当前的关键词不在停用词库中才进行记录
if word in replace_words: # 将某些在文中人物的昵称替换成正式的名字
word = replace_words[word]
if word not in stopwords:
# 记录全局分词
segments.append({'word':word, 'count':1})
splitedStr += word + ' '
# 将结果数组转为df序列
dfSg = pd.DataFrame(segments)
# 词频统计
seg_count = dfSg.groupby('word')['count'].sum
seg_count = pd.DataFrame(seg_count)
seg_count.sort_values(by='count', ascending=False, inplace=True)
seg_count.reset_index(inplace=True)
# print(seg_count)
# exit
# word = WordCloud(init_opts=opts.InitOpts(theme=ThemeType.BUILTIN_THEMES))
word = WordCloud(init_opts=opts.InitOpts)
word.add("", [*zip(list(seg_count['word']), list(seg_count['count']))], shape=SymbolType.ARROW ,word_size_range=[20, 100])
word.set_global_opts(title_opts=opts.TitleOpts(title=mytitle),
toolbox_opts=opts.ToolboxOpts)
print('词云图已经生成')
return word
word_all_danmu = bili20_wordcloud(df,mytitle='B 站2020跨年晚会弹幕词云图')
B 站跨年晚会第1章弹幕的数据分析,今天就聊到这里。
如果你对其他什么话题感兴趣,欢迎留言告诉我们。