数据科学家 / 统计学家应该养成哪些好习惯？
[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.