运营之路:数据分析+数据运营+用户增长
上QQ阅读APP看书,第一时间看更新

1.1 为什么要正确和高效地预处理与清洗数据

本节首先介绍了数据的加工和生产流程,并在此流程中详细分析数据预处理的3个步骤,以及完成每个步骤的具体方法。

1.1.1 指标的数据来源

开始拆解数据预处理前,非常有必要和大家聊一聊数据的加工和生产流程,因为:

(1)数据的加工和生产流程是数据分析的基础。

(2)可以了解指标数据是如何从业务系统一步步汇总计算,从无意义的明细数据变成具备业务意义和价值的指标的。

(3)可以快速分析数据问题,便于后期快速定位和追查数据问题。

如图1-1所示,要生成我们日常运营的指标,数据需要经过至少三大节点,即源系统、数据中台和数据应用层。

图1-1 数据的生产流程

1.源系统

源系统通常也叫业务系统,即承载产品业务的系统,它们在运行各种业务应用的同时也会产生对应的业务数据,所以叫源系统,是数据产生的源头。

特别对于平台类产品,因其承载了很多业务,故而连接了很多业务系统。令人苦恼的是,这些业务系统都是由不同供应商开发和运维的,各个源系统间的数据结构不完全兼容,不仅数据字段不一样,甚至同一业务含义字段的命名、格式、约束也不一样。

例如,源系统A中用户标识用的是手机号,源系统B中用户标识用的是注册用户名,源系统C中用户标识用的是微信ID。

如图1-2所示,对于用户本身而言,手机号、注册用户名、微信ID等都是这个用户的唯一标识,但是在不同的源系统中却是完全不同的标识。显然,如果把手机号、注册用户名、微信ID作为3个用户是违背认知且不合理的,需要某种机制把这3种类型不同但却是指向同一用户的标识统一起来,让数据认为他们是1个用户,而不是3个用户。

图1-2 不同源系统用户标识不尽相同

例如,源系统A和源系统B中用户标识用的都是手机号,但A中的手机号格式是139-1234-1234的3-4-4结构,B中的手机号格式是139-123-41234的3-3-5结构。

如图1-3所示,对于用户本身而言,这两种格式的手机号都是13912341234,都表示了同一用户,区别仅仅是存储的格式不同,但是如果不做数据预处理,就会被认为是两个用户,显然不合理。

图1-3 不同源系统同一字段格式不尽相同

我们把上述情况叫作异构系统中的数据规约问题。

异构系统中的数据规约问题,不仅会带来数据的混乱,还会造成大量的数据孤岛,导致有用的数据无法被发现,故而需要在数据预处理阶段将同一业务含义的不同数据整齐划一,以同一种数据规范进行存储和分析。

注意:异构系统的数据规约是数据治理的重要工作。一般平台型APP,后端都连接超过300个业务系统,这些业务系统区别极大,让异构系统的数据规约成为极其重要的工作。这种情况下,通常会有一个中等规模的团队来负责300多个业务系统的数据规约工作。

2.数据中台/数据中间层/业务中间层

数据中间层,也叫业务中间层、数据中台,其作用是将源系统中异构系统的数据统一规范和统一管理。一般有两种方式:实体整合和逻辑整合。

(1)实体整合

实体整合,即Entity Integration,定期将源系统的数据抽取到数据中间层,并在数据中间层完成数据预处理,以保证数据进入数据中间层后已满足统一规范和统一管理的要求。

实体整合的第一个特点是非实时,即数据中间层的数据与源系统的数据存在时间差,这个时间差通常用T+x来表示。

实体整合的第二个特点是数据已经过预处理,对于上层数据应用和业务分析而言速度很快,且不受源系统干扰,源系统即使中断服务或停服维护也不影响分析,因为数据已经被抽取到数据中间层。实体整合特别适合源系统更新不频繁的数据,例如用户信息、商品信息等,以及时效性要求不高的指标,例如周报、月报中的指标。

注意:T+x,即数据中间层数据的更新速度比源系统落后x,通常单位为天。T+0,即数据中间层的数据与源系统保持同步;T+1,即数据中间层的数据比源系统要落后1天,意味着在数据中间层看到今天的数据实际上是源系统中昨天的数据。

(2)逻辑整合

逻辑整合,即Logical Integration,不需要定期将源系统的数据抽取到数据中间层,不在数据中间层完成数据预处理,而是创建某种映射关系,连接数据中间层和源系统,并在分析数据的时候实时进行数据预处理。

逻辑整合的第一个特点是实时,即数据中间层的数据与源系统的数据是映射关系,不存在时间差,是T+0。

逻辑整合的第二个特点是数据未经预处理,对于上层数据应用和业务分析而言需要在数据使用过程中实时进行预处理和计算,速度会受影响,且受源系统服务质量的影响。如果源系统中断服务或停服维护,将无法完成数据预处理和分析,因为数据是实时连接到源系统的。

