虽然几种平均数都属于平均值的范畴,但它们的关注点是不一样的。这种关注点的差异,其实在一定程度上也反映了原始数据的某些分布(比如几何平均数就比较接近于较小的值)。如果所要了解的“可读性”正好关注的是这类分布的数据,那我想这个平均值本身就能反映该“可读性”了。而你所说的“调和级数”,其实也只不过是一种根据数值大小,给予不同权重而求得的平均值,它跟方差似乎也没有什么关系呢。
而所谓的“动态剔除方差较大的数值”,是好的(点击量很大的)与差的(点击量很小的)离群值都去掉呢,还是只去掉其中差的?若只去掉差的,是否会有些主观?若同时去掉好的与差的,是否又回到了求平均值的效果?
比如:100篇文章,一种情况是每一篇都点击100次;一种情况是98篇每篇都点击100次,剩余两篇分别点击101次与99次;还有一种是98篇每篇都点击100次,剩余两篇分别点击150次与50次。这三种情况到底哪一个的可读性更好呢?这其实还是回到最初的定义问题上来了。
下面是我把数据和不同方法都用R代码表示出来(如果还有什么其他数据,可以往其中增加,以测试和比较不同函数对可读性的计算结果):
<br />
Sys.setlocale(locale = "Chinese_China.936") # 设置字符集,以便使用汉字作为列名(若R语言环境本身为中文,则可不用此句)<br />
<br />
# 设置数据<br />
data <- list(<br />
a = c(100, rep(0, 99)),<br />
b = rep(1, 100),<br />
c = c(100, rep(1, 99)),<br />
d = rep(2, 100),<br />
e = c(rep(30, 50), rep(50, 50)),<br />
f = rep(100, 100),<br />
g = c(rep(100, 98), 101, 99),<br />
h = c(rep(100, 98), 150, 50)<br />
)<br />
<br />
# 不同的函数<br />
funs <- c(<br />
"算术平均数" = mean,<br />
"中位数" = median,<br />
"几何平均数" = function(x) prod(x) ^ (1 / length(x)),<br />
"调和平均数" = function(x) 1 / sum(1 / x),<br />
"调和级数" = function(x) sum(sort(x) / seq_along(x))<br />
)<br />
<br />
# 计算结果<br />
sapply(funs, function(FUN) lapply(data, FUN))<br />
计算结果如下:
<br />
算术平均数 中位数 几何平均数 调和平均数 调和级数<br />
a 1 0 0 0 1 <br />
b 1 1 1 0.01 5.187378<br />
c 1.99 1 1.047129 0.01009999 6.177378<br />
d 2 2 2 0.02 10.37476<br />
e 40 40 38.72983 0.375 169.3848<br />
f 100 100 100 1 518.7378<br />
g 100 100 99.9999 0.999998 517.7478<br />
h 100 100 99.71273 0.9933775 469.2378<br />
供参考,欢迎大家踊跃发言,集思广益。