Categories
日常应用

探索R包reshape2:揉数据的最佳伴侣

前几天放出来的那个R的展示中,有说到其实学R的过程更多的就是熟悉各种函数的过程(学习统计模型不在此列...我个人还是倾向于不要借助软件来学习理论知识,虽然可以直接看codes...笔和纸上的推导还是不可或缺的基本功),然后各种基础函数熟悉了之后很多被打包好的函数就是缩短代码长度的利器了。

excel里面有神奇的“数据透视表(pivot table)”,其实很多时候真的已经很神奇了....不过我还是喜欢R,喜欢R直接输出csv或者xlsx的简洁。揉数据呢(学名貌似叫数据整理),我也还是喜欢写出来代码的形式,而不是直接向excel那样面对结果。只是感觉更加不容易出错吧。

揉数据,顾名思义,就是在原有的数据格式基础上,变化出来其他的形式。比如,长长的时间序列变成宽一点的~当然这个可以简单的借助reshape()函数了。可惜我还是不死心,想找一个更好用的,于是就自然而然的看到了reshape2这个包。

这个包里面函数精华在melt()*cast()。说实话melt()耗了我一段时间来理解,尤其是为什么需要先melt再cast...后来发现这个步骤简直是无敌啊,什么样的形状都变得更加容易揉了,大赞。

warm-up完毕,还是回到正题吧,怎么用reshape2揉数据呢?虽然reshape2支持array, list和data.frame,但是我一般还是习惯于用data.frame,所以还是说说这东西怎么揉吧。揉数据的第一步就是调用melt()函数,不用担心你的input是什么格式,这个函数array, list和data.frame通吃。然后,要告诉他哪些变量是(唯一)识别一个个体的,这句话是什么意思呢?我们先看melt()的参数:

 melt(data, id.vars, measure.vars,
    variable.name = "variable", ..., na.rm = FALSE,
    value.name = "value")

其中id.vars可以指定一系列变量,然后measure.vars就可以留空了,这样生成的新数据会保留id.vars的所有列,然后增加两个新列:variable和value,一个存储变量的名称一个存储变量值。这样就相当于面板数据的长格式了。直接拷一个作者给出的例子:

原数据:

head(airquality)
  ozone solar.r wind temp month day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
dim(airquality)
[1] 153   6

然后我们将month和day作为识别个体记录的变量,调用melt(airquality, id=c("month", "day"))

head(melt(airquality, id=c("month", "day")))
  month day variable value
1     5   1    ozone    41
2     5   2    ozone    36
3     5   3    ozone    12
4     5   4    ozone    18
5     5   5    ozone    NA
6     5   6    ozone    28
dim(melt(airquality, id=c("month", "day")))
[1] 612   4

嗯,这样数据就变长了~然后,就可以随意的cast了...dcast()会给出宽格式的数据,比如我们想把day作为唯一的识别,那么:

names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
head(dcast(aqm, day ~ variable+month))
  day ozone_5 ozone_6 ozone_7 ozone_8 ozone_9 solar.r_5 solar.r_6 solar.r_7 solar.r_8 solar.r_9 wind_5 wind_6 wind_7 wind_8 wind_9 temp_5 temp_6
1   1      41      NA     135      39      96       190       286       269        83       167    7.4    8.6    4.1    6.9    6.9     67     78
2   2      36      NA      49       9      78       118       287       248        24       197    8.0    9.7    9.2   13.8    5.1     72     74
3   3      12      NA      32      16      73       149       242       236        77       183   12.6   16.1    9.2    7.4    2.8     74     67
4   4      18      NA      NA      78      91       313       186       101        NA       189   11.5    9.2   10.9    6.9    4.6     62     84
5   5      NA      NA      64      35      47        NA       220       175        NA        95   14.3    8.6    4.6    7.4    7.4     56     85
6   6      28      NA      40      66      32        NA       264       314        NA        92   14.9   14.3   10.9    4.6   15.5     66     79
  temp_7 temp_8 temp_9
1     84     81     91
2     85     81     92
3     81     82     93
4     84     86     93
5     83     85     87
6     83     87     84

或者对于每个月,求平均数:

 head(dcast(aqm, month ~ variable, mean, margins = c("month", "variable")))
  month    ozone  solar.r      wind     temp    (all)