逻辑整合特别适合源系统更新频繁的数据,例如交易明细、浏览记录等,以及时效性要求较高的指标,例如用户访问路径分析、用户即时兴趣推荐等。

说明:逻辑整合,类似我们在Windows中为文件创建快捷方式,在Linux中为文件创建soft-link。

无论实体整合还是逻辑整合,其整合方式最常见的是统一用户标识,即通过某种用户标识来将各个业务系统的数据整合,形成复合的星型结构。统一的用户标识既可以是具备实际意义的信息,例如手机号、用户名等,也可以是数据中间层自行创建的标识,只要保证唯一性即可,最常见的是将用户个人信息进行不可逆加密来生成唯一标识的字符串,既保证用户隐私,也能唯一标识用户。

例如,阿里的数据中台通过OneID来连接用户在阿里巴巴产品体系下的用户数据,将用户在阿里系产品中产生的数据通过OneID关联起来,这样就可以从衣食住行等各个方面来精确描绘用户画像和兴趣,制定高转化率的营销方案。

注意:个性化推荐系统分为离线更新和在线更新。离线更新通常在用户行为热度降低的时候进行,一般选择在晚上更新。在这个时间段可以分析用户过往很长周期——例如一年——的数据来计算用户的兴趣,从而完成内容推荐。在线更新通常在用户使用产品过程中进行,计算用户的即时兴趣,实现实时推荐。

3.数据应用层

数据应用层通常包括我们熟知的BI系统、报表系统、模型系统、标签系统等,它们都是基于数据中间层的数据应用服务。数据应用层也是数据分析人员最为频繁接触和使用的地方,在这里数据分析人员利用管理驾驶舱、各种业务报表等来分析业务变化,寻找原因,制定策略。

注意:在入职新公司的数据分析岗位时,第一件事就是向同事详细了解数据生产和加工流程,即指标数据来自哪个业务系统,经过哪些中间系统进行汇总计算,最终在报表层面如何体现。了解指标的加工流程,对于后续指标运营和分析有极大的帮助。

1.1.2 数据预处理的目的

上面讲了指标数据如何从源系统最终达到数据应用层,其间多次提到数据预处理,那么数据预处理的目的是什么呢?

数据预处理的目的是在对业务数据进行分析挖掘前,先行对数据进行一些处理,以提升数据质量,为数据分析过程节约时间和空间。

注意:在实际工作中,数据预处理的时间甚至要超过数据分析本身所需的时间。如果需要分析的数据质量很高,那么对后续的数据分析来说无疑是如虎添翼。

1.1.3 数据预处理的流程

在数据科学领域,已有一套成熟的数据预处理流程,并在实际工程中应用多年,成为实际业务运营中的标准,它就是ETL,即Extract(抽取),Transform(转换)和Load(加载)。

ETL是一种数据预处理流程,它负责从异构的源系统中读取数据(所谓的Extract,即抽取),然后根据一定的数据处理规则进行数据清洗和转换(所谓的Transform,即转换),最后将预处理完成的数据加载到数据中间层或数据应用层(所谓的Load,即加载)。

如图1-4所示,方框部分就是ETL部分。ETL向下对接源系统,向上对接数据中间层或数据应用层。所有的数据预处理工作都在ETL中进行。

图1-4 数据预处理流程ETL的架构

下面简要说明ETL的3个模块,更多信息请参详ETL的专业书籍。

1.抽取(Extract)

抽取,即从源系统中读取原始业务数据,常见的数据源以关系型数据库(Oracle、PostgreSQL、MySQL、SQLServer)、分布式文件系统(Hadoop、Hive)为主。

抽取数据主要有两种方式:增量抽取(Incremental Extraction)和全量抽取(Full Extraction)。增量抽取,即每次从源系统抽取数据时仅抽取更新的数据,包括新增、更新和删除的数据,无变化的数据不会更新;全量抽取,即每次从源系统抽取全部数据,包括新增、更新和删除的数据,也包括无变化的数据。

2.转换(Transform)

转换,即根据数据中间层或数据应用层的要求,将从源系统抽取的数据进行转换处理,主要包括数据清洗和数据转换。数据清洗,是指清洗掉重复的、不完整的以及错误的数据;数据转换是指按照预处理规则将源系统中的数据转换为符合规范的数据格式。

常见的数据转换策略包括如下内容。

(1)移除非业务列

移除非业务列,即将与业务分析无关的列全部删除。常见的非业务列包括自增序号列、标识ID列、预留的空白字段列等,如图1-5所示。

图1-5 常见的非业务列

(2)重复值处理

重复值,通常是由于数据抽取过程中未进行排重判断,或源系统中数据创建时发生错误。重复值通常需要删除,多条重复数据仅需保留一条。

