【お便りコーナー】性能測定だいきらい

こんにちは。

モデルナワクチン(2回目)の副反応でダウンしているたーせるです。

体調は悪いくせに退屈で仕方ないので、先日、同業のアプリケーション開発者の方からいただいたお便りを紹介してみようと思います。

性能測定大嫌い…笑

何をもって性能いいって言うのかさっぱり分からない。

同業者からのお便り

性能測定ってなに?

たとえば Web アプリの場合、ページ遷移した際に初期表示が完了するまで○秒以内、みたいな性能指標があるんだよ。

ふむ。

こういうのは、非機能要件として最初に取り決めておく。

で、アプリが出来上がってきた頃に、要件を満たす十分な性能が出ているかを確認するんだ。

え、でもそれって「OK」って判断するの難しくない?

2〜3回ストップウォッチで実測して「ハイ大丈夫です」なんてさんなことを言うわけにはいかないよね?

そうだね。

「平均応答時間 1秒以内」をどうやって確かめる?

ちょっと具体的な場面を想定してみましょう。

あなたはとあるアプリケーション開発者で、前任者から引き継いだ要件定義書には「平均応答時間 1秒以内」と書いてありました*1

開発もいよいよ佳境に入り、今から出来上がりつつあるアプリの応答時間を計測して、この非機能要件を満たしているかどうかを判断しなくてはなりません。

直感的には、測定回数を 1,000回とか 10,000回とかに増やしてその平均を求めれば、だんだん本来の平均値に近づいていきそうな気がします。 この直感は正しくて、「たいすうの法則」というれっきとした名前もついているのですが、現実問題としてそんな気の遠くなるようなマネはできません。

なんとかして少ないサンプルから平均応答時間を割り出したい、これが本日の動機づけです。

区間推定という手法

初めに、ちょっとズルい仮定をしましょう。

もしも徹底的に(1億回くらい)性能を測定し、その結果をプロットしたら、きっと平均  {\mu}、分散  \sigma^{2}正規分布に従うだろうと決めつけてしまうのです。

もちろん  {\mu} {\sigma^{2}} は未知の変数です。 でも、とにかく測定回数が  {\infty} になれば正規分布になると心の底から信じるのです。

まだ全く観測してもいないうちから、「あ、これはきっと正規分布だな」なんてあらかじめわかるわけがないのですが、こういう仮定を置かないとこの先の議論が成立しなくなるので、少々気持ち悪いですが耐えてください。

あ、ちなみに正規分布はこんな釣りがね形の分布です(Wikipediaから引用しました)。

この平均値  {\mu} が 1秒以内に収まるかどうかを判断できれば、性能目標を満たせているかどうかが判断できそうです。

でも今回は測定回数が不十分なので、 {\mu} をバシっと一点に決めることは難しいでしょう。

そこで次善の策として、 {\mu} が取りそうな範囲を推理することにしましょう。

ただ、その範囲があまりにも広すぎると意味がなくなってしまいますので、せめて「この範囲だったら95%の確率で的中する!」というところまでは絞ろうと思います。 まぁ 5% の確率で外れるかもしれませんが、潔く割り切ってください。

このような推理を、統計学的には「区間推定」と呼びます。

きちんと理屈で理解しようとするとかなり高度な思考力を要するので、ここでは誰でもできる方法だけを絵描き歌のように紹介しておきます。

Step1. 標本平均を計算する

まずは、がんばって性能を  {n}回実測したとしましょう。 10回とか 20回とか、まぁ現実的な回数で大丈夫です。

次に、測定結果の平均値  {\overline{X}} を求めます。

1回目の測定結果が  {X_{1}}、2回目が  {X_{2}} {\cdots}{n}回目が  {X_{n}} だとするならば、それらの平均は  {\overline{X} = \dfrac{1}{n} \displaystyle\sum_{i=1}^{n}X_{i} } になります。

これを、標本平均と言います。 10回くらい適当な標本サンプルを抽出して平均を取っただけなので、こういう呼び名がついています。

Step2. 不偏分散を計算する

次に、今後の計算のための準備として、へん分散  {S^{2}}を計算します。

そもそも分散ってなんだっけ?

それぞれの測定結果がどのくらい平均からかけ離れているかを足し合わせたもの、だね。

分散が大きいほどデータのバラつきも大きいということ。

ホントは真の分散  {\sigma^{2}} が分かっていればよいのですが、残念ながら今はそれが未知なので、仕方なく少ない測定結果だけを使って近似的に分散っぽいものを計算するのです。

 {S^{2} = \dfrac{1}{n-1} \displaystyle\sum_{i = 1}^{n} (X_{i} - \overline{X})^{2} }

ここで、分母が  {n-1} になっているところがポイントです。 すなわち、10回性能測定した場合、分母は  {10-1 = 9} になる、ということです。

なんで分母が  {n-1} になるの?

これはね、いろいろめんどくさいので考えない方がいいよ。

「不偏分散 {S^{2}} 自体を確率変数とみなしたとき、期待値が分散 {\sigma^{2}} になること」を示せばよいのだけど、、、

