导读:无论你的工作内容是什么,掌握一定的数据分析能力,都可以帮你更好的认识世界,更好的提升工作效率。数据分析除了包含传统意义上的统计分析之外,也包含寻找有效特征、进行机器学习建模的过程,以及探索数据价值、找寻数据本根的过程。

作者:马海平 于俊 吕昕 向海

本文摘编自《Spark机器学习进阶实战》,如需转载请联系我们

01 数据分析流程

数据分析可以帮助我们从数据中发现有用信息,找出有建设性的结论,并基于分析结论辅助决策。如图1所示,数据分析流程主要包括业务调研、明确目标、数据准备、特征处理、模型训练与评估、输出结论等六个关键环节。

▲图1 数据分析流程

数据分析能力并非一朝一夕养成的,需要长期扎根业务进行积累,需要长期根据数据分析流程一步一个脚印分析问题,培养自己对数据的敏感度,从而养成用数据分析、用数据说话的习惯。当你可以基于一些数据,根据自己的经验做出初步的判断和预测,你就基本拥有数据思维了。

02 数据分析基本方法

数据分析是以目标为导向的,通过目标实现选择数据分析的方法,常用的分析方法是统计分析,数据挖掘则需要使用机器学习构建模型。接下来介绍一些简单的数据分析方法。

1. 汇总统计

统计是指用单个数或者数的小集合捕获很大值集的特征,通过少量数值来了解大量数据中的主要信息,常见统计指标包括:

  • 分布度量:概率分布表、频率表、直方图

  • 频率度量:众数

  • 位置度量:均值、中位数

  • 散度度量:极差、方差、标准差

  • 多元比较:相关系数

  • 模型评估:准确率、召回率

汇总统计对一个弹性分布式数据集RDD进行概括统计,它通过调用Statistics的colStats方法实现。colStats方法可以返回RDD的最大值、最小值、均值、方差等,代码实现如下:

import org.apache.spark.MLlib.linalg.Vector
 
import org.apache.spark.MLlib.stat.{MultivariateStatisticalSummary, Statistics}
 
// 向量[Vector]数据集
 
val data: RDD[Vector] = ... 
 
// 汇总统计信息
 
val summary: statisticalSummary = Statistics.colStats(data)
 
// 平均值和方差
 
println(summary.mean)
 
println(summary.variance) 

2. 相关性分析

相关性分析是指通过分析寻找不用商品或不同行为之间的关系,发现用户的习惯,计算两个数据集的相关性是统计中的常用操作。

在MLlib中提供了计算多个数据集两两相关的方法。目前支持的相关性方法有皮尔逊(Pearson)相关和斯皮尔曼(Spearman)相关。一般对于符合正态分布的数据使用皮尔逊相关系数,对于不符合正态分布的数据使用斯皮尔曼相关系数。

皮尔逊相关系数是用来反映两个变量相似程度的统计量,它常用于计算两个向量的相似度,皮尔逊相关系数计算公式如下:

其中表示两组变量,表示两个变量的平均值,皮尔逊相关系数可以理解为对两个向量进行归一化以后,计算其余弦距离(即使用余弦函数cos计算相似度,用向量空间中两个向量的夹角的余弦值来衡量两个文本间的相似度),皮尔逊相关大于0表示两个变量正相关,小于0表示两个变量负相关,皮尔逊相关系数为0时,表示两个变量没有相关性。

调用MLlib计算两个RDD皮尔逊相关性的代码如下,输入的数据可以是RDD[Double]也可以是RDD[Vector],输出是一个Double值或者相关性矩阵。

import org.apache.spark.SparkContext
 
import org.apache.spark.MLlib.linalg._
 
import org.apache.spark.MLlib.stat.Statistics
 
// 创建应用入口
 
val sc: SparkContext = ...
 
// X变量
 
val seriesX: RDD[Double] = ...
 
// Y变量,分区和基数同seriesX
 
val seriesY: RDD[Double] = ... 
 
// 使用Pearson方法计算相关性,斯皮尔曼的方法输入“spearman”
 
val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")
 
// 向量数据集
 
val data: RDD[Vector] = ... 
 
val correlMatrix: Matrix = Statistics.corr(data, "pearson")

皮尔逊相关系数在机器学习的效果评估中经常使用,如使用皮尔逊相关系数衡量推荐系统推荐结果的效果。

3. 分层抽样

分层抽样先将数据分为若干层,然后再从每一层内进行随机抽样组成一个样本。MLlib提供了对数据的抽样操作,分层抽样常用的函数是sampleByKey和sampleByKeyExact,这两个函数是在key-value对的RDD上操作,用key来进行分层。

