jquery append的数据进行each_数据分析实例:自学者更喜欢哪些数据分析视频

数据分析实例:自学者更喜欢哪些数据分析视频

项目背景:随着今年计算机和金融的快速发展,越来越多的人投入计算机和金融行业中。其中,数据分析师职业犹受大学生欢迎。然而,数据分析师需要从业者具有较好的编程、统计分析、数学建模以及数据爬虫能力。这给跨行从事数据分析的求职者带来了巨大的挑战。哔哩哔哩是当今青少年学习的重要平台。据不完全统计,截止到2019年5月,哔哩哔哩上共有962个数据分析视频。为了分析数据分析未来发展趋势,探索哪些数据分析视频受自学者喜欢,以及充分发挥python中Numpy,Pands 和Matplotlib模块特长,对哔哩哔哩弹幕网中的数据分析相关视频进行数据挖掘和数据分析。

目标:1)获取哔哩哔哩弹幕网中数据分析相关视频信息(播放量、视频长度、弹幕、投币、分享、AV号、点赞和标题内容);

2)分析各个数据分析视频的特征量随时间的变化规律;

3)探究数据分析视频的特征量与视频长度规律,探讨哪个视频长度区间最受学习者欢迎。

4)查清数据分析师所需要必备技能

方法:1)python中的scrapy爬虫框架以及现有的网络爬虫软件八爪鱼问数据获取提供了便利。由于提取指标较多,为了回避构造多次正则表达式问题,采用八爪鱼获取页面数据。后续针对数据数据,专门写篇通过python爬虫获取哔哩哔哩视频特征数据

2)采用python中的Numpy和Panda模块对数据进行数据统计、数据分析和数据清洗,并利用Matplotlib模块进行数据可视化分析。

3)通过python中的Jieba模块利用TF-IDF算法对文章标题内容提取关键词

数据集定义

表1 哔哩哔哩视频数据的基本信息

848e7429bc85269641b078bffc08836e.png

数据获取

数据来源:哔哩哔哩弹幕网

数据范围:以数据分析为主题所有视频

数据集:哔哩哔哩数据分析视频的特征数据集(962个)

工具:python爬虫和八爪鱼爬虫

时间:所有数据截止到2019年05月26日

数据集获取方式:链接:https://pan.baidu.com/s/1NJAUYR3qJTmMcLSWiGBWhA

提取码:ksak

复制这段内容后打开百度网盘手机App,操作更方便哦

数据处理

1)加载原始数据,导入python常用模块

# bibili数据分析

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 数据清洗

# 原始数据集命名为data1,读取title等标签

data = pd.read_excel('C:/Users/Administrator/Desktop/data1.xlsx',
names = ['title','open','time','author','duration','av_number','view','danmu','pick','reply','collect',
'coin','share','like','copyright'])

#处理缺失值

#查找缺失值

data[data.isnull().values==True] 

#对缺失值进行处理有填充和删除,本文选择填充方式,将删除命令附录如下

#去除缺失值的数据

#data_delet = data.dropna() # 去除所有缺失值所在的行 
#data = data[data.danmu.isnull().valu ==False] #某一行含有缺失值去除

#缺失值填充

data_fill = data.fillna(data.mean())

#数据爬虫无法回避数据重复,删除重复行(播放量,点赞量等)

data = data.drop(['open','pick','copyright'],axis =1)

#时间提取(获取时间格式year-month-day,此处只提取年份)

for i in range(0,len(data.time)):
    data.time[i] = data.time[i][:4]

#将播放历时数据全部转为秒为单位

i = 0 #定义初始位置    
try: #防止数据异常程序崩溃	
    for each in data.duration:
        if len(each) == 9:
            data.duration[i] = int(each[:3])*3600+int(each[4:6])*60 + int(each[7:])
        elif len(each)==8:
            data.duration[i] = int(each[:2])*3600+int(each[3:5])*60 + int(each[7:])
        elif len(each) == 5:
            data.duration[i] = int(each[:2])*60 + int(each[3:])
        else:
            data.duration[i] = int(each)
        i = i +1
except ValueError:
        print(data.duration[i],'位置是%d'%i) 

#数据清洗结束

数据清洗完成后的数据集如下:

表2 数据清洗结束后特征汇总

ca46709f1e11334f538930d3d8d65fd0.png

步骤2 分析视频特征量随时间变化规律

data=data.sort_values(by='time')

