数据的统计分析有助于我们从整体上理解信息。 这在生物统计学和业务分析等许多领域都有应用。
无需查看单个数据点,只需查看它们的集体平均值或方差,便可以通过观察原始格式的所有数据来揭示我们可能错过的趋势和特征。 这也使两个大型数据集之间的比较更加容易和有意义。
牢记这些需求,Python为我们提供了统计模块。
在本教程中,您将学习计算平均值和测量给定数据集的传播的不同方法。 除非另有说明,否则此模块中的所有功能均支持基于int
, float
, decimal
和fraction
的数据集作为输入。
计算平均值
您可以使用mean(data)
函数来计算某些给定数据的平均值。 通过将所有数据点的总和除以数据点数来计算。 如果数据为空,将引发StatisticsError 。 这里有一些例子:
import statistics
from fractions import Fraction as F
from decimal import Decimal as D
statistics.mean([11, 2, 13, 14, 44])
# returns 16.8
statistics.mean([F(8, 10), F(11, 20), F(2, 5), F(28, 5)])
# returns Fraction(147, 80)
statistics.mean([D("1.5"), D("5.75"), D("10.625"), D("2.375")])
# returns Decimal('5.0625')
在上一教程中,您了解了很多生成随机数的函数。 现在让我们使用它们来生成数据,并查看最终均值是否等于我们期望的值。
import random
import statistics
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mean(data_points)
# returns 50.618
data_points = [ random.triangular(1, 100, 80) for x in range(1,1001) ]
statistics.mean(data_points)
# returns 59.93292281437689
使用randint()
函数,该均值有望接近两个极端的中点,而使用三角形分布,该均值应该接近low + high + mode / 3
。 因此,在第一种情况和第二种情况下的均值分别应为50和60.33,这与我们实际得到的值接近。
计算模式
平均值可以很好地指示平均值,但是一些极值可能会导致平均值偏离实际中心位置。 在某些情况下,更希望确定数据集中最频繁的数据点。 mode()
函数将从离散数值和非数值数据中返回最常见的数据点。 这是可以与非数字数据一起使用的唯一统计函数。
import random
import statistics
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 94
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 49
data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 32
mode(["cat", "dog", "dog", "cat", "monkey", "monkey", "dog"])
# returns 'dog'
给定范围内随机生成的整数的模式可以是任何这些数字,因为每个数字的出现频率都是不可预测的。 上面的代码片段中的三个示例证明了这一点。 最后一个示例向我们展示了如何计算非数值数据的模式。
计算中位数
依靠模式来计算中心值可能会引起误解。 正如我们在上一节中看到的,无论数据集中的所有其他值如何,它始终是最受欢迎的数据点。 确定中心位置的另一种方法是通过使用median()
函数。 如有必要,它将通过计算两个中间点的平均值来返回给定数值数据的中值。 如果数据点数为奇数,则返回中间点。 如果数据点的数量为偶数,则返回两个中值的平均值。
median()
函数的问题在于,当数据点的数量为偶数时,最终值可能不是实际的数据点。 在这种情况下,您可以使用median_low()
或median_high()
来计算中位数。 对于偶数个数据点,这些函数将分别返回两个中间点的较小值和较大值。
import random
import statistics
data_points = [ random.randint(1, 100) for x in range(1,50) ]
statistics.median(data_points)
# returns 53
data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median(data_points)
# returns 51.0
data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median(data_points)
# returns 49.0
data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median_low(data_points)
# returns 50
statistics.median_high(data_points)
# returns 52
statistics.median(data_points)
# returns 51.0
在最后一种情况下,中位数下限为50和52。这意味着在我们的数据集中没有值51的数据点,但是median()
函数仍然计算出中位数为51.0。
测量数据传播
确定数据点与数据集的典型值或平均值有多少偏离与计算中心值或平均值本身一样重要。 统计模块具有四个不同的功能来帮助我们计算这种数据分布。
您可以使用pvariance(data, mu=None)
函数来计算给定数据集的总体方差。
在这种情况下,第二个参数是可选的。 提供的mu值应等于给定数据的平均值。 如果缺少该值,将自动计算平均值。 当您要计算整个总体的方差时,此功能很有用。 如果您的数据只是总体样本,则可以使用variance(data, xBar=None)
函数来计算样本方差。 在此, xBar是给定样本的平均值,如果未提供,则会自动计算。
要计算总体标准定义和样本标准偏差,可以分别使用pstdev(data, mu=None)
和stdev(data, xBar=None)
函数。
import statistics
from fractions import Fraction as F
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
statistics.pvariance(data) # returns 6.666666666666667
statistics.pstdev(data) # returns 2.581988897471611
statistics.variance(data) # returns 7.5
statistics.stdev(data) # returns 2.7386127875258306
more_data = [3, 4, 5, 5, 5, 5, 5, 6, 6]
statistics.pvariance(more_data) # returns 0.7654320987654322
statistics.pstdev(more_data) # returns 0.8748897637790901
some_fractions = [F(5, 6), F(2, 3), F(11, 12)]
statistics.variance(some_fractions)
# returns Fraction(7, 432)
从上面的示例可以明显看出,较小的方差意味着更多数据点的值更接近均值。 您还可以计算小数和分数的标准偏差。
最后的想法
在本系列的最后一篇教程中,我们了解了统计模块中可用的不同功能。 您可能已经观察到,在大多数情况下,赋予函数的数据是经过排序的,但并非必须如此。 我在本教程中使用了排序列表,因为它们使您更容易理解不同函数返回的值与输入数据之间的关系。
翻译自: https://code.tutsplus.com/tutorials/mathematical-modules-in-python-statistics--cms-27750