其中,sampleByKey方法通过掷硬币的方式进行抽样,它需要指定需要的数据大小;sampleByKeyExact抽取个样本,表示期望获取键为key的样本比例,表示键为key的键值对的数量。sampleByKeyExact能够获取更准确的抽样结果,可以选择重复抽样和不重复抽样,当withReplacement为true时是重复抽样,false时为不重复抽样。重复抽样使用泊松抽样器,不重复抽样使用伯努利抽样器。

分层抽样的代码如下:

import org.apache.spark.SparkContext
 
import org.apache.spark.SparkContext._
 
import org.apache.spark.rdd.PairRDDFunctions
 
val sc: SparkContext = ...
 
// RDD[(K, V)]形式的键值对
 
val data = ...
 
//指定每个键所需的份数
 
val fractions: Map[K, Double] = ...
 
//从每个层次获取确切的样本
 
val approxSample = data.sampleByKey(withReplacement = false, fractions)
 
val exactSample = data.sampleByKeyExact(withReplacement = false, fractions)

通过用户特征、用户行为对用户进行分类分层,形成精细化运营、精准化业务推荐,进一步提升运营效率和转化率。

4. 假设检验

假设检验是统计中常用的工具,它用于判断一个结果是否在统计上是显著的、这个结果是否有机会发生。通过数据分析发现异常情况,找到解决异常问题的方法。

MLlib目前支持皮尔森卡方检验,对应的函数是Statistics类的chiSqTest,chiSqTest支持多种输入数据类型,对不同的输入数据类型进行不同的处理,对于Vector进行拟合优度检验,对于Matrix进行独立性检验,对于RDD用于特征选择,使用chiSqTest方法进行假设检验的代码如下:

import org.apache.spark.SparkContext
 
import org.apache.spark.MLlib.linalg._
 
import org.apache.spark.MLlib.regression.LabeledPoint
 
import org.apache.spark.MLlib.stat.Statistics._
 
val sc: SparkContext = ...
 
// 定义一个由事件频率组成的向量
 
val vec: Vector = ... 
 
// 作皮尔森拟合优度检验
 
val goodnessOfFitTestResult = Statistics.chiSqTest(vec)
 
println(goodnessOfFitTestResult)
 
// 定义一个检验矩阵
 
val mat: Matrix = ...
 
// 作皮尔森独立性检测
 
val independenceTestResult = Statistics.chiSqTest(mat)
 
// 检验总结:包括假定值(p-value)、自由度(degrees of freedom)
 
println(independenceTestResult)
 
// pairs(feature, label).
 
val obs: RDD[LabeledPoint] = ... 
 
// 独立性检测用于特征选择
 
val featureTestResults: Array[ChiSqTestResult] = Statistics.chiSqTest(obs)
 
var = 1
 
featureTestResults.foreach { result =>
 
    println(s"Column $i:\n$result")
 
    i += 1
 
}

03 简单的数据分析实践

为了更清楚的说明简单的数据分析实现,搭建Spark开发环境,并使用gowalla数据集进行简单的数据分析,该数据集较小,可在Spark本地模式下,快速运行实践。

实践步骤如下:

1)环境准备:准备开发环境并加载项目代码;

2)数据准备:数据预处理及one-hot编码;

3)数据分析:使用均值、方差、皮尔逊相关性计算等进行数据分析。

简单数据分析实践的详细代码参考:ch02\GowallaDatasetExploration.scala,本地测试参数和值如表1所示。

本地测试参数

参数值

mode

local[2]

input

2rd_data/ch02/Gowalla_totalCheckins.txt

▲表1 本地测试参数和值

1. 环境准备

Spark程常用IntelliJ IDEA工具进行开发,下载地址:www.jetbrains.com/idea/,一般选择Community版,当前版本:ideaIC-2017.3.4,支持Windows、Mac OS X、Linux,可以根据自己的情况选择适合的操作系统进行安装。

(1)安装scala-intellij插件

启动IDEA程序,进入“Configure”界面,选择“Plugins”,点击安装界面左下角的“Install JetBrains plugin”选项,进入JetBrains插件选择页面,输入“Scala”来查找Scala插件,点击“Install plugin”按钮进行安装。(如果网络不稳定,可以根据页面提示的地址下载,然后选择“Install plugin from disk”本地加载插件),插件安装完毕,重启IDEA。

(2)创建项目开发环境

启动IDEA程序,选择“Create New Project”,进入创建程序界面,选择Scala对应的sbt选项,设置Scala工程名称和本地目录(以book2-master为例),选择SDK、SBT、Scala版本(作者的开发环境:Jdk->1.8.0_162、sbt->1.1.2、scala->2.11.12),点击“Finish”按钮完成工程的创建。

