9.7. statistics — 数学统计函数 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/statistics
跳转至:导航、​搜索

9.7. 统计数据 — 数理统计函数

3.4 版中的新功能。


源代码: :source:`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)

调和平均值是一种平均值,是数据中心位置的度量。 在对速率或比率(例如速度)等量求平均值时,这通常是合适的。 例如:

假设投资者购买三家公司中每家公司的等值股份,市盈率(市盈率)分别为 2.5、3 和 10。 投资者投资组合的平均市盈率是多少?

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

使用算术平均值得出的平均值约为 5.167,这太高了。

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

3.6 版中的新功能。

statistics.median(data)

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

中位数是对中心位置的可靠度量,受数据中存在异常值的影响较小。 当数据点数为奇数时,返回中间数据点:

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

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

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

这适用于您的数据是离散的,并且您不介意中位数可能不是实际数据点的情况。

如果您的数据是序数(支持顺序操作)但不是数字(不支持加法),则应使用 median_low()median_high() 代替。

statistics.median_low(data)

返回数值数据的低中位数。 如果 data 为空,则引发 StatisticsErrordata 可以是序列或迭代器。

低中位数始终是数据集的成员。 当数据点数为奇数时,返回中间值。 当它是偶数时,返回两个中间值中较小的一个。

>>> median_low([1, 3, 5])
3
>>> median_low([1, 3, 5, 7])
3

当您的数据是离散的并且您希望中位数是实际数据点而不是插值时,请使用低中位数。

statistics.median_high(data)

返回数据的高中位数。 如果 data 为空,则引发 StatisticsErrordata 可以是序列或迭代器。

高中位数始终是数据集的成员。 当数据点数为奇数时,返回中间值。 当它是偶数时,返回两个中间值中较大的一个。

>>> median_high([1, 3, 5])
3
>>> median_high([1, 3, 5, 7])
5

当您的数据是离散的并且您希望中位数是实际数据点而不是插值时,请使用高中位数。

statistics.median_grouped(data, interval=1)

使用插值返回分组连续数据的中位数,计算为第 50 个百分位数。 如果 data 为空,则引发 StatisticsErrordata 可以是序列或迭代器。

>>> 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

此函数不检查数据点是否至少间隔 间隔

也可以看看

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

  • 计算 中值

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


statistics.mode(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 的总体方差,这是实值数字的非空迭代。 方差,或关于均值的二阶矩,是对数据可变性(传播或分散)的度量。 大的方差表明数据是分散的; 小的方差表明它紧密地聚集在均值附近。

如果给出了可选的第二个参数 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 的子类,用于统计相关异常。