1     5 23.61538 181.2963 11.622581 65.54839 68.70696
2     6 29.44444 190.1667 10.266667 79.10000 87.38384
3     7 59.11538 216.4839  8.941935 83.90323 93.49748
4     8 59.96154 171.8571  8.793548 83.96774 79.71207
5     9 31.44828 167.4333 10.180000 76.90000 71.82689
6 (all) 42.12931 185.9315  9.957516 77.88235 80.05722

当然还有更强大的acast(),配合.函数:

library(plyr) # needed to access . function
acast(aqm, variable ~ month, mean, subset = .(variable == "ozone"))
             5        6        7        8        9
ozone 23.61538 29.44444 59.11538 59.96154 31.44828

嗯,基本上数据就可以这么揉来揉去了...哈哈。怎么感觉有点像数据透视表捏?只是更加灵活,还可以自定义函数。

此外还有recast()可以一步到位,只是返回的是list;colsplit()可以分割变量名...函数不多,却精华的很啊。

--------------------
题外废话:我的小册子哎~只能这样零零碎碎的写一些了,事后再统一整理进去好了。不要鄙视...

Categories
事儿关经济 读书有感

声誉溢价让资本市场波动愈演愈烈?

按说我一个不怎么研究finance的人,是没什么太多积淀来对这篇paper评头论足的。只是翻这一期AER的时候看到这篇文章了,感觉有点意思,所以简单的说说他的观点。感觉在成熟的资本市场(不包括中国),对于波动性的研究已经越来越细致,各种可能的因素对于市场的冲击都在其中。相比而言,不成熟的市场就有更多匪夷所思的套利机会,这也是很多量化工具切入点吧……不懂乱说,finance我总喜欢用寡头博弈去理解嗯。

Guerrieri, Veronica, and Péter Kondor. 2012. "Fund Managers, Career Concerns, and Asset Price Volatility." American Economic Review, 102(5): 1986–2017.

working paper版本可以直接点击上面的标题链接下载。

前几天的那篇讨论薪酬的paper类似,这篇只是更直接的在说基金经理的报酬,当然随着市场的不同有些假设也不大一样。

先说假设。可能大家都知道,金融圈有两种基金经理,靠数量模型的和靠搞市场关系的。前一种基本就是天天对着计算机,后一种则天天到处跑,然后做的就是去找企业的内幕消息。在这样的现实下,肯定有一部分经理对某些企业的违约情况有着更多的信息。

可惜市场永远是信息不对称的。投资者并不知道哪些人确切的有这些内部信息,他们只能参照这些基金经理以往的业绩来决定投资与否。久而久之,我们就见到了很多所谓的“大牌经理”,做到极致的有庞氏骗局的创立者Ponzi,当然他是直接融资了。随着时间的积累,基金经理之间形成了一些声誉之类的信息,可以向外传递。这东西和我们在淘宝买东西时候看到的卖家评价别无二致——亲,这个经理以前没赔过哦~ 很简单的道理,很多人为了规避风险往往会在淘宝选择大卖家,这样大卖家就借助自己既有的声誉可以设置更高的价格(关于在位者与进入者的博弈模型暂时不考虑,那个更符合最近京东和苏宁的故事,有空另外讲~),这就是所谓的“声誉溢价”了。声誉溢价会对基金经理有着正的激励,所以出于对职业发展的考虑他们的投资决策会有所影响——比如当风险极高的时候,一般会选择保守策略。

这篇文章很有意思,一般说来“高风险高收益”,换成人话就是“舍不得孩子套不住狼”,当企业的违约风险比较高的时候,其对应的(不违约时候)收益也应该比较高,这样就可以补偿这些基金经理被炒鱿鱼的风险。可是这不是一个静态的过程嘛,随着时间的流逝,大牌经理的声誉溢价会越来越多的影响投资者的决策,进而更多的影响基金经理的投资偏好(高风险还是低风险金融产品),进而“小流汇江海”,声誉溢价会带来金融市场本身波动的放大,于是我们看到金融市场的一起起风起云涌浪潮波动愈演愈烈。市场的过激反应,便有可能来源于这种声誉溢价。

简单的说,这篇文章得出的就是这么一个结论。放大冲击的波动示意图见下。

