間違いだらけ!?「分散」と「標準偏差」の正しい計算法 – Python(Numpy, Pandas)、Excel、R の比較

多くのソフトウェアが分散や標準偏差を計算する便利な関数を用意しています。しかし、統計学を学ばずにソフトウェアの関数だけに頼ると、誤った計算をしてしまうので注意が必要です。

Python(Numpy, Pandas)、R、Excel(エクセル) で「分散」と「標準偏差」を正しく計算する方法をマスターしましょう。

3つのポイント

分散と標準偏差を正しく計算するポイントは下記の3つです。

  • 分2つの計算方法(n法とn-1法)
  • ソフトウェアの標準は n-1法
  • 例外的なソフトウェア Numpy に注意

順に説明していきます。

分散と標準偏差の2つの計算方法

分散・標準偏差は「分析対象のデータがすべてあるか否か」により計算方法が異なります。

1. 全データがある場合(母分散・母標準偏差・n法)

学内テスト結果や社員の営業成績を分析するといったケースが該当します。調査対象について全データが得られる場合、下記の式で分散を算出することができます。(xは平均値)

1ni=1nxix¯2
 

これを「母分散」と呼びます。母分散の正の平方根が「母標準偏差」です。

高校の数学で習う「分散・標準偏差」は「母分散・母標準偏差」なので、多くの人に馴染みがあるのは母分散・母標準偏差でしょう。

この計算式を(分母がnなので)n法と呼ぶことがあります。正式な統計学用語ではないかと思いますが、この記事でも便宜上 n法 と呼ぶことにします。

 

2. 全データがない場合(不偏分散・不偏標準偏差・n-1法)

内閣支持率を求めるのに全有権者から回答を得る、出荷するミカンの糖度を調べるのに全部のミカンの糖度を調べる、といったことは不可能です。

このように全データを得ることが不可能なケースでは、全データから「一部分のデータ(標本・サンプル)」を取り出して分析を行います。

この「一部分のデータ」から推測した分散を「不偏分散」と呼び下記の式で算出します。

1n1i=1nxix¯2

 

「不偏分散」の正の平方根が「不偏標準偏差」です。

この計算式を(分母がn-1なので)n-1法と呼ぶことがあります。正式な統計学用語ではないかと思いますが、この記事でも便宜上 n-1法 と呼ぶことにします。

統計学に詳しいなら「標本分散」、「標本標準偏差」という言葉をご存知でしょうが、これらの用語の定義は書籍や資料により異なることでも有名です。この記事では混乱を避けるため、n-1法、n法という計算方式で説明をしています。

ソフトウェアの標準は n-1 法

今でこそ「ビッグデータ」のように全データ集計も可能になってきましたが、データ解析の実務では一部分のデータから“本当の値”を推測するケースの方が圧倒的に多くなっています。世論調査、内閣支持率、テレビ視聴率などニュースや資料で目にする値の多くは統計的推測によるものです。

このため統計解析に関するソフトウェアやライブラリの多くは「不偏分散」「不偏標準偏差」つまり「n-1法」をデフォルトの仕様とするのが一般的です。各ソフトウェアの詳細は後ほど説明しますが、Python Pandas、R、Excelともに「n-1法」が分散、標準偏差を計算する際のデフォルト仕様になっています。

例外的なソフトウェア Numpy に注意

主流は「n-1法」ですが、稀に「n法」で計算するソフトウェア・ライブラリがあります。

有名どころでは Numpy が該当します。Python でデータ解析を行うにあたって Pandas と Numpy を併用する場合には注意が必要です。

 

各ソフト別 分散・標準偏差の計算方法

データ解析で使われることの多い Python(Numpy, Pandas, statistics)、R言語、Excel(エクセル)について具体的な計算方法をみていきましょう。

Numpy (Python3)

Numpy は 分散を var(), 標準偏差を std() メソッドで算出できます。