#分析个指标随年度变化i = 0,计算各个年度区间视频个数以坐标

video_number = []
video_year=[data.time.min()]
for i in range(1,len(data.time)):
    if data.time.iloc[i]>data.time.iloc[i-1]: #采用绝对坐标处理数据
        video_number.append(i)
        video_year.append(data.time.iloc[i])
    if i == len(data.time)-1:
        video_number.append(i+1)
#构造空列表储存收藏量硬币等
view = []; danmu = []; reply = []; collect = []; coin = []; share = []; like = []; duration = []
#确定统计视频特征参数
static_name = ['view','danmu','reply','collect','coin','share','like','duration'] 
# 计算不同年份下各个指标统计量
for i in range(len(video_number)):
    if i==0:
        view.append(sum(data.view[0:video_number[i]])) # 计算不同年份下各个指标统计量
        danmu.append(sum(data.danmu[0:video_number[i]]))
        reply.append(sum(data.reply[0:video_number[i]]))
        collect.append(sum(data.collect[0:video_number[i]]))
        coin.append(sum(data.coin[0:video_number[i]]))
        share.append(sum(data.share[0:video_number[i]]))
        like.append(sum(data.like[0:video_number[i]]))
        duration.append(sum(data.duration[0:video_number[i]]))
    else:
        view.append(sum(data.view[video_number[i-1]:video_number[i]]))
        danmu.append(sum(data.danmu[video_number[i-1]:video_number[i]]))
        reply.append(sum(data.reply[video_number[i-1]:video_number[i]]))
        collect.append(sum(data.collect[video_number[i-1]:video_number[i]]))
        coin.append(sum(data.coin[video_number[i-1]:video_number[i]]))
        share.append(sum(data.share[video_number[i-1]:video_number[i]]))
        like.append(sum(data.like[video_number[i-1]:video_number[i]]))
        duration.append(sum(data.duration[video_number[i-1]:video_number[i]]))
#汇总统计变量并输出数据
static = [view, danmu, reply, collect, coin, share, like, duration] #不同时间段各个特征量的统计
static = np.array(static).T #转置
static = pd.DataFrame(static,columns = static_name, index = video_year) #重命名表头和列名
video_number = pd.DataFrame(video_number)  #转化为panda数据
writer = pd.ExcelWriter('C:/Users/Administrator/Desktop/data_new.xlsx') #输出数据
static.to_excel(writer, 'Sheet1', 'A1:I7')
data.to_excel(writer, 'Sheet2')
writer.save() #存储

统计数据结果如下:

表 3 视频特征量随时间变化

fb7c0bb919d2a70f56d5819777074d2a.png

步骤3 特征量随时间的变化

#导入python 中matplotlib模块进行数据可视化
#对字体和显示结果进行设置
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['Fangsong']
mpl.rcParams['axes.unicode_minus'] = False
#读取数据清洗后数据
statis = pd.read_excel('C:/Users/Administrator/Desktop/data_new.xlsx','Sheet1')
#读取依据播放历时排序数据
data = pd.read_excel('C:/Users/Administrator/Desktop/data_new.xlsx','Sheet2')
#绘制统计图形
fig1,ax1 = plt.subplots() #获取图形句柄
ax1.bar(statis.year,statis.number,hatch = None,color = 'r',width = 0.5,label = '播放数')
ax1.set_xlabel('时间',size = 12) #设置坐标轴标签
ax1.set_ylabel('播放量',size = 12)
ax2 = ax1.twinx() #由于纵坐标刻度范围不一致采用子图形式表示
ax2.plot(statis.year,statis.duration,color = 'b',marker ='x',ls='--',label = '播放历时/s')
ax2.set_ylabel('播放时间(s)',size =12)
fig1.legend(ncol = 2,loc = [0.13,0.82]) 
fig2,ax3 = plt.subplots()
scatter.plot(statis.year, statis.danmu,color = 'r',ls='--', marker = 'x',label = '弹幕')
ax3.plot(statis.year, statis.reply,color = 'b',ls ='-.', marker = 'o',label = '评论')
ax3.plot(statis.year, statis.coin, color = 'g',ls = '-', marker = '>',label = '投币')
ax3.plot(statis.year, statis.share, color = 'k',ls = '-',marker = '^',label = '转发')
ax3.set_xlabel('时间',size =12)
ax3.set_ylabel('次数',size =12)
ax4 = ax3.twinx()
ax4.plot(statis.year,statis.collect,color = 'k',ls = '-.', marker = '^',alpha = 0.5,label = '收藏')
ax4.plot(statis.year,statis.like,color = 'b',ls = '--', marker = '<',alpha =0.5, label = '点赞')
ax4.set_ylabel('次数',size =12)
fig2.legend(ncol = 3,loc = [0.13,0.78]) # 设置图例位置和形态
plt.show()