2013-12-09 16_55_23-guerrierikondor_nov7.pdf - Adobe Reader

让我简单的评价的话...嗯,就算有这么个channel,我们也无力从机制设计上改变什么。市场自然演化的结果。

Categories
日常应用 网络新发现

颇具Geek精神的impress.js

好吧,感谢@乐天诗人 童鞋的推荐,让我见识到了这么震撼的presentation template。面对这种东西,完全没有抵抗力5555。什么powerpoint,什么beamer...什么pandoc自带的那几个破烂HTML5...一切都定格在impress.js。不要问我这是什么,如果你连自己搜都不会,就太不符合geek精神了。作者超级霸气,比如在帮助文档里面...

HOW TO USE IT

Use the source, Luke 😉

If you have no idea what I mean by that, or you just clicked that link above and got very confused by all these strange characters that got displayed on your screen, it's a sign, that impress.js is not for you.

Sorry.

然后乖乖的看源代码,好不容易看完几百行废话连篇自恋不已的说明,悍然发现:

Oh, you've already cloned the code from GitHub?

You have it open in text editor?

Stop right there!

That's not how you create awesome presentations. This is only a code. Implementation of the idea that first needs to grow in your mind.

So if you want to build great presentation take a pencil and piece of paper. And turn off the computer.

Sketch, draw and write. Brainstorm your ideas on a paper. Try to build a mind-map of what you'd like to present. It will get you closer and closer to the layout you'll build later with impress.js.

Get back to the code only when you have your presentation ready on a paper. It doesn't make sense to do it earlier, because you'll only waste your time fighting with positioning of useless points.

If you think I'm crazy, please put your hands on a book called "Presentation Zen". It's all about creating awesome and engaging presentations.

伤不起啊...还是乖乖的去找“Presentation Zen”这个东西吧。在书到手之前,乖乖的先弄一点东西应付一下接下来的presentation。可惜没搞定knitr,总是报错。只能手动拷代码进去了,sigh。

impress

BTW,这里有个impress.js制作的稍稍潦草的slides,大家凑活着看一下,嘻嘻: http://loyhome.com/impress/ 注:中文默认用“冬青黑体”,没有的自己看着办吧....

Categories
互联网产业观察 读书有感

互联网广告评估的“不可能定理”?

题外话若干。本来是打算老老实实呆在家里,吃饱了睡,睡饱了吃,吃饱睡饱看奥运的。结果想起来有个电影还没看,搜了一下居然已经上映了,果断下手抢票。可怜唯一的一个场次还是晚上十点半,索性先写点东西再出门看电影嗯嗯。这么晚了,只能一个人去看了,真伤不起啊~

继续说Rao的paper。和昨天说到的那篇相关,这里还有一篇working paper也是在说在线广告的评估问题。

On the Near Impossibility of Measuring Advertising Effectiveness (joint with Randall Lewis)

先看paper中引用的几个数字:

1. 每天,美国人平均要看25-45分钟的电视广告,另加不计其数的户外广告和网络广告。
2. 一些商业报告指出,每年美国的广告业营业额大概在1730亿左右,等价于每人每年500刀。
3. 那么平均算下来,广告投放者每人每天得拿到净利润1.35刀才可以盈亏平衡。
4. 按照企业平均边际收益水平计算,这些大概会带来4-6刀的产品销售额。

嗯,也就是说,我们扪心自问——每天我所花费的钱中,至少有5刀是被广告影响的?而对于不同行业不同产品,比如快消品和汽车广告,前者可能在每个消费者上得到的收益差不多,而后者可能会相当极端——要么是数千数万的消费,要么就是0,波动蛮大的(即方差很大)。这样说来,广告投入到底花的值不值呢?这个评估命题显得有点错综复杂了。

Rao在Yahoo!的时候,他们做了25次在线广告的随机实验(对应广告费为近三百万刀),然后发现,就算是大样本实验,由于个体的差异性太大造成太多噪声,广告的效果可能被因此低估。很多广告主关心的问题,就算借助实验,可能也是无法完美回答的——平均的ROI可能达到50%,但是鉴于方差实在太大,95%的置信区间可能就异常之宽了。这样,显著性检验什么的就很难拒绝“0效果”的原假设了。

