Yuhang's Blog

平均的平均

2020-08-06 Mathematics

当确定一个值需要超过一个主键,对数据聚合时就会产生“平均的平均”的问题。

例如,每个司机每天都有一个在线时长。要求当月每个司机每天的平均在线时长,就会有三种可能的做法:

  1. 直接所有对(司机,日期)对确定的所有时长取均值;
  2. 求每个司机当月的平均每天在线时长,再求当月平均所有司机的日均在线时长,即先对天平均,再对司机平均;
  3. 求每天平均每个司机的在线时长,再求当月每天的这个时长的平均值,即先对司机平均,再对天平均。

在绝大多数情况下,这三者都是不等价的。下面详细讨论。

举个例子。

时长(小时)司机甲司机乙司机丙平均
1日1237.5
2日184.5
3日1010
平均1128

表中空缺的单元格表示该司机当日未出车。让我们来分别计算一下三个平均值:

  1. A1=(12+10+3+1+8)/5=6.8
  2. A2=(11+2+8)/3=7
  3. A3=(7.5+4.5+10)/3=7.3

直观地理解:用第一种方法算平均值,是对每个司机的每个日期的记录一视同仁地处理;用第二种方法,算到第二层平均值时,事实上假设了所有司机的当月每日平均在线时长是等价的;第三种方法同理。后两种方法可能是不公平的。例如,上面的表格中,有2条(40%)的记录是小于5小时的;但由于这两条记录都属于乙,在平均后,它们只能在最后的平均中占到33%的权重。再比如,丙只出车了1天,因此最后他的均值就是这一天的值;假如这一天他工作时间非常长或非常短,那么相比在更多日期工作的司机的某一天的记录,丙工作的唯一一天的这条记录将更能影响最后的平均结果。假如有许多司机只在第一天工作一小时就不再接单,他们对于最后的结果就将产生较大的影响,然而这是不佳的。

换言之,平均的平均之所以有问题,是因为模型的稳定性受损了。事实上,空缺的单元格就是一切麻烦的根源,空缺的单元格导致一行或一列的均值容易有较大浮动,或者说导致不同行列中的单元格数据对最后结果做出的贡献不等。假如所有的单元格是填满的,上面三个平均值是相等的。

由于第二种和第三种方法本质上没有差别,下面我们一般性地讨论一下第一种和第二种方法的差异。假如一共有N条数据,一共有K列,其中第k列有Nk条数据(显然N1+N2++NK=N),第k列所有数据求和是Sk,那么:
A1=S1+S2++SKN=S1+S2++SKN1+N2++NK

A2=S1N1+S2N2++SKNKK
不难发现:
A2A1=1Kk=1KSk(1NkKN)
容易验证A1=A2的取等的一个充分条件是N1=N2==NK=N/K;取等的另外一个充分条件是Sk/Nk全部相等。笔者难以找到取等的必要条件,但是可以确定的是,在一般业务场景下,即当数据量足够大的时候,不能期待这两者相等。