ba3c5f43bac5fa67cdf09123bca89ed3.png
图1 视频特征参数随时间变化

083bfd1fbbfdf6dccbe242c418116716.png
图 2 播放数与播放历时随时间变化

由图1和图2,在哔哩哔哩弹幕网上,数据分析的相关视频最早出现在2013年并且视频个数只有3个。2015年间,数据分析的相关视频没有。2016年13个数据分析视频逐渐出现,到2017和2018年数据分析视频上升到几百个。其中2017-2018年间,数据分析视频急剧增加。数据分析视频的急剧增加,一方面与网络降价提速发展密切相关,另一方面也受社会需求控制。随着信息化发展,社会积累的数据规模越来越大,需要更多的数据挖掘以及数据分析师从这些低质的数据中挖掘有用的信息。

对视频其它特征参量演化规律进行分析,发现弹幕、投币、收藏、点赞和视频历时与视频个数随时间变化规律相同。而评论数与转发数的演化规律与其他特征量演化规律不同。评论数与转发数在2018年前,随着时间增加逐渐增加,但在2018年后逐渐。上述规律一方面表明自主学习者更偏向与收藏视频,很少与其他同学进行讨论,另一方面也间接的论证了自主学习者往往是孤军奋战,不具备将自己所看到的优秀视频推荐给他人的环境。

步骤4 播放历时与其他视频特征参数关系

data=data.sort_values(by='duration') #依据时间历时对数据进行排序
data = data[1:776] #由于横坐标轴跨度较大,绘制部分放大子图
data2 = data[1:400] #选择放大子图部分
fig1,ax1 = plt.subplots() #获取坐标句柄
plt.plot(data.duration, data.danmu,color = 'b',ls='--', marker = 'x',label = '弹幕',alpha =0.5)
plt.xlabel('视频长度/s',size = 12)
plt.ylabel('弹幕个数',size = 12)
plt.legend()
plt.tick_params(labelsize=8)
labels = ax1.get_xticklabels() + ax1.get_yticklabels() # 对坐标轴刻度进行设置
[label.set_fontname('Times New Roman') for label in labels] #设置字体样式
fig7,ax7 = plt.subplots() #采用子图样式绘制放大图
plt.plot(data2.duration, data2.danmu,color = 'b',ls='--', marker = 'x',label = '弹幕',alpha =0.5)
plt.xlabel('视频长度/s',size = 14)
plt.ylabel('弹幕个数',size = 14)
plt.legend()
plt.tick_params(labelsize=10)
labels = ax7.get_xticklabels() + ax7.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
fig2,ax2 = plt.subplots()
plt.plot(data.duration, data.reply,color = 'b',ls ='-', marker = 'o',label = '评论',alpha = 0.5)
plt.xlabel('视频长度/s',size = 12)
plt.ylabel('回复次数',size = 12)
plt.tick_params(labelsize=8)
labels = ax2.get_xticklabels() + ax2.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
fig8,ax8 = plt.subplots()
plt.plot(data2.duration, data2.reply,color = 'b',ls ='-', marker = 'o',label = '评论',alpha = 0.5)
plt.xlabel('视频长度/s',size = 12)
plt.ylabel('回复次数',size = 12)
plt.tick_params(labelsize=10)
labels = ax8.get_xticklabels() + ax8.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
fig3,ax3 = plt.subplots()
plt.plot(data.duration, data.coin, color = 'b',ls = '-', marker = '>',label = '投币',alpha =0.5)
plt.xlabel('视频长度/s',size = 12)
plt.ylabel('投币个数',size = 12)
plt.tick_params(labelsize=8)
labels = ax3.get_xticklabels() + ax3.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
fig9,ax9 = plt.subplots()
plt.plot(data2.duration, data2.coin, color = 'b',ls = '-', marker = '>',label = '投币',alpha =0.5)
plt.xlabel('视频长度/s',size = 12)
plt.ylabel('投币个数',size = 12)
plt.tick_params(labelsize=10)
labels = ax9.get_xticklabels() + ax9.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
fig4,ax4 = plt.subplots()
plt.plot(data.duration, data.share, color = 'b',ls = '-',marker = '^',label = '转发',alpha =0.5)
plt.xlabel('时间历时/s',size = 12)
plt.ylabel('转发次数',size = 12)
plt.tick_params(labelsize=8)
labels = ax4.get_xticklabels() + ax4.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
fig10,ax10 = plt.subplots()
plt.plot(data2.duration, data2.share, color = 'b',ls = '-',marker = '^',label = '转发',alpha =0.5)
plt.xlabel('时间历时/s',size = 12)
plt.ylabel('分享次数',size = 12)
plt.tick_params(labelsize=10)
labels = ax10.get_xticklabels() + ax10.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.legend()
plt.show() # 显示所有子图
# 收藏和点赞的数值较大,单独绘制,代码基本与其他特征量绘制函数一样。
# 为了进行比较,我们在这里利用美图秀秀对两幅图进行拼接,这样可以看到图形的前端数据的变化。

