レスポンスタイムの平均

人間が目で、今と過去のレスポンスタイムを比較して遅くなっている・早くなっているを判断すると正確な判断ができないこともあるし、正確な判断ができるかどうかが人によってしまいそうです。 また、うちのチームでは二週間に一度ぐらい、主だったエンドポイントのレスポンスタイムが悪化していないかを点検していたんですが、なかなか忙しくて手が回らなくなってきてしまいました。

レスポンスタイムが悪化していないかは、過去のある時点のレスポンスタイムと、現時点のレスポンスタイムを比較し、差がない事がいえればよさそうです。 この比較は、標本平均に差があるかどうかを検定することで、行う事ができます。

この記事では、標本平均の差の検定をするための基礎知識についてまとめます。

中心極限定理

レスポンスタイムの母平均は、レスポンスタイムの確率分布がわかっていれば直接求められます。その差を検定することもできそうです。しかし、レスポンスタイムをどの確率分布でモデリングすると良いのかは僕には難しい問題です。

標本平均の確率分布は正規分布するという中心極限定理があるため、これを利用するとレスポンスタイムの確率分布が未知でも、標本平均については差を検定する事ができます。

この中心極限定理がレスポンスタイムで成り立つかを調べました。本物のレスポンスタイムでやった実験を公開したいんですが、ちょっとそれはめんどくさい(これを公開して良いかの社内調整、または、具体的なレスポンスタイムは特定できないようにしつつ実験するにはどうすると良いか考えたりするのが)のでダミーデータとして指数分布からの乱数を利用して、実験手法について紹介します。

具体的な手順は以下です。

  • 正規分布ではない分布、ここでは指数分布を使います、から乱数を生成する
  • 乱数から適当にサンプリングし平均を取る
  • ヒストグラムを書いて正規分布っぽいかみる

実験

母集団として、指数分布に従う値を生成します。

e = Exponential(2)
population = rand(e, 100000)
histogram(population

f:id:happy_siro:20210927140149p:plain
指数分布

このコードだと、指数分布のパラメータが1/2(Juliaだと1/引数がパラメータとなる)なので、期待値は2になります。 この母集団からサンプリングし、平均を取ります。この時、中心極限定理によると標本平均の分布は平均2の正規分布に従うはずです。

plt = []
for i in 1:5
    sample_mean = zeros(0)
    for j in 1:50
        append!(sample_mean, mean(sample(population, 10^i)))
    end
    p = plot(sample_mean, st=:histogram,title="histogram $(10^i)")
    push!(plt, p)
end
plot(plt...

f:id:happy_siro:20210927213846p:plain
標本平均の分布

標本の数が10個ぐらいだと平均のとりうる値の範囲も広く、また、偏りが見えます。だんだんと標本の数が増えるに従って分散が減り正規分布っぽくなっているように見えます。

f:id:happy_siro:20210927214148p:plain
範囲を固定

また、分散が減っているということをよりわかりやすくするために範囲を固定してみました。 こうすると、標本平均が母平均に近づいて行っているのがよくわかります。

まとめ

当たり前といえば当たり前ですが、標本平均の分布は正規分布に近づき、標本数が大きくなれば分散が小さくなることがわかりました。 また、母集団の確率分布が正規分布とはなれていても、↑のような結果になることがわかりました。

このことを利用すると、全てのエンドポイントについて過去と現在のレスポンスタイムの差を検定し、差がある確率がある値以上なら人間が詳しく見るというようなシステムが構築できそうです。

ソフトウェアにより構成されるシステムははどんどん巨大に、複雑になっています。この全体を人間がつぶさに観察し調査するのはとても大変です。 統計を利用すれば、この複雑なシステムと楽に戦っていけるのではないか、ということを考えてこの記事を書きました。

次は差の検定をやってみてどんな感じになったかを多分書きます。使い物になると良いな…。