重新认识数据

误入数据分析行业已有5年多,由于并非“科班”专业毕业,自己从编程到统计理论基础,从简单线性回归到SVM、GBDT、LSTM等复杂算法一路跌跌撞撞学习过来,蓦然回首,才发现做了这么久的数据分析、数据挖掘、大数据等,却没有系统地思考过“数据”这一最基础的要素的确切含义和特性。而所有行业中,基础要素的概念和特性,无疑都是武侠中的“气宗”之本,决定了最终修为的境界高低。回忆所学,似乎也没有哪本书专门讲过“数据”本身,大概大家都对这个词习以为常了吧,就像大家都对政府门前的石狮子习以为常了,很少去想中国境内有没有“狮子”这种动物。今天就结合工作中的个人体会,系统地梳理一下“数据”的概念和特性,欢迎大牛补充。

数据本质上是信息。

数据本质上是对信息的记载。从刻在龟壳上的甲古文,到记录在计算机磁盘上的文字,本质上都是对信息的记载。这些记载的信息,属于数据的一个子类:文本数据。互联网上80%以上都是文本数据,现阶段对于非结构化文本数据的挖掘分析,相比半结构化、结构化的文本数据和数字数据,还是很不充分的。

信息又是什么呢?信息是和物质、能量一起构成世界的三大要素之一。物质和能量相对好理解,没有物质,一切都不存在;没有能量,一切都是死寂的。没有信息呢?一切都没有意义。物质、能量和信息都是客观存在的,只不过人类认知到物质和能量的时间要远早于信息。直到1940年代香农的信息论问世,才奠定了信息学科的基础。

信息的价值不言而喻。战争中,掌握更多情报的一方占据巨大的、有时甚至是决定性的优势。经济学中,信息不对称是造成竞争优势的重要因素。商业决策中,一份具有洞见的咨询报告,即使只用到了简单的统计汇总,也能卖出天价,并给公司指明战略方向。二战中,苏联面对德国的围攻,欧洲战场已无兵可用,但远东部署的60万兵力却不敢调回。关键时期,苏联的特务获知并向莫斯科发送了1比特的情报信息:日本将南下。斯大林得知后,迅速将远东的60万兵力调回欧洲,投入战争中,对扭转整个二战战局起到了不可估量的作用。可见,即使是最小单位的信息量,也可能产生无上的价值。

信息是如此的基础,以至于在人类涉及的所有领域中都会用到。而数据本质上是信息,数据分析就是挖掘信息,因此数据分析在国防、政府决策、战争、金融、电信、互联网、医药、心理学、社会学等领域中都有应用。关于数据的应用案例,推荐去读余子沛先生的《数据之巅》这本书,它讲了美国在200多年的历史中,几乎把数据分析应用到了国家的方方面面的案例,真正接近于运用数据的巅峰状态。

理解了数据的本质,也就明白了行业中常说的“数据是新石油”的含义。我们知道石油储蕴含着能量,而发动机引擎是将此能量可控地释放出来,为人类所用的工具。发动机本身是不产生能量的,它输出的动力性能如何,最主要还是要看喂给它的能量原料如何,其次才是这个发动机的性能如何。“数据是新石油”,这个类比真的很贴切:数据里蕴含着信息!数据挖掘80%的时间花在数据清洗上,这个步骤类似于对石油的提炼,清洗好的数据,相当于提炼好的汽油、柴油等;而各个机器学习算法如SVM、GBDT等,相当于发动机引擎,它们是把数据中蕴含的信息释放出来的工具。做数据分析、数据挖掘的人,最后往往发现自己最需要练好的,不是各个算法的调优啊、推导啊之类看似高大上的技能,反而是数据清洗和加工的功底。是不是感觉被欺骗了?这也是很多新人容易跑偏,眼高手低,老是想去做高大上的模型,看不起清洗数据这类“低级活”的原因。

数据与数字的区别。

可能还是有部分新人和外人直觉上认为数据就是数字,这里特意强调一下这两者的区别。数字是量化了的数据,可以进行加减乘除等数学运算的。数字的“可运算”性是非常重要的,因为一旦可运算,就与数学建立了联系,我们就可以借助整个数学帝国中的工具去分析、优化它来达到目的。而数据更多是指信息,“我们没有数据,所以不知道平衡车的市场前景如何”这样的话中,“数据”的本意就是信息。数据的表现形式除了数字,还可以是文本、图像、音频、信号等等,并且图像识别、自然语言处理、语音识别等也都是机器学习的应用领域。这些数据都不可运算,那数学算法是如何去计算并优化它们的呢?这里就涉及到数据的转换和表征了,所谓表征,就是用可计算的数字,来表示这些不可计算的数据,并且尽量保持数据中的原本信息。数据的表征后面再细谈,这里主要强调一点:一旦用数字表示了文本等不可计算的数据后,就可运算了。

数据与生产者、方差因子。

