Skip to main content

9.7. statistics —数学统计函数

3.4 新版功能.

源代码: Lib/statistics.py


该模块提供用于计算数字(Real 值)数据的数学统计的功能。

注解

除非另有明确说明,否则这些功能支持 intfloatdecimal.Decimalfractions.Fraction。目前不支持其他类型的行为(无论是否在数字塔中)。混合类型也是未定义的和实现依赖的。如果您的输入数据由混合类型组成,您可以使用 map() 来确保一致的结果,例如。 map(float, input_data)

9.7.1. 中央位置的平均值和度量

这些函数从总体或样本计算平均值或典型值。

mean()

数据的算术平均值(“平均”)。

harmonic_mean()

数据的谐波均值。

median()

数据的中位数(中间值)。

median_low()

数据的中位数低。

median_high()

数据的中位数高。

median_grouped()

中位数或第50百分位数的分组数据。

mode()

离散数据的模式(最常见值)。

9.7.2. 传播的措施

这些函数计算总体或样本趋向于偏离典型值或平均值多少的量度。

pstdev()

数据的总体标准偏差。

pvariance()

数据的人口方差。

stdev()

数据的样本标准偏差。

variance()

数据的样本方差。

9.7.3. 功能详细信息

注意:这些函数不要求对它们提供的数据进行排序。然而,为了阅读方便,大多数实例显示了排序的序列。

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()mode()。 (在这种情况下,“有效”是指统计效率而不是计算效率。)

样本平均值给出了真实总体平均值的无偏估计,这意味着,在所有可能的样本上取平均值,mean(sample) 收敛于整个总体的真实平均值。如果 data 代表整个群体而不是样本,则 mean(data) 等价于计算真实群体平均值μ。

statistics.harmonic_mean(data)

返回 data 的谐波平均值,即实数值的序列或迭代器。

谐波平均值,有时称为子谐振平均值,是数据倒数的算术 mean() 的倒数。例如,三个值 abc 的调和平均值将等于 3/(1/a + 1/b + 1/c)

调和平均值是一种平均值,是数据中心位置的度量。通常适用于平均速率或比率的数量,例如速度。例如:

假设投资者在三家公司中的每一家购买了相同的股票价值,P/E(价格/收益)比率为2.5,3和10.投资者投资组合的平均市盈率是多少?

>>> harmonic_mean([2.5, 3, 10])  # For an equal investment portfolio.
3.6

使用算术平均值将给出大约5.167的平均值,这太高了。

如果 data 为空或任何元素小于零,则引发 StatisticsError

3.6 新版功能.

statistics.median(data)

使用常用的“中间两个平均值”方法返回数值数据的中值(中间值)。如果 data 为空,则 StatisticsError 被引发。 data 可以是序列或迭代器。

中位数是中心位置的鲁棒测量,并且受到数据中异常值的存在的影响较小。当数据点的数量为奇数时,返回中间数据点:

>>> median([1, 3, 5])
3

当数据点的数目是偶数时,通过取两个中间值的平均值来内插中值:

>>> median([1, 3, 5, 7])
4.0

这适合于您的数据是离散的,并且您不介意中值可能不是实际的数据点。

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

可选参数 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

在某些情况下,median_grouped() 可能会将数据点强制为浮点数。这种行为在未来可能会改变。

参见

  • “行为科学统计”,Frederick J Gravetter和Larry B Wallnau(第8版)。

  • 计算 中位数

  • Gnome Gnumeric电子表格中的 SSMEDIAN 函数,包括 这个讨论

statistics.mode(data)

从离散或标称 data 返回最常见的数据点。模式(当存在时)是最典型的值,并且是中心位置的鲁棒测量。

如果 data 为空,或者没有一个最常见的值,则 StatisticsError 被引发。

mode 假定离散数据,并返回单个值。这是学校通常教授的模式的标准处理:

>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
3

该模式是唯一的,因为它是唯一也适用于标称(非数字)数据的统计量:

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
'red'
statistics.pstdev(data, mu=None)

返回总体标准差(总体方差的平方根)。有关参数和其他详细信息,请参阅 pvariance()

>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
0.986893273527251
statistics.pvariance(data, mu=None)

返回 data 的总体方差,data 是实数值的非空迭代。方差或关于平均值的二阶矩是数据的可变性(扩散或分散)的度量。大的方差表示数据被展开;小方差表示其在均值附近聚集。

如果给出了可选的第二个参数 mu,它应该是 data 的平均值。如果缺失或 None (默认),将自动计算平均值。

使用此函数计算整个总体的方差。为了估计样本的方差,variance() 函数通常是更好的选择。

如果 data 为空,则提高 StatisticsError

例子:

>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]
>>> pvariance(data)
1.25

如果您已经计算了数据的均值,则可以将其作为可选的第二个参数 mu 传递,以避免重新计算:

>>> mu = mean(data)
>>> pvariance(data, mu)
1.25

此函数不会尝试验证您已通过 mu 的实际平均值。对 mu 使用任意值可能导致无效或不可能的结果。

支持小数和分数:

>>> from decimal import Decimal as D
>>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('24.815')

>>> from fractions import Fraction as F
>>> pvariance([F(1, 4), F(5, 4), F(1, 2)])
Fraction(13, 72)

注解

当调用整个人口时,这给出了人口方差σ²。当调用样本时,这是偏置样本方差s²,也称为具有N个自由度的方差。

如果你以某种方式知道真实的总体平均值μ,你可以使用这个函数来计算样本的方差,给出已知的总体平均值作为第二个参数。如果数据点是代表性的(例如独立和相同分布的),则结果将是对群体方差的无偏估计。

statistics.stdev(data, xbar=None)

返回样本标准偏差(样本方差的平方根)。有关参数和其他详细信息,请参阅 variance()

>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])
1.0810874155219827
statistics.variance(data, xbar=None)

返回 data 的样本方差,一个至少两个实数值的迭代。方差或关于平均值的二阶矩是数据的可变性(扩散或分散)的度量。大的方差表示数据被展开;小方差表示其在均值附近聚集。

如果给出了可选的第二个参数 xbar,它应该是 data 的平均值。如果缺失或 None (默认),将自动计算平均值。

当您的数据是来自总体的样本时,使用此函数。要计算从整个人口的方差,请参阅 pvariance()

如果 data 具有少于两个值,则提高 StatisticsError

例子:

>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> variance(data)
1.3720238095238095

如果您已经计算了数据的均值,则可以将其作为可选的第二个参数 xbar 传递,以避免重新计算:

>>> m = mean(data)
>>> variance(data, m)
1.3720238095238095

此函数不会尝试验证您已通过 xbar 的实际平均值。对 xbar 使用任意值可能导致无效或不可能的结果。

支持小数和分数值:

>>> from decimal import Decimal as D
>>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")])
Decimal('31.01875')

>>> from fractions import Fraction as F
>>> variance([F(1, 6), F(1, 2), F(5, 3)])
Fraction(67, 108)

注解

这是样本方差s²与贝塞尔校正,也称为具有N-1自由度的方差。如果数据点是代表性的(例如独立和相同分布的),则结果应该是真实总体方差的无偏估计。

如果您以某种方式知道实际的群体平均值μ,您应该将其作为 mu 参数传递给 pvariance() 函数,以获取样本的方差。

9.7.4. 例外

定义了一个异常:

exception statistics.StatisticsError

用于统计相关异常的 ValueError 子类。