列表的标准偏差

时间:2013-03-13 15:38:21

标签: python list standard-deviation

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

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

现在我想取*_Rank[0]的平均值和标准值,*_Rank[1]的平均值和标准值等。
(即:所有(A..Z)_rank列表中第1位的平均值和标准值;
所有(A..Z)_rank列表中第二位数的平均值和标准值;
第三位数的平均值和标准数;等等)。

8 个答案:

答案 0 :(得分:112)

自Python 3.4 / PEP450以来,标准库中有一个statistics module,它有一个method stdev来计算像你这样的迭代的标准偏差:

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

答案 1 :(得分:93)

我会将A_Rank等放入2D 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 :(得分:45)

这里有一些纯Python代码可用于计算平均值和标准偏差。

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

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

答案 3 :(得分:21)

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

  • 人口标准:只使用numpy.std(),除数据列表外没有其他参数。
  • 示例标准:您需要将 ddof (即Delta Degree of Freedom)设置为1,如下例所示:
  

numpy.std(&lt; your-list&gt;, ddof = 1

     

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

它计算样本std而不是人口标准。

答案 4 :(得分:9)

在python 2.7中,你可以使用NumPy numpy.std()给出population standard deviation

在Python 3.4 statistics.stdev()中返回样本标准偏差。 pstdv()功能与numpy.std()相同。

答案 5 :(得分: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))

答案 6 :(得分:3)

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

我将假设A-Z是整个人口。如果没有,请参阅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]] 

现在你可以简单地从A-Z获得所有第n个地方的标准和平均值:

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

#mean
numpy.mean(getAllNthRanks(n))

答案 7 :(得分:3)

使用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之间的相似之处