リストの標準偏差


103

複数の(Z)リストの1桁目、2桁目、...桁の平均と標準偏差を求めたい。たとえば、私は持っています

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

今私は、平均とstdを取りたい*_Rank[0]の平均値とstd、*_Rank[1]など、
;すべて(A..Zからの平均と1桁目のSTD)リストを_rank:(すなわち
から2桁目の平均値とstdすべての(A..Z)_rankリスト
、3桁目の平均とstd ...;など)。


13
こんにちは、バイラル。スタックオーバーフローは、最高の作品として質問 -と- 回答サイト。あなたが質問すると、他の誰もが答えを提供します。投稿に含まれているのはステートメントのみで、質問はありません。特定のプログラミング質問がありますか?別の言い方をすると、これまでに何を試しましたか、どこに行き詰まっていますか?
Robᵩ

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 2013年

回答:


150

Pythonの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_Rank2Dへら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に入力すると、結果は25,109ではなく22,45になります。
ジムクレルモンズ2015年

22
@JimClermonts正しさとは関係ありません。ddof = 0(デフォルト、データを母集団として解釈する)かddof = 1(サンプルとして解釈する、つまり真の分散を推定する)かどうかは、実行していることに依存します。
runDOSrun 2016年

17
@runDOSrunのポイントをさらに明確にするために、Excel関数STDEV.P()とNumpy関数std(ddof=0)母集団 sdまたは未修正のサンプル sdを計算し、Excel関数STDEV.S()とNumpy関数std(ddof=1)(修正された)サンプル sdを計算します。これはsqrt(N /(N-1)に等しい) )母集団の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

こんにちはアレックス、サンプル標準偏差を計算するための関数を投稿していただけませんか?私はPython2.6に制限があるため、この関数を中継する必要があります。
Venu S 2017

@VenuS:こんにちは、stddevサンプルと母集団の両方の標準偏差を計算できるように関数を編集しました。
Alex Riley

22

Python 2.7.1では、以下を使用numpy.std()して標準偏差を計算できます。

  • 母集団stdnumpy.std()データリスト以外に追加の引数なしで使用します。
  • stdのサンプル:次の例のように、1に設定されたddof(つまり、Delta Degrees of Freedom)を渡す必要があります。

numpy.std(<your-list>、ddof = 1

計算に使用される除数はN-ddofです。ここで、Nは要素の数を表します。デフォルトでは、ddofはゼロです。

人口標準ではなくサンプル標準を計算します。



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

純粋なpythonコード:

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ライナーについて「純粋」なものは何もありません。ああ。これはよりPythonicバージョンです:sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne

3

他の回答はpythonで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.