??? 「{S^{2}} 自体が確率変数」とは???

そこそこ高度な思考力を要するので、結果のオイシイとこだけ使ってください。


まずは簡単な例から入りましょう。

サイコロを1回投げると、ランダムで1〜6の目が出ます。

このサイコロの目のように、確率的に決まる変数を確率変数と呼ぶのでした。

サイコロを{n}回繰り返し投げたときに出る目を {X_{1},\,X_{2},\,\cdots, X_{n}}とすると、1回目に出た目の数が2回目の結果に影響を及ぼすわけではないので、 {X_{1},\,X_{2},\,\cdots, X_{n}}互いに独立な確率変数といえます。

では本題に移りましょう。

「アプリの性能を10回測定して求めた不偏分散{S^2}」も、「10回の測定」をやり直すたびに少しずつ値が変わり、サイコロの目と同じで結果は一定しません。

言い換えると、ある意味、確率的に{S^2}の値が決まると考えることができるので、{S^2}は確率変数とみなせます。

さらに言うと、 {S^2}の出どころは同じ母集団から無作為に抽出された標本が基になっているため、不偏分散を{n}回求めたとしたら、その結果  {S_{1}^{2},\, S_{2}^{2},\,\cdots ,\, S_{n}^{2} }は同一の確率分布に従う互いに独立な確率変数とみなすことができるのです。

コラム: {S^2}自体が確率変数?

Step3. 新たな統計量を導入する

これまでに計算した標本平均{\overline{X}}、不偏分散 {S^{2}} を使って、新たな統計量 {U = \dfrac{\overline{X} - \mu}{\sqrt{\dfrac{S^{2}}{n}}}} を定義します。

この {U} は、正規分布ではなく「自由度{n-1}tティー分布」に従うことが分かっています*2

非常に唐突感のある展開で大変恐縮ですが、統計学の理論を駆使してやっと導出できるしろものなのでご容赦ください。

t分布とは……?

一応、式を載せるけど、ちょっとキツいかも。

もしヤバいと思ったら速攻で忘れてくださいw

自由度{n}のt分布の確率密度関数は、次のように定義されます。

{t_{n}(x) = \dfrac{1}{\sqrt{n}\! \cdot \! B\left( \dfrac{n}{2}, \, \dfrac{1}{2} \right)} \left( \dfrac{x^2}{n} + 1\right)^{-\frac{n+1}{2} } }

ただし、 {B (p, \, q)} はベータ関数と呼ばれる関数で、以下のとおりです。

 {B(p, \, q) = \displaystyle\int_{0}^{1} x^{p-1} (1-x)^{q-1} \mathrm{d}x \qquad (p >0,\, q > 0)}

実際にグラフを描くと、正規分布とよく似た形をしています。

ここで出てくる「自由度」とは?

単なるパラメータです。

自由度が変わるとグラフの形も微妙に変わると思ってください。

話を戻して、{U = \dfrac{\overline{X} - \mu}{\sqrt{\dfrac{S^{2}}{n}}}} のうち、未知の変数は母平均 {\mu} だけです。

それ以外は、すべて測定した値から実際に計算で求められる値ばかりです。

t分布が発見される以前は、推定や検定に正規分布が用いられていました。

ただ、標本数が十分な場合はこれでもよかったのですが、小標本だとどうも誤差が大きすぎてうまくいかないことが分かっていました。

そんな20世紀初頭、ビール会社に勤めていたゴセット (W. S. Gosset) が、「標本数が少ないときはt分布(←新発見)を使うといいよ」という画期的論文を著しました。

その後、統計学者のフィッシャー (R. A. Fisher) もt分布の重要性を認め、「とりあえず少ない標本で母平均 {\mu}区間推定するならt分布」という新常識が定着したのです。

余談ですが、ゴセットは実名で論文発表をすると職場の偉い人に怒られる可能性があったので、彼は論文に「Student」というけんきょな偽名を使いました。

そのため、今もt分布のことを「Student's t-distribution」と表記する文献もあります。

コラム: 正規分布ではなくt分布?

Step4. t分布の 95% の面積から  {\mu} の範囲を求める

10回性能測定を行った場合、統計量 {U} は自由度 9 (= 10 - 1) の t分布に従うことが分かっています。

t分布は、正規分布によく似た左右対称の釣り鐘形をしています。 横軸 {y=0}{t_{n}(x)} で囲まれた領域の面積はぴったり1で、この釣り鐘型の裾野から左右それぞれ 2.5% (= 0.025) ずつの面積を引いてやれば、95% の範囲が計算できます。

そのためには、 { \displaystyle\int_{u_{9}}^{\infty} t_{9} (x) \mathrm{d}x = \underbrace{0.025}_{\textrm{面積}}} を満たす変数 {u_{9}} を探り当てる必要があるのですが、ここで突然、t分布表という数表が登場します。

{\alpha} 0.25 0.1 0.05 0.025 0.01 0.005
{u_{9}(\alpha)} 0.703 1.383 1.833 2.262 2.821 3.250

この  {\alpha} が裾野の(片側の)面積で、これに対応する 2.262 が、上式の積分区間の下端 {u_9} に対応します。

