列表的标准偏差

phy*_*all 91 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 )...
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ngt 130

因为Python 3.4/PEP450存在statistics module在标准库,其中有一个方法stdev,用于计算像您iterables的标准偏差:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,如果您的列表代表整个人口(即列表不是人口样本),则可能应该使用`pstddev`.`stddev`是使用样本方差计算的,并且会高估总体均值. (32认同)
  • 这些函数实际上称为[`stdev`](https://docs.python.org/3.4/library/statistics.html#statistics.stdev)和[`pstdev`](https://docs.python.org/ 3.4/library/statistics.html#statistics.pstdev),没有像人们期望的那样使用`std`作为`standard`.我无法编辑帖子,因为编辑需要修改至少6个字符... (3认同)

NPE*_*NPE 97

我将A_Ranket al放入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 ])
Run Code Online (Sandbox Code Playgroud)

  • @JimClermonts它与正确无关.是否ddof = 0(默认,将数据解释为总体)或ddof = 1(将其解释为样本,即估计真实方差)取决于您正在做什么. (22认同)
  • 为了进一步澄清@ runDOSrun的观点,Excel函数`STDEV.P()`和Numpy函数`std(ddof = 0)`计算*population*sd,或*uncorrected sample*sd,而Excel函数`STDEV. S()`和Numpy函数`std(ddof = 1)`计算*(校正的)样本*sd,它等于总数(N /(N-1))乘以总体sd,其中N是点数.查看更多:https://en.m.wikipedia.org/wiki/Standard_deviation#Corrected_sample_standard_deviation (16认同)
  • 这是正确的:numpy.std(arr,ddof = 1) (6认同)
  • numpy.std的结果不正确.鉴于这些值:20,31,50,69,80并使用STDEV.S(A1:A5)放入Excel,结果为25,109 NOT 22,45. (2认同)

Ale*_*ley 47

这里有一些纯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
Run Code Online (Sandbox Code Playgroud)

注意:为了在求和浮点数时提高精度,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
Run Code Online (Sandbox Code Playgroud)

  • @Ranjith:如果你想计算*样本*方差(或样本SD),你可以使用`n-1`.上面的代码是针对人口SD(所以有'n`自由度). (2认同)

小智 21

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

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

numpy.std(<your-list>,ddof = 1)

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

它计算样本std而不是人口std.


pan*_*kaj 11

使用python,这里有几个方法:

import statistics as st

n = int(input())
data = list(map(int, input().split()))
Run Code Online (Sandbox Code Playgroud)

方法 1 - 使用函数

stdev = st.pstdev(data)
Run Code Online (Sandbox Code Playgroud)

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

variance = st.pvariance(data)
devia = math.sqrt(variance)
Run Code Online (Sandbox Code Playgroud)

方法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))
Run Code Online (Sandbox Code Playgroud)

笔记:

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


B.K*_*cis 10

在python 2.7中,你可以使用NumPy numpy.std()给出人口标准偏差.

在Python 3.4中statistics.stdev()返回样本标准偏差.该pstdv()功能是一样的numpy.std().


Ela*_*kel 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))
Run Code Online (Sandbox Code Playgroud)

  • 1衬里没有“纯粹”的东西。uck 这是更多的pythonic版本:`sqrt(sum((x-mean)** 2 for x in lst)/ len(lst))` (8认同)