Simpangan baku daftar

103

Saya ingin mencari mean dan deviasi standar dari digit ke-1, ke-2, ... dari beberapa daftar (Z). Misalnya, saya punya

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

Sekarang saya ingin mengambil mean dan std dari *_Rank[0], mean dan std dari *_Rank[1], dll.
(Yaitu: mean dan std dari digit pertama dari semua daftar (A..Z) _rank;
mean dan std dari digit ke-2 dari semua daftar (A..Z) _rank;
mean dan std dari digit ke-3 ...; dll).

physics_for_all
sumber
13
Halo, viral. Stack Overflow yang terbaik sebagai pertanyaan -dan- jawaban situs. Anda mengajukan pertanyaan, dan semua orang memberikan jawaban. Posting Anda hanya berisi pernyataan, tidak ada pertanyaan. Apakah Anda memiliki pertanyaan pemrograman khusus? Dengan kata lain, apa yang telah Anda coba sejauh ini, dan di mana Anda terjebak?
Robᵩ
2
Mengapa daftar ini tidak ada dalam kamus atau semacamnya?
Waleed Khan
Maaf Jika saya tidak menyampaikan pertanyaan dengan baik. Saya ingin mengambil mean dari A_rank [0] (0.8), B_rank [0] (0.1), C_rank [0] (1.2), ... Z_rank [0]. sama untuk A_rank [1] (0.4), B_rank [1] (2.8), C_rank [1] (3.4), ... Z_rank [1].
physics_for_all

Jawaban:

150

Karena Python 3.4 / PEP450 ada statistics moduledi pustaka standar, yang memiliki metodestdev untuk menghitung deviasi standar dari iterable seperti milik Anda:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952
Bengt
sumber
38
Perlu pstddevdisebutkan bahwa mungkin sebaiknya digunakan jika daftar Anda mewakili seluruh populasi (yaitu, daftar tersebut bukan sampel dari suatu populasi). stddevdihitung menggunakan varian sampel dan akan melebih-lebihkan rata-rata populasi.
Alex Riley
4
Fungsi sebenarnya dipanggil stdevdan pstdev, tidak digunakan stduntuk standardseperti yang diharapkan. Saya tidak dapat mengedit posting karena pengeditan perlu memodifikasi setidaknya 6 karakter ...
mknaf
104

Saya akan memasukkan A_Ranket al ke dalam array 2D NumPy , dan kemudian menggunakan numpy.mean()dan numpy.std()menghitung sarana dan deviasi standar:

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 ])
NPE
sumber
2
hasil numpy.std salah. Diberikan nilai-nilai ini: 20,31,50,69,80 dan dimasukkan ke dalam Excel menggunakan STDEV.S (A1: A5) hasilnya adalah 25,109 BUKAN 22,45.
Jim Clermonts
22
@JimClermonts Ini tidak ada hubungannya dengan kebenaran. Apakah ddof = 0 (default, interpretasikan data sebagai populasi) atau ddof = 1 (interpretasikan sebagai sampel, yaitu perkirakan varian sebenarnya) tergantung pada apa yang Anda lakukan.
runDOSrun
17
Untuk lebih memperjelas poin @ runDOSrun, fungsi Excel STDEV.P()dan fungsi Numpy std(ddof=0)menghitung sd populasi , atau sd sampel yang tidak dikoreksi , sedangkan fungsi Excel STDEV.S()dan fungsi Numpy std(ddof=1)menghitung (dikoreksi) sampel sd, yang sama dengan sqrt (N / (N-1) ) dikalikan populasi sd, dengan N adalah jumlah poin. Lihat lebih lanjut: en.m.wikipedia.org/wiki/…
binaryfunt
52

Berikut beberapa kode Python murni yang dapat Anda gunakan untuk menghitung mean dan deviasi standar.

Semua kode di bawah ini didasarkan pada statisticsmodul di 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

Catatan: untuk meningkatkan akurasi saat menjumlahkan float, statisticsmodul menggunakan fungsi kustom _sumdaripada built-in sumyang saya gunakan sebagai gantinya.

Sekarang kita punya contoh:

>>> 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
Alex Riley
sumber
1
Bukankah seharusnya demikian pvar=ss/(n-1)?
Ranjith Ramachandra
2
@ Ranjith: jika Anda ingin menghitung varians sampel (atau sampel SD), Anda dapat menggunakan n-1. Kode di atas adalah untuk SD populasi (jadi ada nderajat kebebasannya).
Alex Riley
Halo Alex, Bisakah Anda memposting fungsi untuk menghitung deviasi standar sampel? Saya dibatasi dengan Python2.6, jadi saya harus menyampaikan fungsi ini.
Venu S
@VenuS: Halo, saya telah mengedit stddevfungsinya sehingga dapat menghitung deviasi standar sampel dan populasi.
Alex Riley
22

Di Python 2.7.1, Anda dapat menghitung deviasi standar menggunakan numpy.std()untuk:

  • Population std : Cukup gunakan numpy.std()tanpa argumen tambahan selain daftar data Anda.
  • Contoh std : Anda harus melewati ddof (yaitu Delta Degrees of Freedom) set ke 1, seperti pada contoh berikut:

numpy.std (<daftar-Anda>, ddof = 1 )

Pembagi yang digunakan dalam perhitungan adalah N - ddof , di mana N mewakili jumlah elemen. Secara default ddof adalah nol.

Ini menghitung std sampel daripada std populasi.

Ome
sumber
8

Menggunakan python, berikut beberapa metode:

import statistics as st

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

Approach1 - menggunakan sebuah fungsi

stdev = st.pstdev(data)

Pendekatan2: hitung varians dan ambil akar kuadratnya

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

Pendekatan3: menggunakan matematika dasar

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

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

catatan:

  • variance menghitung varians populasi sampel
  • pvariance menghitung varians dari seluruh populasi
  • perbedaan serupa antara stdevdanpstdev
pankaj
sumber
5

kode python murni:

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))
Elad Yehezkel
sumber
10
Tidak ada yang 'murni' tentang 1-liner itu. Yuck. Berikut lebih banyak versi pythonic:sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne
3

Jawaban lain mencakup bagaimana melakukan std dev dengan python secara memadai, tetapi tidak ada yang menjelaskan bagaimana melakukan traversal aneh yang telah Anda jelaskan.

Saya akan berasumsi AZ adalah seluruh populasi. Jika tidak, lihat jawaban OME tentang cara mengambil kesimpulan dari suatu sampel.

Jadi untuk mendapatkan simpangan baku / mean dari digit pertama dari setiap daftar, Anda memerlukan sesuatu seperti ini:

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

Untuk mempersingkat kode dan menggeneralisasikannya ke digit ke mana pun, gunakan fungsi berikut yang saya buat untuk Anda:

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

Sekarang Anda bisa mendapatkan stdd dan mean dari semua tempat ke-n dari AZ seperti ini:

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

#mean
numpy.mean(getAllNthRanks(n))
Samy Bencherif
sumber
Bagi siapa pun yang tertarik, saya membuat fungsi menggunakan satu baris yang berantakan ini:str([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
Samy Bencherif