web-dev-qa-db-ja.com

リストの標準偏差

いくつかの(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 )...

今、私は*_Rank[0]の平均と標準偏差、*_Rank[1]の平均と標準偏差などを取りたいと思います。
(つまり、すべての(A..Z)_rankリストの最初の桁の平均と標準偏差。
すべての(A..Z)_rankリストの2桁目の平均と標準偏差。
3桁目の平均と標準...等)。

81
physics_for_all

Python 3.4/ PEP45 から標準ライブラリには statistics module があります。これにはあなたのようなイテラブルの標準偏差を計算するための method stdev があります:

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

A_Rank他を2D 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 ])
93
NPE

これは、平均値と標準偏差を計算するために使用できる純粋なPythonコードです。

以下のコードはすべて、Python 3.4+の statistics モジュールに基づいています。

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
45
Alex Riley

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

  • Population std:あなたのデータリスト以外に追加の引数なしでnumpy.std()を使うだけです。
  • Sample std:次の例のように、ddof(つまりDelta Degrees of Freedom)を1に設定する必要があります。

numpy.std(<あなたのリスト>、ddof = 1

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

母集団の標準偏差ではなく標本の標準偏差を計算します。

21
Ome

Python 2.7では、NumPyの numpy.std() を使うと、 母集団標準偏差 が得られます。

Python 3.4の場合 statistics.stdev() は標本標準偏差を返します。 pstdv()関数はnumpy.std()と同じです。

9
B.Kocis

純粋な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))
5
Elad Yehezkel

他の答えは、pythonでstd devを十分に実行する方法をカバーしていますが、あなたが説明した奇妙なトラバーサルを実行する方法を誰も説明していません。

A-Zが全人口であると仮定します。そうでなければ Ome はサンプルから推論する方法についての答えです。

したがって、すべてのリストの最初の桁の標準偏差/平均を取得するには、次のようなものが必要になります。

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

これで、A-Zからn番目の場所すべてのstddとmeanを簡単に取得できます。

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

#mean
numpy.mean(getAllNthRanks(n))
3
Samy Bencherif

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の間の同様の違い
3
pankaj