Excel は,コンピュータ・ソフトウェアの三種の神器のようになっていますが,とんでもないこともあるというお話。
リンク
それでは,揚げ足取りをはじめましょうか...
Last modified: Jun 25, 2004
このサイトでもあちらこちらに書いてあるのですが,リンクだけでも一箇所にまとめておくことにしました。
また,関連する他のサイトへのリンクも掲載することにします。
ここに記載した以外の問題点にお気づきの方は,是非お知らせ下さい。即刻,掲載します。
リンク
- 「財務関数もでたらめだ」というページ(T-maru's Home Page / 尚智庵)
- Excel の演算誤差について(三重大学:奥村晴彦先生)
- "Excel for Statistics?" pdf file(The University of Iowa: Jonathan D. Cryer)
- "The Roll of Excel for Statistical Analysis" ppt file(Pondview Associates: I Elaine Allen)
- "Using Excel for Statistical Data Analysis"(University of Massachusetts: Eva Goldwater)
- "Using Excel 7 for Statistical Data Analysis: Successes and Cautions"(University of Massachusetts: Eva Goldwater)
- Untitled 19 pages Word file(New York University: Gary Simon)
- Statistical Analysis Using Microsoft Excel(New York University: Jeffry Simonoff)
それでは,揚げ足取りをはじめましょうか...
- Excel の関数に関して
- rand, randbetween 関数
Excel 2003 の rand 関数には致命的なバグがあります。0 〜 1 の一様乱数を返すはずですが,なんと 10 % の確率で負の値を返すそうです。発生させる乱数の範囲を指定できる randbetween 関数とて rand 関数を下請けにしているのだろうから同じ問題が起きているとのことです。R を使いましょう。
詳細 1,詳細 2,原因と対策?(黒い魔ソフトマイクロソフト) - binomdist, poisson, hypgeomdist 関数
引数によって関数値が計算されないことがあります。Excel のプログラマが,教科書的な定義式と実際の計算方法は別ということを理解していないためです。
詳細 binomdist, 詳細 poisson, 詳細 hypgeomdist, Prof. Leo Knüsel(pdf)
- gammaln 関数
精度が悪すぎます。
詳細
- chidist 関数
引数によって関数値が計算されないことがあります(これは上述の binomist, poisson, hypergeomdist 関数とは性質の異なる不具合)。
ここから始まるスレッドを参照
- var, varp, stdev, stdevp 関数
全ての引数に大きな定数を加えたとき,不正な値を返します。
varp(1,2,3) = 0.666666667 ですが,varp(1+1e10, 2+1e10, 3+1e10) = -14563.55556 など。加える定数により,負の値や 0 を返します。
stdevp(1,2,3) = 0.816496581 ですが,stdevp(1+1e10, 2+1e10, 3+1e10) = 0 など。加える定数により,varp, var が負や 0 になるときには,0 を返します。
このアルゴリズムじゃだめだ,解説,詳細,Prof. Leo Knüsel(pdf), Jonathan D. Cryer(pdf)
- geomean 関数
オンラインヘルプに明記されているように,計算方法が「全てのデータを掛け合わせてその n 乗根を求める」ということになっているので,geomean(1e150,2e150,3e150) = #NUM! となってしまいます。
「対数をとって平均値を求め,その逆対数を求める」という計算方法をとっていないための問題です。適切な方法で計算すると,1e150, 2e150, 3e150 の幾何平均は 1.8171E+150 となることがわかります。
1e150, 2e150, 3e150 などという大きな数値の幾何平均など求めないだろうという人もいるかもしれませんが,10 未満の数値(平均値が 5 程度)を取る 500 個ほどのデータの幾何平均も求められないということだと,考え直す人もいるでしょう。コンピュータは 10 の 300 乗ほどの大きさの数値しか扱えないのです。
詳細
- pearson 関数
全ての引数に大きな定数を加えたとき,不正な値を返します。
同じ相関係数を計算する関数 correl は,correl({0,1,2}, {40000000,40000001,40000002}) = 1 ですが,pearson({0,1,2},{40000000,40000001,40000002}) = 0.866025404 となってしまいます。
pearson({0,1,2}, {160000001,160000002,160000003}) = #DIV/0! など。加える定数により,varp, var が負や 0 になるときには,#DIV/0! を返します。
詳細
- confidence 関数
オンラインヘルプには「母集団に対する信頼区間を返します。信頼区間とは、標本平均の両側のある範囲のことです。たとえば、通信販売で商品を注文したときに、ある程度の確信を持って、その商品が最も早く到着する日と、最も遅く到着する日を予測することができます。」と書いてあります。
この関数が返すのは,信頼区間の幅の 1/2 です。ですから,「信頼区間を返します」というのは,誤った表現です。
信頼区間は [標本平均-この関数の返す値,標本平均+この関数の返す値] です。ですから,「信頼区間とは、標本平均の両側のある範囲のことです。」というのも誤っています。「ある範囲」というのも,不正確で何を言っているのか分かりません。
「たとえば、通信販売で商品を注文したときに、ある程度の確信を持って、その商品が最も早く到着する日と、最も遅く到着する日を予測することができます。」というのも,よい例ではありません(例を正しく説明してもいません)。
詳細
- ftest 関数
オンラインヘルプには「片側 P 値」と書いてありますが,それは真っ赤な嘘です。
返されるのは両側 P 値です。
「F 検定」という名前も不適切です。
詳細
- ztest 関数
オンラインヘルプでは「z 検定の両側 P 値を返します」と書いてありますが,それは真っ赤な嘘です。
返されるのは片側 P 値です。
「Z 検定」という名前も不適切です。
詳細
- mode 関数
mode(1, 2, 3, 4, 5, 6, 7) は #N/A を返します。全てが相異なる数値の場合には,最頻値は存在しないからです(頻度が等しい。すなわち,全てのデータは 1 個ずつある)。
mode(1, 2, 3, 3, 5, 6, 6) のような場合,結果としては 3 が帰ってきます。確かに,データ 3 は 2 個存在しますが,データ 6 も 2 個存在します。このように,頻度が同じ数値が複数個ある場合には,最初に見つかった方の数値を返すようです。
以上のこととも関連しますが,連続変数そのものに対して最頻値を求めようとするのは正しい態度ではありません。
詳細
- frequency 関数
階級の定義で,指定する数値は階級の上限値であり,その値はその階級に含まれます。通常,階級欄に a という数値が書いてあると,解釈としては「a 以上(次の数値未満)」を表すので,誤解を生みやすいかもしれません。分析ツールの「ヒストグラム」も同じ問題があります。
詳細
- kurt 関数,skew 関数
説明が不足しているだけで,間違っているわけではありません。
これらは,一般に使われているのとは異なる計算式によって計算されています。これらは,母数(母尖度,母歪度)の推定値を与えます(varp と var の関係でいえば,var にあたるものです)。
詳細(kurt), 詳細(skew)
- minverse 関数
特異行列(singular matrix)の場合に,何の警告もなく,でたらめな結果を返します。
具体例
- mdeterm 関数
特異行列(singular matrix)の場合に 0 でない値を返します。
具体例
- linest 関数
独立変数の個数が17個以上になると,#REF! エラーを返します。
大阪市立大学経済学部の中川満さんからお知らせいただきました。
詳細
- rand, randbetween 関数
- 分析ツールに関して
- 「ヒストグラム」
階級の定義で,指定する数値は階級の上限値であり,その値はその階級に含まれます。通常,階級欄に a という数値が書いてあると,解釈としては「a 以上(次の数値未満)」を表すので,誤解を生みやすいかもしれません。同じような集計を行うために用意されている frequency 関数にも同じ問題があります。
詳細
- 「基本統計量」
● 「信頼区間」として表示される一つの数値は,「母分散が未知の場合の母平均の信頼区間の幅の 1/2」です。
信頼区間は [標本平均-この値,標本平均+この値] です。
confidence 関数が返すのは上述のように,「母分散が既知の場合の母平均の信頼区間の幅の 1/2」です。
● 出力中の「標本数」というのは,「標本の大きさ」または「標本サイズ」と言うべきです。
● 表示される「最頻値」は必ずしも適切なものではありません(「mode 関数」の項を参照)。
詳細
- 「F 検定: 2標本を使った分散の検定」
表示されている P 値は「P(F<=f) 両側」と書かれていますが,それは真っ赤な嘘です。表示されるのは,片側 P 値です。両側 P 値は,表示されている値を 2 倍しないといけません。
詳細
- 「回帰分析」
● 原点を通る回帰分析を行うとき,表示される重相関係数,決定係数などが不正です。
詳細
● 多重共線性に対して無頓着です。
詳細
● 標準化残差の計算方法がちょっとおかしいです。
詳細
● 計算精度が不足しています(多項式回帰などの場合に特に)。
詳細
● 分析に使える独立変数の個数が16個とは,少なすぎるのではないでしょうか。
大阪市立大学経済学部の中川満さんからお知らせいただきました。
詳細
- 「t-検定: 一対の標本による平均の検定」
片方の観測値が欠損値であるようなデータ対において,別々に数えた有効な観測値の数が同じであるような場合に不正な結果を返します。
Jonathan D. Cryer(pdf)
- 「t-検定: 分散が等しくないと仮定した2標本による検定」
P 値の計算で小数点付きの自由度に対応できていません。
詳細1,詳細2
注:ttest 関数で第 4 引数に 3 を指定したときに行われる Welch の検定では,小数自由度に対応した P 値を返します。 - 「乱数発生」
発生できる一様乱数は 32768 種しかありません(他の乱数もこれをもとにして生成されるので,32768 種しかありません)。
Prof. Leo Knüsel(pdf)
注:rand 関数はちゃんと,2147483648 種の乱数を発生できます。Excel 2003 の rand 関数には致命的なバグがあります
- 「ヒストグラム」
- グラフ表示に関して
- 欠損値の扱いに関して(以下のものは不具合というより要望かもしれませんが)
欠損値の扱いに規則性がなく,また不条理な規則が適用されています。以下の記述も複雑で,フォローし切れていないかもしれませんので,使用に当たっては,各自で確認してください。
- averagea, counta, maxa, mina, stdeva, stdevpa, vara, varpa 関数
これらの関数は,数値、文字列、および論理値を含む引数を対象とします。しかし,オンラインヘルプによると,・ 引数として指定した配列またはセル参照に文字列が含まれる場合、これらは 0 (ゼロ) と見なされます。 空白文字列 ("") は、値が 0 (ゼロ) であると見なされます。 計算の対象に文字列の値を含めない場合は、(末尾に a のつかない 関数)を使用してください。
ということなので,一般的には,これら関数を使わなくてもよいように(average, count などなどを使う),データを用意するのが望ましいでしょう。
・ 引数に TRUE が含まれている場合は 1 と見なされ、FALSE が含まれている場合は 0 (ゼロ) と見なされます。
なお,空白文字列と空というのは別です(空白文字列は ' だけを入力してリターンキーを押したセル,空は要するに何も入力していないセル)。空は計算対象から除外されます。
詳細,具体例
- correl 関数,pearson 関数,その他の多くの関数
データの片方(両方)が数値以外(文字列,空文字列,論理値,空)がある場合,その組は計算から除外されます。次の項と比べるとこの機能は便利ですが,場合によっては入力ミスで除外されたデータ対があっても,データ対の数が報告されないので注意が必要かもしれません。
なお,この関数では,変数のデータ範囲はそれぞれ一列(一行)でなくてもよいような仕様になっていますが,利用に当たっては注意が必要です。
具体例
- 分析ツールの「基本統計量」,「相関」,「共分散」,「分散分析:一元配置」,「分散分析:繰り返しのある二元配置」,「分散分析:繰り返しのない二元配置」,「F 検定:2 標本を使った分散の検定」,「ヒストグラム」,「移動平均」,「t 検定:等分散を仮定した 2 標本による検定」,「t 検定:分散が等しくないと仮定した 2 標本による検定」,「z 検定:2 標本による平均の検定」
データ範囲に数値以外(文字列,空文字列,論理値)がある場合,エラーメッセージを出して分析は実行されません。
空セルはあってもかまいません。ちゃんと除外して計算されます。
希望を言えば,この場合にこそ欠損値を除いて分析する機能を付けて欲しかったです。
具体例
- 分析ツールの「t-検定: 一対の標本による平均の検定」
これは要望ではなくて不具合です。前述しました。 - 分析ツールの「回帰分析」
データ範囲中に数値以外(文字列,空文字列,論理値,空)がある場合,エラーメッセージを出して分析は実行されません。
空セルも許されないことに注意が必要です。
希望を言えば,この場合にこそ欠損値を除いて分析する機能を付けて欲しかったです。
具体例
- averagea, counta, maxa, mina, stdeva, stdevpa, vara, varpa 関数
Last modified: Jun 25, 2004