如何在python中计算列表的方差?

时间:2016-02-23 16:47:04

标签: python list statistics variance

如果我有这样的清单:

results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
          0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]

我想在Python中计算这个列表的方差,这是与平均值的平方差的平均值。

我该如何解决这个问题?访问列表中的元素进行计算让我感到困惑,因为我得到了方差。

9 个答案:

答案 0 :(得分:38)

您可以使用numpy的内置函数var

import numpy as np

results = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
          0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]

print(np.var(results))

这会为您提供28.822364260579157

如果 - 无论出于何种原因 - 您无法使用numpy和/或您不想使用内置功能,您也可以手动计算它#34;#34 ;使用例如一个list comprehension

# calculate mean
m = sum(results) / len(results)

# calculate variance using a list comprehension
var_res = sum((xi - m) ** 2 for xi in results) / len(results)

给你相同的结果。

如果您对标准偏差感兴趣,可以使用numpy.std

print(np.std(results))
5.36864640860051

@Serge Ballesta explained very well方差nn-1之间的差异。在numpy中,您可以使用选项ddof轻松设置此参数;它的默认值为0,因此对于n-1情况,您只需执行以下操作:

np.var(results, ddof=1)

"手工"解决方案在@Serge Ballesta's answer中给出。

两种方法都会产生32.024849178421285

您也可以为std设置参数:

np.std(results, ddof=1)
5.659050201086865

答案 1 :(得分:6)

嗯,有两种方法可以定义方差。您有完整集时使用的方差 n ,以及样本时使用的方差 n-1

2之间的区别在于m = sum(xi) / n值是真实平均值还是仅仅是平均值的近似值。

示例1:您想知道班级中学生的平均身高及其方差:好的,值m = sum(xi) / n是实际平均值,而且Cleb给出的公式是正确的(方差 n )。

示例2:您想知道公交车在公交车站经过的平均小时数及其差异。您记下一个月的小时数,并获得30个值。此处,值m = sum(xi) / n仅是实际平均值的近似值,并且对于更多值,该近似值将更准确。在这种情况下,实际方差的最佳近似值是方差 n-1

varRes = sum([(xi - m)**2 for xi in results]) / (len(results) -1)

好的,它与Python无关,但确实会对统计分析产生影响,问题标记为

注意:通常,像numpy这样的统计库使用方差 n 来表示他们称之为varvariance的方差,方差 n-1 用于给出标准偏差的函数。

答案 2 :(得分:1)

Numpy确实是最优雅,最快捷的方式。

我认为实际的问题是关于如何访问列表的各个元素以自己进行这样的计算,所以下面是一个例子:

results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
      0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]

import numpy as np
print 'numpy variance: ', np.var(results)


# without numpy by hand  

# there are two ways of calculating the variance 
#   - 1. direct as central 2nd order moment (https://en.wikipedia.org/wiki/Moment_(mathematics))divided by the length of the vector
#   - 2. "mean of square minus square of mean" (see https://en.wikipedia.org/wiki/Variance)

# calculate mean
n= len(results)
sum=0
for i in range(n):
    sum = sum+ results[i]


mean=sum/n
print 'mean: ', mean

#  calculate the central moment
sum2=0
for i in range(n):
    sum2=sum2+ (results[i]-mean)**2

myvar1=sum2/n
print "my variance1: ", myvar1

# calculate the mean of square minus square of mean
sum3=0
for i in range(n):
    sum3=sum3+ results[i]**2

myvar2 = sum3/n - mean**2
print "my variance2: ", myvar2

给你:

numpy variance:  28.8223642606
mean:  -3.731599805
my variance1:  28.8223642606
my variance2:  28.8223642606

答案 3 :(得分:0)

Numpy有一种可以为您完成此操作的方法,这是最简单的方法。或者您可以编写自己的函数。

import numpy as np
np.var(a)

OR

def find_variance(a):

    n = len(a)
    mean = sum(a)/n
    diff_sq = [None] * n

    for i in range(n):
        diff_sq[i] = (a[i] - mean) ** 2

    return sum(diff_sq)/n

答案 4 :(得分:0)

Python 3.4开始,标准库随附variance函数(样本方差方差n-1 )作为{ {3}}模块:

from statistics import variance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
variance(data)
# 32.024849178421285

可以使用statistics获得 p 人口差异(或差异n )功能:

from statistics import pvariance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
pvariance(data)
# 28.822364260579157

还请注意,如果您已经知道列表的平均值,则variancepvariance函数采用第二个参数(分别为xbarmu)以备用重新计算样本的平均值(这是方差计算的一部分)。

答案 5 :(得分:0)

正确的答案是使用像NumPy这样的程序包之一,但是如果您想自己滚动,并且想逐步执行,那么有一个好的算法具有更高的准确性。看到此链接https://www.johndcook.com/blog/standard_deviation/

我将perl实现移植到Python。请在评论中指出问题。

Mklast = 0
Mk = 0
Sk = 0
k  = 0 

for xi in results:
  k = k +1
  Mk = Mklast + (xi - Mklast) / k
  Sk = Sk + (xi - Mklast) * ( xi - Mk)
  Mklast = Mk

var = Sk / (k -1)
print var

答案是

>>> print var
32.0248491784

答案 6 :(得分:0)

import numpy as np
def get_variance(xs):
    mean = np.mean(xs)
    summed = 0
    for x in xs:
        summed += (x - mean)**2
    return summed / (len(xs))
print(get_variance([1,2,3,4,5]))

出2.0

a = [1,2,3,4,5]
variance = np.var(a, ddof=1)
print(variance)

答案 7 :(得分:0)

如果没有导入,我将使用以下python3脚本:

#!/usr/bin/env python3

def createData():
    data1=[12,54,60,3,15,6,36]
    data2=[1,2,3,4,5]
    data3=[100,30000,1567,3467,20000,23457,400,1,15]

    dataset=[]
    dataset.append(data1)
    dataset.append(data2)
    dataset.append(data3)

    return dataset

def calculateMean(data):
    means=[]
    # one list of the nested list
    for oneDataset in data:
        sum=0
        mean=0
        # one datapoint in one inner list
        for number in oneDataset:
            # summing up
            sum+=number
        # mean for one inner list
        mean=sum/len(oneDataset)
        # adding a tuples of the original data and their mean to
        # a list of tuples
        item=(oneDataset, mean)
        means.append(item)

    return means

# to do: substract mean from each element and square the result
# sum up the square results and divide by number of elements
def calculateVariance(meanData):
    variances=[]
    # meanData is the list of tuples
    # pair is one tuple
    for pair in meanData:
        # pair[0] is the original data
        interResult=0
        squareSum=0
        for element in pair[0]:
            interResult=(element-pair[1])**2
            squareSum+=interResult
        variance=squareSum/len(pair[0])
        variances.append((pair[0], pair[1], variance))

    return variances





def main():
    my_data=createData()
    my_means=calculateMean(my_data)
    my_variances=calculateVariance(my_means)
    print(my_variances)

if __name__ == "__main__":
    main()

在这里您可以打印原始数据,均值和方差。我知道这种方法涵盖了几个数据集的列表,但是我认为您可以根据自己的目的快速调整它;)

答案 8 :(得分:-1)

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

import statistics as st

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

方法1-使用函数

variance = st.pvariance(data)

方法2:使用基本数学

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

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

注意:

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