当确定一个值需要超过一个主键,对数据聚合时就会产生“平均的平均”的问题。
例如,每个司机每天都有一个在线时长。要求当月每个司机每天的平均在线时长,就会有三种可能的做法:
- 直接所有对(司机,日期)对确定的所有时长取均值;
- 求每个司机当月的平均每天在线时长,再求当月平均所有司机的日均在线时长,即先对天平均,再对司机平均;
- 求每天平均每个司机的在线时长,再求当月每天的这个时长的平均值,即先对司机平均,再对天平均。
在绝大多数情况下,这三者都是不等价的。下面详细讨论。
举个例子。
时长(小时) | 司机甲 | 司机乙 | 司机丙 | 平均 |
---|---|---|---|---|
1日 | 12 | 3 | 7.5 | |
2日 | 1 | 8 | 4.5 | |
3日 | 10 | 10 | ||
平均 | 11 | 2 | 8 |
表中空缺的单元格表示该司机当日未出车。让我们来分别计算一下三个平均值:
; ; 。
直观地理解:用第一种方法算平均值,是对每个司机的每个日期的记录一视同仁地处理;用第二种方法,算到第二层平均值时,事实上假设了所有司机的当月每日平均在线时长是等价的;第三种方法同理。后两种方法可能是不公平的。例如,上面的表格中,有2条(40%)的记录是小于5小时的;但由于这两条记录都属于乙,在平均后,它们只能在最后的平均中占到33%的权重。再比如,丙只出车了1天,因此最后他的均值就是这一天的值;假如这一天他工作时间非常长或非常短,那么相比在更多日期工作的司机的某一天的记录,丙工作的唯一一天的这条记录将更能影响最后的平均结果。假如有许多司机只在第一天工作一小时就不再接单,他们对于最后的结果就将产生较大的影响,然而这是不佳的。
换言之,平均的平均之所以有问题,是因为模型的稳定性受损了。事实上,空缺的单元格就是一切麻烦的根源,空缺的单元格导致一行或一列的均值容易有较大浮动,或者说导致不同行列中的单元格数据对最后结果做出的贡献不等。假如所有的单元格是填满的,上面三个平均值是相等的。
由于第二种和第三种方法本质上没有差别,下面我们一般性地讨论一下第一种和第二种方法的差异。假如一共有
而
不难发现:
容易验证