背景
大量のセルの統計量を算出する場合,関数によって処理時間が大きく異なる場合がある。
そこで,各種統計関数の処理時間を調べてみた。
検証環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
CPU: Core i7 2.4GHz
RAM: 16GB
仮想メモリ: OFF
検証方法
以下の手順で検証した。
- 約100万行×50列(=約5000万個)の乱数列を作成する。ただし,再計算されないように,値は固定する。
- 5000万個のセルに対して,統計関数によって統計量を算出する。
- Application.CalculateFull を実行するのに要する時間を,timeGetTime関数を利用して計測する。
- 2.~3.を,各種関数ごとに実行,比較する。
- ただし,キャッシュの効果などもあるので,どの関数をテストするかの順序については無作為実験を行う。また,Excel再起動ごとに2セットずつ測定し,計10回ずつの実験を行う。
結果
結果は下図のとおり。誤差棒は10回の標準偏差。
DEVSQ関数を除いては,計算内容から定性的に予想される結果とほぼ同じになった。
また,PERCENTILE.INC関数を使うと遅くなると感じていたのだが,それを裏付ける結果となった。
SUMSQとVAR.Sとの違いはあまりない。これに対し,DEVSQはVAR.Sと比較して大幅に遅い。理由は不明。定義上は,VAR.SとDEVSQの計算量は大して違わないはずであるが・・・。
背景
STDEV.関数は,平方根をとるぶんだけ,VAR.S関数よりも処理に時間がかかることも考えられる。
そこで,速度を比較した。
検証環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
CPU: Core i7 2.4GHz
RAM: 16GB
仮想メモリ: OFF
検証方法
以下の手順で検証した。
- 2個の数値をセルに入力する。平方根の処理の差を際立たせるため,個数は少ないほうがよい。
- VAR.S関数で2個の数値の分散をApplication.Calculatefullメソッドで10000回再計算する。
- 同様に,STDEV.S関数で標準偏差を計算する。
- 2,3の処理時間を比較する。
結果
有意な違いはなさそう。
処理時間(=速度)を気にすることなく,便利なほうを使えばよい。
背景
標準偏差は,VAR.S関数の平方根をとって算出することもできる。
そこで,VAR.S関数を利用して標準偏差を求めた場合と,STDEV.S関数で標準偏差を直接求めた場合とで一致桁数を比較した。
検証環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
CPU: Core i7 2.4GHz
RAM: 16GB
仮想メモリ: OFF
検証方法
以下の手順で検証した。
- 標本数nの一様乱数を生成する。
- VAR.S関数で分散を計算する。
- その平方根をとって,標準偏差とする。
- この結果と,生データから直接,STDEV.S関数で求めた結果との一致桁数を算出する。
結果
いくつかの条件で試したところ,条件によらず,15桁まで一致した。
平方根をとるだけなので,さすがに内部で特殊なことはしていないということか?
VAR.P関数,STDEV.P関数についても同様の検証を行ったが,同じ結果であった。
背景
分散は,DEVSQ関数を利用して算出することもできる。
そこで,DEVSQ関数を利用して分散を求めた場合と,VAR.S関数で分散を直接求めた場合とで一致桁数を比較した。
検証環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
CPU: Core i7 2.4GHz
RAM: 16GB
仮想メモリ: OFF
検証方法
以下の手順で検証した。
- 標本数nの一様乱数を生成する。
- DEVSQ関数で偏差平方和を計算する。
- n-1で割って,分散とする。
- この結果と,生データから直接,VAR.S関数で求めた結果との一致桁数を算出する。
結果
いくつかの条件で試した中で,一致の比較的悪かったものは下図のとおり。11桁は一致するとみてよさそうである。
Excelでの実際のアルゴリズムがよくわからないので,これ以上の考察はしない。
VAR.P関数についても同様の検証を行ったが,結果はほぼ同様であった。
STDEV関数またはSTDEV.S関数を使って,100.1,100.1,100.1 の3個の数値の標準偏差を計算すると,0にならない。
確認環境
Excel 2013(64bit) + Windows 10 Pro(64bit)