1bd7b2c37e3502db9fb036feb6446baf.png
图 3 视频长度与弹幕个数关系

60240b6aa10a7d5f09fa6f4400c82aef.png
图4 视频长度与点赞次数关系

2b3177771d455142c668343cedd7d229.png
图5 视频长度与评论次数关系

3b4ccc45f03b55514bb75a04f1e0d825.png
图6 视频长度与收藏次数关系

c00eee0fdaebaacb50b9b2cd4492e727.png
图7 视频长度与投币个数关系

9ebcfaa333d1749ebb4264172817f032.png
图 8 视频长度与转发次数关系

由图3-图8,弹幕个数、点赞次数、评论次数、收藏次数、投币个数和转发次数较多的视频一般视频长度都较短,并且集中在2000s以内。2000s以内的视频不足40分钟,这类视频往往是一些介绍类视频以及启蒙性视频。表明大多数人只是初步了解数据分析和数据挖掘。此外,由于模糊搜索,个别娱乐类的视频也在数据集中,但对总体规律影响较小。2000s以后的各个特征都很小,一方面受学习人数限制,另一方面与学习性质本身有关。自学者更习惯认真听课,自己动手查询解决问题,较少在视频下方进行讨论。

此外,图3,图6和图8表明,即使视频长度较长的情况下,仍然可以获得较高的认可度(弹幕数大,收藏、投币和转发次数多)。为了避免分析出错,挑选出了该数据。该数据题目为“R语言基础课程6讲”,为典型的数据分析内容,证明了上述我们的推断。

步骤5:视频特征相关性分析

视频特征量的相关性分析是进行机器学习建模的基础。在python中的pandas模块,利用pd.corr和pd.cov获得各个特征量的相关性系数矩阵和协方差矩阵。

corr = data.corr #计算各个特征量的相关性矩阵

表4 特征量相关性系数矩阵

01b3c2ca6921ca173721b9deaf15fe38.png

为了更易区分哪些特征量彼此相关,对利用excel对表格进行条件处理。当相关性系数大于等于0.75时,保留原始相关性系数,否则为0,计算结果见表5

表5 处理后特征向量的相关性系数矩阵

1ca06d5cd7a2f036aeee21dc2cdad0df.png

由表5,播放量与投币数、分享次数和点赞数密切相关,表明大多数学习者打开视频后,习惯性点赞,投币和转发(常说的三连),而较少发表弹幕、评论和收藏。因此,弹幕数,评论数和收藏数可以较为准确的评价一个数学分析视频受欢迎程度。此外,我们还发现点赞数与投币数密切相关。与分享相比较而言,一个数据分析视频,自学者只要喜欢往往会点赞投币一起,而较少选择转发。一方面出于个人信息保密考虑,并不想让太多的人了解到自己所做事情;另一方面也可能与操作复杂有关系,转发的操作复杂度远远大于投币的复杂度。

步骤6 :数据分析所需技能

为了分析数据分析视频围绕的主题,对所有视频的title的关键词进行了文本分析。由于title中包含了中文文字和英文文字,使提取关键词变的较为困难。中文的关键词提取可以通过jieba分词进行处理,英文分词则需通过字典统计每个单词出现的词频。Python,SPSS等数据处理分析软件的英文名称均为英文,故本文对英文进行词频统计,利用jieba对中文词频统计,可参考https://blog.csdn.net/bozhanggu2239/article/details/80157305 。

