数据科学家 / 统计学家应该养成哪些好习惯?
[Update 11/09/2016, CST] 不知为啥一下子多了~30赞,难道跟川普当选有关???之前有想更新这个回答一直没找到机会,借着这个历史时刻更新一下.加一条习惯:0. [美国大选教导我们]数据会说谎,要谨记! 详见正文. ======================================================= [Original 08/25/2015] 已有的答案大多谈的都是high level的比较抽象的东西,像了解业务,阅读人文,培养好奇心这些.我来说说具体关于数据分析的习惯好了. 0. [美国大选教导我们]数据会说谎,要谨记! [Added 11/09/2016 CST] 嗯.数据会说谎.借着美国总统大选的民调来说解释这个再贴切不过了. 相信大家已经熟知,2016年美国总统大选中各大民调被昨晚的结果狠狠打脸.首当其冲的被打的最狠的估计就是著名的538了.下图是我昨天晚上12点10分(11/09/2016, 12:10 AM, CST)在538网站上的截图.上半图关于总统胜选概率:红色代表Trump获胜,蓝色代表Clinton获胜;下半图是electorial college vote的数目预测.我想说的是截止到昨晚9点(CST)包括我之前一两个星期断断续续刷过538的数据,538给出的预测一直都是希拉里80%左右的概率胜出,与投票结果是完完全全反过来的,真是让人匪夷所思! 关于美国大选的民调还有更极端的例子.那就是1936年美国时任总统罗斯福对阵共和党候选人兰登的选举[1].当时已经正确预测5次总统大选结果的民调机构"文摘周刊""随机"抽样抽样了240万民众之后预测兰登将以55%比41%的压倒性概率胜出.而最后的大选结果反差令人咋舌. 民调: 结果: 参见下图.是的,你没有看错,完爆,全线飘蓝啊!! 注:此图为1936年美国大选选举人票(electoral college vote by state). 注:此图为1936年美国大选民众票(popular vote by county). 那么,为什么当时成功预测5次大选的民调突然错的这么离谱呢? 要探究为什么,先得了解当时那个民调是如何做的:(1)"文摘周刊"从电话簿和俱乐部会员列表的数据库里"随机"抽取了1000万人邮寄问卷调查,(2)只获取了240万反馈结果,然后根据这240万做的预测. 偏差一:(1)的抽样中出现了选择性偏差(selection bias):在1936年,电话还没有普及,只有四分之一的家庭有电话;而俱乐部会员当然是富裕的群体.这个民调在无意识的情况下自动排除了相当一部分低收入人群.作为背景知识:罗斯福的政策更倾向于穷人,兰登的政策倾向于富人.当时的美国正处于大萧条,有数以百万计的失业人口和低收入家庭.所以,尽管该民调样本足够大,但是没法正确反映出不同人群的分布百分比,所以不能代表总体. 偏差二:(2)中出现了反馈偏差(response bias):据后来的研究表明[2],即使(1)中存在相当程度的选择性偏差,如果"文摘周刊"能够收到所有的反馈,依然能够准确预测罗斯福胜出(尽管比例不准).更不幸的是,给予反馈的240万中,大部分是支持兰登.(51% vs. 48%:注意这个数据是后来Gallup追踪之前受访人群做的调查.由于人们记忆偏差等原因,这个数据跟原始的"文摘周刊"的比例不太一样.)所以导致了错上加错. 总结一句话:1."文摘周刊"选取了倾向于支持兰登的sub-population来做调查,导致选择性偏差;2. 而在这堆偏差人群中,支持兰登的人群更多地给出了反馈意见. 没有收到问卷的和收到了但是没有回应的那帮人,就是当时的"沉默的大多数".他们默默地等到大选日,悄无声息地用选票发出了他们的声音,狠狠地给民调一记耳光! 好了,回到今年的大选结果.聪明的,你告诉我,为什么今年所有主流民调全部都错了,而且有些还错的这么离谱呢?? 历史啊,总是惊人的相似! 1. 分析数据前,一定要尽可能多的进行数据可视化!可视化!可视化!做exploratory data analysis! (说三遍!!!) 我上过的几乎所有的应用性的统计课程上的老师都会强调这一点.这个习惯对于数据科学家,统计学家来说估计是最最实用的.在实际的数据分析过程中,数据可视化可以揭示很多insights:从选择什么样的模型,选择哪些feature建模,到如何分析结果,解释结果等等. 给一个很著名的例子, Anscombe's quartet (安斯库姆四重奏):这个例子包含四组数据.每组数据有11个(x, y)数据样本点.四组数据样本里x的均值方差全相等,y的均值方差基本相等,x与y的相关系数也很接近.导致的结果是,四组数据线性回归的结果基本一样.但是,这四组数据本身差别很大.如下图. 如果不做可视化,简单跑一个线性回归,我们只能得到同样的回归线.数据可视化后,很直观的,左上图是传统的线性回归;右上图需要high-order nonlinear term;左下图x和y是线性关系,但是有outlier;右下图x和y没有线性关系,也有outlier, etc. 每一个数据科学家都应该熟悉各种图的画法,更重要的是,不同的图如何反映不同的信息以及面对不同的数据类型时,应该选择哪种图才能最好的揭示数据里蕴含的信息. 为此,强烈推荐关于R里ggplot包的教程: 当然另一方面,如果数据量太大维度太高,数据可视化做起来就比较困难.这时候就需要一些经验技巧了. 2. 跑完程序得到模型结果时,一定提醒自己:任务只完成50%,分析,验证,解释结果才是根本! 很多时候,我们以为写完code跑完程序就完事了.能做到这一步只能算是一个合格的data analyst.这离数据科学家,统计学家还差远了.分析,验证,解释结果才是根本! 这个过程更需要data sense, domain knowledge, and statistical expertise. 在拿到结果的时候,一定要多问自己为什么.模型assumptions是否满足?结果是否make sense?能否解答research question?特别当结果不符合expectation时,要么有新发现,要么有错误!如果有错,错在哪里?如果模型假设不成立,如何修正?是否有outliers,如何处理?或有missing values,missing的机制是啥样的(missing at random, completely at random, or NOT at random)? 是否有multicollinearity? 数据收集是否有bias (如selection bias)?建模是否忽略了confounding factors ( )? 3. 养成story-telling的习惯! 把分析结果跟你的boss或者collaborator讲!务必让他们明白!这个太需要技巧了, 特别是当你的collaborator是layperson的时候. 不会说只能等着被虐,哪怕analysis做的再好!Over. 参考文献: [1] [2] Squire, Peverill. "Why the 1936 Literary Digest poll failed." Public Opinion Quarterly 52.1 (1988): 125-133.