微信号:cntongji

介绍:中国统计网(www.itongji.cn),国内最大的数据分析门户网站.提供数据分析行业资讯,统计百科知识、数据分析、商业智能(BI)、数据挖掘技术,Excel、SPSS、SAS、R等数据分析软件等在线学习平台.

爆款题目为什么会吸引点击量?

2017-10-13 16:40 数据仓鼠

原作者:himono(日)

译者:数据仓鼠

译者说:相信大家都有在B站等地传过投稿,拟题目的时候是否很随意呢?这位日本小哥通过数据分析告诉你,想要点击量,拟题需谨慎!


写在前面


这篇文章的目的


自己开始学习数据科学(data science)是因为它看起来蛮好玩的样子。提到Pandas之类的程序包,和SVM模型之类的,关于身边实例的介绍少之又少。喂别再提“菖蒲花的分类”那个老掉牙的例子了!

 

本文以“如何增加VOVALOID初投稿作品的播放次数的分析”为例,带你体验一下数据分析的全过程和步骤。如果其中对你有何启发的话那就再好不过啦!^_^


本文的构成


大致按以下顺序进行分析,参考了计量经济学实证分析文献的提纲,加入了编代码的技术。[i]


  1. 题目设定

  2. 假说设定

  3. 用API取得数据

  4. 数据分析

  5. 评价分析的妥当性

 

本文所用到的手法


本文主要目的是带领读者体验一下数据分析的过程,如果你对在分析中涉及到以下小专题感兴趣的话,也顺带看一下。


*用Python如何执行niconico动画snapshot 检索API

*用pandas中的groupby,进行条件分组

*Mann-Whitney的U检定(2组中位数的比较)

*“伪关系(spurious relationship)”的排除方法

 

阅读本文需要具备的知识


*numpy,pandas,matplotlib等library相关知识

*统计学基础知识



 1、题目设定



你作为一个VOCALOID新手,刚完成了一个作品投放到了视频网站上,想着怎么样增加一些播放数。作品的质量已经不能改变了,那么怎么在作品命名和简介上花些功夫呢。



 2、假说设定



一般VOCALOID乐曲的最初投稿一定会加上“VOCALOID处女作”的标签,但是在有标签分类的基础上还在题目中加“初投稿”字眼的人是少数。(例如《初音ミク原创~题目~初投稿》这种形式)

 

看到在题目中加入“初投稿“的字眼的人会有些什么样的想法呢。


“哦,这是个新人,听听看什么画风的”,“这个人没什么投稿,听了也没啥用”观众的可能会有这两种反应。如果观众哪怕抱有一点前者想法的,那在题目中加上一些技巧的字眼,收看的人数就会变多了。


本文做一个假设“已经标有”VOCALOID处女作”字样的作品,再此基础上投稿题目中加入“第一次投稿”等字眼,会让播放数增加。”



 3、用API来获得数据



用于此分析中必要的数据有:

*带有“VOCALOID处女作”标签的作品

*播放数+题目

* + 投稿时间(在后半段使用)


另外利用的数据范围是过去4年的(2013-2016年被投放的作品)

让我们从niconico动画网站的snapshot 检索API从取得作品的情报。

官网的指南如下http://site.nicovideo.jp/search-api-docs/snapshot.html

 

列出几个要点


*把检索条件定义出来,用urllib library 编码出来,编码会看起来很简单。

*导入requests library getrequest 送信。requestsライブラリでgetリクエストを送る,所反应的响应转换成json形式来用。

*因为一次能取得的作品数最大为100,所以要用offset和循环语句(loop)

*offset用1601以上会出现报错,因为要用4年的样本,所以要按年份分开统计,以免超过1061个。[ii]


          '_limit': 100,

         '_context': 'apiguide'

       } )

       self.url_ = url_body + url_query

       return self

 

   def get_json(self):

       response = requests.get(self.url_)

       self.json_ = response.json()

       return self.json_

 

 

''' 取得数据 '''

data = []

nicoApi = NiconicoApi('VOCALOID処女作')

 

