月度归档:2010 年十一月

BI应用中的三大矛盾

spear-and-shield  因为近期工作的变更,一直在忙一些杂七杂八的东西,工作交接、离职手续及对新工作的思路整理,目前还处在这个阶段,所以可能近期没有比较新的内容跟大家分享,最近的几篇文章会以一些总结的内容为主,主要是对之前的工作中的一些感想。但相信之后会有更加丰富的数据分析相关的内容向大家呈上,因为我相信我要去的新公司是一个朝气蓬勃、充满创意和挑战的地方,而最重要的是他们对数据的重视和理解。

  看到文章标题,相信大家已经知道这篇文章还是关于BI方面的,其实这是我刚进现在所在公司的时候所写的一篇文章,现在回头看来即使一直努力地在协调好这些矛盾,但说实话最终没有一个是真正完完全全的解决了的。我相信如果其他公司也是自己搭建BI系统的话,多多少少也会遇到这些问题,可能其中的一两个矛盾现在也正困扰着大家,我这里提供了我的解决方案,至于可行性和效果,有待大家去验证。

矛盾一:业务部门对数据的理解与数据部门对需求的理解

  把它放在第一位是因为这个直接影响着数据所能发挥的效用,或者说这个矛盾没协调好的话,数据所能创造的价值将大打折扣。造成这个矛盾的原因就是业务部门无法了解数据的获取、处理、计算整个流程,从而对数据的含义和用处产生了自己的理解;同时数据部门无法真正了解业务需求,不清楚数据到底用于何处,为了监控或评估产品的哪个方面,于是无法提供最优或最有效的数据。

  解决方案:建立业务部门与数据部门间的接口。这个接口包括规范的流程详细的文档合理的数据展现,而最重要的还是能够衔接起业务和数据之间的人

  首先是数据需求流程的规范化,也就是需求一般由业务部门提起,通过数据部门对数据的获取和计算将结果返回给业务部门,这个流程中业务部门不仅要提供数据的规则,同时应该对获取数据的目的、指标的定义、用处和价值做出详细的描述;而数据部门不仅要给出最终数据,同时需要对指标的获取途径、计算方法作出解释,最终的目的都是为了使双方在理解上能够达成一致。

  其次是详细的文档。这个其实就是上面所说的流程中必然会产生的两类文档:数据需求文档数据解释文档(在数据仓库里面是元数据的重要组成部分,关于数据仓库的元数据一直想整理一篇文章出来,希望在之后尽快贴上来),文档的内容基本就是包含上面流程中提到的那些内容。

  再者就是合理的数据展现。其实就是一个原则:让每个人看到自己想看的数据,并能直观地理解这些数据。无论是报表、Excel还是其他展现方式,每个指标都应该能够有途径去直接查看相应的数据解释文档,而数据应该以最直观的方式展现出来以方便理解,借助各类图表结合的方式。

  最后也是最重要的一点就是业务与数据的衔接者。这类人员应该对产品的战略目标、业务流程十分熟悉,同时对数据的获取途径、计算方法也了如指掌,或许不需要涉及高技术难度的数据ETL处理、组织和优化,但必须具备自己去计算和获取各类数据的能力。

矛盾二:业务需求的不断变化与生成数据的复杂流程

  业务需求是不断变化的,尤其是身在互联网这个发展迅速的环境中。所以我们往往会遇到每天业务部门都会有新的需求过来,或者几天前某个指标的计算逻辑在几天之后就发生了变化。而数据部门面对这些情况,往往会陷入困境,一方面由于数据获取上的问题导致某些指标没法计算得到,另一方面指标计算逻辑的改变可能需要改动到整个复杂的数据处理流程,令人头疼。

  解决方案集成化的完整的底层数据与快速灵活的数据获取途径

  其实在关于数据仓库架构的文章中就提到过数据仓库尽量保存所有的底层细节数据,包括原始的日志点击流数据和前台数据库的ODS数据以及其他来源的数据,其实我不太建议数据仓库是单纯根据需求建立起来的多维模型,因为需求始终会变,但多维模型在应对变化时有缺失灵活性。而如果保存的底层数据,其实在大部分时间内就能做到以不变应万变,因为几乎所有的指标都是从这些底层数据中计算得到的,拥有了底层数据相当于满足了大部分数据的需求。

  还有一个问题就是对需求改变时的及时应变,一种方法是建立面向不同主题的多维模型(当然是在底层数据的上层建的),因为多维模型能够满足从多个角度多个层面对数据的观察分析,能够从一定程度上解决数据的多样需求;同时基于底层数据集成化的组织管理环境,使用标准化的统计语言,如SQL语句,借助其强大的对数据的聚合、排序、分组等能力,加速数据的获取和计算。

