목록의 표준 편차


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

이제 나는의 mean과 std of *_Rank[0], mean and std of *_Rank[1], etc.
(ie : mean and std of the first digit from all (A..Z) _rank list;
the mean and std of the twond digit from 모든 (A..Z) _rank 목록,
세 번째 숫자의 평균 및 표준 ... 등).


13
안녕하세요, 바이러스입니다. Stack Overflow는 질문답변 사이트 로 가장 잘 작동 합니다. 당신은 질문을하고 다른 사람들은 대답을합니다. 게시물에는 진술 만 포함되어 있으며 질문은 없습니다. 특정 프로그래밍 질문이 있습니까? 다시 말해, 지금까지 무엇을 시도했으며 어디에 붙어 있습니까?
Robᵩ 2013-03-13

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

답변:


150

이후 파이썬 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
함수는 실제로 호출 stdev되며 예상대로 for 를 pstdev사용하지 않습니다 . 편집은 6 자 이상을 수정해야하므로 게시물을 편집 할 수 없습니다 ...stdstandard
mknaf

104

나는 둘 것 A_Rank2 차원에 등을 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에 입력하면 결과는 22,45가 아니라 25,109입니다.
Jim Clermonts

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)는 sqrt (N / (N-1) 과 같은 (수정 된) 샘플 sd를 계산합니다. ) x 모집단 sd. 여기서 N은 포인트 수입니다. 더보기 : en.m.wikipedia.org/wiki/...
binaryfunt

52

다음은 평균 및 표준 편차를 계산하는 데 사용할 수있는 순수 Python 코드입니다.

아래의 모든 코드 statistics는 Python 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 2015 년

2
@Ranjith : 표본 분산 (또는 표본 SD) 을 계산 하려면 n-1. 위의 코드는 인구 SD에 대한 것입니다 (따라서 n자유도가 있습니다).
Alex Riley

안녕하세요 Alex, 표본 표준 편차 계산 함수를 게시 해 주시겠습니까? 저는 Python2.6으로 제한되어 있으므로이 함수를 중계해야합니다.
Venu S

@VenuS : 안녕하세요, stddev표본 및 모집단 표준 편차를 모두 계산할 수 있도록 함수를 편집했습니다 .
Alex Riley

22

Python 2.7.1에서는 numpy.std()for를 사용하여 표준 편차를 계산할 수 있습니다 .

  • Population std : numpy.std()데이터 목록 외에 추가 인수없이 사용 하십시오.
  • 샘플 std : 다음 예와 같이 1로 설정된 ddof (즉, 델타 자유도) 를 전달해야합니다 .

numpy.std (<목록>, ddof = 1 )

계산에 사용되는 제수는 N-ddof입니다 . 여기서 N은 요소의 수를 나타냅니다. 기본적으로 ddof는 0입니다.

모집단 표준이 아닌 샘플 표준을 계산합니다.



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

순수한 파이썬 코드 :

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 라이너에 대해 '순수한'것은 없습니다. 왝. 다음은 더 파이썬적인 버전입니다.sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne

3

다른 답변은 파이썬에서 std dev를 수행하는 방법을 충분히 다루지 만 아무도 설명한 기괴한 순회를 수행하는 방법을 설명하지 않습니다.

AZ가 전체 인구라고 가정하겠습니다. 오메가 보이지 않으면샘플에서 추론하는 방법에 대한 의 답변 .

따라서 모든 목록의 첫 번째 숫자의 표준 편차 / 평균을 얻으려면 다음과 같은 것이 필요합니다.

#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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.