(3)缺失值处理

缺失值,通常是由于源系统服务故障无法上报数据,或源系统进行迁移暂停服务导致无数据。根据业务运营的需求,可以选择保留缺失值、回补缺失值和删除缺失值3种策略。

在实际工程应用中,最常见的缺失值处理策略是借助缺失前后的数据进行均值回补。

某APP用户行为分析系统,在2019年5月到6月进行系统迁移,导致其间用户行为数据缺失且无法后补,可以借助5月前和6月后的正常数据趋势来回补5月至6月的数据,使整年度的行为数据趋势完整。当然,这需要在系统中清晰标注数据回补的逻辑。

(4)文本数值化

文本数值化,即将文本存储的数据转化为数值,以方便后续的汇总计算。文本数据仅能进行计数汇总,无法满足后续复杂的数据分析。

常见的文本数值化策略包括:性别数值化,男-女转为1-0或0-1;地理信息数值化,直辖市为0,省会为1,或一线城市为1,二线城市为2;以文本存储的数字,转换为以数值存储的数字。这个是在数据预处理中易被忽略的情况,极易导致后续汇总分析发生错误,特别需要仔细处理。

(5)数据离散化

数据离散化,即将连续的数据按照规则转换为离散的数值,有时也叫分桶转换,即按照设定的分桶规则,将数据转换为分桶的信息。通过数据离散化,可以将连续的数据转换为更接近于业务运营角度的表述,在后续运营中更加直观。

数据离散化的方法主要有3种。

a)等宽法

等宽法,即将连续的数据分为长度相同的多个区间,每个区间赋予一个业务定义。

例如,用等宽法将用户年龄数据进行离散化。

用户年龄数据:1,9,14,18,20,32,37,40,48。

第一步:设定区间宽度为10,每10岁分到相同的区间。

第二步:根据年龄的最小值和最大值,结合区间宽度即得到5个区间:[1,10],[11,20],[21,30],[31,40],[41,50]。

第三步:为这5个区间设定业务名称,即A:[1,10],B:[11,20],C:[21,30],D:[31,40],E:[41,50]。

第四步:将用户年龄按照区间范围和名称进行离散化,如表1-1所示。

表1-1 等宽法进行数据离散化

于是,用户年龄由9个值转换为4个值,完成离散化处理。

b)等频法

等频法,即将连续的数据分为个数相同(频次)的多个区间,每个区间赋予一个业务定义。

例如,用等频法将用户年龄数据进行离散化。

用户年龄数据:1,9,14,18,20,32,37,40,48。

第一步:设定区间所含数据个数为4,即每4个数据分到一个区间,若区间中数据个数为4,则下一个数据自动分入下一个区间。

第二步:将用户年龄按照区间频率进行离散化,如表1-2所示。

表1-2 等频法进行数据离散化

于是,用户年龄由9个值转换为3个值,完成离散化处理。

不过在实际工程应用中,等宽法和等频法并不常用,原因在于以下三点。

第一,等频法和等宽法都是根据数据分布特点来进行离散化,未将具体业务需求考虑在内,数据离散化处理后可能难以在业务运营中落地。

第二,等宽法可能会将相同的数据分到两个区间。例如原始数据中第10位和第11位数据都是10,在区间宽度为10的条件下,第10位和第11位的两个数据就分到两个区间了。如果这个数据表示的是年龄,显然不应该分到两个区间。

第三,等频法可能会将差异较大的数据分到一个区间。例如原始数据前三个数是10,12,14,第四个数是50,在区间频次为4的情况下,10、12、14和50就分到一个区间了。如果这个数据表示的是年龄,显然不应该包含50。

所以,在实际工程应用中,更常见的是用自定义区间法进行数据离散化处理。

c)自定义业务区间法

自定义区间法,即按照业务运营的要求来设定离散化的规则,包括离散化区间的个数,区间的宽度,以及区间对应的业务含义。假如源系统中有一个年龄列,记录了用户的年龄,但在业务运营中不会直接应用具体的年龄数值,而是应用少年、青年、中年和老年等年龄段标识。这时就需要按照年龄段标识的规则将具体的年龄数值转换为少年、青年、中年和老年,如表1-3、表1-4和表1-5所示。

表1-3 源系统的数值化年龄

表1-4 业务运营需要的年龄段标识规则

表1-5 转换后的年龄段标识

(6)数据归一化/标准化

数据归一化/标准化是将不同的数据转换到同一范围或同一标准,以方便后续的分析,主要包括两部分工作。

a)将相同量纲但不同范围的数据缩放到相同的范围,以方便对比分析

例如分析班级中语文和数学的考试成绩,发现语文成绩的平均分是110分,数学成绩的平均分是90分。此时可以断言语文成绩就比数学好吗?

