随着互联网的极速发展,海量用户产生的海量日志,每天都在急剧膨胀。数据仓库就像一个个油井一样,我们都知道这里边有矿,但是怎么从矿里边挖出有价值的信息,一直是困扰矿主的最大问题。如果缺乏强大的分析工具,或者数据分析能力,积累再多的数据的数仓,都会变成数据坟墓:花了大力气采集过来数据,然后打包放到冷存仓库里边,一直没有任何访问,直到一天磁盘空间满了,把最老的数据清理掉。我们的决策,往往是依赖于个人的经验和直觉,而不是基于数据所呈现给我们的信息。而要从数据中挖掘出有用的信息辅助我们做决策,一方面需要强大的数据分析工具,一方面需要专业的数据分析经验。
阿里云日志服务从各种孤岛系统中采集日志,统一到云上存储,让数据所见所得。也提供了SQL这种通用的、强大的数据分析能力,让用户可以在秒级别内、在百亿数据中分析数据。数据洞察系列文章,介绍一系列数据分析经验给我们的客户,帮助我们的客户最大化数据的价值。
在数据分析中,有6大类统计分析:
- 描述性统计分析:告诉我们发生了什么事情
- 推断统计分析:通过小数据集合推断大数据集合发生了什么事情
- 预测统计分析:告诉我们未来会发生什么事情
- 指导性分析:告诉我们接下来怎么做
- 探索式数据分析:给我们一个数据的初步印象,告诉我们一些关键的发现
- 因果分析:告诉我们为什么会发生某件事情
今天我们介绍描述性数据分析的方法,帮助我们的获得对一份数据的大致印象。当我们有了一份数据,还没有明确的分析目的的时候,我们不妨先用描述性分析,先看看数据能给我们提供什么信息。
描述性数据分析的类别
1. 描述数据的频率
了解事件发生的频率至关重要,方法包括发生的次数或者百分比。在日志领域,我们甚至可以查看事件在时间维度的频率波动情况,例如查看每分钟PV的变化
* | select date_trunc('minute',__time__) as t, count(1) as pv group by t order by t limit all
2. 测量数据集中趋势
集中趋势告诉我们,数据的中心点在什么位置,一般使用三个平均值来衡量:均值、中位数、众数。就像我们看一个几何图形,会找他的几何中心或者重心在哪里,知道了大致重心,就知道了大量数据是围绕着中心转的。
SQL中计算均值和中位数的方法:
* | select avg(key), approx_percentile(key,0.5)
计算众数的方法:
* | select key,count(1) as pv group by key order by pv desc limit 1
3. 计算离散度
当我们知道数据的中心在哪里之后,我们还需要知道,其他数据是怎么围绕中心分布的,即距离中心的程度,是非常发散,还是非常聚集。评估离散度的指标有:方差(标准差)、变异系数、绝对中位数差。
标准差用于评估每个数字距离均值的距离。但是标准差是个绝对值,我们很难判断某个标准差到底是高还是低,所以我们需要一个比例变异系数,更加直观的判断。变异系数就是用标准差除以均值。 绝对中位数差,是指每个数字距离中位数的距离,类似于标准差,因此也需要一个系数来判断,可以用绝对中位数差除以中位数。
用SQL可以实现如下:
*|select stddev(key) # 标准差
*|select stddev(key)/avg(key) # 变异系数
*|select sum(diff)/count(1) as mad from (select abs(key - approx_percentile(key,0.5) over()) as diff from log ) # 计算绝对中位数差
*|select sum(abs(key-p50))/count(1)/p50 from(select key , approx_percentile(key,0.5) over() as p50 from log ) # 绝对中位数差系数
4. 评估位置
均值和中位数是总体的估计量,当我们要评估单个数字的位置的时候,最好的办法是使用分位数或者四分位数来评估。
分位数和四分位数的计算方法:
* | select approx_percentile(key,0.1) as p10, approx_percentile(key,0.9)as p90
5. 评估多列的关系
上述指标用于评估单列数字的概况。如果是2个以上变量的分析,我们更多关注两个变量之间的关系。在SQL上,我们可以计算两列的相关系数。而使用可视化手段,我们可以采取散点图或者交叉表。
* | select corr(key1, key2) # 计算相关系数
总结
本文介绍了针对数据做描述性统计分析的方法。本系列会陆续推进更多分析日志的方法。
数据洞察(2):描述性数据分析在日志场景的落地.md.