planoutを使用してABテストを管理する

2743 ワード

なぜABテストツールだけでは足りないのですか?
グロスの登場に伴い、これまで以上に多様なABテストが行われている.以前は主にFirebase,Optimizeを用いてABテストを管理していたが(Optimizeは不明であったが)、Firebaseには分配が不安定であるという問題があった.1人のユーザが互いに排他的な管理ではなく、AグループとBグループで経験したことがよくある.試験結果においてノイズが発生する問題や非UIポリシーに関連する試験においてもCX問題は常に存在しており,最終的にはより安定した試験運転とより正確な試験結果のために独自のAB試験環境を構築した.
小さく簡単に始まる
最低限の環境を構築するために考慮すべき特徴は大きく2つある.
  • の割り当て方法
  • の結果
  • を分析する方法
    実際、分析結果を作成する環境は難しくありません.アンペアの導入と積極的な使用が開始されているため、各テスト割当結果を記録し、アンペアに反映すれば十分である.
    悩んでいるのは残りの1つ、どのように分配します-.テストによってはAグループ、Bグループの配分割合を異なるように設定すべきであり、一部の通信量に対してのみ実験を行う可能性もあるため、単純な乱数生成には限界がある.
    いろいろなおすすめを探しているうちに、PlanOutというフレームワークを知りました.
    Planout
    PlanOut is a framework for online field experiments. It was created to make it easy to run and iterate on sophisticated experiments in a statistically sound manner while satisfying the constraints of deployed Internet services.
    PlanOutはFacebookが作成したABテスト用のフレームワークです.上で考慮した割当てと記録がサポートされており,割当て比率,流量なども設定でき,多様な形式の実験が可能である.
    基本的にはPlanOutに現れるnamespaceexperimentのクラスを継承し,自分が望むABテストの実験やネーミングスペースとサブ実験の仕方を定義する.
    簡単な例を使用して5:5 ABテストを行い、ボタンの色を変更する場合は、PlanOutを使用して次の操作を行います.
    from planout.experiment import SimpleExperiment
    from planout.ops.random import UniformChoice, WeightedChoice
    
    class ButtonExperiment(SimpleExperiment):
    	def assign(self, params, userid):
        	params.color = UniformChoice(choices=["green", "blue"], unit=userid)
  • PlanOutから単純Experimentクラスを継承するButtonExperimentを定義し、
  • を定義します.
  • 賦値方法では、「color」値が5:5の確率で「green」または「blue」を返すことが要求される.(5:5はUniformChoiceインスタンス、ズームが必要な場合はWeightedChoiceインスタンス)
  • experiment = ButtonExperiment(userid='apple1350')
    assigned_result = experiment.get('color')
    
  • の一意の区切り文字(一般ユーザーID)を使用して、上記のButtonExperimentインスタンスを作成し、
  • を作成します.
  • インスタンスのgetメソッドを使用して、割り当て結果の色値
  • を決定する.namespaceもあまり違いはありません.とても簡単です!
    テストの開始と終了、トラフィックなどのより詳細なオプションは、本書で確認できます.(🔗 PlanOut公式文書 )
    毎回ABテストを定義しますか?
    上記の例に示すように、ABテストを生成する際のトラブルが発生します.新しい実験を追加するたびに、新しいテストのコードをアプリケーションに追加し、配布する必要があります.
    私は毎回配置する必要はありません.また、開発者でなくても、テストを行う権利のある人が自分の意思で設定して起動できるようにしたいと思っています.(…開発者に頼らずに運営業務をしたい)
    このため,namespaceexperimentをクラスの管理点として利用し,実行時に各テストクラスを動的に生成する方法を選択した.(🔗 Pythonでクラスを動的に作成する )
    DBにテスト名、開始日、終了日、割当スケール、サブ実験、セグメントなどを入力し、アプリケーションはこれらの値を参照してテストクラスを動的に生成し、追加の作業を行わずに実験を追加または終了できます.