导入Spark开发包,具体步骤为:File->Project Structure->Libraries->+New Project Library(Java),选择spark jars(如:spark-2.3.0-bin-hadoop2.6/jars)和本地libs(如:\book2-master\libs,包括:nak_2.11-1.3、scala-logging-api_2.11-2.1.2、scala-logging-slf4j_2.11-2.1.2)。

(3)拷贝项目代码

拷贝源代码中的2rd_data、libs、output、src覆盖本地开发项目目录,即可完成开发环境搭建。

除此之外,也可以通过Maven方式Import Project。

2. 准备数据

我们提供的数据格式:

用户[user] 签到时间[check-in time] 维度[latitude] 精度[longitude] 位置标识[location id]

数据样例如下:

准备数据的步骤如下。

(1)数据清洗

在数据清洗阶段过滤掉不符合规范的数据,并将数据进行格式转换,保证数据的完整性、唯一性、合法性、一致性,并按照CheckIn类填充数据,具体实现方法如下:

// 定义数据类CheckIn
 
case class CheckIn(user: String, time: String, latitude: Double, longitude: Double, location: String)
 
// 实例化应用程序入口
 
val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster(mode)
 
val sc = new SparkContext(conf)
 
 val gowalla = sc.textFile(input).map(_.split("\t")).mapPartitions{
 
case iter =>
 
val format = DateTimeFormat.forPattern("yyyy-MM-dd\'T\'HH:mm:ss\'Z\'")
 
iter.map {
 
// 填充数据类
 
case terms => CheckIn(terms(0), terms(1).substring(010), terms(2).toDouble, terms(3).toDouble,terms(4))
 
}
 
}

(2)数据转换

在数据转化阶段,将数据转换成Vectors的形式,供后面数据分析使用。

// 字段:user, checkins, checkin days, locations
 
val data = gowalla.map{
 
  case check: CheckIn => (check.user, (1L, Set(check.time), Set(check.location)))
 
}.reduceByKey {
 
// 并集 union
 
case (left, right) =>(left._1 + right._1,left._2.union(right._2),left._3.union(right._3))
 
}.map {
 
  case (user, (checkins, days:Set[String], locations:Set[String])) =>
 
Vectors.dense(checkins.toDouble,days.size.toDouble,
 
locations.size.toDouble)
 
}

3. 数据分析

通过简单的数据分析流程,实现均值、方差、非零元素的目录的统计,以及皮尔逊相关性计算,来实现对数据分析的流程和方法的理解。

简单的数据分析代码示例如下:

// 统计分析
 
val summary: MultivariateStatisticalSummary = Statistics.colStats(data)
 
// 均值、方差、非零元素的目录
 
println("Mean"+summary.mean)
 
println("Variance"+summary.variance)
 
println("NumNonzeros"+summary.numNonzeros)
 
// 皮尔逊
 
val correlMatrix: Matrix = Statistics.corr(data, "pearson")
 
println("correlMatrix"+correlMatrix.toString)

简单数据分析应用运行结果如下:

均值:[60.16221566503564,25.30645613117692,37.17676390393301]
 
方差:[18547.42981193066,1198.630729157736,7350.7365871949905]
 
非零元素:[107092.0,107092.0,107092.0]
 
皮尔逊相关性矩阵:
 
1.0 0.7329442022276709 0.9324997691135504 
 
0.7329442022276709 1.0 0.5920355112372706 
 
0.9324997691135504 0.5920355112372706 1.0 

本文摘编自《Spark机器学习进阶实战》,经出版方授权发布。

延伸阅读《Spark机器学习进阶实战》

点击上图了解及购买

转载请联系微信:togo-maruko

推荐语:科大讯飞大数据专家撰写,从基础到应用,面面俱到。

更多精彩

在公众号后台对话框输入以下关键词

查看更多优质内容!


PPT | 报告 | 读书 | 书单

Python | 机器学习 | 深度学习 | 神经网络

区块链 | 揭秘 | 干货 | 数学

猜你想看

  • 干掉围棋九段后,可定制计算能让AI打败程序员和芯片工程师吗?

  • 揭秘“21世纪最性感的职业”:数学、编程、沟通和商业技能一个都不能少!

  • 一文读懂量子计算机的前世今生,它的未来人类连想都不敢想

  • 如何科学地评价妹子身材?三围符合黄金比例是审美标准?你错了!

Q: 数据分析的方法你掌握了多少?

欢迎留言与大家分享

觉得不错,请把这篇文章分享给你的朋友

转载 / 投稿请联系:baiyu@hzbook.com

更多精彩,请在后台点击“历史文章”查看

