2015-01-19

クリック率やコンバージョン率の信頼区間を求めたい! (2) 実装編

Posted on 2015-01-19, 1:03

前回 は CTR (クリック率)、CVR (コンバージョン率) に対するいくつかの区間推定方法を、それぞれの特徴とともに列挙してみました。今回はそれらの区間推定方法による実際の信頼区間を、Java や Python, R を用いて求める方法をまとめてみます。

Java による区間推定

Java で二項比率の区間推定をするには、commons-math3org.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) メソッドで信頼区間を求めようとすると、 MathIllegalArgumentExceptionNotStrictlyPositiveException などの例外が発生してしまいます。

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 コメント:

コメントを投稿