[原] 论从数据探索到数据产品的最快路径
概述
加快推动从数据探索到数据产品的过程是一件很有意义的事情,数据分析要如何做到尽量和数据分析的流程紧密结合,又要方便工程化落地一直困扰着许多数据分析师和Web工程师。数据分析师不想深究太多前端JS实现,Web工程师也不想插手复杂的业务逻辑与SQL,前后分离看起来势在必行。
对于工程化这件事情,如果数据分析输出的图表是基于html的,那Web工程师只需要复制粘贴相应的js配置项然后引用一下js库就完成70%的工作了。但是对于数据探索来说,大部分的数据可视过程70%的工作可能都是失败、或者暂时的,花费大量精力完成的前端代码并不会对数据分析这件事情本身带来太多帮助。
如何权衡前端交互与后端算法一直以来都是困扰数据分析师的一个问题,本文将对这一问题做进一步的讨论。
可能的解决方案
数据分析师 + 无代码交互式绘图
常见的方式比如,Caravel(Python)都具有这样的功能,数据分析师可以建立一个数据库连接,然后在连接中通过SQL语句得到想要的数据,再通过交互式的绘图方式完成数据可视化的探索。
优势:让数据分析师可以集中精力在数据分析本身,可以快速实现数据探索、建模、甚至分享页面和仪表盘。
劣势:复杂的数据分析算法实现起来比较困难,数据需要事先规整清晰好,满足多维数据分析条件才行。虽然Caravel 目前已经集成了大多数前端绘图库,但是整体定制性还有待加强,且对中国友人支持度不高。
数据分析师 + JS
第一种方案建立在交互式绘图工具足够好用的基础上,对于很多非主流的startup并不一定完全适用,因为startup人手有限,很可能要求数据分析师有能自行解决前端数据可视化的能力需求。
常见的方式是通过SQl取数后调用一个JS制图库(比如echarts、highcharts、plotly等等),分析师需要在js中完成许多数据描述性统计的工作直接展示在前端页面上,然后将配置项和SQL保存在数据库中,以供后续的API查询调用。
优势:简化了数据产品落地的流程,在SQL不够用的情况下可以用JS来补足,可以快速实现定制化的前端图表输出,满足各种可视化特殊需求。
劣势:简单的数据分析算法实现也很困难,数据分析很难专注于数据本身,需要处理很多JS相关问题。
数据分析师 + Zeppelin/Radiant/PowerBI + R
上述两种方案在数据处理上都并不是非常完美,更加理想的方案是通过用一种数据分析语言完成数据分析和数据可视的工作,既要保证数据分析的灵活性,又要保证工程落地的敏捷性变成一个很关键的事情。但是通常自己写前端JS的代码又非常的麻烦。
一些常见的描述性统计(极值均值求和计数等等)在前端实现都会耗费很多功夫,比如需要使用mapreduce,更不用说更高级的一些算法了,而大部分数据分析工作在Python或者R语言中其实是可以快速完成。那么,从Python和R中直接输出一些html图表不失为一种好的办法,当然更多场景下我是建议用R来完成,再借助Zeppelin
/Radiant
/PowerBI
这样的工具,我们也可以直接将前端页面生成Dashboard或者通过iframe的方式独立输出。
优势:满足不同需求层次的快速数据分析,既能满足复杂的算法模型快速实现,又能满足工程敏捷落地的需求。
在简单分析模式下,交互式数据分析可以覆盖60%的分析场景
在复杂分析模式下,使用R语言可以覆盖90%的作图需求
在极度定制化可视化需求下,可以使用JS前端控件定制满足100%的数据可视化需求
具体方案
Zeppelin、Radiant、PowerBI 都是支持以R 为辅助作图工具的数据分析工具,由于篇幅有限,本文以Zeppelin为例,讲解一个如何使用R语言打通数据分析从探索到产品的全流程。
在NFLab公司的推动下,Zeppelin 从0.6版本就正式开始支持 R 的编译器,并且对此做了诸多优化与拓展。R Tutorial 也是 Zeppelin Notebook 默认的数据分析教程。
工具链条
tidyverse 全家桶 (囊括基本数据处理的一切)
htmlwigets 全家桶 (N个前端可视化库集合)
ggfortify与ggplot其他插件 全家桶 (N个ggplot2可视化插件集合)
plotly 全家桶 (一键无缝迁移ggplot2到plotly)
Zeppelin (快速制作交互式 dashboard)
sqldf、SparkR、data.table、rlist (满足高级数据处理需求)
正常流程
小数据集的简单分析:
可以通过 Zeppelin 配置 JDBC
或者 Spark.SQL
的方式连接多种数据库来快速实现简单的交互式数据分析了。
2.小数据集的复杂分析:
基于ggplot2
的统计图表生态实在过于强大,各种插件琳琅满目,总有一款可以满足你奇葩的需求。比如使用ggfortify
或者ggally可以一行代码就完成各种复杂的可视化分析,比如PCA分析、聚类分析、协方差矩阵、时间序列预测等等,这样就保证了数据分析结果维度的丰满。
由于ggally
是一个ggplot2
的一个拓展,同样也支持ggplot2
的图层叠加原理。通过+
的链式调用,可以在同一基础图形上变换多种展现方式进而得到更多多维分析结果。
如果需要将ggplot2
的结果制作成动态图表,还可以直接利用plotly::ggplotly()
函数做渲染,然后通过plotly::layout
函数来控制新图表的布局细节,满足专业数据分析与可视化的高级需求。
data(tips, package = "reshape") pm <- ggpairs(tips) pm %>% plotly::ggplotly() %>% plotly::layout(xaxis = list(title="test",showgrid = F))
3.大数据集的简单分析:
大数据的分析往往并不需要太复杂的分析了,因为大数据集的复杂分析基本上是通过抽样的方式转化成小数据集分析的方式来操作。
对于大数据集的分析,我们可以将数据读入Spark,通过Spark SQL来实现简单分析,如果确实遇到需要全量分析,我们则可以借助于SparkR
和sparklyr
甚至是scala
这样的方式来进一步拓展数据分析的能力,相应的作图也可以借助于 ggplot2.SparkR
包来实现。
如果是直接通过 Spark.SQL
的方式进行简单的交互式分析,我们也可以使用Zeppelin本身来完成。
参考资料
解密Airbnb数据流编程神器:Caravel 颠覆许多大数据分析平台的开源工具