Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AbemaTV 広告における全方向的なデータ分析の取り組み / abematv-analysi...

CyberAgent
February 22, 2019

AbemaTV 広告における全方向的なデータ分析の取り組み / abematv-analysis-all-around

CA BASE CAMP 2019
AbemaTV 広告における全方向的なデータ分析の取り組み

CyberAgent

February 22, 2019
Tweet

More Decks by CyberAgent

Other Decks in Technology

Transcript

  1. 阿部 昌利:アベマ of アベマ • 職歴:基本的にずっとデータサイエンティスト 2011年:㈱帝国データバンク → 2014年:㈱コロプラ →

    2017年:オリックス㈱ → 2018年: ㈱AbemaTV 【イマココ】 • 最近読み返した本 『人間の建設』小林 秀雄, 岡 潔 • データ分析時の心得 当っていると思うときほど間違っていると思え https://twitter.com/ABE_Masatoshi 7 / 58
  2. 分析の提供先 広告商品 企画部門 営業推進 部門 CM制作 部門 システム 開発部門 営業

    部門 • AbemaTV広告本部の組織概要 ※データ分析で関わった部門のみ。実際の組織図上の区分とは異なる。約80名 AbemaTV 広告本部 12 / 58
  3. 高優先度の課題への取り組み方 データサイエンスコンビ 広告商品 企画部門 システム 開発部門 営業 部門 依頼ルートは1本化。システムの開発ロードマップの一部として、 いつまでに何をするか議論・コミット。優先順はビジネスインパ

    クトを基準に決める。目標として進捗管理 • AAAの組織概要 ※データ分析で関わった部門のみ。実際の組織図上の区分とは異なる。約80名 営業推進 部門 CM制作 部門 集約 16 / 58
  4. 分析例 高優先度の分析例 • デモグラ推定モデルの構築 • imp数予測モデルの構築 • 配信優先順のスコアリングモデルの構築 • システム仕様決定向けのシミュレーション

    • 配信結果シミュレーションツールの作成 • SQL研修 など プロダクトに直結するモデル構築と、 重要な意思決定のための分析によって、実益に貢献 https://www.slideshare.net/MasatoshiAbe/abematv-88705806 https://developer.abema.io/2018/#session_11_a 詳細は別イベントで発表しているのでご参考ください 17 / 58
  5. やれるだけやる分析 データサイエンスコンビ 全部署と個別に向き合って、優先度を決めたタスクに 支障のない範囲で対象部署を問わず、自由に機動的に分析する 広告商品 企画部門 システム 開発部門 営業 部門

    営業推進 部門 CM制作 部門 • AbemaTV広告本部の組織概要 ※データ分析で関わった部門のみ。実際の組織図上の区分とは異なる。約80名 23 / 58
  6. 分析例 高優先度の分析例 • デモグラ推定モデルの構築 • imp数予測モデルの構築 • システム仕様決定向けのシミュレーション • 商品仕様決定のための在庫試算

    • 配信結果シミュレーションツールの作成 • SQL研修 など やれるだけやる分析例 • 月曜朝会でのトリビア発表 • 広告主さま向けのCMコメント分析 • 提案資料数値のエクセル試算ツール作成 など 当然ロードマップに沿う分析の方が多い。25 : 1 程度 25 / 58
  7. データへの親近感が高まった結果 データサイエンスコンビ データへの親近感が高まると、 良くも悪くも相談・依頼が増える 広告商品 企画部門 システム 開発部門 営業 部門

    営業推進 部門 CM制作 部門 • AbemaTV広告本部の組織概要 ※データ分析で関わった部門のみ。実際の組織図上の区分とは異なる。約80名 29 / 58
  8. そこでデータの民主化 データサイエンスコンビ データを操ることができる人材を育成 広告商品 企画部門 システム 開発部門 営業 部門 営業推進

    部門 CM制作 部門 SQL研修 • AbemaTV広告本部の組織概要 ※データ分析で関わった部門のみ。実際の組織図上の区分とは異なる。約80名 30 / 58
  9. SQL研修(Big Query)で遭遇した問題 • よく使うカラムをJOINしなければならない • たまに使うカラムを、複雑なCASE WHEN を駆使しなければつくれない • テーブルによって時刻の形式が異なる

    • パーティションタイムで指定する日時条件と実際の日時条件が異なる データ取り込み時刻の関係で、パーティションタイムの方を広くとる必要がある • テーブルやカラムの変更、追加をキャッチアップする必要がある 生ログを操るためには中級以上のクエリ技能が必要 31 / 58
  10. SQL浸透のための対策 • よく使うカラムをJOINしなければならない • たまに使うカラムを、複雑なCASE WHEN を駆使しなければつくれない • テーブルによって時刻の形式が異なる •

    パーティションタイムで指定する日時条件と実際の日時条件が異なる データ取り込み時刻の関係で、パーティションタイムの方を広くとる必要がある • テーブルやカラムの変更、追加をキャッチアップする必要がある 対策 JOIN不要で、ほしいデータの期間をWITH句で指定すれば、 シンプルなクエリを書くだけで集計できるクエリテンプレを用意。 10名にSQL研修を行い、普段使いメンバーが2名誕生 解決! 32 / 58
  11. クエリテンプレ ・データ期間は1箇所だけWITH句で指定 ------------------------------------------------------------------------------ -- 1. データ期間入力 ------------------------------------------------------------------------------ #standardSQL WITH startdt

    AS (SELECT DATE( ‘2018-12-01’ –データ期間の開始日 ) AS sdt), enddt AS (SELECT DATE( ‘2019-01-08’ –データ期間の終了日 ) AS edt), ------------------------------------------------------------------------------ -- 2. 【ここはいじらなくて大丈夫です】データ作成 ------------------------------------------------------------------------------ log AS (SELECT DATE(CAST(FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_SECONDS(time), 'Asia/Tokyo') AS TIMESTAMP)) AS dt, * FROM `project.adlog` WHERE DATE(_PARTITIONTIME) BETWEEN (SELECT DATE(TIMESTAMP_ADD(CAST(sdt AS TIMESTAMP), INTERVAL -1 DAY)) FROM startdt) AND (SELECT * FROM enddt) ), 33 / 58
  12. クエリテンプレ ・JOINの嵐で使いそうなカラムを網羅しておく ※名称はマスキングしていますがマスタとIDの数は実際と一緒です FROM log A LEFT JOIN setting ON

    A.id1 = dss.id1 AND A.id2 = dss.id2 AND A.id4 = dss.id4 AND A.id5 = dss.id5 LEFT JOIN `project.master1` B ON A.id6 = B.id6 LEFT JOIN `project.master2` C ON A.id7 = C. id7 LEFT JOIN `project.master3` D ON C.id8 = D.id8 LEFT JOIN `project.master4` cr ON A.id9 = cr.id9 LEFT JOIN `project.master5` cpm ON A.id10 = cpm.id10 LEFT JOIN `project.master6` ag ON A.id11 = ag.id11 LEFT JOIN `project.master7` adbra ON A.id12 = adbra.id12 LEFT JOIN `project.master8` ch ON A.id13 = ch.id13 LEFT JOIN `project.master9` v_ch ON D.video_id13 = v_ch.id13 LEFT JOIN `project.master10` cp ON A.id1 = cp.id1 LEFT JOIN `project.master11` cluster ON A.id14 = cluster.id14 LEFT JOIN `project.master12` conp ON A.id15 = conp.id15 LEFT JOIN `project.master13` sl ON A.id16 = sl.id16 LEFT JOIN `project.master14` sli ON A.id16 = sli.id17 LEFT JOIN `project.master15` ps ON ps.id7 = A.id7 AND ps.id16 = A.id16 34 / 58
  13. ▪ツールとしての展開例 (※Big Query) 以下のように、WITH句で条件部分だけ書き換えてRUNすれば、直近の データでのシミュレーション結果(100回の中央値)を得られるクエリを作成 ------------------------------------------------------------------------------ --1. 条件入力 ------------------------------------------------------------------------------ ----A.

    配信期間---- WITH term AS(SELECT -- 配信期間を一つ指定してください。 28 AS term ), ----B. CM尺---- duration AS(SELECT -- CM尺を一つ指定してください。 60 AS duration ), ----C. デモグラ---- demogra AS(SELECT * FROM UNNEST([ 'dummy' -- 配信しないデモグラについては、[Ctrl] + [/]で除外してください ,'Teen' ,'F1' ,'F2以上' ,'M1' ,'M2以上' ]) AS demogra ), 42 / 58
  14. #standardSQL WITH dice_twice AS( SELECT ROW_NUMBER()OVER() AS row_id ,side1 ,side2

    ,side1 + side2 AS side_sum ,COUNT(1)OVER() AS nrow FROM UNNEST(GENERATE_ARRAY(1, 6)) AS side1, UNNEST(GENERATE_ARRAY(1, 6)) AS side2 ), randTable AS( SELECT simulation_id ,RAND() AS randNum FROM UNNEST(GENERATE_ARRAY(1, 10000)) AS simulation_id ) SELECT side_sum ,COUNT(1) AS cnt FROM dice_twice CROSS JOIN randTable WHERE FLOOR(randNum / (1/nrow)) + 1 = row_id GROUP BY 1 ORDER BY 1 行番号 サイコロA の出目 サイコロB の出目 2つの サイコロの合計 全行数 row_id side1 side2 side_sum nrow 1 1 1 2 36 2 1 2 3 36 3 1 3 4 36 … 34 6 4 10 36 35 6 5 11 36 36 6 6 12 36 2つのサイコロの出目テーブル:dice_twice ▪サイコロ2個の出目の合計のシミュレーション例 ※以下クエリはそのまま実行できます 以下のように、シミュレーション回数分の乱数を発生させたテーブルを CROSS JOINして、乱数を適当な条件として用いればよい 1万回、乱数を 発生させた テーブル シミュレ ーション 実行 43 / 58
  15. データコンペの工夫点とメリット1 • 競技後の解説 はまったポイントと対策を説明。 運用モデルの中身とスコアも提示 する • 実務的な評価スコアの設定 一般的な精度指標のみではなく、 実際に用いているビジネスイン

    パクトをイメージしやすい評価 指標を用いる 工夫点 メリット • ノウハウの整理&集積 はまりポイントは参加者も同様に遭遇 するので、解法の伝達は満足度向上に 寄与しやすい。平均満足度 4.9/5.0 点 • 実務場面の再現 より実務に近い形で、参加者に課題 に取り組んでもらうことで、仕事へ のイメージを醸成できる。また採用 側も一緒に働いた場合のイメージし やすく、マッチング精度が高まる 48 / 58
  16. • スコアダッシュボード作成 エンジニアの方々が作成。csvを アップロードすれば採点&ランキ ング • Auto MLの実施 DataRobotを導入テストも兼ねて 課題データに対して利用。運用モ

    デルがベストモデルと遜色ないこ とを確認 データコンペの工夫点とメリット2 • 別テーマのコンペも開催容易 正解データとスコア計算式さえ更新 すれば、別課題でコンペ開催可能 • 運用モデルの説得力維持 試していないモデル手法を参加者が 用いて、運用モデルが敗れる心配を ほぼなくせる 49 / 58
  17. 6つのTips 1. まず分析官の地位を確立する 2. 周囲のデータへの親近感を高める 3. SQL研修は、研修後の運用方法に配慮する 4. SQLをシミュレーションに活用する 5.

    分析結果を採用イベントに転用する 6. 研究機関に気軽に声をかけてみる 上記Tipsを駆使して、幅広い提供先と多様な課題を対象に、 データ分析に取り組んできた1年間でした (その結果として組織貢献できたかなと思います) 55 / 58
  18. 1年間で形成された分析エコシステム ビジネス課題 高優先度の分析 サービスの システムに組込 データ × インプット アウトプット •

    統計モデル • 知見 • 計算ロジック • 分析系研修 意思決定の支援 アウトカム • 収益向上 • サービス改善 • 業務効率化 • 広報 シミュレーション ツール展開 共同研究 やれるだけ やる分析 採用イベントに 転用 分析 リソース増 アウトプット • ラフな場での発表 • 個別相談への対応 施策提案の材料