こんにちは。
モデルナワクチン(2回目)の副反応でダウンしているたーせるです。
体調は悪いくせに退屈で仕方ないので、先日、同業のアプリケーション開発者の方からいただいたお便りを紹介してみようと思います。
性能測定大嫌い…笑
何をもって性能いいって言うのかさっぱり分からない。
性能測定ってなに?
たとえば Web アプリの場合、ページ遷移した際に初期表示が完了するまで○秒以内、みたいな性能指標があるんだよ。
ふむ。
こういうのは、非機能要件として最初に取り決めておく。
で、アプリが出来上がってきた頃に、要件を満たす十分な性能が出ているかを確認するんだ。
え、でもそれって「OK」って判断するの難しくない?
2〜3回ストップウォッチで実測して「ハイ大丈夫です」なんて杜撰なことを言うわけにはいかないよね?
そうだね。
「平均応答時間 1秒以内」をどうやって確かめる?
ちょっと具体的な場面を想定してみましょう。
あなたはとあるアプリケーション開発者で、前任者から引き継いだ要件定義書には「平均応答時間 1秒以内」と書いてありました*1。
開発もいよいよ佳境に入り、今から出来上がりつつあるアプリの応答時間を計測して、この非機能要件を満たしているかどうかを判断しなくてはなりません。
直感的には、測定回数を 1,000回とか 10,000回とかに増やしてその平均を求めれば、だんだん本来の平均値に近づいていきそうな気がします。 この直感は正しくて、「大数の法則」という歴とした名前もついているのですが、現実問題としてそんな気の遠くなるようなマネはできません。
なんとかして少ないサンプルから平均応答時間を割り出したい、これが本日の動機づけです。
区間推定という手法
初めに、ちょっとズルい仮定をしましょう。
もしも徹底的に(1億回くらい)性能を測定し、その結果をプロットしたら、きっと平均 、分散 の正規分布に従うだろうと決めつけてしまうのです。
もちろん と は未知の変数です。 でも、とにかく測定回数が になれば正規分布になると心の底から信じるのです。
まだ全く観測してもいないうちから、「あ、これはきっと正規分布だな」なんて予めわかるわけがないのですが、こういう仮定を置かないとこの先の議論が成立しなくなるので、少々気持ち悪いですが耐えてください。
あ、ちなみに正規分布はこんな釣り鐘形の分布です(Wikipediaから引用しました)。
この平均値 が 1秒以内に収まるかどうかを判断できれば、性能目標を満たせているかどうかが判断できそうです。
でも今回は測定回数が不十分なので、 をバシっと一点に決めることは難しいでしょう。
そこで次善の策として、 が取りそうな範囲を推理することにしましょう。
ただ、その範囲があまりにも広すぎると意味がなくなってしまいますので、せめて「この範囲だったら95%の確率で的中する!」というところまでは絞ろうと思います。 まぁ 5% の確率で外れるかもしれませんが、潔く割り切ってください。
きちんと理屈で理解しようとするとかなり高度な思考力を要するので、ここでは誰でもできる方法だけを絵描き歌のように紹介しておきます。
Step1. 標本平均を計算する
まずは、がんばって性能を 回実測したとしましょう。 10回とか 20回とか、まぁ現実的な回数で大丈夫です。
次に、測定結果の平均値 を求めます。
1回目の測定結果が 、2回目が 、、回目が だとするならば、それらの平均は になります。
これを、標本平均と言います。 10回くらい適当な標本を抽出して平均を取っただけなので、こういう呼び名がついています。
Step2. 不偏分散を計算する
次に、今後の計算のための準備として、不偏分散 を計算します。
そもそも分散ってなんだっけ?
それぞれの測定結果がどのくらい平均からかけ離れているかを足し合わせたもの、だね。
分散が大きいほどデータのバラつきも大きいということ。
ホントは真の分散 が分かっていればよいのですが、残念ながら今はそれが未知なので、仕方なく少ない測定結果だけを使って近似的に分散っぽいものを計算するのです。
ここで、分母が になっているところがポイントです。 すなわち、10回性能測定した場合、分母は になる、ということです。
なんで分母が になるの?
これはね、いろいろめんどくさいので考えない方がいいよ。
「不偏分散 自体を確率変数とみなしたとき、期待値が母分散 になること」を示せばよいのだけど、、、
??? 「 自体が確率変数」とは???
そこそこ高度な思考力を要するので、結果のオイシイとこだけ使ってください。
まずは簡単な例から入りましょう。
サイコロを1回投げると、ランダムで1〜6の目が出ます。
このサイコロの目のように、確率的に決まる変数を確率変数と呼ぶのでした。
サイコロを回繰り返し投げたときに出る目をとすると、1回目に出た目の数が2回目の結果に影響を及ぼすわけではないので、は互いに独立な確率変数といえます。
では本題に移りましょう。
「アプリの性能を10回測定して求めた不偏分散」も、「10回の測定」をやり直すたびに少しずつ値が変わり、サイコロの目と同じで結果は一定しません。
言い換えると、ある意味、確率的にの値が決まると考えることができるので、は確率変数とみなせます。
さらに言うと、の出どころは同じ母集団から無作為に抽出された標本が基になっているため、不偏分散を回求めたとしたら、その結果 は同一の確率分布に従う互いに独立な確率変数とみなすことができるのです。
Step3. 新たな統計量を導入する
これまでに計算した標本平均、不偏分散 を使って、新たな統計量 を定義します。
この は、正規分布ではなく「自由度のt分布」に従うことが分かっています*2。
非常に唐突感のある展開で大変恐縮ですが、統計学の理論を駆使してやっと導出できる代物なのでご容赦ください。
t分布とは……?
一応、式を載せるけど、ちょっとキツいかも。
もしヤバいと思ったら速攻で忘れてくださいw
自由度のt分布の確率密度関数は、次のように定義されます。
ただし、 はベータ関数と呼ばれる関数で、以下のとおりです。
実際にグラフを描くと、正規分布とよく似た形をしています。
ここで出てくる「自由度」とは?
単なるパラメータです。
自由度が変わるとグラフの形も微妙に変わると思ってください。
話を戻して、 のうち、未知の変数は母平均 だけです。
それ以外は、すべて測定した値から実際に計算で求められる値ばかりです。
t分布が発見される以前は、推定や検定に正規分布が用いられていました。
ただ、標本数が十分な場合はこれでもよかったのですが、小標本だとどうも誤差が大きすぎてうまくいかないことが分かっていました。
そんな20世紀初頭、ビール会社に勤めていたゴセット (W. S. Gosset) が、「標本数が少ないときはt分布(←新発見)を使うといいよ」という画期的論文を著しました。
その後、統計学者のフィッシャー (R. A. Fisher) もt分布の重要性を認め、「とりあえず少ない標本で母平均を区間推定するならt分布」という新常識が定着したのです。
余談ですが、ゴセットは実名で論文発表をすると職場の偉い人に怒られる可能性があったので、彼は論文に「Student」という謙虚な偽名を使いました。
そのため、今もt分布のことを「Student's t-distribution」と表記する文献もあります。
Step4. t分布の 95% の面積から の範囲を求める
10回性能測定を行った場合、統計量 は自由度 9 (= 10 - 1) の t分布に従うことが分かっています。
t分布は、正規分布によく似た左右対称の釣り鐘形をしています。 横軸 と で囲まれた領域の面積はぴったり1で、この釣り鐘型の裾野から左右それぞれ 2.5% (= 0.025) ずつの面積を引いてやれば、95% の範囲が計算できます。
そのためには、 を満たす変数 を探り当てる必要があるのですが、ここで突然、t分布表という数表が登場します。
0.25 | 0.1 | 0.05 | 0.025 | 0.01 | 0.005 | |
---|---|---|---|---|---|---|
0.703 | 1.383 | 1.833 | 2.262 | 2.821 | 3.250 |
この が裾野の(片側の)面積で、これに対応する 2.262 が、上式の積分区間の下端 に対応します。
これでようやく準備が整いました。
実際、10回性能を測定した結果を用いて、95% の的中率で真の平均 の範囲を推定してみましょう。
ここで を代入して、以下の式を得ます。
さらに について解くと、
おめでとうございます。
これでようやっと応答性能の真の平均 の範囲が、 95% くらいの確からしさで推理できたことになります。
改めて も、 も も、すべて測定結果から実際に計算できる値であることを思い出しましょう。
t検定(右片側検定)という手法
体調がしんどくなってきたので、そろそろ締めに入るとしましょう。
性能測定を10回だけ行い、その結果をもとにこのアプリの平均応答性能が1秒(以内)であると謳ってしまっても問題ないかどうかを確かめる手段として、検定という統計的手法が使えます。
Step 1. 2つの仮説を立てる
まずは「平均応答性能 」みたいな仮説を立てます。この仮説のことを、帰無仮説と呼んだりします。
ところが、どうやらあなたはアプリの品質を司る内部の牽制部門から疑いの目を向けられているようです。
つまり、「ホントは平均応答時間は1秒より長いのでは?」と怪しまれ、その上「」という、あなたにとって不利な対立仮説を立てられ、あなたの仮説は無に帰されそうになっています。
Step 2. 検定統計量を決める
ここからバチバチの戦いが始まるわけですが、まず検定統計量 を、 と置きます。
どこかで見覚えのある式ですが、これは、平均も分散も未知で、なおかつ測定回数もそんなに多くない場合向けの特注品です。
Step 3. 棄却域を決める
次に、先ほどの数表から、棄却域と呼ばれる閾値を決めます。
具体的には、測定回数10回ならば自由度9のt分布表から を求めます。 ちなみに は 0.05 とか 0.01 とかが選ばれることが多いです。ここでは を選んだとしましょう。
この 0.05 とか 0.01 のことを有意水準と呼んだりします。 パーセントを付けて、5% とか 1% と表記することも多いです。
まとめ
そんなわけで、今日は限られたサンプルから真の姿を見つけ出す推測統計のお話でした。
それではよいアプリケーション開発を。