第1章 数据分析项目的流程 本章主要介绍进行数据分析项目时,项目的人员分配、如何定义问题、 数据分析的流程等。 通过对本章的学习,掌握数据分析项目的整个流程,了解数据分析项目 成员的各种角色和职责、数据分析项目的各个阶段、数据分析项目的目标定 义及数据分析项目的预期设定。 一个数据分析项目有一个负责人,对项目全程负责,有时候这个负责人 被称为数据科学家。一个数据分析项目的成功,靠的是有清晰、定量的目标, 有良好的方法论,有跨越学科的交流合作,以及一套可以重复的工作流程。 1.1 数据分析项目中的角色 1. 出资方 一个数据分析项目最重要的角色是出资方。出资方是数据分析项目负责 人要负责的对象,也是想得到数据分析结果的人。通常而言,数据分析项目 的成功与失败是由出资方来认定的。如果出资方对数据分析项目的结果满意, 则可以认定项目是成功的。因此,让出资方满意是数据分析项目的一个重要 目标。 要让出资方满意,必须要做的一件事是保持出资方对项目的了解和介入, 这一点至关重要。根据出资方对数据分析项目的理解程度,为他们介绍项目 的计划、目前的进展、阶段性的成功及目前遇到的困难,这样做的一大好处 是容易获得出资方的支持。如果只是自己闷头做,很容易造成出资方的误解, 甚至导致项目失败。 为了确保出资方对项目满意,必须和出资方讨论数据分析项目的目标, 直至目标清晰。需要注意的是,一定要用量化的语言来描述出资方的目标。 这样做的好处是,精确的目标有助于检查该目标是否能够满足目前的商业意 图,是否有足够的资源,是否有高质量的数据与工具去完成这个目标,以及是否有能力衡 量目标是否完成。 2. 数据科学家 数据科学家是数据分析项目中很重要的角色,其负责数据分析项目的各个流程,包括 设定项目战略,保证出资方了解项目进展。数据科学家需要设计数据分析项目的流程,挑 选数据分析项目的数据源及使用工具。数据科学家需要挑选并尝试使用各种技术,所以其 必须要精通统计学和机器学习。另外,数据科学家也负责对项目进行监控。 在技术层面,数据科学家要检查数据,进行统计检验,构建统计模型、机器学习模型, 评价模型结果。 3. 数据仓库负责人 数据仓库负责人负责所有的数据及数据的存储。这个角色往往由数据分析项目团队之 外的人来担任,如公司的数据库管理员或者架构师。该角色负责解决项目中与数据有关的 问题。 4. 业务负责人 业务负责人在获取数据和提交最终结果的过程中是非常关键的项目角色,通常负责数 据科学团队之外的操作。例如,当应用数据分析结果、构建好模型分析这个结果或者模型 会对业务有什么影响时,业务负责人在决定如何进行应用数据分析时有比较大的发言权。 这个人会给出响应时间、编程语言和数据大小等方面的约束。 1.2 数据分析项目的阶段 在一个比较理想的数据分析项目中,数据科学家需要与所有的其他利益方进行不断的 交流反馈。也就是说,数据分析项目并不是一个线性的过程,而是一个不断往复的过程, 如图1.1 所示。 定义问题 数据处理与 特征选择 收集数据建立模型评价模型结果展示模型部署 图1.1 数据分析项目流程图 尽管一个数据分析项目的生命周期被划分成了不同的阶段,但是现实项目中各个阶段 之间的边界并不是固定的,一个阶段的活动经常与另一个阶段的活动重叠在一起。 下面以一个银行问题为例子—银行目前有很多的不良贷款,想要降低贷款的违约率。 基于这个目的,首先需要制定一个目标。 1.2.1 制定目标 制定一个可以衡量、可以量化的目标是数据分析项目的第一个任务,也是非常重要的 一个任务。所以,在这个阶段,需要尽可能多地了解项目的背景与相关信息,例如: ● 为什么需要对这个项目做研究?出资方缺少了什么及需要什么? ● 出资方有何办法来解决问题?是否做得足够好? ● 这个数据分析项目需要什么资源?有多少数据可用?是否需要领域专家的合作? ● 这个数据分析项目有哪些约束条件? 回到上文提到的银行贷款违约的例子,这个例子的商业目标是减少银行的不良贷款, 减少贷款损失。这就需要一个方法来判断贷款人的违约概率,对贷款人进行打分。一旦和 项目的出资方及其他相关的利益方对关于这个项目的各种问题有了一个基本答案,就需要 和他们一起制定数据分析项目的精确目标。该目标应该是具体的、可以衡量的。 例如,将不良贷款率降低1 个百分点。通过项目具体目标得出该项目的具体约束条件 和接受条件。目标越不具体,数据分析项目就越没有边界。若我们不知道想要达到的目标 是什么,就不知道什么时候可以结束,什么时候停止尝试,最终项目会由于时间过期或者 资源耗尽而不得不结束,这个时候每个人都不会对结果满意。 这并不是说不需要对数据分析项目进行一些探索,而是说要定义好目标,然后做和目 标相关的事情,目标告诉了我们探索的方向。一旦定义好了目标,就需要收集数据,尽可 能地去实现这些目标。 1.2.2 收集数据 在定义好数据分析项目的目标之后,需要识别出需要的数据。这个阶段是处理过程中 最耗时的过程,也是非常重要的过程,需要探讨的问题如下: ● 什么数据可以用? ● 这些数据是否有用? ● 数据是否足够多? ● 数据的质量是否足够好? 当我们搜集到了所有我们能够搜集到的数据,需要将数据有组织地储存起来,接下来 需要对数据进行一些处理和分析。 1.2.3 数据处理和分析 在这个阶段,我们需要对数据进行初始的探索和可视化,并且还需要对数据进行清洗, 修复数据的错误,对数据进行必要的转换。在探索和清洗数据的过程中,有些数据可能无 法使用,有些数据可能不太适合,这个时候有些问题是需要我们去解决的。有时我们会发 现数据的结论和我们的常识判断是不一样的,这个时候我们就会发现一些常识不一定是 对的。 在这个过程中要观察数据的分布、数据是否有偏、数据是否来自单一的分布,哪些特 征有比较好的预测效果,这些问题都是这个过程中要探讨的。不断地发现问题及一些有意 思的点,有助于我们和其他的项目利益方去精化项目目标。通常而言,数据探索并不仅仅 发生在这个过程,在这个阶段之前及这个阶段之后,也常常会反复进行。 在这个过程中,我们会使用各种统计图形来展示数据,图形可以很好地帮助我们了解 数据,帮助我们在数据分析中产生洞见。在这里先使用一组数据集来做演示,这个数据集 是德国的一家银行的信用评分数据集,这个数据集被封装在一个R包中—scorecard包, 加载这个包之后即可使用这个数据集。在下面的代码中,library( )函数用于加载一个包, data( )函数用于获取包中的数据集,dim( )函数用于查看数据集的维度。 library(scorecard) data("germancredit") dim(germancredit) ## [1] 1000 21 这个数据集一共有1000条数据、21个特征,每一条数据代表一个用户,而数据集的 最后一个特征creditability记录了这个用户的逾期情况,good代表好客户,bad代表坏客户。 对于这份数据集,我们首先要做的是尽可能地去了解其信息。 例如,我们想要了解数据中人群的分布,那么我们可以计算一些关于年龄的统计量, library(ggplot2) ggplot(data=germancredit,aes(x=age.in.years,color=creditability))+ge om_histogram(aes(y = ..density..),binwidth = 0.5) +geom_density(alpha = 0.2) 好 年龄 密度 坏 图1.3 好坏客户的年龄直方图分布 从图1.3中可以看出,坏客户的分布比好客户的分布更靠左,这就意味着年轻人更有 可能是坏客户。这个结论也符合常理,年轻人的经济状况不如中年人,而且大多数没有形 成比较好的经济理念,容易超前消费,同时容易发生信贷逾期的情况。 按同样的方法,不断地探索数据,发现数据之间的规律,找到那些关键的信息,然后 进入构建模型的步骤。 7 第 1 章 数据分析项目的流程 1.2.4 构建模型 在对数据进行了充分的探索之后,可以尝试去构建模型,用统计模型和机器学习模型 去解决项目面临的问题。模型可以表达数据中的复杂关系,帮助我们去理解和领悟数据中 的信息。有些统计模型会有关于数据的各种假设,因此,在构建模型之前的数据探索环节, 我们需要去验证各种假设和条件,当然,也有一些模型对于数据没有任何假设。总而言之, 数据探索和构建模型之间的关系并没有严格的界限,二者之间往往会有重叠和反复。 一般而言,机器学习的任务有两大类,即有监督的问题和无监督的问题。其中,有监 督的问题往往包括以下三方面。 ●分类问题:将不同的样本归属于不同的类别。 ●回归问题:模型会去预测一个数值,如房价。 ●排名问题:类似于回归问题,但是与回归问题的不同之处在于排名问题的目的是对 数据进行排序。 无监督的问题包括以下两方面。 ●聚类:用于识别数据中相似的组。 ●关联规则:用于找出数据中潜在的关系。 一旦我们识别出了项目面临的问题属于哪一类,就可以应用多种方法来解决这个问题。 例如,上文所使用的数据集,其本质上是要预测用户的违约情况—违约或者不违约,因 此这个问题属于二分类的问题。对于二分类的问题,可用的方法有很多,最常用的方法是 逻辑回归模型。可以使用的机器学习模型还包括决策树、随机森林、神经网络模型等。这 里使用iris 数据集构建一个随机森林模型,这个数据集是R 语言自带的数据集,因此可以 直接使用。这里使用randomForest 包中的randomForest( ) 函数构建随机森林模型。使用 randomForest( ) 构建随机森林模型所使用的基础参数包括两个:第一个参数是模型的公式, “Species ~.,”表示以Species 为因变量,数据集中所有的其他变量为自变量;第二个参数 是所用到的数据集。其他参数默认,运行即可构建出随机森林模型。 library(randomForest) ## randomForest 4.6-14 ## Type rfNews() to see new features/changes/bug fixes. ## ## Attaching package: 'randomForest' ## The following object is masked from 'package:ggplot2': ## ## margin ran <- randomForest(Species~.,data = iris) ran ## ## Call: ## randomForest(formula = Species ~ ., data = iris) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 2 ## ## OOB estimate of error rate: 4% ## Confusion matrix: ## setosa versicolor virginica class.error ## setosa 50 0 0 0.00 ## versicolor 0 47 3 0.06 ## virginica 0 3 47 0.06 这样就构建好了一个随机森林模型。从结果中可以看到,构建的模型是随机森林的分 类模型,一共生成了500棵决策树,OOB estimate of error rate(包外估计误差)是4%,误 差比较小。结果还给出了训练数据的混淆矩阵(confusion matrix),从混淆矩阵中可以发现, 3个virginica被模型错判为versicolor,3个versicolor被模型错判为virgincicn。构建好模型 之后,就需要对模型进行评估,以判断模型的优劣。 1.2.5 评估模型 当构建好模型之后,我们需要知道这个模型的效果如何,以及我们建立的模型是否能 够达到我们的目标。 评估模型需要评估以下几个方面。 ● 模型的预测效果。如果一个模型的预测效果与抛硬币相差无几,这意味着我们的模 型可有可无。我们可以设置一个基本模型,这个模型是最简单、最基本的,我们建 立好的模型必须比这个基本模型要好。例如,我们可以认为抛硬币是一个基本模型, 这个模型预测正确的概率为0.5,则新模型必须比抛硬币模型要好。基础模型可以 指定为我们能够实现的最简单模型。 ● 模型的简洁性。奥卡姆剃刀准则指出,正确的答案往往是较简单的那个答案。这就 意味着模型必须尽可能地简单。模型过于复杂,意味着需要对其进行调整。 9 第 1 章 数据分析项目的流程 ●模型的可解释性。模型的结果是否能够对我们的问题有解释,我们尽可能地希望模 型是有含义的,是可以理解的,而不是一个黑箱。 重新构建我们在上文构建的随机森林模型: library(randomForest) set.seed(1) ran <- randomForest(Species~.,data = iris) ran ## ## Call: ## randomForest(formula = Species ~ ., data = iris) ## Type of random forest: classification## Number of trees: 500 ## No. of variables tried at each split: 2## ## OOB estimate of error rate: 4.67% ## Confusion matrix: ## setosa versicolor virginica class.error## setosa 50 0 0 0.00 ## versicolor 0 47 3 0.06 ## virginica 0 4 46 0.08 可以看到,模型的误差为4.67%,这意味着模型有一个比较好的预测效果。观察混淆 矩阵,发现4 个versicolor 被错分类为virginica,3 个virginica 被错分类为versicolor。接着 可以去查看这些分类的变量为什么会被分类错,并对其进行优化。 另外,模型的可解释性和模型的简洁性都不是很好,这是由模型本身决定的。 因此,有时候我们同样面临取舍,是使用可解释性较差而预测能力较高的模型(如深 度学习),还是使用解释性比较好而预测能力一般的模型(如决策树、逻辑回归)。这取 决于具体的业务目的。另外,需要注意使用训练集来评价的模型对数据集的拟合程度。使 用测试集来评价模型的泛化能力,也就是当有一个新的数据时,通过新数据来预测模型是 否能够预测准确。一般期望模型对新的数据有很好的预测能力,即要求模型的泛化能力要 好。模型在训练集上表现得很好,并不一定在测试集同样表现好,因为模型可能会过拟合。 因此没有必要在训练集中要求模型有非常高的预测精度。 1.2.6 展示结果 对数据有了充分的了解及建立起令人满意的模型后,需要将我们的成果分享给大家, 分享的对象包括这个模型所涉及的各种人员,如出资方。 另外,需要将数据分析项目整个过程的文档进行归类分组与总结,确保数据分析项目 的结果有可重复性。然后编制模型文档,以供相关人员使用,并为运行和维护模型提供支撑。 需要注意的是,对于不同的人员需要展示不同的信息。对于出资方,需要展示这个数 据分析结果的业务效果,这个模型能带来什么,例如,使用这个模型能提高50%的销售额, 让出资方确切地知道这个模型的价值。对于同行,则需要探讨技术性的东西,如这个项目 遇到的挑战、所用到的一些创新性方法。 这个步骤很重要,好的展现效果有助于用户获取更多的资源,以在未来更好地开展工作。 1.2.7 部署与维护模型 模型构建完成并不意味着数据分析项目的结束,还需要将模型应用于现实的环境。在 现实环境中使用模型,往往会碰到很多意想不到的问题,有些问题通过简单的修正就可以 解决,有些问题可能会造成很严重的后果。这个时候需要对模型进行监控,及时地发现和 解决问题,避免产生灾难性的后果。 随着现实环境的变化,模型可能不再适用,这个时候需要对模型进行更新,构造一个 更适合当前环境的模型。所以,一个数据分析项目的完成往往意味着一个新项目的开始。 1.3 总 结 数据分析项目存在大量的反复工作,整个项目的流程并不是线性的,而是在不断地反 复中进行的。在项目进行的过程中,会遇到很多的障碍和意外,在克服这些障碍的同时, 需要注意让所有的利益相关方了解项目发展情况、所遇阻碍,因为这可以帮助你在解决问 题的时候获取更多支持,并且在项目完成之后,所有人不会对项目的结果感到意外。本章 介绍了数据分析的基本流程,包括定义问题、收集数据、数据处理与特征选择、建立模型、 评价模型、结果展示、模型部署与维护等过程。这些过程并不是线性的关系,而是不断往复的。