NumPyには、配列の要素から分散を求めるnp.var()が用意されています。このページでは、この関数の使い方と注意点について解説します。
なお、同じ分散を求めるものにメソッドのndarray.varもありますがオプション引数は全く同じなので、ここでは関数のnp.varを使って解説していきます。さらに、np.nanvarという関数もあります。通常のnp.varは、対象となる配列に欠損値nanが含まれる場合、nanを返します。しかし、np.nanvarでは欠損値nanを無視して他の要素から分散を計算します。この違いは覚えておくと良いでしょう。
それでは始めましょう。
1. 書式
まずは書式を確認しましょう。
書き方:
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で解説します。 |
keepdims* | bool | これをTrueにすると、標準偏差の配列の次元数が、元の配列a と同じになり、ブロードキャストが可能になります。 |
* はオプション引数であることを示します。 |
戻り値:
分散:ndarray 分散を要素とする配列を返します。 |
一緒に確認したい関数:
書き方:
ndarray.std(axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)
Notes
np.varで取得する分散は標本分散です。統計学の分野で一般的によく用いられる不偏分散ではありません。不偏分散を求める場合は、オプション引数でddof=1を指定してやる必要があります。
具体的には、デフォルトのddof=0では、np.varが計算する分散の値は var = mean(abs(x – x.mean())**2) です。ここでの平均(mean)は x.sum()/len(x) で計算されます。この時、ddof=1 を指定すると推定統計で一般的な x.sum()/(len(x)-1) で計算されます。
繰り返しになりますが、np.varはデフォルトでは標本分散を計算します。統計学で一般的に使われる不偏分散を計算するには、オプション引数でddof=1を指定する必要があります。
2. サンプルコード
それではサンプルコードで、np.varの使い方を確認していきましょう。
1次元配列の場合
まずはランダムな数値の1次元配列を作成します。
import numpy as np
rng = np.random.default_rng()
a = rng.integers(35, 101, (5, ))
a
この配列をnp.varに渡すと、デフォルトでは標本分散(ddof=0)を取得します。
# 標本分散を取得
np.var(a)
一般的な推定統計に使う分散を取得するには ddof=1 を指定します。
2次元配列の場合
2次元配列の場合も見てみましょう。以下の配列を例にします。
# 2次元配列
a = rng.integers(35, 101, (3, 5))
a
デフォルトでは、多次元配列の全要素を対象とした分散を計算します。
np.std(a, ddof=1)
オプション引数 axis で分散を求めるための次元軸を指定することができます。
# 1次元軸(横軸)
np.std(a, axis=-1, ddof=1)
# 2次元軸(縦軸)
np.std(a, axis=0, ddof=1)
オプション引数 keepdims=True を指定すると、元の配列a と同じ次元数を維持します。これによって、元の配列a に対してブロードキャスト可能な形になります。
# keepdims
np.std(a, axis=-1, keepdims=True, ddof=1)
# keepdims
np.std(a, axis=0, keepdims=True, ddof=1)
3. まとめ
以上が、NumPyの配列の分散を求めるnp.var()の使い方です。
繰り返しになりますが、この関数はデフォルトでは標本分散を取得します。標本分散は記述統計といって、その領域に関する全てのデータを保持しているとして、そのデータのばらつき度合いを求めるために使うものです。しかし、実際は、ある領域の問題について全てのデータを得られることはありません。
そのため、統計とは一般的に推定統計のことを指します。推定統計とは、全てのデータを得られるわけではないが、得られたデータの中から意味のある教訓を得るというものです。この推定統計において使われる分散を取得するには、オプション引数でddof=1と指定するようにしてください。
コメント