$30 off During Our Annual Pro Sale. View Details »

メディアアプリの計測Tips

mahiguch
June 28, 2019
150

 メディアアプリの計測Tips

Shibuya.apk #35でのLT資料です。

mahiguch

June 28, 2019
Tweet

Transcript

  1. メディアアプリの計測Tips

    View Slide

  2. Masahiro Higuchi / 樋口雅拓
    ● グリーグループのリミア株式会社で、LIMIA という住まい領域のメディアを
    作っています。ゲーム会社ですが、最近はメディアに力を入れています。
    ● 機械学習のエンジニアですが、iOS, Android,JSなどもやっている何でも屋
    です。4歳の娘のパパ。twitter: @mahiguch1
    ● https://limia.jp/
    ● https://arine.jp/
    ● https://aumo.jp/
    ● https://www.mine-3m.com/mine/

    View Slide

  3. LIMIAとは?
    ● メディアサービス
    ● 記事一覧を表示し、タップすると記事
    詳細を閲覧できる。
    ● Android(Kotlin), iOS(Swift),
    Web(TypeScript)
    ● AWS:90%、GCP:10%。
    ● PHP/EC2 → Go/ECS移行中

    View Slide

  4. 背景と目的
    ● 計測は超重要。
    ● レポートを作成することで、運営による改善が可能。
    ● 計測した指標で運営できるようになったら、機械に置き換えて効率化。
    —> ハマりやすい「CTR」、「読了率」、「WebView」、「A/Bテスト」の計測
    Tipsを共有します。

    View Slide

  5. 良い記事とは何か? (1) CTR
    良い記事をユーザに提供することで、良い体験を届けた
    い。でも、良い記事って何だろう?
    起動すると記事一覧画面が表示される。そこから選ば
    れないと読んでもらえない。
    そこで、「一覧からタップされやすいもの」をユーザが一
    覧表示することを望んでいるものと仮説を立て、それを
    検証した。
    「一覧からタップされやすいもの」 = CTR と定義した。

    View Slide

  6. CTRとは?
    CTR(Click Through Rate) = タップ数 / 表示回数
    【表示回数の定義】
    ・広告が視聴可能なスクリーンに表示されていること
    ・広告の一定面積以上が見える状態にあること
    ・広告が一定の時間以上見える状態であること
    ・広告が人間によって視聴されていること
    つまり、一覧表示のChild/Cellが画面上に表示したうち、タップされた割合。
    タップ数は簡単に取れるが、スクリーンに表示された回数はどう取れば良いのか?

    View Slide

  7. スクリーンに表示されたログ送信
    AndroidではRecyclerView.layoutManagerのpositionを取得する
    ことで実現した。
    (obtainRecyclerView()?.layoutManager as? LinearLayoutManager)?.let {
    val first = it.findFirstVisibleItemPosition()
    val last = it.findLastVisibleItemPosition()
    if (first >= 0 && last >= 0) {
    for (position in first..last) {
    ログ送信
    https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#findFirstVisibleItemPositio
    n()

    View Slide

  8. スクリーンに表示されたログ送信(ファーストビュー)
    いきなり走らせると更新される度にログが再送されてしまうので、 viewTreeObserver の
    Listnerに仕込むことで描画してからログ送信されるようにした。
    obtainRecyclerView()?.viewTreeObserver?.addOnGlobalLayoutListener(object :
    ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
    logImpressionForCurrentVisibleItems {
    obtainRecyclerView()?.viewTreeObserver?.removeOnGlobalLayoutListener(this)
    https://developer.android.com/reference/android/view/ViewTreeObserver

    View Slide

  9. 良い記事とは何か? (2) 読了率
    リストをタップして表示した記事が期待
    通りだった場合、記事を最後まで閲覧
    する可能性が高い。そこで、記事を最
    後まで読み切った比率(読了率)が高い
    ものを記事を表示するユーザが望ん
    でいると仮説を立て、それを検証した。

    View Slide

  10. 読了率: 読了イベントを発火
    読了したらイベントを発火し、「読了率 = 読了イベント数 / 記事閲覧数」とした。
    記事直下に執筆者名などが表示されるitemがあり、それが表示されたら、読了
    イベントを飛ばした。
    その後、半分まで読んだら「0.5」のような読了割合を取得し、「読了率 =
    SUM(読了割合) / 記事閲覧数」とした。

    View Slide

  11. その他のTips: WebViewのイベント計測
    ネイティブ Android コードを JavaScript から呼び出せるようにするには、@JavaScriptInterface を付けたメソッドを
    定義してクラスを実装します。作成したネイティブ インターフェースを WebView に登録すると、WebView で実行される
    JavaScript コードからアクセスできるようになります。
    https://firebase.google.com/docs/analyt
    ics/android/webview?hl=ja

    View Slide

  12. WebViewイベント計測(Javascript側実装)
    JavascriptからWebViewの中に用意したメソッドを叩くことができるようになります。

    View Slide

  13. その他のTips2: A/Bテストのどちらに振り分けられたか
    Firebase A/B Testingを使うと楽。
    実装しなくてもA/Bテストでどちらのセ
    グメントに振り分けられたか、
    UserPropertyに自動設定される。key
    は次のようになる。
    firebase_exp_

    View Slide

  14. まとめ
    ● 計測は機能開発が終わった後に実装する事が多いので、面倒に感じる。
    ● Tipsをみんなで共有して、機能開発に集中したい!
    ● 計測結果を使って機械学習での最適化を行なっているので、どこかで話し
    たい。
    ご静聴、ありがとうございました!

    View Slide