矛盾三:数据即时查询的效率与海量数据的处理和建模

  其实这里又是一个权衡的问题,即如何在提供足够丰富的指标的前提下保证数据的展现、获取和查询的效率能够满足数据需求方的要求。如果提供的指标不够,或者数据的粒度不够细,就无法满足日常数据监控和分析需要;相反,如果每天计算和统计的指标过多或者数据分得太细,那么显然会增加服务器运算的负荷,同时在数据查询上的响应能力也会相应的下降。

  解决方案把握核心数据,建立合理的多维模型

  其实数据仓库中海量数据的处理和查询效率的问题本身就是一门很深的学问,涉及数据仓库结构和ETL的优化、OLAP的优化(上一篇文章——OLAP的基本特征有提到Oracle在这方面所做的优化),这里不谈论这些技术上的实现途径,还是说应用上的。

  核心数据,简单说就是网站的目标、KPIs等,这些数据是从高层到基层人员都在时刻关注的数据,所以最优先的原则就是保证这些数据的查询效率和及时响应。最简单的做法就是这些指标独立统计,不放入多维模型,只做每天的简单聚合存入Summary表中直接供报表展现。

  另一个就是建立合理的多维模型,说到合理这里又要抱怨下,数据的需求方起初会漫无边际地提各种需求,可能会有上百个指标,但一旦统计出来之后很少会有人真正去使用和分析这些指标(估计是因为看了会眼花),这个我在关于实时数据统计中提到过类似问题。因为在多维模型中增加一个维或维的层次加深一层,对于立方的数据是以乘积方式递增的,比如增加一个100条记录的维相当于立方的数据乘以100,或者时间维的粒度从天到小时,相当于数据量是原先的24倍,这个对于那些本身数据量就非常庞大的多维模型而言本身就是一场灾难。所以建立多维模型时的原则是提供实际应用中需要的维和指标,同时把握好各个维的层次粒度。

  上面就是我遇到的三大难题了,一下子又写了这么多,希望大家有耐心看完。其实之前的工作也较多地涉及了一些技术上面的东西,主要是Oracle和PL/SQL,由于对于那方面不是很擅长,另外博客主要面向网站数据分析方面的主题,所以很多总结的东西也不敢拿出来献丑,如果大家希望也有这个方面的讨论的,我可以分享几篇上来,大家可以留言给我点建议。 ;)

OLAP的基本特征

features-of-olap  又是一篇关于商务智能(BI)方面的文章,前面有几篇文章介绍了数据仓库、多维模型和OLAP方面的知识。这篇文章主要总结了OLAP具备的一些基本特征,以及其在数据的处理、展示和分析中体现的优势。

  其实我们大部分时间是在模仿,参考书本或者他人的范例,而当我们去实现这些东西的时候,我们又会有自己的体验,我们需要将这些体验记录下来,当我们能够自己去总结整个实现过程的时候,其实可以认为我们已经掌握了这个知识或技能。而正是在总结的过程中,我们也许会发现原先的范例可能并不是最优的,我们会产生自己的思考和优化方案,其实到这一步的时候你已经实现了一个超越,而当你自己的方案被实践所验证时,那么可能你已经站在了一些人的前面了。而我今天要做的就是——“总结”。

