前回 は CTR (クリック率)、CVR (コンバージョン率) に対するいくつかの区間推定方法を、それぞれの特徴とともに列挙してみました。今回はそれらの区間推定方法による実際の信頼区間を、Java や Python, R を用いて求める方法をまとめてみます。
Java による区間推定
Java で二項比率の区間推定をするには、commons-math3 の org.apache.commons.math3.stat.interval
パッケージ以下のクラスを使うのが手っ取り早いでしょう。
それぞれの区間推定方法に対応するクラスは以下のとおりです。
- Wald confidence interval
NormalApproximationInterval
クラス
- Clopper-Pearson (or 'Exact') confidence interval
ClopperPearsonInterval
クラス
- Wilson (or 'Score') confidence interval
WilsonScoreInterval
クラス
- Adjusted Wald confidence interval / Agresti-Coull confidence interval
AgrestiCoullInterval
クラス
これらのクラスに定義されている #createInterval(int numberOfTrials, int numberOfSuccesses, double confidenceLevel)
を呼び出すことで信頼区間を求めることができます。たとえば numberOfTrials
にインプレッション数を、 numberOfSuccesses
にクリック数を、 confidenceLevel
に 0.95 を設定して呼び出せば、95% 信頼水準での CTR の信頼区間が得られます。
サンプルコードは以下のとおり。
注意点として、 CTR や CVR の割合が 0% or 100% になるケース (つまりは、クリックやコンバージョンがまったく発生していない or 毎回発生している状態) において NormalApproximationInterval
クラス、もしくは ClopperPearsonInterval
クラスの #createInterval(int, int, double)
メソッドで信頼区間を求めようとすると、 MathIllegalArgumentException
や NotStrictlyPositiveException
などの例外が発生してしまいます。
Wald confidence interval ではそもそも区間の幅が 0 になるケースに相当するのでどうしようもないのですが、Clopper-Pearson confidence interval では区間の片側だけでも算出することはできるはずです。
なので、このようなケースでも無理矢理に算出することはできるわけで、例えば ClopperPearsonInterval
クラスの実装を以下のように修正すれば例外を生じることなく信頼区間を求めることができます。
Python による区間推定
Python の場合は、statsmodels を使います。
使い方は こちらのドキュメント を参考に、statsmodels.stats.proportion.proportion_confint(count, nobs, alpha, method)
を呼び出します。CTR を算出するのであれば count
にクリック数を、nobs
にインプレッション数を指定し、加えて信頼水準 $100(1-\alpha)\%$ の $\alpha$ を alpha に指定します。
method
には、区間推定方法を文字列で指定します。
- Wald confidence interval
normal
- Clopper-Pearson (or 'Exact') confidence interval
beta
- Wilson (or 'Score') confidence interval
wilson
- Adjusted Wald confidence interval / Agresti-Coull confidence interval
agresti_coull
サンプルコードは以下のとおり。
Java 同様に注意すべきこととして、CTR や CVR の割合が 0% or 100% の場合に、Clopper-Pearson confidence interval による区間推定の結果のうち、一方の片側が NaN になってしまうことが挙げられます。この場合、下側のエンドポイントが NaN であれば 0% と、上側のエンドポイントが NaN であれば 100% と読み替えればよいかと思います。
R による区間推定
R では、binom パッケージ の binom.confintt(x, n, conf.level, methods, ...)
を使って二項比率の区間推定をします。
methods
に "all"
を指定すると、すべての区間推定方法の結果を一覧で出力してくれます。もしくは以下の文字列を指定することで、対応する区間推定方法での結果を出力してくれます。
- Wald confidence interval
prop.test
- Clopper-Pearson (or 'Exact') confidence interval
exact
- Wilson (or 'Score') confidence interval
wilson
- Adjusted Wald confidence interval / Agresti-Coull confidence interval
agresti-coull
まとめ
今回挙げた言語の各ライブラリでは、いずれもメソッド・関数を呼び出す程度の簡単なコードで二項比率の区間推定をすることができました。
ただ Java と Python については、CTR / CVR が 0% or 100% といったコーナーケースにおいてあまり好ましくない振る舞いをするため、多少の注意が必要となります。
また、各ライブラリで区間推定方法の呼称が異なることがあるため (Python / statsmodels の beta
(Clopper-Pearson) や、R / binom の prop.test
(Wald) など)、この点にも注意すべきかと思われます。
(次回こそはシミュレーション結果を…)
0 コメント:
コメントを投稿