import numpy as np
import pandas as pd
import re # 导入所需要的模块,其中需要正则区分中文和英文
data = pd.read_excel('C:/Users/Administrator/Desktop/data_new.xlsx','Sheet2') #读取数据
title = data.title #读取title数据并存入变量title
con_text  = [] #定义空列表
content = '' #空字符串
for item in title:
    con_text.append(jieba.cut(item,cut_all = False)) #对所有title中的中文进行jieba分词
for it in con_text: 
    for item in it:
        content = content + item + ' ' #以字符串+空格形式存储
keywords = jieba.analyse.extract_tags(content, topK=20, withWeight=True, allowPOS= ('n', 'nr','ns'))
#其中topK显示tf-idf个数,withWeight关键词权重,allowPOS允许词性。
content = content.upper() #将所有title中的英文字母全部转为小写字母
chi = re.compile(r'[u4e00-u9fa5]') # 匹配所有中文正则
rng = re.compile(r'[^A-^Z]') #匹配所有英文表达
c_out =chi.split(content) # 利用正则对文本进行分割
clean_out = '' 
for item in c_out:
	if item!='':
		clean_out = clean_out + item + ' ' #去除空集
r_out =rng.split(clean_out) # 去除所有非英文字符
clean_rout = ''
for item in r_out:
	if item!='':
		clean_rout = clean_rout + item + ' ' #转为字符串
each = ''
text = []
for item in clean_rout:
	if item != ' ':
		each = each + item
	else:
		text.append(each) # 对clean_rout进行分词
		each = ''
full_text = [] 
for item in text:
	if item != '':
		full_text.append(item) #去除空集
tf = {} #以字典形式存词频
for word in full_text:
    if word in tf:
        tf[word] += 1
    else:
        tf[word] = 1
for item in tf:
    if tf[item]>20: #输出词频大于20的单词
        print(item,tf[item])

利用上述代码,对title中词频大于20的关键词进行了统计,如下图9。其中Python词频231,SPSS为131,R为62,SEM为45,Pandas为29,EXCEl为28,DATA为21。表明Python和SPSS已经成为数据分析的常用语言,传统的EXCEl表格工具重要程度越来越低,但R语言的依旧受欢迎。搜索引擎营销(SEM)相关的数据分析也越来越受关注。对中文关键词进行分析,发现可视化tf-idf最高,说明了数据可视化是数据分析的重要内容。此外,随着信息化社会的发展,人工智能和机器学习在数据分析出现频率越来越高。“财务报表”和“企业”在数据分析的视频题目简介中出现频率也较高,表明数据分析更倾向于实际案例,自学者也更喜欢实际操作性视频。

表 6 中文关键词词频排序

d170a77c5ad750e383eb227667884d75.png

5c7b364d87be3f3275e280cdf06894fb.png
图9英文关键词分布柱状图

结论:1) 数据分析视频数量在2018年迅速增加,增加了约3.5倍。越来越多的从业人员开始关注数据分析行业;

2)数据分析视屏在2018年以前以短视频为主,平均单个视频长度约1.25小时。2018年后,视频长度急剧增加,平均单个视频长度约6.40小时;

3)数据分析视频各个特征量随着时间增加显著增加,但评论、弹幕和分享次数在2018年区域稳定,表明更多自主学习者更关注视频内容,较少互动。

4)0-2000时间区间的视频较易获得较高的点赞、投币、评论和收藏。另一方面时间历时超过10000也获得较多的投币、点赞和收藏,但评论次数偏低。一方面表明视频质量较高时即使视频长度较长,观众依旧能够接受并喜爱这个视频。另一方面表明,对于较长历时的视频,观众很少评论。可能由于观众尚未真正点进去学习,只是习惯性点赞、收藏和投币;

5)大多数学习者打开视频习惯性点赞,投币和转发,只有真正喜欢认为有用时,选择弹幕和收藏;观看数据分析视频,学习者点赞同时往往也会选择性投币。

6)python、SPSS和Excel等已成数据分析师必备技能,其中尤以Python逐渐取代R等语言成为数据分析师必会语言。此外随着人工智能、大数据和深度学习兴起,机器学习算法、Hadoop、Spark大数据工具和tensorflow深度学习框架也逐渐成为数据分析师的常用工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值