OLAP的类型和基本操作

  先来回顾下一些基础知识,之前的文章——数据立方体与OLAP中介绍过OLAP的一些基本知识,包括OLAP的类型ROLAPMOLAPHOLAP

  以及OLAP的基本操作钻取(Drill-down)上卷(Roll-up)切片(Slice)切块(Dice)以及旋转(Pivot)

  因为这些在之前的文章中都有介绍,这里不再重复了,有兴趣了解的同学直接去看我之前的那篇文章即可。

OLAP的优势

  OLAP的优势包括之前提到的丰富的数据展现方式高效的数据查询以及多视角多层次的数据分析。这里再补充两点,是Oracle 11g的官方文档介绍OLAP时提到的在Oracle中使用Cube所具备的优势(当然Oracle里面的Cube指的是MOLAP类型的数据组织方式,有点偏技术了):

  从细粒度数据到汇总数据的预聚合(fine-grained approach to pre-aggregating summary data):Oracle的Cube提供了基于成本的预聚合(Cost based pre-aggregation),也就是既不会完全不进行预先的聚合,也不会将每个维每个层次的数据都预先聚合起来;而是会去考虑对于每条记录聚合的成本,并将那些在动态聚合中相对高成本的记录预先聚合并储存起来,这样相当于权衡了立方数据加载时的压力和数据查询时的效率(过度的预聚合会使数据加载的时间和空间成本提高,而过少的预聚合则会让数据查询的效率降低)。而其最终实现的就是最具性价比的快速查询(fast query)。

  维和立方之间的预关联(pre-joining of dimensions to cube):当然这个也是基于MOLAP所具有的优势,MOLAP是基于数组来构建的,所以维和立方之间是预关联的,也就是相比ROLAP而言,其消除了构建索引以及建立表或物化视图时所需要的额外的时间开销,而在聚合数据的时候也避免了维和立方之间的多次关联。

OLAP的基本特征

  进入主体内容,下面是我自己对OLAP所具备的基本特征的总结,当然包括一些国外的博客和相关网站的介绍(现在打开某些国外的网站还真累),Oracle的一些文档资料以及自己在实际使用时的体会。其实每个特征都从不同层面上体现着OLAP对数据的组织、处理和分析上的优势。

数据建模(Data Modeling)

  我们知道数据仓库的特征之一是面向主题的,而数据模型的构建正是为了将原本基于业务关系的数据整理成更符合人们日常观察事物的一般方式,多维模型让人们对数据的观察更加得心应手,数据建模的优势就是体现在简化了复杂的数据组织逻辑和关系

Mondrian

多维与可视化(Multidimensional and Visual)

  多维和可视化体现在对数据多视角多层次的展现上。其实多维模型的OLAP在可视化层面上主要体现在报表上的钻取、上卷、切片等操作,如果用过Mondrian的开源OLAP引擎就能体验到其实就是一个类似树形结构的展开,就像Windows里面的资源管理器左侧列表,这个符合人们日常观察和使用的习惯。同时大部分的报表工具都支持此类的OLAP展示,MDX(Multi-Dimensional Expression,多维表达式)就是专门为多维OLAP打造的查询语法标准。

聚合(Aggregation)

  聚合的优势体现在满足了从细节数据到高度汇总数据的不同需求。聚合的特征在多维模型中体现为预计算(pre-calculated)以及快速查询(fast query)上面,能够在不同的数据粒度上对数据进行聚合汇总,满足数据的多种需求。

计算度量(Calculated Measures)

  计算度量更加丰富地表现了各类指标的延伸、比率及变化趋势等。最简单的计算度量就是指标间的加减乘除、排名及比例,常见的例子就是销售额减成本计算得到利润,进而根据利润对不同的产品进行排名,或者计算各类产品类型的利润所占的比例等;另外一种就是基于时间序列上计算得到的度量,比如同比增长、环比增长、期初累计、移动平均等。所以计算度量的存在让我们的分析指标有了更多的选择。

预测(Forecast)

  其实熟悉OLAP,用过相关OLAP工具的朋友都知道,大部分的OLAP都会提供预测的功能,一般是基于时间序列的预测,工具直接提供相应的预测方法,比如加权移动平均法、指数平滑法(历史数据加权平均的不断迭代的过程)等。因为在实践中没有用到过,所以这里也不便讨论起具体的意义多大,但这种不需要自己去写算法,而直接使用工具根据相应的聚合数据预测未来的趋势,至少能为我们快捷地展现数据可能的走向,并做出可能调整

  好了,今天的总结就到这里,不知道对你来说是不是也有些许收获。 :)

