6.6. statistics — 统计学计算
目的:常见的统计计算实现。
statistics
模块实现了许多常用的统计公式,以便使用 Python 的各种数值类型(int
,float
,Decimal
和Fraction
)进行高效的计算。
平均值
均值支持三种形式,平均值,中位数和众数。mean()
用来计算算术平均值。
statistics_mean.py
from statistics import *
data = [1, 2, 2, 5, 10, 12]
print('{:0.2f}'.format(mean(data)))
整数和浮点数的返回值始终为 浮点数
。 对于“Decimal”和“Fraction”输入数据,结果与输入的类型相同。
$ python3 statistics_mean.py
5.33
使用 mode()
计算数据集中出现最多的数据点。
statistics_mode.py
from statistics import *
data = [1, 2, 2, 5, 10, 12]
print(mode(data))
返回值始终是输入数据集的成员。因为 mode()
将输入视为一组离散值,并计算重复次数,输入实际上不需要是数值。
$ python3 statistics_mode.py
2
计算中位数或中值有四种变化。前三个是常用算法的直接版本,使用不同的解决方案来处理具有偶数元素的数据集。
statistics_median.py
from statistics import *
data = [1, 2, 2, 5, 10, 12]
print('median : {:0.2f}'.format(median(data)))
print('low : {:0.2f}'.format(median_low(data)))
print('high : {:0.2f}'.format(median_high(data)))
median()
找到中心值,如果数据集具有偶数个值,则平均两个中间项。median_low()
始终从输入数据集返回一个值,使用具有偶数项的数据集的两个中间项中的较低者。median_high()
同样地返回两个中间项中的较高者。
$ python3 statistics_median.py
median : 3.50
low : 2.00
high : 5.00
中位数计算的第四个版本, median_grouped()
,将输入视为连续数据,并通过优先使用提供的间隔宽度找到中值范围,然后使用落在该范围内的数据集中的实际值的位置在该范围内插值来计算 50% 百分位中值。
statistics_median_grouped.py
from statistics import *
data = [10, 20, 30, 40]
print('1: {:0.2f}'.format(median_grouped(data, interval=1)))
print('2: {:0.2f}'.format(median_grouped(data, interval=2)))
print('3: {:0.2f}'.format(median_grouped(data, interval=3)))
随着间隔宽度增加,针对相同数据集计算的中值改变了。
$ python3 statistics_median_grouped.py
1: 29.50
2: 29.00
3: 28.50
方差
统计使用两个值来表示一组值相对于均值的分散程度。方差是每个值与均值的差值的平方的平均值,标准差是方差的平方根(这是有用的,因为取平方根允许标准差表示在与输入数据相同的单位)。方差或标准差的较大值表示一组数据是分散的,而较小的值表示数据的分组更接近均值。
statistics_variance.py
from statistics import *
import subprocess
def get_line_lengths():
cmd = 'wc -l ../[a-z]*/*.py'
out = subprocess.check_output(
cmd, shell=True).decode('utf-8')
for line in out.splitlines():
parts = line.split()
if parts[1].strip().lower() == 'total':
break
nlines = int(parts[0].strip())
if not nlines:
continue # skip empty files
yield (nlines, parts[1].strip())
data = list(get_line_lengths())
lengths = [d[0] for d in data]
sample = lengths[::2]
print('Basic statistics:')
print(' count : {:3d}'.format(len(lengths)))
print(' min : {:6.2f}'.format(min(lengths)))
print(' max : {:6.2f}'.format(max(lengths)))
print(' mean : {:6.2f}'.format(mean(lengths)))
print('\nPopulation variance:')
print(' pstdev : {:6.2f}'.format(pstdev(lengths)))
print(' pvariance : {:6.2f}'.format(pvariance(lengths)))
print('\nEstimated variance for sample:')
print(' count : {:3d}'.format(len(sample)))
print(' stdev : {:6.2f}'.format(stdev(sample)))
print(' variance : {:6.2f}'.format(variance(sample)))
Python 包括两组用于计算方差和标准差的函数,具体取决于数据集是代表整个总体还是代表总体样本。这个例子使用 wc
来计算所有示例程序的输入文件中的行数,然后使用 pvariance()
和 pstdev()
计算整个总体的方差和标准差,然后再使用 variance()
和 stddev()
用于计算通过使用找到的每个第二个文件的长度创建的子集的样本方差和标准差。
$ python3 statistics_variance.py
Basic statistics:
count : 1282
min : 4.00
max : 228.00
mean : 27.78
Population variance:
pstdev : 17.86
pvariance : 318.84
Estimated variance for sample:
count : 641
stdev : 16.94
variance : 286.90
也可以看看
- 统计模块的标准库文档
- mathtips.com:离散和连续频率类型数据的中位... -- 讨论连续数据的中位数
- PEP 450 -- 将统计模块添加到标准库
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。