点击阅读原文,了解更多

你真的懂数据分析吗?一文读懂数据分析的流程、基本方法和实践相关推荐

  1. 一文读懂计算机组成,一文读懂为什么要做动态心电图检查?

    什么是动态心电图? 动态心电图是一种可以长时间连续记录并编辑分析人体心脏在活动和安静状态下心电图变化的方法.此技术于1947年由Holter首先应用于监测心脏电活动的研究,所以又称Holter监测心电 ...

  2. 一文读懂程序化易法易化资频易计利

    转 一文读懂程序化交易.算法交易.量化投资.高频交易. 统计套利 在央行发布的<中国金融稳定报告(2016)>中,对于高频交易的解释为程序化交易的频率超过一定程度,就成为高频交易.而对程序 ...

  3. 一文读懂程序化交易算法交易量化投资高频交易统计利

    转 一文读懂程序化交易.算法交易.量化投资.高频交易. 统计套利 在央行发布的<中国金融稳定报告(2016)>中,对于高频交易的解释为程序化交易的频率超过一定程度,就成为高频交易.而对程序 ...

  4. 一文读懂PQuant与QQuant量化易金工

    转 一文读懂P Quant与 Q Quant ,量化交易与金融工程 原标题:P Quant 和 Q Quant 到底哪个是未来?  来源:李老师与何老师的CFA学习课堂  作者:何璇 P-Quant ...

  5. ​一文读懂EfficientDet

    一文读懂EfficientDet. 今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测 ...

  6. 一文读懂机器学习中的模型偏差

    一文读懂机器学习中的模型偏差 http://blog.sina.com.cn/s/blog_cfa68e330102yz2c.html 在人工智能(AI)和机器学习(ML)领域,将预测模型参与决策过程 ...

  7. 语言相关系数显著性_相关性分析在SPSS中的具体操作,一文读懂相关系数的含义及使用——【杏花开生物医药统计】...

    相关性分析介绍 生物和医学统计中,相关分析属于流程前端的探索性分析,研究变量间关系及性质,其结果在为下一步采取何种方法做出指引,为数据挖掘之前的基础工作. 相关系数的选择 相关分析之前,需要先确认变量 ...

  8. 一文读懂大数据平台——写给大数据开发初学者的话!

     一文读懂大数据平台--写给大数据开发初学者的话! 文|miao君 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hado ...

  9. | 一文读懂迁移学习(附学习工具包)

    当一个CNN用于另一个领域,就使用到了迁移学习.迁移学习是一种用于模型领域泛化和扩展的工具. 文章链接:独家 | 一文读懂迁移学习(附学习工具包) 参考:当深度学习成为过去,迁移学习才是真正的未来? ...

最新文章

  1. 堪称为经典游戏设计帖整理20个点击回复超高的精品贴
  2. 页面如何自动出现滚动条(overflow属性用法)
  3. RabbitMQ —— 延迟队列
  4. 3、Power View—数据透视表般华丽
  5. 秒表c语言程序代码,求大神帮忙写一篇简单的C语言秒表程序, 谢谢。
  6. 如何调试 web worker
  7. html图片分开,webpack单独分离打包css,css里引用的图片路径错误,怎么解决?
  8. 【工具大道】UML的点点滴滴
  9. QEMU多进程(Multi-process QEMU)及vfio-user应用
  10. 华为P50 Pro最新渲染图曝光 预装鸿蒙HarmonyOS 2
  11. 让用VS2013编写的程序在XP中顺利运行
  12. 比较3个购书网站,china-pub,dangdang,joyo(amazon)
  13. OA系统新流程创建与管理办法
  14. 资料:《大学英语》精读修订版(全六册)原文及全文翻译
  15. 《精通CSS》读书笔记2
  16. 小程序毕业设计 基于微信鲜花花店商城小程序毕业设计开题报告功能参考
  17. Blender2.9基础二:UV篇
  18. 分布式环境下限流器springboot实现,令牌桶
  19. 支付宝支付异步回调的一些问题
  20. Ubuntu 搜狗输入法安装指南

热门文章

  1. linux 网络块存储,网络存储集群
  2. mysql 安装1607_mysql服务启动报1607error
  3. 泰晤士计算机排名2021,THE2021年世界大学专业排名-计算机
  4. js 字符串插入_Vue.js 条件与循环
  5. c form画直线_新手教程跟我一起画儿童裤子裁剪图
  6. android fastboot常见命令
  7. 三、Java面向对象编程有四个特征
  8. 4-7:TCP协议之流量控制
  9. 动态规划之正则表达式匹配字符串
  10. epoll内存计算方法:4G内存服务器epoll并发量最大能达到多少?