一个有效的内容推荐方法

recommendation  内容推荐,似乎对于网站而言是个有点技术难度的功能实现,目前大部分网站可能都会提供热门内容排行的展示,这可以认为是最简单的推荐,因为只需要对内容的浏览量、下载量、评论量等进行排序即可,所以对于后台的计算不会造成太大的压力。但同样不需要高深的算法和复杂的数据处理流程,我们在内容推荐上可以做得更多,更有创意,当然也可能更具效益。

为什么要推荐

  首先再来明确下为什么要进行内容推荐?我的理解是如果用户有特定需求,并且用户对自身的需求十分明确,那么用户会利用网站上可以使用的途径来寻找自己需要的信息,只要你的网站提供足够高效的渠道。而当用户对自身的需求并没有那么明确,或者用户从没发觉你的网站上存在一些会如此让他着迷的东西,那么显然用户很难发现这些内容,这个时候就需要一个有效的内容推荐途径来帮助用户了,给用户装上一个智能导航系统。

  但往往我们很容易就陷入了这样一个思维怪圈:向用户推荐与用户的兴趣相关的内容,这确实是一个很棒的个性化服务的应用,我之前也写过此类的文章——向上营销、交叉营销与关联推荐;但这个毕竟实现起来需要一定的成本,而且如果把推荐限制在这个个性化的层面,容易让自己走入死胡同,或许不需要这么复杂,我们可以找到其他有效的推荐方法,而且可能对于中小网站其效果也不会比基于高级算法的个性化推荐功能会差。

选择简单有效的推荐方法

  这里要介绍的推荐功能基于一个简单的实现方式,即在首页或者网站的侧边栏的某个模块中开辟一块小区域来放些你想要推荐的内容,正如我的博客首页导航栏正下方的滚动内容推荐。其实这个推荐的思维形式很简单,就是不要忽视用户的眼光和选择,把用户认为有趣的内容推荐给其他的用户。

  首先要认识到的是那些网站曝光度很高的内容可能不需要你做另外的推荐,这也是这里要介绍的这个推荐方法与常见的热门推荐间的最大不同。因为用户能够找到途径去发现这些内容,可以看一下Google的网站管理员工具上对于“指向网站的链接”排名:

google-webmaster-linkrank

  再看一下Google Analytics的Top Landing Pages的排名:

GA-landing-pages

  很显然用户可以找到一些渠道进入这些页面来查看内容,所以我们真的需要推荐的不是这些。那些转化率高(或者Avg. Time on Page)高的,但曝光度不够(用户找不到,或者没有意识到)的内容才是我们推荐的重点。因为它们拥有较高的转化率,能够直接帮你实现网站的目标,同时考虑较低的Bounce Rate或者较高的停留时间说明这些内容对用户具有一定的吸引力,这也是它们值得被推荐的理由,我们可以把它们展示到显眼的位置。

  好的,既然我们已经有了思路,接下去就是寻找上面所说的值得推荐的内容了。这里不得不介绍下Google Analytics推出的新功能——Weighted Sort,进入Content模块的Top Content,先点击$ Index排序,就会出现一个Weighted Sort的勾选框,勾上它预期的效果就出来了:

GA-weighted-sort

  接下去就是选择那些Unique Pageviews相对较低的内容放到推荐模块,这个工作就完成了,是不是很简单。

  当然还有其它的方法,比如如果你已经将数据导出到Excel,那么在上面进行自定义排序会是个好方法:根据Conversion Rate、Avg. Time on Page降序,再按照Pageviews升序后,也就你就看到你该推荐的内容了。如果你的数据存在了数据仓库,那就更方便了,SQL强大的Order By功能就可以发挥作用了。

  好了,我已经把自己的分析结果应用到我的博客首页面内容滚动展示模块的,你也可以尝试下这个推荐方法,也许会带来不错的效果。