列表的标准偏差


103

我想找到几个(Z)列表的第一,第二,...个数字的均值和标准差。例如,我有

A_rank=[0.8,0.4,1.2,3.7,2.6,5.8]
B_rank=[0.1,2.8,3.7,2.6,5,3.4]
C_Rank=[1.2,3.4,0.5,0.1,2.5,6.1]
# etc (up to Z_rank )...

现在,我要获取的均值和std *_Rank[0],的均值和std *_Rank[1]
(即:所有(A..Z)_rank列表中第一个数字
的均值和std;来自的第二个数字的均值和std所有(A..Z)_rank列表;
第三个数字的均值和std ...;等等)。


13
你好,病毒。堆栈溢出效果最好的问题 -和- 答案的网站。您提出问题,其他所有人都提供答案。您的帖子仅包含陈述,没有问题。您是否有特定的编程问题?换句话说,到目前为止,您做了什么尝试?
罗伯(Robᵩ)2013年

2
为什么这些列表不存在字典中?
Waleed Khan

抱歉,如果我没有正确传达问题。我想表示A_rank [0](0.8),B_rank [0](0.1),C_rank [0](1.2),... Z_rank [0]。与A_rank [1](0.4),B_rank [1](2.8),C_rank [1](3.4),... Z_rank [1]相同。
physics_for_all 2013年

Answers:


150

从Python 3.4 / PEP450开始statistics module,标准库中提供了一个,该库提供了一种stdev用于计算像您这样的可迭代对象的标准偏差的方法

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952

38
值得指出的是,pstddev如果您的列表代表整个人群(即该列表不是人群的样本),则应该改用它。stddev是使用样本方差计算的,并且会高估总体平均值。
Alex Riley

4
这些函数实际上是调用stdevpstdev,而不像预期的那样使用stdfor standard。我无法编辑帖子,因为修改至少需要修改6个字符...
mknaf

104

我将A_Rank等人放入二维NumPy数组中,然后使用numpy.mean()numpy.std()计算均值和标准差:

In [17]: import numpy

In [18]: arr = numpy.array([A_rank, B_rank, C_rank])

In [20]: numpy.mean(arr, axis=0)
Out[20]: 
array([ 0.7       ,  2.2       ,  1.8       ,  2.13333333,  3.36666667,
        5.1       ])

In [21]: numpy.std(arr, axis=0)
Out[21]: 
array([ 0.45460606,  1.29614814,  1.37355985,  1.50628314,  1.15566239,
        1.2083046 ])

2
numpy.std的结果不正确。给定以下值:20,31,50,69,80并使用STDEV.S(A1:A5)放入Excel中,结果为25,109 NOT 22,45。
吉姆·克莱蒙斯

22
@JimClermonts与正确性无关。ddof = 0(默认,将数据解释为总体)还是ddof = 1(将其解释为样本,即估计真实方差)取决于您正在执行的操作。
runDOSrun

17
为了进一步阐明@runDOSrun的观点,Excel函数STDEV.P()和Numpy函数std(ddof=0)计算总体 sd或未校正的样本 sd,而Excel函数STDEV.S()和Numpy函数std(ddof=1)计算(校正的)样本 sd,其等于sqrt(N /(N-1) )乘以总体sd,其中N是点数。查看更多:en.m.wikipedia.org/wiki/...
binaryfunt

52

这是一些纯Python代码,可用于计算均值和标准差。

以下所有代码均基于statisticsPython 3.4+中的模块。

def mean(data):
    """Return the sample arithmetic mean of data."""
    n = len(data)
    if n < 1:
        raise ValueError('mean requires at least one data point')
    return sum(data)/n # in Python 2 use sum(data)/float(n)

def _ss(data):
    """Return sum of square deviations of sequence data."""
    c = mean(data)
    ss = sum((x-c)**2 for x in data)
    return ss

def stddev(data, ddof=0):
    """Calculates the population standard deviation
    by default; specify ddof=1 to compute the sample
    standard deviation."""
    n = len(data)
    if n < 2:
        raise ValueError('variance requires at least two data points')
    ss = _ss(data)
    pvar = ss/(n-ddof)
    return pvar**0.5

注意:为提高浮点求和时的准确性,该statistics模块使用了自定义函数,_sum而不是sum我使用的内置函数。

现在我们有例如:

>>> mean([1, 2, 3])
2.0
>>> stddev([1, 2, 3]) # population standard deviation
0.816496580927726
>>> stddev([1, 2, 3], ddof=1) # sample standard deviation
0.1

1
应该不是pvar=ss/(n-1)吗?
Ranjith Ramachandra

2
@Ranjith:如果要计算样本方差(或样本SD),可以使用n-1。上面的代码用于人口SD(因此有n自由度)。
Alex Riley 2015年

您好亚历克斯,您能发表计算样品标准偏差的函数吗?我受Python2.6的限制,因此我必须继续介绍此功能。
Venu S

@VenuS:您好,我已经编辑了该stddev函数,以便它可以计算样本和总体标准差。
Alex Riley

22

在Python 2.7.1中,您可以使用numpy.std()以下方法计算标准差:

  • 人口标准:仅使用numpy.std()数据列表之外的其他参数即可。
  • 示例std:您需要将ddof(即Delta自由度)设置为1,如以下示例所示:

numpy.std(<您的列表>,ddof = 1

计算中使用的除数为N-ddof,其中N表示元素数。默认情况下,ddof为零。

它计算样本std而不是总体std。



8

使用python,以下是几种方法:

import statistics as st

n = int(input())
data = list(map(int, input().split()))

方法1-使用功能

stdev = st.pstdev(data)

方法2:计算方差并求平方根

variance = st.pvariance(data)
devia = math.sqrt(variance)

方法3:使用基本数学

mean = sum(data)/n
variance = sum([((x - mean) ** 2) for x in X]) / n
stddev = variance ** 0.5

print("{0:0.1f}".format(stddev))

注意:

  • variance 计算样本总体的方差
  • pvariance 计算整个人口的方差
  • 相似的差异stdevpstdev

5

纯python代码:

from math import sqrt

def stddev(lst):
    mean = float(sum(lst)) / len(lst)
    return sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, lst))) / len(lst))

10
1衬里没有“纯粹”的东西。uck 这里是更多的Python版本:sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne

3

其他答案涵盖了如何在python中充分执行std dev,但没有人解释如何进行您所描述的怪异遍历。

我将假设AZ是整个人口。如果没有,请参阅Ome关于如何从样本推断的答案。

因此,要获得每个列表的第一位数字的标准差/均值,您将需要如下所示:

#standard deviation
numpy.std([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

#mean
numpy.mean([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

为了缩短代码并将其通用化为第n个数字,请使用我为您生成的以下函数:

def getAllNthRanks(n):
    return [A_rank[n], B_rank[n], C_rank[n], D_rank[n], E_rank[n], F_rank[n], G_rank[n], H_rank[n], I_rank[n], J_rank[n], K_rank[n], L_rank[n], M_rank[n], N_rank[n], O_rank[n], P_rank[n], Q_rank[n], R_rank[n], S_rank[n], T_rank[n], U_rank[n], V_rank[n], W_rank[n], X_rank[n], Y_rank[n], Z_rank[n]] 

现在,您可以像这样简单地从AZ获取所有n个位置的stdd和均值:

#standard deviation
numpy.std(getAllNthRanks(n))

#mean
numpy.mean(getAllNthRanks(n))

对于任何感兴趣的人,我都使用此凌乱的一线代码生成了该函数:str([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
Samy Bencherif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.