これでようやく準備が整いました。

実際、10回性能を測定した結果を用いて、95% の的中率で真の平均 {\mu} の範囲を推定してみましょう。

{\begin{align} - \underbrace{u_{9}\left( 0.025 \right)}_{2.262} \leq U \leq \underbrace{u_{9}\left( 0.025 \right)}_{2.262} 
\end{align}}

ここで {U = \dfrac{\overline{X} - \mu}{\sqrt{\dfrac{S^{2}}{n}}}}を代入して、以下の式を得ます。

{ -2.262 \leq \dfrac{\overline{X} - \mu}{\sqrt{\dfrac{S^{2}}{n}}} \leq 2.262 }

さらに  {\mu}について解くと、

 { \overline{X} - 2.262 \sqrt{\dfrac{S^{2}}{n}} \leq \mu \leq \overline{X} + 2.262 \sqrt{\dfrac{S^{2}}{n}} }

おめでとうございます。

これでようやっと応答性能の真の平均  {\mu} の範囲が、 95% くらいの確からしさで推理できたことになります。

改めて  {\overline{X}} も、 {S^2} {n} も、すべて測定結果から実際に計算できる値であることを思い出しましょう。

t検定(右片側検定)という手法

体調がしんどくなってきたので、そろそろ締めに入るとしましょう。

性能測定を10回だけ行い、その結果をもとにこのアプリの平均応答性能が1秒(以内)であるとうたってしまっても問題ないかどうかを確かめる手段として、検定という統計的手法が使えます。

Step 1. 2つの仮説を立てる

まずは「平均応答性能  {\mu = \underbrace{\mu_{0}}_{\textrm{1}}}」みたいな仮説を立てます。この仮説のことを、仮説と呼んだりします。

ところが、どうやらあなたはアプリの品質をつかさどる内部のけんせい部門から疑いの目を向けられているようです。

つまり、「ホントは平均応答時間は1秒より長いのでは?」と怪しまれ、その上「 {\mu > \underbrace{\mu_0}_{\textrm{1}}}」という、あなたにとって不利な対立仮説を立てられ、あなたの仮説はされそうになっています。

Step 2. 検定統計量を決める

ここからバチバチの戦いが始まるわけですが、まず検定統計量 {T} を、  {T = \dfrac{\overline{X} - \mu_{0}}{ \sqrt{\dfrac{S^2}{n} } }} と置きます。

どこかで見覚えのある式ですが、これは、平均も分散も未知で、なおかつ測定回数もそんなに多くない場合向けの特注品です。

Step 3. 棄却域を決める

次に、先ほどの数表から、棄却域と呼ばれるしきい値を決めます。

具体的には、測定回数10回ならば自由度9のt分布表から  {u_{9}(\alpha)} を求めます。 ちなみに {\alpha} は 0.05 とか 0.01 とかが選ばれることが多いです。ここでは  {\alpha = 0.05} を選んだとしましょう。

この 0.05 とか 0.01 のことを有意水準と呼んだりします。 パーセントを付けて、5% とか 1% と表記することも多いです。

 {u_{9} (0.05) = 1.833}

Step 4. 統計量 {T} を計算し、棄却域に入るかどうかを確かめる

そして、実際に測定した結果を計算した結果  { X_{1}, \, X_{2}, \cdots ,\, X_{10} } を基に、  {T} の値を計算します。 もしも  {T} が棄却域に入ってしまった場合は、帰無仮説棄却されます(対立仮説が採択されたとも言います)。

棄却された瞬間「あぁ、これ絶対性能ヤバいな」と判断できるのです。

反対に、もし {T} が棄却域に入らなかった場合、帰無仮説受容されたと言います。

注意したいのは、初めに立てた帰無仮説が棄却されなかったからといって、対立仮説の方が間違っている! とは必ずしも言えないという点です。

Step 5. 結果報告

最終的に、性能見解を報告書としてまとめる場合は、

帰無仮説  H_{0}: \mu = 1、対立仮説  {H_{1}: \mu > 1} とそれぞれおき、自由度  {n-1}のt分布に従う統計量  {T = \dfrac{\overline{X} - 1}{ \sqrt{\dfrac{S^2}{n} } }}」を用いて、有意水準 5% で右片側検定を行った結果、帰無仮説  H_{0}棄却されなかった

みたいな歯切れの悪い言い回しをすることが多いです。

ちょっと意地悪な仮説  H_{1} を立ててまで、 H_{0}を崩そうとしたけど結果無理でした ──という感じの意味合いで、やや含みを帯びた形にせざるを得ないと思います。

まとめ

そんなわけで、今日は限られたサンプルから真の姿を見つけ出す推測統計のお話でした。

それではよいアプリケーション開発を。

*1:実際には、「通信環境が良好である場合」とか「システムの実行環境が推奨構成を満たしている場合」とか「初期表示データ件数は何件を想定」とか、いろいろ条件がくっつくのですが。

*2:だいぶ端折って書きましたが、 {U}を確率変数とみなしたとき、その確率密度はt分布に従う、というのがより正しい表現です。

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.