ゴール
このチュートリアルでは、kameleoon_to_airtable.py スクリプトの動作をステップごとに説明します。Kameleoon の実験 ID、Airtable のベース ID、Airtable のテーブル ID を指定すると、スクリプトは実験のメタデータと統計結果を取得し、最も成果の良いバリエーションを判断して、データを Airtable の Experiments スキーマにマッピングし、レコードを Airtable に書き戻します。同じ実験に対してスクリプトを再実行すると、重複を作成する代わりに既存の行を更新します。 本チュートリアルは、Automation API を使用して実験結果を取得する チュートリアルに続くものであり、同じリクエストとポーリングのフローを再利用します。要件
-
Kameleoon API の認証情報。 Automation API にはアクセストークンが必要です。スクリプトは
client_credentialsグラントを使用して、client_idとclient_secretからプログラムでアクセストークンを取得します。アクセストークンを取得する を参照してください。 -
対象のベースに対して
data.records:writeスコープを持つ Airtable の個人アクセストークン。 -
Airtable のベース ID とテーブル ID。 どちらもテーブルの URL、またはベースの API ドキュメントに表示されます。ベース ID は
appで始まり、テーブル ID はtblで始まります。 -
Experiments スキーマがすでに構築された Airtable テーブル。 スクリプトは次のフィールドに書き込みます:
Experiment Name、Status、Start date、End date、Notes、Actual、Probability、Result。また、手動入力用のフィールドAssignee、Category、Prediction、Mkt Est、Eng Est、Attachmentsが存在することを前提としていますが、スクリプトがこれらの値を設定することはありません。Airtable はテーブルにまだ存在しないフィールド名への書き込みを拒否し、typecastは既存のフィールドに対して値の型を変換するだけです(不足しているフィールドや選択肢を作成することはありません)。スクリプトを実行する前に、これらのフィールドと対応するStatusの選択肢を持つテーブルを作成してください。各フィールドに設定される値については、ステップ 6 を参照してください。 -
Python 3.9 以上、
requestsライブラリを含む(pip install requests)。
188308)を使用します。オリジナルバリエーションに加えて、Redesign 1(ID 828220)と Redesign 2(ID 828221)の 2 つのバリエーションがあります。
1. Automation API で認証する
エンドポイント: トークンエンドポイントに POST リクエストを送信して、アクセストークンを取得します。
例:
access_token を Bearer トークンとして送信してください。アクセストークンはデフォルトで 2 時間有効です。
2. 実験を取得する
エンドポイント: Get an experiment エンドポイントに GET リクエストを送信して、実験のメタデータを取得します。
例:
name、status、dateStarted、dateEnded、description を読み取り、次のステップで結果リクエストの範囲を絞り込むために mainGoalId を読み取ります。
API はデフォルトで
mainGoalId を返すため、これを読み取るために optionalFields パラメータは必要ありません。Automation API は status フィールドの固定された列挙値を公開していませんが、API 全体の他のステータス系フィールドは一貫して大文字のトークン(たとえば STOPPED、ACTIVE、DRAFT)を使用します。ステップ 6 では、この前提のもとで status フィールドをマッピングします。マッピングに依存する前に、実際のリクエストでアカウントが返す正確なトークンを確認してください。3. 実験の結果をリクエストする
エンドポイント: Request experiment’s results エンドポイントに POST リクエストを送信して、結果レポートの生成をトリガーします。
例:
dataCode を返し、ステップ 4 ではこれを使用して結果をポーリングします。
このスクリプトには
bayesian: true が必要です。ベイズ推定を有効にすると、レポートの reliability の値にベイズ成功確率(あるバリエーションが参照バリエーションに勝る確率)が反映され、スクリプトはこの値を Probability フィールドにマッピングします。アカウントが別のデフォルトの統計手法を使用している場合は、Kameleoon アプリ内の同じレポートと照らして値を確認してください。Automation API の仕様では dateIntervals は必須と記載されていますが、上記の例ではこれを省略しても有効なレポートが返されます。仕様には、dateIntervals を省略した場合のデフォルト動作は記載されていません。本チュートリアルでは、実験の全期間をカバーすると仮定しているため、この動作に依存する前に、自分のアカウントで確認してください。特定の期間にレポートを限定するには、代わりに dateIntervals 配列を渡します。4. 結果をポーリングする
エンドポイント: Poll results エンドポイントに GET リクエストを送信し、レポートが準備できるまで取得を繰り返します。
レスポンスの
status は、Kameleoon がレポートを計算している間は WAITING、データが利用可能になると READY、失敗時は ERROR または TIMEOUT になります。ステータスが ERROR または TIMEOUT の場合、レスポンスにはトップレベルの errorDescription が含まれます。スクリプトは、ステータスが READY になるまで一定の間隔でポーリングします。
例:
5. 最も成果の良いバリエーションを選択する
結果には、variationData の下にバリエーションごとに 1 つのエントリと、オリジナルページ用の _reference の行が含まれます。各バリエーションについて、リクエストしたゴールの指標は breakdownData._reference.generalData.goalsData[goalId] の下にあります。
スクリプトは _reference エントリをスキップし、各バリエーションの improvementRate と reliability(ベイズ成功確率)を読み取り、改善率が最も高いバリエーションを最も成果の良いものとして選択します。次のステップでマッピングされる Result フィールドには、そのバリエーションが実際に勝利したかどうか、つまり十分に高い成功確率と正の上昇率を達成したかどうかが記録されます。
例:
828220)は +211.48% の改善を示しているのに対し、Redesign 2 は -43.33% です。したがって、Redesign 1 が最も成果の良いバリエーションであり、95% を超える確率と正の上昇率を伴う正真正銘の勝者です。
6. データを Airtable フィールドにマッピングする
スクリプトは、実験のメタデータと最も成果の良いバリエーションの指標を、Airtable の Experiments スキーマに変換します。
スクリプトは、Kameleoon 側にソースがないフィールド(
Assignee、Category、Prediction、Mkt Est、Eng Est、Attachments)を設定しません。これらのフィールドは、Airtable 内で手動入力用として利用できる状態のままです。また、スクリプトは空の値を省略するため、既存のセルを空欄で上書きすることはありません。
例:
Automation API は実験の
status フィールドに固定された列挙値を公開しておらず、トークンは今後変わる可能性があります。map_status は大文字・小文字を区別せずにマッチングし、認識できないステータスに対しては None を返すため、誤った値を書き込む代わりに Status セルへの書き込みを省略します。1 回の GET /experiments/{experimentId} でアカウントが返すトークンを確認し、必要に応じて STATUS_MAP を拡張してください。7. レコードを Airtable にアップサートする
Airtable の Update table エンドポイント(
PATCH /v0/meta/bases/{baseId}/tables/{tableId})は、テーブルの名前と説明のみを変更するものであり、行にデータを書き込むことはできません。レコードにデータを入力するには、performUpsert オプションを指定して records エンドポイントを使用してください。
例:
createdRecords の下に ID が返される場合は Airtable が新しい行を作成したことを意味し、updatedRecords の下に ID がある場合は Airtable が既存の行を更新したことを意味します。
8. スクリプトを実行する
実験 ID と Airtable のベース ID、テーブル ID を引数として渡します:スクリプト全文
以下の完全なスクリプトは、kameleoon_to_airtable.py と関数単位で一致しています。そのままコピーするか、リンク先からファイルをダウンロードしてください。カスタマイズに関する注意事項
- ステータスマッピング は
STATUS_MAP定数にあり、API が返す大文字のステータストークンをキーとします。Status の選択肢がRunning/Implementing/Completed/Defunctと異なる場合はターゲットの値を調整し、マッピングに依存する前に実際のGET /experiments/{experimentId}リクエストでアカウントが返すトークンを確認してください。 - Probability は測定されたベイズ成功確率から取得され、結果リクエストで
bayesian: trueが必要です。Probability フィールドが実験前の見積もりを手動で入力するものである場合は、build_airtable_fieldsからProbabilityの行を削除してください。 - ゴールの選択 には実験の
mainGoalIdを使用します。別のゴールについてレポートするには、そのゴール ID をrequest_resultsとpick_best_variationに渡してください。 - アップサートキー。 Airtable はマージフィールドを厳密に一致させるため、
Experiment Nameの大文字・小文字や空白の違いは、既存の行を更新する代わりに新しい行を作成してしまいます。実験名を安定させるか、専用の安定した識別子フィールドでマージしてください。 - Actual フィールドの形式。 スクリプトは、生の
improvementRateの値(たとえば211.48)を Actual に書き込みます。Actual が Airtable の Percent フィールドである場合は、分数ではなく通常の数値を受け取るように設定するか、分数ベースの Percent フィールドに合わせてbuild_airtable_fields内でその値を 100 で割ってください。 - レート制限。 Automation API は 10 秒あたり最大 50 リクエスト、1 時間あたり最大 1,000 リクエストまで許可していますが、Kameleoon はアカウントごとに 1 分あたり 12 コール未満に抑えることを推奨しており、高頻度のトラッキングに Automation API を使用しないよう推奨しています。多数の実験をまとめて処理する場合は、トークンをキャッシュし、リクエストをスロットリングし、大量のデータが必要な場合は Data API の使用を検討してください。