数据展示
数据展示,用图表说话
新华网关于学生冬季长跑的调查结果让人着实跌眼镜,一共调查了100人,报告中的结果都是xx.xx%形式的,例如“92.79%的学生认为强健了自己的身体”。这0.79个人是怎么来的?
咱们学统计的,应该对数字有一定的敏感性,比如当你看到小数位中含有667这样的数字(e.g. 0.291667)时就应该警觉:对方是否给出了样本量?如果没给的话,你就应该怀疑这个数字本来是0.29166666……如果你不知道这个比例是怎么来的,那么就拿一些整数去乘这个比例,看看哪个数字乘以这个比例能得到整数。最终你发现是24的倍数,样本量是7的倍数。然后你再想,7/24、14/48、28/96、……这一系列数字哪对更符合这个调查的背景。如:若你怀疑调查者很懒,那么不妨猜测他/她就调查了24个人。
以上只不过是低级的数字游戏,对统计来说根本没派上用场,现在很多人都琢磨着怎么建个模型整个P值去忽悠答辩委员会,而事实往往是,费尽千般心思,辛辛苦苦调查来的数据在建模之后根本没法用,要么系数是反的,要么不显著,或者有自相关,或有异方差,总之和初衷很不符,此时,离答辩往往只剩下几个星期,怎么办呢?只好眼睛一闭心一横,改数据吧!怎么改呢……【此处省略八千字】最后,王子和公主们过上了幸福生活。
我一般不相信经济学论文中的统计模型,原因之一就是数据。
前几天又看了一遍Processing的教程和示例,并且把作者Ben Fry的一本书”Visualizing Data”找来看了看,最终的结论是:Processing适合艺术设计人员使用,但并不适合数据分析人员使用。
Visualizing Data一书中基本上以几个编程的例子为主线,从统计的角度来说,评价只能是Just-so-so;与Cleveland (1993)的同名书比起来在统计上的价值差距甚远。不过,Processing的最初目标本来也不在统计,而在于使得编程变得有趣,不可否认,用Processing写代码的确很有趣,而且设计出来的作品可以惊人地绚丽。
昨天上课老杜说饼图是那位提灯女士发明的,事实上这种说法并不确切;不过很不幸,好像有很多人都说饼图是南丁格尔发明的。
历史记录最早的饼图是在William Playfair的著作中,关于这一点,我在我的书中第一章就说明了。南丁格尔的妙处在于把条形图以饼图的外观表现出来了:将一年12个月分散在圆的1/12扇形上,扇形的半径长度与统计数值成正比。乍一看像饼图,实质上是条形图(传说中的玫瑰图)。
老杜拿着Spine plot就可以忽悠中铝的老总(估计老杜自己并不知道自己用的是Spine plot),看来我可以去忽悠小胡了。
今天大致浏览了一下Google可视化API,说实话现在Google在可视化方面开发的库还太贫乏了,寥寥几种可视化方法,对统计数据展示来说还相当不够用。下面我用它的MotionChart库结合R的正态随机数做了一个布朗运动展示,这个展示比我的animation包中那个布朗运动要更平滑,这也一直是我想达到的目的。
由于涉及到繁重的加载数据过程,所以JavaScript运行起来会很慢,使用IE的客官耐心等待20秒至半分钟左右(Firefox比较快)。以下是示例代码:
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["motionchart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
data.addRows(750);
data.addColumn('string', 'point');
data.addColumn('number', 'year');
data.addColumn('number', 'X');
data.addColumn('number', 'Y');
data.setValue(0, 0, "01");
data.setValue(0, 1, 1901);
data.setValue(0, 2, 1.24);
data.setValue(0, 3, -0.37);
data.setValue(1, 0, "02");
data.setValue(1, 1, 1901);
data.setValue(1, 2, 0.12);
data.setValue(1, 3, 0.48);
data.setValue(2, 0, "03");
data.setValue(2, 1, 1901);
data.setValue(2, 2, -1.5);
data.setValue(2, 3, -1.21);
....
data.setValue(748, 0, "14");
data.setValue(748, 1, 1950);
data.setValue(748, 2, 1.73);
data.setValue(748, 3, -2.24);
data.setValue(749, 0, "15");
data.setValue(749, 1, 1950);
data.setValue(749, 2, 2.38);
data.setValue(749, 3, 16.65);
var chart = new google.visualization.MotionChart(document.getElementById('chart_div'));
chart.draw(data, {width: 600, height: 500});", " }
</script>
<div id="chart_div" style="width: 600px; height: 500px;"></div>
话说今日有一印度小经理给我发个邮件,让我LaTeX排版给他开个价,我晕,从哪儿看见我是干这行的了?
据我所知,历史上“大家来找茬”游戏中应该从来没有过找统计数据的茬的事件(不过国外曾经有类似的事情),老夫再此开一个先例,数据如下:
一共20000条数据,2个变量,看看这数据有啥特别之处呢?走过路过,千万不要错过。
大约一周后公布答案。
注:答对有奖。于北京市各大商场超市领奖,领奖办法:任意商品均为奖品,拿了就使劲跑。
—————————————我是答案分割线—————————————
事实的真相是:这20000行数据中,有10000行是正态分布随机数,另10000行是在一个半径为0.5的圆上。为了揭露其邪恶本质,特提供如下五种办法:
http://yihui.name/en/2008/09/to-see-a-circle-in-a-pile-of-sand/
欢迎大家继续提供解决方案。
Density surface of 2D variables from Yihui Xie on Vimeo.
最近评论