所有的数据都不是从石头缝里蹦出来的,一定有产生它的生产者。在进行任何数据分析之前,我们必须先搞清楚这些数据是怎么来的,即生产者是谁,生产逻辑是什么。这对于我们理解数据十分重要。比如人的身高、体重、三围数据,人是生产者,生产逻辑是按国际长度标准和质量标准测量的。我在工作中曾经碰到过部分建模同事,做完模型汇报工作时,被领导询问却答不出一个变量的确切含义。数据的含义都没弄清楚,又如何确保你使用数据的姿势水平优不优雅、正不正确呢?

但仅有生产者和生产逻辑是不够的,不同人的这些指标不同,差异的源头来自哪里呢?除了这些显性的、可直接观测的数据之外,显然还有一些隐性的、抽象的内在因子,它们造成了观测数据的差异,因此称做方差因子。显然性别是一个重要的因素,它对身高、体重、三围都有重要的影响,当然性别是一个可观测的方差因子。在语音识别领域中,演讲者的性别、年龄、国籍、口音等,都是造成音频信号差异的重要因子。数据挖掘,很大程度上就是要提取、分析出业务领域内的方差因子,并从各个维度上量化这些方差因子。比如作者从事的风险建模领域内,一个人的信用逾期风险,与贷款收益、还款能力、履约历史、共债水平、稳定性、违约成本等方差因子强烈相关,因此特征工程都以这些方差因子作为指导方向,而选择出的特征也往往反映了这些维度的信息。因此,如果想要挖掘到深处去,一定不能停留于数据的浅表,而要不断地思考并尝试,直到提取出内在的方差因子。而想要找出内在的方差因子,一般又需要对业务知识有足够的了解,因此业内的牛人都会告诉你,一定要理解业务,一定要结合业务,就是这个道理。

数据与产生时的场景。

所谓产生时的场景,是指这些数据被生产出来时,其生产者和生产逻辑的上下文环境。某种程度上,生产者和生产逻辑都是静态信息,有时候只了解这些静态信息是不够的,还要了解场景这一重要的动态上下文信息。如果你在分析数据时觉得不对劲,排除数据出错的可能后,首先就应该去检查它的场景。而想要还原场景,最重要、最不可或缺的就是时间戳。有了时间戳,我们就可以问这个关键的问题了:当时发生了什么?然后查大事记、询问干系人等,一般都能顺利还原出数据产生的场景。曾经有实习MM问“我们10月1号的申请量比平日高了几倍,是不是被黑中介人肉攻击了?”,其实她的问题中已经包含了答案,只是她不懂得还原场景:十一是国庆节啊妹子!也有新人做分析时自动把时间、日期、id等变量自动剔除——时间信息又不能入模型,为什么要留着它呢。这种想法大错特错,不能入模,不代表这个变量不重要。时间信息,恰恰是很少入模,而又最重要的场景信息!

场景除了帮助理解数据,在查找问题时也特别有用。工作中经常遇到已经正常在线上跑了几个月的模型,突然又出错误了。为了救火省时间,我一般首先查找公司最近是不是又上新版本了,哪里改动了什么。然后抽取改动时间点前后各部分数据,快速分析对比一下错误变量的数据,一般就能定位问题了,剩下的事情就是通知干系人去改bug了。

数据与时间戳、id。

上面提到的时间戳,除了能还原场景,还有很重要的作用。你可以认为我们活在三维空间中,也可以认为我们活在四维空间中——如果加上时间维的话。去掉时间维,很多变化的、重复的数据都比较棘手,难以应付;而站在四维的角度看待问题的话,一切都是静止的、不变的,因此问题的复杂度大大降低(这是从函数式编程中借鉴的思想,特别推荐感兴趣的朋友去了解一下)。如果告诉你我国的人口是12亿,你肯定会说“这数据错了吧”,假如你去数据库里面一查,我的天,库里面为什么为有10、11.4、12、13、13.6、14亿等这么多个人口数据?哪一个才是正确的呢?其实这些数据都是正确的,只不过是不同年份里统计出来的。加上时间维度后,重复性便不存在了,更进一步,我们还有了更多的信息(历史信息)。有了历史信息,我们便可以看趋势、也可以做对比,还能够做预测等等。这个随手举的简单例子,显示出数据的时间属性的基本作用,以及缺失时会面临的基本问题。我工作中,曾经遇到过IT在数据库中建了个没有时间戳的表,查询问题、去重、增量抽取等很多操作都存在问题,遗害不浅。借用函数式编程里的一句话来强调一下:时间是一个本质的问题。

