爆款题目为什么会吸引点击量?
原作者:himono(日)
译者:数据仓鼠
译者说:相信大家都有在B站等地传过投稿,拟题目的时候是否很随意呢?这位日本小哥通过数据分析告诉你,想要点击量,拟题需谨慎!
写在前面
这篇文章的目的
自己开始学习数据科学(data science)是因为它看起来蛮好玩的样子。提到Pandas之类的程序包,和SVM模型之类的,关于身边实例的介绍少之又少。喂别再提“菖蒲花的分类”那个老掉牙的例子了!
本文以“如何增加VOVALOID初投稿作品的播放次数的分析”为例,带你体验一下数据分析的全过程和步骤。如果其中对你有何启发的话那就再好不过啦!^_^
本文的构成
大致按以下顺序进行分析,参考了计量经济学实证分析文献的提纲,加入了编代码的技术。[i]
题目设定
假说设定
用API取得数据
数据分析
评价分析的妥当性
本文所用到的手法
本文主要目的是带领读者体验一下数据分析的过程,如果你对在分析中涉及到以下小专题感兴趣的话,也顺带看一下。
*用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.
原文链接:http://qiita.com/himono/items/bd42e005009bafb7201f#fn1
数据特工介绍
后台回复“特工”加入我们
- 粉笔划过黑板的声音 为什么会让你抓狂?
- 为什么不同年份的相同葡萄酒价格变化会如此之大?
- 为什么唱歌总是跑调?
- 揭秘: 秒杀为什么抢不到?
- 为什么会得胃溃疡?得了胃溃疡到底有多严重?
- 农村很多人为什么把父亲叫“大”,看完后明白了…
- 关晓彤又双?上热搜了,为什么大家都不喜欢关晓彤?
- 为什么腰椎痛,看过医生这个比喻你就明白啦!
- “抢票”为什么这么难?“黄牛”团伙开发软件抢囤
- 家长们为什么来参加北京国际学校博览会?