下面这些函数并不需要输入的数据要排序,但是,为了方便阅读,大多数例子展示的是已排序的序列。
statistics.mean(data) 返回data的样本算术平均数,形式为序列或迭代器。 算术平均数是数据之和与数据个数的商。尽管它只是诸多数学平均数之一,但我们通常还是称它为“平均数”。它是数据的中心位置的量度。 若 data 为空,将会抛出 StatisticsError。 一些用法示例:
>>> mean([1, 2, 3, 4, 4])
2.8
>>> mean([-1.0, 2.5, 3.25, 5.75])
2.625
>>> from fractions import Fraction as F
>>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
Fraction(13, 21)
>>> from decimal import Decimal as D
>>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
Decimal('0.5625')
验证:
有关统计知识:
平均数会受到“异常值”的强烈干扰,因而不一定能作为数据指标的典型例子。想获得“集中趋势”的更可靠的度量,可以参看效率要低一些的median()函数。
样本均值给出了一个无偏向的真实总体均值的估计,因此当平均抽取所有可能的样本,mean(sample)收敛于整个总体的真实均值。如果data代表整个总体而不是样本,那么mean(data)等同于计算真实整体均值μ。
简单介绍迭代器
我们知道字符串、列表和元组都是序列,都可以用for...in...句型进行遍历。然而,集合不是序列,一样可以用for...in...句型进行遍历。那么可以用for...in...句型遍历不是序列才有的属性。这样,序列和集合一定可以归为一个更大的数据类型,这种数据类型可以使用for...in...句型进行遍历。对!这就是迭代对象。
除了序列和集合外,你一定会想到for i in range(start,end,step)句型,难道range也是迭代对象?对!它就是我们用得最多的迭代对象。range这类迭代对象与序列和集合不同,它里边没有元素,有的只是产生元素的方法和范围。我们把这种里面没有元素,只有产生元素的方法和范围的迭代对象,称作迭代器。迭代器是数据生成器而非数据本身。
statistics.fmean(data, weights=None)
将data转换成浮点数并且计算算术平均数。 此函数的运行速度比mean()函数快并且它总是返回一个float。data可以为序列或可迭代对象。如果输入数据集为空,则会引发StatisticsError。
>>> fmean([3.5, 4.0, 5.25])
4.25
3.11版后支持可选权重。例如,一位教授通过将测验的权重定为20%,家庭作业的权重为20%,期中考试的权重为30%,期末考试的权重则为30%来为一门课程打分:
>>> grades = [85, 92, 83, 91]
>>> weights = [0.20, 0.20, 0.30, 0.30]
>>> fmean(grades, weights)
87.6
如果输入权重,则其长度必须与数据长度相同,否则将引发ValueError。
验证:
statistics.geometric_mean(data) 将data转换成浮点数并且计算几何平均数,3.8版后增加功能。 几何平均值使用值的乘积计算,而不像算术平均值那样用和,这样使它成为数据中心趋势或典型值。
如果输入数据集为空、包含零或包含负值则将抛出StatisticsError。data 可以是序列或其它可迭代对象。
这个函数使人轻而易举得到几何平均数准确的结果。(但是,将来或许会修改。)
round(geometric_mean([54, 24, 36]), 1)
36.0
验证:
statistics.harmonic_mean(data, weights=None) 返回包含实数值的序列或可迭代对象data的调和平均数。如果weights 被省略或为None,则会按相等权重执行。 调和平均数是数据的倒数的算术平均值mean()的倒数。例如,三个数值 a, b和c的调和平均数将等于3/(1/a + 1/b + 1/c)。如果其中一个值为零,则结果也将为零。 调和平均数是均值的一种,是对数据的中心位置的度量。它通常适用于求比率和比例(如速度)的均值。 (1)假设一辆车在40km/hr的速度行驶了10 km,然后又以60km/hr的速度行驶了10km。车辆的平均速率是多少?
>>> harmonic_mean([40, 60])
48.0
验证:第一段路用时t1=10/40,第二段路用时t2=10/60,总用时t=t1+t2=10/40+10/60。平均速度=总路程/总用时v = (10+10)/t=20/(10/40+10/60)=2/(1/40+1/60)
=48.0。
(2)假设一辆汽车以速度 40 公里/小时行驶了 5 公里,当道路变得畅通后,提速到 60 公里/小时行驶了行程中剩余的 30 km。请问其平均速度是多少?
>>> harmonic_mean([40, 60], weights=[5, 30])
56.0
验证:第一段路用时t1=5/40,第二段路用时t2=30/60,总用时t=t1+t2=5/40+30/60。平均速度=总路程/总用时v = (5+30)/t=35/(5/40+30/60)=7/(1/40+6/60)
=56.0。 如果 data 为空、任意元素小于零,或者加权汇总值不为正数则会引发 StatisticsError。 当前算法在输入中遇到零时会提前退出。这意味着不会测试后续输入的有效性。(此行为将来可能会更改。)
statistics.median(data)
使用普通的“取中间两数平均值”方法返回数值数据的中位数(中间值)。如果 data 为空,则将引发 StatisticsError。data 可以是序列或可迭代对象。 中位数是衡量中间位置的可靠方式,并且较少受到极端值的影响。当数据点的总数为奇数时,将返回中间数据点:
>>> median([1, 3, 5])
3
当数据点的总数为偶数时,中位数将通过对两个中间值求平均进行插值得出:
>>> median([1, 3, 5, 7])
4.0
这适用于当你的数据是离散的,并且你不介意中位数不是实际数据点的情况。
如果数据是有序的(支持排序操作)但不是数字(不支持加法),请考虑改用 median_low() 或 median_high()。
statistics.median_low(data) 返回数值数据的低中位数。如果 data 为空则将引发 StatisticsError。data 可以是序列或可迭代对象。 低中位数一定是数据集的成员。当数据点总数为奇数时,将返回中间值。当其为偶数时,将返回两个中间值中较小的那个。
>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3
当你的数据是离散的,并且你希望中位数是一个实际数据点而非插值结果时可以使用低中位数。
验证:
statistics.median_high(data) 返回数据的高中位数。如果 data 为空则将引发 StatisticsError。data 可以是序列或可迭代对象。 高中位数一定是数据集的成员。当数据点总数为奇数时,将返回中间值。当其为偶数时,将返回两个中间值中较大的那个。
>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5
当你的数据是离散的,并且你希望中位数是一个实际数据点而非插值结果时可以使用高中位数。
statistics.median_grouped(data, interval=1) 返回分组的连续数据的中位数,根据第 50 个百分点的位置使用插值来计算。如果 data 为空则将引发 StatisticsError。data 可以是序列或可迭代对象。
>>> median_grouped([52, 52, 53, 54])
52.5
在下面的示例中,数据已经过舍入,这样每个值都代表数据分类的中间点,例如 1 是 0.5--1.5 分类的中间点,2 是 1.5--2.5 分类的中间点,3 是 2.5--3.5 的中间点等待。根据给定的数据,中间值应落在 3.5--4.5 分类之内,并可使用插值法来进行估算:
>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5])
3.7
示例说明: 分组中间值的数学公式为: GMedian = L + interval*(N/2-CF)/F, L = 中间间隔的下限, interval = 间隔幅度, N = 样本总数, CF = 中位数间隔以下的数据点数量, F=中位数区间内的数据点数。 [1、2、2、3、4、4、4、4、4、5]中位数在这4分组里面: 间隔幅度(interval)1 中间间隔的下限(L)3.5 样本总数为10(N) 4分组里有5个数 (F) 小于3.5的有4个数 (CF) 所以中位数为:3.5 + (10/2-4)/5 * 1=3.5 + 1/5=3.7。 可选参数 interval 表示分类间隔,默认值为 1。改变分类间隔自然会改变插值结果:
>>> median_grouped([1, 3, 3, 5, 7], interval=1)
3.25
>>> median_grouped([1, 3, 3, 5, 7], interval=2)
3.5
此函数不会检查数据点之间是否至少相隔 interval 的距离。CPython 实现细节:在某些情况下,median_grouped() 可以会将数据点强制转换为浮点数。此行为在未来有可能会发生改变。 参见:"Statistics for the Behavioral Sciences", Frederick J Gravetter and Larry B Wallnau (8th Edition).Gnome Gnumeric 电子表格中的 SSMEDIAN 函数,包括 这篇讨论。