Eric Way's Personal Site

I Write $\sin(x)$ Not Tragedies

平均的平均

2020-08-06 Mathematics

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

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

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

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

举个例子。

时长(小时) 司机甲 司机乙 司机丙 平均
1日 12 3 7.5
2日 1 8 4.5
3日 10 10
平均 11 2 8

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

  1. $A_1 = (12 + 10 + 3 + 1 + 8) / 5 = 6.8$;
  2. $A_2 = (11 + 2 + 8)/3 = 7$;
  3. $A_3 = (7.5 + 4.5+ 10)/3 = 7.3$。

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

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

由于第二种和第三种方法本质上没有差别,下面我们一般性地讨论一下第一种和第二种方法的差异。假如一共有$N$条数据,一共有$K$列,其中第$k$列有$N_k$条数据(显然$N_1 + N_2 + \dots + N_K = N$),第$k$列所有数据求和是$S_k$,那么:
$$
A_1 =\frac{S_1 + S_2 + \dots + S_K}{N}=\frac{S_1 + S_2 + \dots + S_K}{N_1 + N_2 + \dots + N_K}
$$

$$
A_2 = \frac{\frac{S_1}{N_1}+\frac{S_2}{N_2}+\dots+\frac{S_K}{N_K}}{K}
$$
不难发现:
$$
A_2-A_1 = \frac 1 K\sum_{k=1}^K S_k\left(\frac{1}{N_k}-\frac K N\right)
$$
容易验证$A_1 = A_2$的取等的一个充分条件是$N_1 = N_2 = \dots = N_K = N/K$;取等的另外一个充分条件是$S_k/N_k$全部相等。笔者难以找到取等的必要条件,但是可以确定的是,在一般业务场景下,即当数据量足够大的时候,不能期待这两者相等。

This article was last updated on days ago, and the information described in the article may have changed.