同样本质的还有数据关联的id,此id代表了数据属于谁,是与其他数据联结在一起的基础。在讲数据的基本特性时会提到,数据融合后的价值,远大于数据价值的加和,而想要把一个个数据孤岛连通,就需要id这个独木桥。数据的id,几乎是关于这个数据最重要的信息,它一般不能用于分析,也不能入模,最主要的作用是定位数据。但离了这个id,数据便成了无主之野魂,利用价值大打折扣。有些人做模型时,喜欢把清洗好的,能用来跑模型的特征单独取出来用一个表保存,其他的id、时间、原始特征等数据都不在这个表中。这种做法是极不推荐的,这样做丢失了最重要的id、时间和原始数据,却保存了一份完全可以再生的衍生数据。正确的做法是:如果磁盘空间有限,就保存好所有原始数据和衍生代码;如果磁盘空间富裕,就把原始数据和衍生数据保存在同一个表中,并在代码中记录好哪些字段是衍生字段,然后保存代码即可。

数据的再生性和粒度。

有些数据是可以再生的,而有些数据丢失了就再也找不回来了。像衍生类的数据,都是可以根据原始数据再计算出来的;而像时间戳这样的数据,数据产生时没有打上,就永远丢失了。

数据的粒度,是指记录数据的详细程度。最详细的数据,肯定是事物性的数据,一行一条记录。这样的数据,包含最丰富的、最原始的信息,因此是必须保存好的。但这样的数据通常也是量最大的,直接分析这样的数据比较困难,计算速度也慢。因此需要将常用的指标按天、周、月、年汇总计算出来。按不同维度汇总,我们就称粒度的粗细不同,比如按年汇总,就是最粗粒度级别。另外时间维只是我举的一个例子,也可以按地理维、产品维度等其他维度汇总统计,这些维度也都有不同的层次关系,层次越高,粒度越大。还可以综合好几个维度来计算,比如把时间维、地理维、产品维一起综合计算了,这就是一个多维立方体了,更详细的可以参考OLAP相关的理论知识。显然除了最细粒度的事物性数据,其他数据都是可再生的。

保存数据时,原则是优先保存最原始的,不可再生的数据,再按实际情况权衡计算各种衍生数据;常用的业务分析时,原则是先分析粗粒度的统计数据,有异常时再去提取原始数据检查。

一不小心篇幅有点多,数据的基本特性就另起一篇文章吧。

时间: 2024-10-19 22:23:00

重新认识数据的相关文章

记一次MySQL找回用户数据

事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出结论:本来只需要更新微信号的,结果我们公司的流程系统管理员把用户先删除,再创建了新的用户. 解决过程 1.首先想到的是直接从定时备份数据里面找回原来的用户ID,结果发现系统只备份了十天的记录,而工作流系统上显示销售C只有8月3号以后的流程记录,距今已经40多天,从自动备份的数据里已经无法恢复. 2.

使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

本文标签: WebScraper Chrome浏览器插件 网页数据的爬取 使用Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬虫中的登陆.验证码.异步加载等复杂问题. Web Scraper插件 Web Scraper 官网中的简介: Web Scraper Extension (Free!)Using our extension you can create a plan (sitemap) how a web site

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中

C#如何拿到从http上返回JSON数据?

在实际开发中,我们经常会使用到API,所谓API一般就是一个地址,我们称之为接口.然后我们通过用C#对这地址发送请求,请求后,服务器就会给我们返回数据,一般是XML或者JSON,这里我们主要讲述的是JSON. 为了演示,我们这里准备了一个接口,这是一个查询物流的接口.(读者读到这篇文章的时候,接口可能有效,也可能失效,因为接口是网上找的,不是笔者自己写的,但是原理是一样的.) 接口:  http://www.kuaidi100.com/query?type=快递公司编码&postid=物流单号

C#中导出数据到Excel表格中

之前PM交给我一个自动化测试的Case,让我抓取页面上的数据到Excel表格中,刚好又接了一个之前人家做的系统, 刚好看到可以用NPOI导数据,就动手试试,成功导出. 由于鄙人比较菜,也比较懒, 怕自己忘记了,今天就总结一下,以防下次用可以参考. 1.要使用NPOI,首先需要在Project中Install NPOI的 Package. 右键点击Project------>Manage NuGet Packages---->Search NPOI----->点击搜索到的NPOI然后点击等

Oracle in 查询数据

问题描述: 查询所有的数据,查询结果:146360 select count(1) from bank_cde; in查询的获取部分数据,查询结果 :73080 select count(1) from bank_cde t where t.belongcode2 in('ABC','BCOM','BOC','CCB','CEB','CGB','CIB','CITIC','CMBC','ICBC','PAB','POST','SPDB'); not in查询数据,结果为0 select coun

SQL基础:数据表的创建

1. 先选择创建表所在的数据库 2. 创建表 3. 查看表是否创建成功 4. 主键:要求主键列的数据唯一,且不允许为空.主键能够唯一的标识表中的每一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度. 主键分为:单字段主键和多字段联合主键. 4.1 单字段主键 4.1.1 定义方式一:在定义列的同时指定主键 4.1.2 定义方式二:在定义完所有的列之后指定主键 4.2 多字段联合主键 5. 使用外键约束 外键用来在两个表之间建立连接,可以是一列或多列.一个表的外键可以是

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco