先复习一下前几天,我们学习了数据分析的框架:
今天我们开始对框架进行详细的拆解:
今天首先给大家介绍一下数据分析前的准备工作,一共分为四部分:首先是对问题的分析,其次是数据的收集,然后是数据的预处理,最后是数据的预分析。
首先是对问题的分析:
对问题的分析不是今天想要说的重点,但是为了框架的完整性,今天做一些简单的介绍。关于对问题本身的分析,人类的知识体系在这方面沉淀了大量的智慧和经验。
其中尤其是以维特根斯坦的语言哲学分析,还有诺贝尔奖得主西蒙的满意决策论,还有大量关于宗教哲学政治关于标准和价值观方面探讨的积累。任何一个纬度的叙述,都有可能会穷尽一个人一生的经历。所以今天只能点到为止,简单给大家做一个介绍。
关于问题的提出
首先是关于问题的提出。
问题的提出可能来自老板,也可能来自同事。关于公司人际关系的分析,不是我们探讨的重点。当然这一点在实际工作中尤其重要,因为每个人的精力都是有限的,然而每个人面对的任务其实是无限的,我们必须有选择的去完成一些对我们同时对公司重要的项目。
我们首先来看一下,当我们面对一个提出的问题的时候,我们是在提问什么?
在大多数时候都觉得当我们需要去解决一个问题的时候,我们需要创造性的提供一种解决方案,实际情况可能和我们的常识不是很一样。
我们可以想象这样一种情景:
通常认为,在回答一个问题之前,你必须提出那个问题。或者,换个比喻的说法,要找的东西必须是已经丢失的东西。但这是不是真的呢?当一个人发现了一个金矿脉时,是不是大自然丢失了这个金矿脉呢?如果我们能找到我们不曾丢失的金子,我们就有可能回答我们未曾问过的问题。
现实工作中,我们很多时候当面对一个问题的时候,我们往往需要自己寻找一个解决方案,而不是去创造一个解决方法,所以我们工作的重点应该是怎么去和我们已有的积累形成联系,或者用更加数学化的语言描述说。怎么将现实问题映射到我们的模型空间中去,这应该是我们的工作重点。
关于问题种类的分析
有问题种类的分析,我们先来看一下我们为什么要分析一个问题的种类。现实中我们面临的实际问题,它的表达形式可能是千变万化的。然而我们资源是有限的,又不能为每一种问题都去积累经验,都去建立模型。我们只能为一些包含重要特征的问题,去建立模型空间。
所以当我们面临一个问题的时候,首先应该去看一下这个问题,它本质上在说什么,它的标准形式是什么样的。
这个过程中,我们首先要做的第一步需要剥离自然语言。这一点比较容易理解,我们平时在说话的过程中,语言中有很多冗余的成分。我们首先要做的就是把这些冗余的成分删除掉,其次是把我们一些似是而非的名词替换成我们的标准名词。经过对自然语言的整理之后,我们更容易发现一个问题的本质。
举个例子:可能大家会更加明白,比如:甲方爸爸给了这样一个需求:俺们公司最近遇到了一件特别闹心的事情,一举办活动,活跃用户就少很多,我们很着急,你们快来帮我们看看巴拉巴拉。以上这段话转化一下就是:举办活动和活跃用户的相关性分析。
用集合的语言和系统泡泡图,去重新描述问题。去把一个在复杂现实情景中的问题,转化为若干研究对象和这些研究对象之间的关系的问题。
当工作进行到这一步的时候,我们就已经已经可以清晰的看出一个问题说出的类别了。一般在世界上所有的问题都大概可以分为三类:
首先是一类探索是什么的问题,也就是关于一些科学性的问题。这一类问题的核心特征是科学研究中对准确率要求非常高,一般要达到99.7%以上。在工作中,要求可能并不需要这么高。还有一类问题是关于为什么的问题,也就是关于一些价值评价标准的问题。日常所说的宗教哲学政治探讨的问题,都属于这个范畴。这个问题的特征是特别讲究多远,从本质上来看,各个价值观之间它们是没有可比性的。然而这只是理论上的,实际生活中还是会看到很多大家因为不同价值观真的面红耳赤的情况,这一类问题在研究过程中非常体现的是组织的价值观,还有上级的价值观。还有一个问题是关于怎么办的问题,这一类问题本质上是属于一类工程问题。在这类问题中我们要注意的是,我们并不是像求解第一类是什么问题,要追求极高的准确率,我们追求的是在资源有限的情况下,我们如何把一件事情做到流畅,也就是60分到80分的样子。也就是说在大多数的时候,我们求解的不是最优解,我们求解的仅仅是一个满意解而已。现实生活中我遇到遇到的本质性的三类问题,其他任何问题都可以转化为这三类问题,或者转化为这三类问题的组合。这三类问题在模型空间里也有标准的对应形式,价值观的探索问题,本质是一类标记或者分类问题。关于是什么的探索问题,往往是一类预测相关性的问题。关于怎么办一类的工程问题,本质上是一类关于过程描述模型和概率描述模型的问题。
对问题边界的边界分析
对问题的边界分析就是我们这个问题解决之后,最好可以达到什么样的效果,如果问题没有能够解决,最坏的结果是什么样的。
为什么我们要对问题进行边界分析?因为我们工作中,面临的大多数问题,都是在给定限制条件下寻求满意解,因为给定了资源限制,也给定了我们能力的边界。
从更深层次上来看,一个工程问题优化的空间永远都是有限的。
为什么呢?
因为从本质上来看首先对问题的测量就有很大误差,然后图灵机限制/哥德尔不完备定理/摩尔定律这些底层规律都对工程问题的优化做了边界上的限定。所以,千万不能以科学的态度和方法对待工程问题.。
那么我们如何对问题进行边界分析呢?这里给出一个参考思路,我们工作中往往面临来自三方面的限制:时间/质量/成本;我么可以选择一个必须达到要求的,然后去调节另外俩者的关系。
比如:我们现在要在放假之前,完成集中周作业/考试/谈恋爱等等若干项目,我们先抓住主要因素:时间,必须在放假之前完成,然后就是质量和成本的关系,成本方面可以削减项目,比如相比交作业和考试,恋爱就可以先不谈了,质量方面,追求中等质量,作业不返图,考试不挂科就可以.
数据的收集:
数据收集分为内部数据读取和外部数据收集俩部分,今天主要谈内部数据读取的问题。
内部数据收集
1.数据库种类
关系型数据库,是指采用了关系模型来组织数据的数据库。关系模型是在年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。
简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系型数据库的最大特点就是事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有要求的系统中,如典型的银行系统。
但是,在网页应用中,尤其是SNS应用中,一致性却不是显得那么重要,用户A看到的内容和用户B看到同一用户C内容更新不一致是可以容忍的。或者说,两个人看到同一好友的数据更新的时间差那么几秒是可以容忍的。因此,关系型数据库的最大特点在这里已经无用武之地,起码不是那么重要了。
相反地,关系型数据库为了维护一致性所付出的巨大代价就是其读写性能比较差,而像微博、facebook这类SNS的应用,对并发读写能力要求极高,关系型数据库已经无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,都是增加一级memcache来静态化网页。
而在SNS中,变化太快,memchache已经无能为力了),因此,必须用新的一种数据结构存储来代替关系数据库。
关系数据库的另一个特点就是其具有固定的表结构,因此,其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储。
于是,非关系型数据库应运而生,由于不可能用一种数据结构化存储应付所有的新的需求。因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。必须强调的是,数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库这员老将。
2.数据库读取工具
SQL概述
结构化查询语言(StructuredQueryLanguage)简称SQL(发音:/eskjuel/“S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL语法总结:
(选择全部)SELECT*fromcelebs;(创建表格)CREATETABLEcelebs(idINTEGER,nameTEXT,ageINTEGER);(插入行数据)INSERTINTOcelebs(id,name,age)VALUES(1,‘JustinBieber’,21);(选择某列)SELECTnameFROMcelebs;(更新信息)UPDATEcelebsSETage=22WHEREid=1;(添加表列)ALTERTABLEcelebsADDCOLUMNtwitterhandleTEXT;(处理缺失值)DELETEFROMcelebsWHEREtwitterhandleISNULL;(多变量筛选)SELECTname,imdbratingFROMmovies;(唯一筛选)SELECTDISTINCTgenreFROMmovies;(条件匹配)SELECT*FROMmoviesWHEREimdbrating8;(文本部分匹配单)SELECT*FROMmoviesWHEREnameLIKE‘Seen’;(文本部分匹配多)SELECT*FROMmoviesWHEREnameLIKE‘a%’;(范围内的数据)SELECT*FROMmoviesWHEREnameBETWEEN‘A’AND‘J’;(与条件选择)SELECT*FROMmoviesWHEREyearBETWEENANDANDgenre=‘