基于数据点的数据分析
在进行数据分析时,常常会有基于数据点的分析需求。
比如,当做好一个客户画像应用的时候,我们可以得到某个客户的所有标签。如何验证这些标签的准确性呢?一个常用的方法是找到这个客户所有的相关数据,然后基于这些数据去验证标签的准确性。这就是基于数据点的分析,这里的数据点是前面提到的“某个”客户。
同样,当开发完指标之后,也可以尝试找出当前指标粒度(比如经销店粒度)下的所有事实及维度数据,从而进行验证。这里的数据点是“某个”经销店。
(下文为了简单,我们将基于数据点的数据分析简称为“点分析”。)
编写SQL实现点分析
想要完成这样的点分析,一般的做法是编写SQL查询相关数据,然后人为分析数据得到结论。
我们来看一下上面客户画像正确性验证的例子。要验证某一客户的画像,其实是要验证画像中的各种标签。一个典型的标签是客户的价值分级标签,从这个标签可以看出该客户是高价值的,还是低价值的。
从这个标签的计算口径中可以了解到,这个标签会统计客户在整个生命周期内的所有消费。这里的消费包括购买及后续的维修服务、保养服务等。
基于前面文章中建立的数据仓库模型,要实现这一分析,我们需要查询当前最新的业务数据,找出相关事实数据。
以“购买”事实为例,可以编写类似以下代码:
select id from (
select *,
-- 先根据订单id进行分组,然后根据时间排序,得到序号
row_number() over(partition by id order by update_time desc) n
from order
) order_with_sequence
where n = 1 -- 取序号为1的订单,即最新订单
-- 筛选客户相关的数据。这里的筛选不能放在内部查询order_with_sequence中完成,其语义不同,可能筛选出非预期的数据。
and customer_id = '{QUERY_CUSTOMER_ID}';
找到所有这些数据之后,需要进一步判断哪些数据是最终产生了有意义的订单的。这一步通常没有看起来那么简单,因为我们可能需要面对的是查询出来的数百个字段,需要从中找出关键的字段,并弄清楚其业务意义。
指标的计算口径在此时只能作为参考,因为这里的标签验证一定程度上就是为了确认计算口径的正确性。
最准确的答案应当来自当时直接接待该客户的业务人员,但想要联系当时的业务人员来确认也并非易事,通常要耗费较多的沟通时间。
总之,如何确认这些数据需要花费大量的时间查看及对比各个维度的数据。
提高点分析的效率
分析上述基于SQL的点分析过程,除了不可避免的需要人为去查看对比数据进行分析,还有一些可以从技术上提供方法进行优化的。比如:
- 简化SQL编写的复杂度
- 提高SQL查询性能
- 提供工具让分析师更容易的查看数据
下面主要从上述三点来进行分析。
简化SQL编写复杂度
比如上述查询最新订单的查询语句,需要分析人员正确理解如何提取最新数据。这里面涉及了一个不容易让人理解的开窗操作,并使得SQL更复杂了。
一个直接的解决方案是,对每张表的数据都建立一个最新数据的视图,查询最新数据的时候就无需关心这样的开窗操作。
对于订单,我们可以创建如下视图:
create view order_l