引数に何も指定しない場合(デフォルト)は n法になっています。他の多くのソフトウェアと異なり、Numpy のデフォルトはn法になることに注意しましょう。

なお n-1法で計算するには ddof=1 という引数を指定する必要があります。

Pandas(Python3)

Pandas は 分散を var(), 標準偏差を std() メソッドで算出できます。

引数に何も指定しない場合(デフォルト)は n-1 法つまり不偏分散・不偏標準偏差となります。n法で計算するには ddof=1 という引数を指定する必要があります。

Python のデータ解析で定番の Numpy と Pandas はメソッド名含め、互換性があるように見えますが、Numpy は n法、Pandas は n-1法であることに注意しましょう。

statistics - Python3 標準モジュール

Python3 には statistics という数理統計の標準モジュールがあります。Numpy と Pandas では引数によりn-1法とn法を使い分けましたが、statistics は関数名で使い分けます。

基本となる variance() , stdev() は n-1法により不偏分散, 不偏標準偏差を算出します。関数名の先頭に「p」をつけた pvariance(), pstdev() は n法により算出します。

 

R(R言語)

var(), sd() は n-1法により不偏分散, 不偏標準偏差を算出します。

R言語にはn法で算出する関数はありません。n法で算出したい場合には、ユーザーが各自で関数を定義する必要があります。

R言語で n法(標本分散・標本標準偏差)で算出する方法は下記ページを参照ください。
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/59.html

 

Excel(エクセル)

Excel は関数名で n-1 法と n法を使い分けます。

VAR.S(), STDEV.S() は n-1法により不偏分散, 不偏標準偏差を算出します。末尾の「S」を「P」に置き換えた VAR.P(), STDEV.P() はn法により算出します。

※上記のエクセル関数は Excel 2010 以降で使用できます。

Excel(エクセル)で分散と標準偏差を求める
 

古いバージョンの名残り

Excel には VAR() ,  STDEV() という関数がありますが、Excel2010より古いバージョンの名残りです。

VAR() ,  STDEV() はn-1法により不偏分散、不偏標準偏差を計算します。n法で計算する場合には、末尾に「P」をつけた VARP() ,  STDEVP() という関数を用います。

ただし、下記のようにVAR(), STDEV(), VARP(), STDEVP() は非推奨になっています。Excel 2010以降では使わないようにしましょう。

重要: この関数は、より精度が高く、その使い方をより適切に表す名前を持つ、新しい 1 つ以上の関数で置き換えられました。この関数は下位互換性のために引き続き利用可能ですが、Excel の将来のバージョンでは利用できなくなる可能性があるため、今後は新しい関数を使用することを検討してください。

support.office.com – STDEV 関数 より引用

 データサイエンティストのような専門家にとっては n-1法が実用的ですが、世間一般的には「分散」「標準偏差」といえば、学校の数学で習った n法による「母分散」「母標準偏差」です。

 

一般の利用者が圧倒的に多い Excel では VAR() ,  STDEV() 関数の誤用が絶えなかったため、現在は関数名が変更され、さらに従来の VAR() , STDEV() といった関数は非推奨になっています。

 

実用上は問題ないことも頭に入れる!

データ数が少ない(nが小さい)場合には、n-1法とn法による差を無視できないことがありますが、コンピュータで自動計算するのが当たり前の時代です。手計算や電卓で1万件のデータを計算するのは不可能ですが、コンピュータなら余裕ですね。

10,000 で割るのと 9,999 で割るのとでは、数値的にはわずかな違いが生じるでしょう。しかし、その違いが分析結果を狂わすか?というと、ほとんどの場合そのようなことはないでしょう。

何をもって大きいとするかは調査・分析によりますが、nが十分に大きいとみなせる場合には神経質にならなくても大丈夫です。重箱の隅をつつくような検証をするより、全体の結果を俯瞰・分析することの方が重要なことを忘れないようにしましょう。

この記事が役に立ったら是非シェアください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です