NumPyで分散を取得するvar()の使い方と注意点

NumPyには、配列の要素から分散を求めるnp.var()が用意されています。このページでは、この関数の使い方と注意点について解説します。

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

それでは始めましょう。

目次

1. 書式

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

np.var関数

書き方:

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
分散を要素とする配列を返します。

一緒に確認したい関数:

  • std: 標準偏差を取得
  • mean: 平均を取得
  • nanvar: 分散を取得(欠損値無視)
  • nanstd: 標準偏差を取得(欠損値無視)
  • nanmean: 平均を取得(欠損値無視)
np.var関数

書き方:

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次元配列を作成します。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(35, 101, (5, ))
a
Out[1]:
array([70, 53, 79, 58, 59])

この配列をnp.varに渡すと、デフォルトでは標本分散(ddof=0)を取得します。

In [2]:
# 標本分散を取得
np.var(a)
Out[2]:
88.56

一般的な推定統計に使う分散を取得するには ddof=1 を指定します。

2次元配列の場合

2次元配列の場合も見てみましょう。以下の配列を例にします。

In [4]:
# 2次元配列
a = rng.integers(35, 101, (3, 5))
a
Out[4]:
array([[56, 61, 40, 84, 47],
       [42, 67, 75, 54, 54],
       [92, 74, 64, 46, 55]])

デフォルトでは、多次元配列の全要素を対象とした分散を計算します。

In [5]:
np.std(a, ddof=1)
Out[5]:
15.308572139568765

オプション引数 axis で分散を求めるための次元軸を指定することができます。

In [6]:
# 1次元軸(横軸)
np.std(a, axis=-1, ddof=1)
Out[6]:
array([16.83151805, 12.81795616, 17.78201338])
In [7]:
# 2次元軸(縦軸)
np.std(a, axis=0, ddof=1)
Out[7]:
array([25.79405616,  6.5064071 , 17.89785834, 20.0333056 ,  4.35889894])

オプション引数 keepdims=True を指定すると、元の配列a と同じ次元数を維持します。これによって、元の配列a に対してブロードキャスト可能な形になります。

In [8]:
# keepdims
np.std(a, axis=-1, keepdims=True, ddof=1)
Out[8]:
array([[16.83151805],
       [12.81795616],
       [17.78201338]])
In [9]:
# keepdims
np.std(a, axis=0, keepdims=True, ddof=1)
Out[9]:
array([[25.79405616,  6.5064071 , 17.89785834, 20.0333056 ,  4.35889894]])

3. まとめ

以上が、NumPyの配列の分散を求めるnp.var()の使い方です。

繰り返しになりますが、この関数はデフォルトでは標本分散を取得します。標本分散は記述統計といって、その領域に関する全てのデータを保持しているとして、そのデータのばらつき度合いを求めるために使うものです。しかし、実際は、ある領域の問題について全てのデータを得られることはありません。

そのため、統計とは一般的に推定統計のことを指します。推定統計とは、全てのデータを得られるわけではないが、得られたデータの中から意味のある教訓を得るというものです。この推定統計において使われる分散を取得するには、オプション引数でddof=1と指定するようにしてください。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる