Bir listenin standart sapması


104

Birkaç (Z) listenin 1., 2., ... rakamlarının ortalamasını ve standart sapmasını bulmak istiyorum. Örneğin, bende var

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

Şimdi ortalama ve std almak istiyor *_Rank[0], ortalama ve std *_Rank[1]vb
(yani: listelerini _rank) ortalama ve (a..z tüm 1 parmağın std;
ortalama ve 2. parmağın std gelen tüm (A..Z) _rank listeleri;
3. hanenin ortalaması ve standardı ...; vb.).


13
Merhaba viral. Yığın taşması bir şekilde en uygun Sorunun -ve- cevabı sitede. Bir soru sorarsınız ve diğer herkes cevap verir. Gönderiniz sadece ifadeler içeriyor, soru yok. Belirli bir programlama sorunuz mu var? Başka bir deyişle, şimdiye kadar ne denediniz ve nereye takılıp kaldınız?
Robᵩ

2
Bu listeler neden sözlükte falan değil?
Waleed Khan

Soruyu doğru şekilde iletmediysem üzgünüm. A_rank [0] (0.8), B_rank [0] (0.1), C_rank [0] (1.2), ... Z_rank [0] 'ın ortalamasını almak istiyorum. A_rank [1] (0.4), B_rank [1] (2.8), C_rank [1] (3.4), ... Z_rank [1] için aynı.
physics_for_all

Yanıtlar:


153

Python 3.4 yana / PEP450 olduğu bir statistics modulebir olan standart kitaplığı üzere bir yöntemstdev sizin gibi Iterables standart sapmasını hesaplamak için:

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

39
pstddevListeniz tüm popülasyonu temsil ediyorsa (yani liste, popülasyonun bir örneği değilse), bunun yerine kullanılması gerektiğine işaret etmeye değer . stddevörnek varyansı kullanılarak hesaplanır ve popülasyon ortalamasını fazla tahmin eder.
Alex Riley

4
Fonksiyonlar aslında denir stdevve pstdevkullanmayan, stdiçin standardbir beklendiği gibi. Düzenlemelerin en az 6 karakteri değiştirmesi gerektiğinden
gönderiyi düzenleyemedim

104

I vereceğini A_Rank2D içine ve ark NumPy kullanmak sonra dizi ve numpy.mean()ve numpy.std()ortalama ve standart sapma hesaplamak için:

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'nin sonucu doğru değil. Bu değerler verildiğinde: 20,31,50,69,80 ve STDEV.S (A1: A5) kullanarak Excel'e yerleştirildiğinde sonuç 25,109 NOT 22,45'tir.
Jim Clermonts

22
@JimClermonts Bunun doğrulukla ilgisi yok. Ddof ​​= 0 (varsayılan, verileri popülasyon olarak yorumlama) veya ddof = 1 (örnek olarak yorumlama, yani gerçek varyansı tahmin etme), ne yaptığınıza bağlıdır.
runDOSrun

17
@ RunDOSrun'un noktasını daha da açıklığa kavuşturmak için, Excel işlevi STDEV.P()ve Numpy işlevi std(ddof=0), popülasyon sd'yi veya düzeltilmemiş örnekSTDEV.S() sd'yi std(ddof=1)hesaplarken, Excel işlevi ve Numpy işlevi sqrt'ye eşit olan (düzeltilmiş) örnek sd'yi hesaplar (N / (N-1) ) nüfusun sd ile çarpımı, burada N, nokta sayısıdır. Daha fazlasını görün: en.m.wikipedia.org/wiki/…
binaryfunt

52

Ortalama ve standart sapmayı hesaplamak için kullanabileceğiniz bazı saf Python kodu.

Aşağıdaki tüm kod statistics, Python 3.4+ modülüne dayanmaktadır.

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

Not: Yüzen sayıları toplarken daha iyi doğruluk için statisticsmodül , yerinde kullandığım _sumyerleşik işlev yerine özel bir işlev kullanır sum.

Şimdi örneğin elimizde:

>>> 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
Olmamalı mı pvar=ss/(n-1)?
Ranjith Ramachandra

2
@Ranjith: Örnek varyansı (veya örnek SD'yi) hesaplamak istiyorsanız kullanabilirsiniz n-1. Yukarıdaki kod, SD popülasyonu içindir (bu nedenle n, serbestlik dereceleri vardır ).
Alex Riley

Merhaba Alex, Örnek standart sapmayı hesaplamak için lütfen fonksiyon gönderebilir misiniz? Python2.6 ile sınırlıyım, bu yüzden bu işlevi aktarmam gerekiyor.
Venu S

@VenuS: Merhaba, stddevfonksiyonu hem örneklem hem de popülasyon standart sapmalarını hesaplayacak şekilde düzenledim .
Alex Riley

22

Python 2.7.1'de, aşağıdakileri kullanarak standart sapmayı hesaplayabilirsiniz numpy.std():

  • Nüfus std : numpy.std()Veri listenizin yanı sıra ek bağımsız değişkenler olmadan kullanın .
  • Örnek std : Aşağıdaki örnekte olduğu gibi ddof'u (yani Delta Serbestlik Derecesi) 1'e ayarlamanız gerekir:

numpy.std (<listeniz>, ddof = 1 )

Hesaplamalarda kullanılan bölen N - ddof'tur ve burada N, eleman sayısını temsil eder. Varsayılan olarak ddof sıfırdır.

Popülasyon standardı yerine örnek std'yi hesaplar.



8

Python kullanarak, işte birkaç yöntem:

import statistics as st

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

Yaklaşım1 - bir işlev kullanma

stdev = st.pstdev(data)

Yaklaşım2: varyansı hesaplayın ve karekökünü alın

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

Yaklaşım3: temel matematik kullanma

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

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

Not:

  • variance örnek popülasyonun varyansını hesaplar
  • pvariance tüm popülasyonun varyansını hesaplar
  • stdevve arasındaki benzer farklılıklarpstdev

5

saf piton kodu:

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
Bu 1-liner hakkında 'saf' hiçbir şey yok. Yuck. İşte daha fazla sqrt(sum((x - mean)**2 for x in lst) / len(lst))
pitonik

3

Diğer cevaplar, yeterince python'da std dev nasıl yapılacağını kapsar, ancak hiç kimse anlattığınız tuhaf geçişi nasıl yapacağınızı açıklamaz.

AZ'nin tüm nüfus olduğunu varsayacağım. Ome'nin bir örneklemden nasıl çıkarım yapılacağına dair cevabını görmüyorsanız .

Dolayısıyla, her listenin ilk basamağının standart sapmasını / ortalamasını elde etmek için şuna ihtiyacınız olacak:

#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]])

Kodu kısaltmak ve bunu herhangi bir n'inci basamağa genellemek için sizin için oluşturduğum aşağıdaki işlevi kullanı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]] 

Şimdi basitçe aşağıdaki gibi AZ'den tüm n'inci yerlerin stdd ve ortalamasını alabilirsiniz:

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

#mean
numpy.mean(getAllNthRanks(n))

: Herhangi bir ilgi, ben bu pis havasında kullanarak işlevini üretilenstr([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
Samy Bencherifve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.