与此同时,不做随机实验,效果更加的不可信...总之就是,这东西确实太难评估了,不做实验完全不可信,做实验也没法特别完美精确的评估...呃,听起来就像一个互联网广告评估的“不可能定理”...在互联网这样可以很好的跟踪用户点击什么的平台都没法评估广告效果,那么传统媒介如户外广告什么的,是不是评估就成为了更加困难的任务了呢?哎,数据完全不给力啊...也难怪我们这些天天做事的人痛苦的挣扎在评估指标的各种纠结中...

不过这篇paper,看起来真没营养啊...果然还是econ出身的,marketing sense不是那么强烈...哎~以后还是看看marketing science的paper好了。

Categories
互联网产业观察 经济、IT观察与思考

那些埋伏在互联网公司的经济学家....

嗯啊,自从著名的微观经济学家Varian跑到google兼职之后(话说Varian这厮最著名的八卦,就是自己在买新彩电之前,各种搜集数据建立模型,然后经过各种最优化选择了最佳时点入手...不就是买个电视嘛,至于这么学以致用嘛~),经济学帝国主义展露出其雄心勃勃的志向——无底线的渗透到各个行业各个环节。有的披着数量分析的外衣,有的带着策略决策的高帽,总之就是各种高端各种名正言顺。然后看看他们发出的paper嘛,什么呀,还是economists这群人自己的逻辑规则。哎呀呀~

最近看AEA系列的文章,发现了两位埋伏在互联网公司的大神,Justin M.RaoDavid H. Reiley,貌似原来都在Yahoo!后来一个跑到了google一个投奔了Microsoft。然后这俩人还到处在econ期刊上面灌水,嗯嗯,小小谴责一下~你们又不评tenure神马的,干嘛总抢有限的publication资源啊(好吧其实这俩明明是过着我羡慕而暂时不可得的生活...)。

本来先看到的是这俩人发在JEP上的,关于垃圾邮件的:

Rao, Justin M., and David H. Reiley. 2012. "The Economics of Spam." Journal of Economic Perspectives, 26(3): 87–110.

然后顺藤摸下去,找到了俩人的网站(作为具有geek气质的经济学家,这俩人果然都有独立网站~),然后就看到了更多的papers:

The Good News-Bad News Effect: Asymmetric Processing of Objective Information about Yourself (local copy) (joint with David Eil AEJ Microeconomics July 2011

Here, There and Everywhere: Correlated Online Behaviors Can Lead to Overestimates of the Effects of Advertising (local copy)  (joint with Randall Lewis and David Reiley). Proceedings of World Wide Web Conference 2011 Research Papers

嗯嗯,这两篇看起来也很有意思(对他们研究NBA的那些文章表示~米有兴趣)。这三篇中,最符合我现在的迫切需求的就是最后一篇——在线行为中的相关性与互联网广告效果评估。米办法,现在整天对着各种评估,各种错综复杂让人经常抓狂。还是看看文章舒服一点。

现在开始说一下最后这篇文章。记得刚刚到eBay的时候,就有被问到,“怎么从correlation到casuality?”。当然,呃,计量注重的因果推断只是狭隘的统计意义上的因果,不过还是比correlation有着实质进步的。因果推断的方法,嗯,很多,只要解决了内生性问题,什么都好说。那么,好吧,最simple and elegant的就是随机分组实验了,因为是随机,所以分组变量一定是外生的,所以估计了一定是一致的。然后就是根植IV理念的一系列方法,然后就是对付无法观测变量的panel data方法...时序我实在是不了解,所以这里就不知道了(最悲哀的是为什么总被问到时序的问题啊,个体的数据是多么好的面板分析base啊,为什么一定要损失信息弄成一些时序指标呢?)。

回到文章。一开始作者就提到了互联网广告效果评估的一个经典“相关行为偏差”案例:

案例1: 用户行为的相关性与估计偏差

Yahoo!在首页上为某大厂商展示了其品牌广告,之后评估由其带来的相关的关于该品牌的搜索行为。没有对照组的时候,他们使用用户在campaign开始前一个星期的各种浏览行为作为控制变量,然后发现campaign带来的提升效果约在871%到1198%之间,可谓 too good to believe。

然后大家就有疑虑了,作为一个经常访问Yahoo!的用户,自然相比于那些不怎么常来的人有更高的概率看到该广告(在线广告一般定义exposure,即被展现即作为treatment),而且他们作为资深用户更有可能去搜索一些关键词。这样,就出现了这两个变量的高度正相关——搜索却不是在线广告直接引起的,而是用户本身特性决定的。然后大家就会说了,那么干脆把campaign开始前用户的搜索行为也作为一个控制变量好了。但是这个东西实在是不稳定,每天之间波动实在是太大。

简单总结一下,就是被展现过广告的用户for sure会比那些没有展现的用户更活跃,所以本身就是一个selected sample,也没有很好的控制变量可以完全的消除这里的选择性样本问题。而在采用了随机对照试验之后,最终的估计量是5.4%,也就是说实际上直接由广告带来的相关搜索只有5.4%的提升量。

然后就有人说,哦,都是同一站点的行为嘛,自然可能相关性比较强。那么不同站点之间的行为,是不是行为之间的相关性就会比较弱一些呢?然后就不会这样干扰结果了?于是,作者进行了第二个实验。

案例2:网站之间交叉行为相关性

Yahoo!在Amazon上放了一段30秒的视频广告,以推销Yahoo的一项服务。然后他们发现,在接下来的一周之内,这些看到该广告用户的中,使用Yahoo!这项服务的用户大概提升到以前的3倍!可见这个广告是非常之有效啊!

然而有意思的是,在同样的时间段之内,另一组用户看到的是是一段政治广告。作为control group,这些用户对于该服务的使用量也差不多增加了2倍——也就是说,可能是其他的一些campaign或者用户的自然增长导致了活跃用户的增加,而不是直接的源于这段视频广告。对比之后,该广告的效果只能用“微乎其微”来形容了。

所以,不同网站之间的行为可能是高度交叉相关的,不能简单的忽略这种行为相关的可能性去采用一些简单的观测评估。否则,往往估计效果会大大的偏离实际。

案例3:广告会造福竞争对手?

一个在线服务商在Yahoo!上展示了2亿次广告,但是很可惜,Yahoo!无法追踪到该广告为服务商直接带来的用户转化量。不过“幸运”的是,在这段时间,他们追踪到了该服务商的一个竞争对手的新用户注册量。于是,“不幸”的结果发生了——看到广告的当天,用户更可能去注册竞争对手的网站用户。莫非,这段广告不仅仅让投放者收益,而且也造福了竞争对手?(比如促进了消费者对于一项新服务的认知度,我们习惯称之为正面的“溢出效应”)

还好,当时Yahoo!也设置了对照组,发现其实对照组的用户在这段时间之内也有很多人去竞争对手网站注册。所以其实这种溢出效应基本为零,不用担心啦~竞争对手用户数上升可能是与此同时其他促销或者广告行为的影响,与这段广告没什么关系的。

嗯,其实这篇paper本身米有什么technical的难度,稍稍学过一点本科计量经济学的应该都能顺利的看懂,不过几个案例还是蛮有说服力的。唯一稍稍遗憾的是,这篇文章的style还是太economist taste了,不是那么的符合业界人士的思维路径...

我想在此基础之上,稍稍多说几句关于“实验设计”的事儿。随机实验很简单的,解决了很多内生性相关性问题,是一个典型的“better data + simple method = better results"的例子。同样的,很多时候如果可能,提高数据的质量而不是寻求更复杂的模型,往往是解决问题最省力的办法。这里的数据质量不仅仅是说“除噪”这些基本功,而也包括数据是不是贴近分析目的设计和搜集的。去年写了一系列的“社会网络中的实验”,一直在说一个优雅的实验设计会带来多么优雅的分析。当然很多的时候,一些客观的现实问题导致实验也只能被优化到一个特定的层次。其实一直在想的是,连续的实验该怎么设计

有的时候,因果关系不需要一次次的挖掘,实验也不需要每次都做,毕竟实验都是有成本的。如果能设计出来一系列优雅的实验,那么很多问题就可以一次性的干净利索的回答,不好么?不过既然在这里说到这些,说明日常的工作中还是存在很大改进余地的。嗯,有空间才有成长,挺好的~

p.s. 其他两篇papers也会稍后介绍~嗯嗯。