for year in range(2013, 2017):

   offset = 0

   nicoApi.gen_url(year=year, offset=offset)

   json = nicoApi.get_json()

 

   while json['data']:

       data += json['data']

       offset += 100

       nicoApi.gen_url(year=year, offset=offset)

       json = nicoApi.get_json()

       time.sleep(1)

 

 

''' DataFrame的变换 '''

df = pd.DataFrame.from_dict(data)

df.shape  # => (4579, 3)


样本数为4579[iii]。因为有4年的数据,看来平均每年能有1000多人的VOCALOID新人出现。



4、数据分析



排名与播放数的可视化


在进入真正的分析步骤之前,要大体掌握一下入手数据的概貌。


首先把播放次数放在纵轴,排名放在横轴画出来。这里因为可以预测到人气作品和无名作品之间会有一个大的差异性,所以纵轴我们取log。



结果:

                       

*3/4的作品都有100~1000的播放数。

*纵轴即使取了log也是偏的,(哈无情的阶级差别#)

*基本确认了偏态分布和异常值的存在,可以灵活应用在以后的分析中。

 

用“题目中是否含有‘初投稿’字眼”来进行DataFrame分组


为了进行分析,要把投稿题目中含有“初投稿”字样和没有的样本分开。所以要用到pandas里面的groupby。


groupby中()填入列名的情况比较多。填入函数也可以的。通过填入一个已经定义好的函数的话,利用任意条件进行分组会变得简单化。

 

这次想根据“题目中是否含有‘初投稿’字眼”来进行分组,所以要先定义函数。还要加上和“初投稿”字眼的同义词“处女作”等加入分析。

 

定义函数如下:



把定义好的函数放入groupby()中,这么做的话,这个函数就适用于df1中index中的各要素,根据返回值来进行分组,类似于filter命令的作用。



描述统计量


分组之后,进行详细的分析。

算出每组的平均值,中位数,包含关键字的是处置组,不含的为对照组。


每组包含:

*样本数

*平均值

*中位数

*标准差


一次性求出描述统计量,用agg命令比较方便。



结果:


4579个样本中,包含关键字“初投稿”的作品有109件,加上含有“处女作”的一共有144件。


不管从平均值还是中位数看,可以发现处置组比对照组的播放次数更多。也就是说在题目中加上“初投稿”等关键字,会更加引人注目。


看图来比较


为了使分析更加简单化,要把样本分为两个组。处置组和对照组。

 


结果


那么让我们用画图来看一下2组的差异


*播放数的log为横轴,样本数(编码规范化之后)为纵轴,画出柱状图。

*plt.hist中设置成不同的颜色以及透明度,以便比较。

 


结果:


看图也能看出处置组和对照组的差异。

 

Mann-Whitney的U检定[iv]


好了,到现在为止我们的确出现了所期望的结果(包含“初投稿”字样的题目会使播放量增加),那么前一节中“处置组和对照组播放量有差异”在统计学上是否有意义呢(是否只是碰巧),让我们来检证一下。


前面已经提到了,播放数是呈偏态分布的,比起平均值,我们更应该关注中值,在这里我们不是直接比较两组中值,而是用Mann-Whitney的U检定。


Mann-Whitney的U检定的原假设是“两组间的分布形状相同”[v][vi]。如果否定了这个原假设,那么说明处置组和对照组的播放数差异并非偶然。


U检定是在scipy的stats模块中,检定命令如下:


 

p值是0.0014,说明2组的分布是不同的,并且并非偶然!太棒了!



5、检讨分析的妥当性



在这个分析中必须要注意的问题,‘伪相关’问题,也可以说“相关≠因果”,本例中可以明确的是“题目总带有“初投稿”字样的作品和播放次数之间是有相关关系的”.接下来要讨论的是这个相关属不属于因果关系。

 

遗漏变量导致偏差


比如说,冰激凌的销量和洪水事故之间是有某种相关性的。但是如果下结论说“越吃冰激凌越有可能遭遇洪水事故”,这也未免太无厘头了。


真的的原因是“季节”。忘记导入季节因素就造成上面这种“伪相关”命题。计量经济学中,这叫做“遗漏变量导致的偏差”。(上面例子中。遗漏变量=季节)

 

我们回到VOCALOID的音乐作品中,如果分析中存在遗漏变量,那会是什么原因导致的呢?


我能想到的是“投稿时间”这个遗漏变量,假定会发生下列情况:


*VOCALOID进入衰退期,播放数从2013到2016逐年减少。

*在VOCALOID投放作品是加上“初投稿”字眼已经不再流行,最近很少看到这样做的人了。

 

如果发生上述状况,那么“投稿时间越早->播放数越多”,“投稿时间越早->题目中包含”初投稿“字样的越多”这两个情况出现来重叠,就会产生“伪相关”。

 

让我们来检证一下上面的“伪相关”。


重新做两列“投稿年”和“处置组or对照组”以它们为基准把样本做分组。



结果:即使以“投稿年份”进行分组之后,除了2013年,处置组和对照组的播放数的差异依然存在。

 


重回归分析


确定了“投稿年份”并不是遗漏变量,下面我们用重回归分析做更加严密的分析。


播放数假定为如下式子:

log(播放数i) = β0 +β1 * 处置组dummy_i + β2 * 时间趋势变量i+ 誤差i

 

各变量解释如下:

*log(播放数i):为了减少异常值带来的影响,对播放量取了log

*处置组dummyi:样本i属于处置组=1,属于对照组=0

*时间趋势(time trend)变量i:最新作品和这个作品i的投稿时间之差(单位:日)

 

接下来,说一下重回归分析的好处。


利用重回归分析,我们可以推算出“在时间趋势固定的情况下,处置组和对照组播放量之间到底有多大的差异(β1)。同时,也可以排除掉时间趋势带来的”伪相关”。


说到缺点的话,推定β1的时候用了播放量的平均值,会受到一部分异常值带来的影响。


下面我们实际运行一下


结果:


*从处置组dummy(变量title)的系数β1的p值看,即使做了重回归结果也是有意义的。

*时间趋势变量(投稿时间)似乎不对播放量造成影响。

*推定出β1=0.3582。这个值的意义就是“处置组比对照组播放量高出36%”。


“投稿时间”并不会导致遗漏变量的偏差出现,可以说分析结果具有稳健性。很好!


到这里“分析结果的妥当性评价”已经完成,如果您认为还有什么好的方法和意见,请一定要留言!

 

写在最后


文章好长啊,感谢你能读到最后!


另外我根据这个分析,自己做个一个作品投到了niconico动画上,加上了“初投稿”字样,然后,目前播放量还没过200……要注意统计上的意义和个别事例不能画等号哟!

 

文章到此就要结束了。


非常高兴与你们分享这个例子,如果你能从中学到东西那更再好不过了!



[i]本文的分析包括了“首先设定假说,再用数据检证”这个常见的分析流程。与数据挖掘关系不大

[ii] Offset的使用方法:比如说把播放量按顺序sort,offset=30就是指定排名30以后的数据。

[iii]2017年6月30日

[iv]Mann, H. B., & Whitney, D. R. (1947). On a test ofwhether one of 2 random variables is stochastically larger than the other.Annals of Mathematical Statistics, 18, 50‐60. 

[v]在做Mann-Whitney的u检定之前要假定2组数据是具有方差齐次性的。


End.

原文链接:https://qiita.com/himono/items/bd42e005009bafb7201f#fn1


数据特工介绍

后台回复“特工”加入我们




 
中国统计网 更多文章 惊呆,小学生都会数据分析了! 以餐厅为例,看出互联网哪个职位最有前途! 最浪费不起的是时间,只剩4天,你还等什么?! 用TensorFlow做Kaggle“手写识别”达到98%准确率-详解 【Day8】赤裸裸的统计学:五大常见统计误区
猜您喜欢 微软小冰登上东方卫视打造首个人工智能新闻节目 Tomcat 与Apache/Nginx有啥区别? 译文|为什么要使用开源软件? SEO:为什么百度只收录网站首页不收录内页? Fenng,祝你能创建一家伟大的公司