NumPyで標準偏差を求めるstd()の使い方と注意点

NumPyには、配列の要素から標準偏差を取得するためのstd関数が用意されています。標準偏差とは、データのばらつきを示す指標のことです。このページでは、この関数の使い方について解説します。

なお、同じ分散を求めるものにメソッドのndarray.stdもありますがオプション引数は全く同じなので、ここでは関数のnp.stdを使って解説していきます。さらに、np.nanstdという関数もあります。通常のnp.stdは、対象となる配列に欠損値nanが含まれる場合、nanを返します。しかし、np.nanstdでは欠損値nanを無視して他の要素から標準偏差を計算します。この違いは覚えておくと良いでしょう。

それでは見ていきましょう。

目次

1. 書式

まずは書式を確認しましょう。

np.std関数

書き方:

np.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)

パラメーター:

引数     解説
a   array_like  ここに渡した配列の要素から標準偏差が計算されます。
axis* None or int or tuple of ints   標準偏差の計算対象とする次元軸を指定します。デフォルトのNoneでは、全要素のうちの標準偏差を計算します。
dtype* dtype   標準偏差のデータ型を指定したい場合に使います。デフォルトでは、配列a の要素がint型の場合はfloat64型、配列a の要素がfloat型の場合は同等の型となります。
out*  ndarray  この関数の出力結果で、既存の配列を上書きしたい場合に指定します。出力結果と、上書き対象の配列のshapeは一致している必要があります。
ddof* int デルタの自由度です。後述のNoteで解説します。
* はオプション引数であることを示します。

戻り値: 

標準偏差ndarray
標準偏差を要素とする配列を返します。

一緒に確認したい関数:

  • var: 分散を取得
  • mean: 平均を取得
  • nanmean: 平均を取得(欠損値無視)
  • nanstd: 標準偏差を取得(欠損値無視)
  • nanvar: 分散を取得(欠損値無視)
ndarray.stdメソッド

書き方:

ndarray.std(axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)

Note

np.std ではデフォルトでは標本分散をもとにした標準偏差を計算します。一般的な推測統計で利用される不偏分散をもとにした不偏標準偏差を求める場合は、オプション引数で ddof=1 を指定する必要があります。

デフォルトの標準偏差は、あくまでも標本分散の平方根のことで、std = sqrt(mean(abs(x – x.mean())**2)) という式で表すことができます。そして、平均二乗偏差は、通常 x.sum()/len(x) で計算されます。もし ddof を指定している場合は、x.sum()/lne(x)-ddof という式になります。

2. サンプルコード

それではサンプルコードを確認していきましょう。関数のnp.std() とメソッドのndarray.std() はオプション引数は全く同じなので、ここでは前者を使って解説していきます。

1次元配列の場合

まずは乱数の配列を作成します。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(35, 101, (5, ))
a
Out[1]:
array([57, 59, 88, 84, 41])

この配列をstdの引数に渡すと、配列の要素から標準偏差を計算して返します。

In [2]:
# 標本分散の標準偏差
np.std(a)
Out[2]:
17.679366504487657

上のNoteで書いている通り、デフォルトではnp.stdは標本分散の標準偏差を返します。機械学習や統計学で一般的な不偏標準偏差を取得するには、オプション引数で ddof=1 と指定してやる必要があります。

In [3]:
# 不偏標準偏差
np.std(a, ddof=1)
Out[3]:
23.723004708108803

多次元配列の場合

多次元配列を渡した場合、デフォルトでは全要素から標準偏差を計算します。しかし、オプション引数で次元軸を指定することができます。

以下の配列を例に確認しましょう。

In [4]:
# 2次元配列
a = rng.integers(35, 101, (3, 5))
a
Out[4]:
array([[50, 39, 92, 50, 59],
       [93, 36, 44, 47, 59],
       [96, 92, 35, 79, 93]])

1次元軸(横軸)を指定すると、以下のように行単位で標準偏差を算出します。

In [5]:
# 1次元軸(横軸)
np.std(a, axis=-1, ddof=1)
Out[5]:
array([20.28546278, 22.37632678, 25.4460213 ])

2次元軸(縦軸)を指定すると、列単位で算出します。

In [6]:
# 2次元軸(縦軸)
np.std(a, axis=0, ddof=1)
Out[6]:
array([25.73583753, 31.50132272, 30.64310689, 17.67295486, 19.62990915])

配列同士の算術演算のために、作成される標準偏差の配列の次元数を維持することができます。その場合は、オプション引数で keepdims=True と指定します。

In [7]:
# keepdims
np.std(a, axis=-1, keepdims=True, ddof=1)
Out[7]:
array([[20.28546278],
       [22.37632678],
       [25.4460213 ]])
In [8]:
# keepdims
np.std(a, axis=0, keepdims=True, ddof=1)
Out[8]:
array([[25.73583753, 31.50132272, 30.64310689, 17.67295486, 19.62990915]])

3. まとめ

以上が、np.stdの使い方です。繰り返しになりますが、ddof の与え方が他のプログラミング言語と異なっている場合があります。一般的な推定統計ではddof=1 を指定して使うようにしましょう。記述統計ではデフォルトのままで大丈夫です。

ぜひ参考にして頂ければと思います。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる