Standardabweichung einer Liste

103

Ich möchte den Mittelwert und die Standardabweichung der 1., 2., ... Ziffern mehrerer (Z) Listen ermitteln. Zum Beispiel habe ich

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

Jetzt möchte ich den Mittelwert und den Standardwert *_Rank[0], den Mittelwert und den Standardwert *_Rank[1]usw.
(dh den Mittelwert und den Standardwert der 1. Ziffer aus allen (A..Z) -Ranglisten;
den Mittelwert und den Standardwert der 2. Ziffer aus alle (A..Z) -Ranglisten;
Mittelwert und Standard der 3. Ziffer ...; etc).

Physik_für_all
quelle
13
Hallo, viral. Der Stapelüberlauf eignet sich am besten als Frage- und- Antwort- Site. Sie stellen eine Frage, und alle anderen geben Antworten. Ihr Beitrag enthält nur Aussagen, keine Fragen. Haben Sie eine spezielle Programmierfrage? Anders ausgedrückt, was haben Sie bisher versucht und wo stecken Sie fest?
Robᵩ
2
Warum sind diese Listen nicht in einem Wörterbuch oder so?
Waleed Khan
Entschuldigung, wenn ich die Frage nicht richtig übermittelt habe. Ich möchte den Mittelwert aus A_Rang [0] (0,8), B_Rang [0] (0,1), C_Rang [0] (1,2), ... Z_Rang [0] nehmen. Gleiches gilt für A_rank [1] (0,4), B_rank [1] (2,8), C_rank [1] (3,4), ... Z_rank [1].
Physik_für_all

Antworten:

150

Seit Python 3.4 / PEP450 gibt es eine statistics modulein der Standardbibliothek, die eine Methodestdev zur Berechnung der Standardabweichung von Iterables wie Ihrer enthält:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952
Bengt
quelle
38
Es ist erwähnenswert, dass dies pstddevwahrscheinlich stattdessen verwendet werden sollte, wenn Ihre Liste die gesamte Bevölkerung darstellt (dh die Liste ist keine Stichprobe einer Bevölkerung). stddevwird anhand der Stichprobenvarianz berechnet und überschätzt den Populationsmittelwert.
Alex Riley
4
Die Funktionen werden tatsächlich aufgerufen stdevund pstdevverwendet wird , nicht stdfür , standardwie man erwarten würde. Ich konnte den Beitrag nicht bearbeiten, da Änderungen mindestens 6 Zeichen ändern müssen ...
mknaf
104

Ich würde A_Ranket al. In ein 2D- NumPy- Array einfügen und dann die Mittelwerte und Standardabweichungen verwenden numpy.mean()und numpy.std()berechnen:

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
quelle
2
Das Ergebnis von numpy.std ist nicht korrekt. Bei diesen Werten: 20,31,50,69,80 und in Excel mit STDEV.S (A1: A5) eingegeben, ist das Ergebnis 25.109 NICHT 22,45.
Jim Clermonts
22
@ JimClermonts Es hat nichts mit Korrektheit zu tun. Ob ddof = 0 (Standard, Daten als Grundgesamtheit interpretieren) oder ddof = 1 (als Stichproben interpretieren, dh wahre Varianz schätzen), hängt davon ab, was Sie tun.
runDOSrun
17
Um den Punkt von @ runDOSrun weiter zu verdeutlichen, berechnen die Excel-Funktion STDEV.P()und die Numpy-Funktion std(ddof=0)die Grundgesamtheit sd oder die nicht korrigierte Stichprobe sd, während die Excel-Funktion STDEV.S()und die Numpy-Funktion std(ddof=1)die (korrigierte) Stichprobe sd berechnen , die sqrt (N / (N-1) entspricht. ) mal die Bevölkerung sd, wobei N die Anzahl der Punkte ist. Weitere Informationen
binaryfunt
52

Hier ist ein reiner Python-Code, mit dem Sie den Mittelwert und die Standardabweichung berechnen können.

Der gesamte folgende Code basiert auf dem statisticsModul in 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

Hinweis: Für eine verbesserte Genauigkeit beim Summieren von Floats verwendet das statisticsModul eine benutzerdefinierte Funktion _sumanstelle der integrierten Funktion, sumdie ich an seiner Stelle verwendet habe.

Jetzt haben wir zum Beispiel:

>>> 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
quelle
1
Sollte es nicht sein pvar=ss/(n-1)?
Ranjith Ramachandra
2
@Ranjith: Wenn Sie die Stichprobenvarianz (oder Stichproben-SD) berechnen möchten, können Sie diese verwenden n-1. Der obige Code gilt für die SD-Bevölkerung (es gibt also nFreiheitsgrade).
Alex Riley
Hallo Alex, Könnten Sie bitte eine Funktion zur Berechnung der Standardabweichung der Stichprobe veröffentlichen? Ich bin mit Python2.6 eingeschränkt, daher muss ich diese Funktion weitergeben.
Venu S
@VenuS: Hallo, ich habe die stddevFunktion so bearbeitet , dass sie sowohl Stichproben- als auch Populationsstandardabweichungen berechnen kann.
Alex Riley
22

In Python 2.7.1 können Sie die Standardabweichung berechnen mit numpy.std():

  • Population std : Verwenden Sie einfach numpy.std()keine zusätzlichen Argumente außer Ihrer Datenliste.
  • Beispiel std : Sie müssen ddof (dh Delta Degrees of Freedom) wie im folgenden Beispiel auf 1 setzen:

numpy.std (<Ihre-Liste>, ddof = 1 )

Der in Berechnungen verwendete Divisor ist N - ddof , wobei N die Anzahl der Elemente darstellt. Standardmäßig ist ddof Null.

Es berechnet eher den Stichprobenstandard als den Populationsstandard.

Ome
quelle
8

Bei der Verwendung von Python gibt es einige Methoden:

import statistics as st

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

Ansatz1 - Verwenden einer Funktion

stdev = st.pstdev(data)

Ansatz2: Varianz berechnen und Quadratwurzel daraus ziehen

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

Ansatz3: Grundlegende Mathematik verwenden

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

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

Hinweis:

  • variance berechnet die Varianz der Stichprobenpopulation
  • pvariance berechnet die Varianz der gesamten Bevölkerung
  • ähnliche Unterschiede zwischen stdevundpstdev
pankaj
quelle
5

reiner Python-Code:

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
quelle
10
An diesem 1-Liner ist nichts 'Reines'. Yuck. Hier ist mehr pythonische Version:sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne
3

Die anderen Antworten behandeln, wie man std dev in Python ausreichend macht, aber niemand erklärt, wie man die bizarre Durchquerung macht, die Sie beschrieben haben.

Ich gehe davon aus, dass AZ die gesamte Bevölkerung ist. Wenn nicht, lesen Sie Omes Antwort, wie Sie aus einer Stichprobe schließen können.

Um die Standardabweichung / den Mittelwert der ersten Ziffer jeder Liste zu erhalten, benötigen Sie ungefähr Folgendes:

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

Um den Code zu verkürzen und auf eine n-te Ziffer zu verallgemeinern, verwenden Sie die folgende Funktion, die ich für Sie generiert habe:

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

Jetzt können Sie einfach den Standard und den Mittelwert aller n-ten Plätze von AZ wie folgt abrufen:

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

#mean
numpy.mean(getAllNthRanks(n))
Samy Bencherif
quelle
Für jeden Interessierten habe ich die Funktion mit diesem chaotischen Einzeiler generiert:str([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
Samy Bencherif