ABテストを行う理由 売り上げを最適化する方法に関する仮説をテストします。 最も売れているバナーは、猫と犬のどちらですか? 観客を2つの等しい部分に分けます。1つは猫、もう1つは犬です。 売上を比較し、結論を導き、更新せずにアプリケーションの動作を変更します。
市場では、有声の課題を解決する既製のシステムがあります。 例:
- swrve.com- 「 Swrveの価格は、年間サブスクリプションで月額2000ドルから9000ドルです。 コストは、カスタムセグメントの数と、実行したい同時実行a / bテストに基づいています。
- www.localytics.com- 「エンタープライズはすべてのアプリで月額1,790ドルから開始(ボリュームベースの価格設定)。」
ここでは価値に焦点を当てます。 それがもっと安ければ私は喜んでそれらの1つを使用するでしょう。 同様の安価なシステムや無料のシステムを知っている場合は教えてください。
さらに、独自のソリューションを迅速かつ安価に構築する方法を説明します。 彼にとって、データベースを備えたサーバーを作成する必要はありません。これにより、タスクが大幅に簡素化されます。
構成
アプリケーションの「構成」(「config」)の概念を紹介します。 ここに、すべてのアプリケーション設定を保存します-何を誰に表示するか。 構成は、すべてのユーザーに同じ静的JSONファイルです。 構成は、何らかのホスティングに配置する必要があります(どのサイトでも可能です)。 アプリケーションは、起動するたびに(たとえばNSURLConnectionを介して)ダウンロードします。
さらに、例としてバナーについて説明しますが、ボタンの色まで、あらゆる面で使用できます。 構成は次のようになります。
{ "banners": [ { "if": "$user_type == 'geek'", "link": "http://habrahabr.ru", "image": "habrahabr.jpg" }, { "if": "$user_type == 'has_money'", "link": "http://buyall.com", "image": "buyall.jpg" } ]}
ここでは、明らかな「画像」と「リンク」に加えて、バナーにも「if」フィールドがあります。 これは、ユーザーセグメンテーションのキーです。 そこで、誰にどのバナーを表示するかを尋ねます。
常に最新バージョンのファイルが存在するように、構成をダウンロードするときにキャッシュを無効にすることをお勧めします。 また、設定を暗号化して、一部の巧妙なユーザーがニーズに合わせてアプリケーションをカスタマイズしないようにすることも理にかなっています。
ユーザー変数
アプリケーションでユーザー変数を設定します。これは、バナーの「if」式で使用できます。 これは、次のように単純に行われます。
- (void)onProductBought:(NSString*)productId { // , NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setBool:YES forKey:productId]; [defaults synchronize]; } - (NSDictionary*)userVars { // NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary* vars = [NSMutableDictionary new]; for (NSString* productId in PRODUCT_IDS) { vars[productId] = [NSNumber numberWithBool:[defaults boolForKey:productId]]; } return vars; }
変数はキーと値の辞書です。 そこに正確に含めるものは、誰もが自分のニーズに基づいて自分で選択します。 変数には、購入のステータス、ユーザータイプ(さまざまなデータに基づいて決定)、ソーシャルネットワークでのアクティビティ、デバイスタイプ(ipad、iphone)、アプリケーションバージョンなどを保存できます。
アプリケーションの最初の起動時に、ABテスト用のブール変数も作成します。
- (void)onAppStarted { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; if (![defaults objectForKey:@"install_date"]) { [defaults setObject:[NSDate date] forKey:@"install_date"]; [defaults setBool:(arc4random() % 2) == 0 forKey:@"test_a"]; [defaults setBool:(arc4random() % 2) == 0 forKey:@"test_b"]; [defaults setBool:(arc4random() % 2) == 0 forKey:@"test_c"]; [defaults synchronize]; } }
3つの独立したテストを同時に実行するには、3つの変数で十分です。 たとえば、1つの変数がバナーの背景色(青または赤)を担当し、2番目がバナーテキストの色(白または黒)を担当し、3番目がバナーテキスト自体(ニュートラルまたはショッキング)を担当しています。
変数の発現
ユーザー変数に基づいて、式を作成できます。 これは、標準のiOSツール-述語を使用して行うのに便利です。 この詳細については、書かれているここ 。
その結果、柔軟な条件を作成できます。 例:
- $ user_type == 'geek' && $ test_a == 1-テストグループN2からのギークのバナー
- $ purchases_count> 2 && $ test_a == 0-テストグループN1から2回以上購入した人のバナー
評価されるような表現は非常に簡単です:
- (BOOL)evaluatePredicate:(NSString*)predicateStr { NSDictionary* userVars = [self userVars]; @try { NSPredicate* predicate = [NSPredicate predicateWithFormat:predicateStr]; return [predicate evaluateWithObject:nil substitutionVariables:userVars]; } @catch (NSException *exception) { NSLog(@"Exception! %@", exception); return NO; } }
バナーの場合、「if」という表現を検討し、条件が満たされた場合、バナーをダウンロードして表示します。
分析システム
ABテストには、分析システムが必要です。 このために、無料のFlurryを使用できます。 その後、通常の代わりに:
[Flurry logEvent:@”PRODUCT_BOUGHT” withParameters:@{ @”product_id”: productId } ];
使用します:
[Flurry logEvent:@”PRODUCT_BOUGHT” withParameters:[self paramsWithUserVars:@{ @”product_id”: productId }] ]; - (void)paramsWithUserVars:(NSDictionary*)params { NSMutableDictionary* newParams = [[NSMutableDictionary alloc] initWithDictionary:params]; NSDictionary* userVars = [self userVars]; for (NSString* var in userVars) { newParams[var] = userVars[var]; } return newParams; }
分析を使用する場合、いくつかの制限を考慮する必要があります。 Flurryイベントの場合、パラメーターの数は10を超えることはできません。したがって、パラメーターの余分な変数はカットオフする必要があります。 Flurryはセッション情報も収集します。 したがって、ユーザー数をカウントするために、一部のイベントを2回送信しないでください。
プッシュ通知
重要なマーケティングツールはプッシュ通知です。 また、それらにセグメンテーションを適用します。 プッシュをいらいらさせないために、すでに買った人を「買う」。
都市分布のための無料の推進ソリューションは、 Urban Airship (UA)です。 1か月あたり最大100万のプッシュアップが無料で、これは小規模なプロジェクトには十分です。 UAにはタグとセグメントのメカニズムがあります。 タグを使用すると、ユーザーにラベル(行)を付けることができます。 セグメントを使用すると、タグから式を作成し、特定のセグメントにのみプッシュを送信できます。 便宜上、タグと同じユーザー変数を異なる形式でのみ使用します。 {@“ product_id”:1}の代わりに@” product_id_1”があります。
NSMutableArray* pushTags = [NSMutableArray new]; NSDictionary* userVars = [self userVars]; for (NSString* var in userVars) { NSString* tag = [NSString stringWithFormat:@"%@_%@", var, userVars[var]]; [pushTags addObject:tag]; } [UAPush shared].tags = pushTags; [[UAPush shared] updateRegistration];
変数の各変更は、UAライブラリで監視および更新する必要があります。
さらにUA Webサイトの[オーディエンス]> [セグメント]セクションで、必要なセグメントを作成できます。 このために、Webコンストラクターがあります。 追加のボーナスとして、UAは各セグメントのおおよその視聴者を計算します。
UA Webサイトですべてのデバイスに直接プッシュを送信できます。 セグメントはAPIを介してのみ送信できます 。 どうやらこれは有料サービスに切り替えるための追加のインセンティブとして行われたようです。 ただし、curlユーティリティを使用して小さなスクリプトを作成します。
# APP_AUTH=<App Key>:<App Master Secret> # PUSH_MESSAGE='"aps":{"alert":" !","sound":"default"},"banner":"welcome.jpg"' # ( id ) curl -X GET -u "$APP_AUTH" -H 'Content-Type: application/json' https://go.urbanairship.com/api/segments/ # curl -X POST -u "$APP_AUTH" -H 'Content-Type: application/json' -d '{"segments":["$SEGMENT_ID"],"ios":{$PUSH_MESSAGE}}' https://go.urbanairship.com/api/push/segments
セグメントにプッシュを送信する前に、まず1つのデバイスでチェックすることをお勧めします。
curl -X POST -u "$APP_AUTH" -H 'Content-Type: application/json' -d '{"device_tokens":["$TEST_DEVICE_TOKEN"],$PUSH_MESSAGE}' https://go.urbanairship.com/api/push/
おわりに
説明したシステムは完全ではなく、使用するには不便な場合がありますが、それでも小規模なプロジェクト(300,000ユーザー-OK)の問題を解決します。 1日で実装でき、適切に使用すれば、この投資はすぐに回収できます。 システムのコンテンツはお金を必要としません(ホスティングは設定を除きます)。 プロジェクトが成功して勢いがついたら、ソリューションを商用のものに切り替えるのが理にかなっています。 幸運を祈ります!