两者量纲虽然都是得分,但语文的成绩范围是0~150分,数学的成绩范围是0~100分,两者的成绩范围不同,即评判的基准不一样,显然不能断言语文成绩就比数学好。

若要科学对比这两门课程的成绩,就需要将两门课的成绩范围缩放到同一区间,使两门课程的评判标准一致,这样才能进行成绩好坏的判断。

又例如分析下沉市场,或所谓的“五环以外”的非一、二线城市的用户购买力和可支配收入时,显然不能拿四、五线城市的用户和一、二线城市直接进行对比。原因在于,四、五线城市和一、二线城市的居民收入、消费水平和生活成本等数据指标的范围完全不同,在四、五线城市一顿午餐可能只要10块钱,而在一线城市一顿午餐可能需要20块钱。

如果直接进行对比分析,极有可能得出错误的结论:四、五线城市的用户购买力和可支配收入远远低于一、二线城市,亦有可能制定出错误的策略:暂时不进入四、五线城市的下沉市场。

如果将四、五线城市和一、二线城市用户的收入、消费和生活成本等数据指标的范围缩放到同一标准,就能进行公平的对比分析,或许得出的结论是四、五线城市的居民购买力和可支配收入并不低于一、二线城市,可以快速进入四、五线城市的下沉市场。

事实上,很多调查机构也都做出过这样的结论:小镇青年们的购买力惊人,幸福指数远高于一、二线城市用户,就像拼多多、快手、抖音等都是把握住了下沉市场的风口,迅速成为中国移动互联网的重要流量平台。

b)将数据的微小变化充分放大,以方便描述分析

在内容运营中CTR(点击率)是重要的指标,代表了内容(短视频、图文)的质量以及受欢迎程度。CTR是一个用百分比率表示的指标,范围从0%到100%。在实际运营中,由于马太效应而导致大部分内容的CTR都集中在3%~15%,内容之间CTR的差异都是在小数点后1~3位体现的。在运营中经常可以看到这样的数据:

短视频A的CTR是7.83%,短视频B的CTR是7.85%,短视频C的CTR是7.8%。

它们三者之间的差异仅仅是0.02%~0.03%,实在太小了,对于日常运营中数据分析是个不小的挑战。为了能够更显著地放大差异,通常将要分析的短视频样本(例如当天的所有短视频)中CTR的最大值映射到100,最小值映射到0。这样所有短视频都分布在0~100的区间,然后再看数据的分布和集中程度。

数据归一化/标准化常用的算法包括极差法和z-score法。

a)极差法

极差法,是数据归一化最简单的算法,它将数据缩放到0~1之间。

极差法的算法,如表1-6所示。

表1-6 极差法计算方法

极差法不关心转换前的数据是正是负,其转换结果范围都会缩放到0~1。

极差法是动态算法,若加入了新的数据,全部数据都需要重新计算,如表1-7所示。

表1-7 源系统的数值化年龄

首先确定最小值、最大值和极差:

最小值:11

最大值:64

极差:64-11 = 53

故用户年龄用极差法转换后如表1-8所示。

表1-8 将年龄用极差法进行转换

b)z-score法

z-score法,即将某一列数值按比例缩放到统一的范围,其均值为0,且方差为1。

z-score法的算法如表1-9和表1-10所示。

表1-9 z-score法计算方法

表1-10 源系统的数值化年龄

首先确定平均值和标准差:

平均值:34

标准差:18.05547

故用户年龄用z-score法转换后如表1-11所示。

表1-11 将年龄用z-score法进行转换

注意:严格意义上的归一化和标准化略有差异,但在业务运营中可以适度忽略此差异。

(7)数据维度拆解与合并

由于源系统的数据规范多种多样,对相同业务含义数据存储各不相同,在进行数据预处理的时候就要进行维度的拆解和合并。

a)维度拆解

维度拆解,即将单一的维度拆分为多个子维度,以满足后续多维分析的需要。

最常见的场景是将地址信息进行拆分。例如将独立存储的地址信息拆分为国家、省份、城市、区域、街道等数据。

b)维度合并

维度合并,即将同一业务含义的维度进行合并和归一,减少数据的维度,降低数据存储要求,如图1-6所示。

图1-6 地址信息的维度拆解和合并

注意:在实际工程应用中,维度拆解是一项重要工作。高质量的维度拆解可以极大提升后续数据分析的速度和效果。正所谓,维度拆解做得好,数据分析没烦恼。

3.加载(Load)

加载,即将清洗和转换后的数据加载到数据中间层或数据应用层,以供后续的数据分析使用。加载常见的有两种方式:全量加载和增量加载,通常与Extract抽取的策略一致。不同加载方式会影响最终报表平台上报表的创建方式以及报表计算逻辑。

注意:关于Load加载的详细信息不是本书的主要内容,略去不讲。