SlideShare a Scribd company logo
30分でわかる広告配信
     エンジンの作り方
(BTからコンテキスト広告まで)



         株式会社
           スケールアウト
              山崎大輔

                     1
はじめに
1. 「広告エンジンって実際なにやってるの?」
というのを理解してもらうための内容になってます。

2. 今回説明する実装はコンセプト実装なので、
   実際の実装とはかなり違います。

3. するどい突っ込みは大歓迎です。




                           2
アジェンダ

   自己紹介
   オンライン広告システムとは
       基礎編
           広告エンジンの役割
           Railsによる実装例
       応用編
           BT(行動ターゲティング)の実装
           コンテキストマッチの実装
   まとめ
                               3
自己紹介
山崎大輔
Twitter: @yamaz
Blog : 最速配信研究会 http://d.hatena.ne.jp/yamaz/

現在:株式会社スケールアウト 代表
1日数億~を超えるような配信をカジュアルに行うための
広告配信システム「ScaleAds」の開発と販売およびコンサル

かれこれオンライン広告業界で14年やってます




                                              4
広告ってなんだ?




           これ
           (バナー広告)




                 5
広告ってなんだ?




               これ(テキストバナー)




リロードすると広告が変わったりします
                         6
広告システムの悩み
 いろいろあります(その1)

いろんなクリエイティブのパターンどうする?
   通常バナー
   RSS広告
   動画広告
   各種モバイル対応
   その他新規デバイス対応
    (wiiチャネル, オンラインゲーム…)
今回説明しません

                           7
広告システム実装の悩み
  いろいろあります(その2)

いろいろな配信パターンどうする?
   コンテンツマッチ(AdSenseみたいなの)
   ビヘイビアターゲティング(行動ターゲティング)
   地域ターゲティング
   PV売り
   枠売り
   上記の組み合わせ
   その他..
今回これらを説明します
                              8
広告エンジンがやってること
           問い合わせ


    ブラウザ
                   配信エンジン


           最適な広告

 営業さんは言います
 「広告エンジンはユーザに対して
         最適な広告を配信してます!」


 それではわかりません><

                            9
最適な広告とは?

1. スケジュールされている広告の中で、

2. その瞬間に配信してもOKなもののうち、

3. その瞬間において一番優先度が高いもの




                         10
広告エンジンの動き
ID   期間      配信条件              達成状況     優先度
1    08/01   100万PV, 女性        11万PV
     08/31
2    …..     枠売り, 20~30歳代      10万PV
3    …..     100万PV, 東京在住      11万PV

4    …..     1000万PV           438万PV

~    …..     …..               …..
80   …..     Context(不動産,賃貸)   56000円
             CPC@30円 予算10万
81   …..     BT(保険) 100万PV     48万PV
82   …..     BT(家電) 200万PV     190万PV


      スケジュールされている広告の中で

                                              11
広告エンジンの動き
ID   期間      配信条件              達成状況     優先度
1    08/01   100万PV, 女性        11万PV
     08/31
2    …..     枠売り, 20~30歳代      10万PV
3    …..     100万PV, 東京在住      11万PV

4    …..     1000万PV           438万PV

~    …..     …..               …..
80   …..     Context(不動産,賃貸)   56000円
             CPC@30円 予算10万
81   …..     BT(保険) 100万PV     48万PV
82   …..     BT(家電) 200万PV     190万PV


      配信してもOKなもののうち

                                              12
広告エンジンの動き
ID   期間      配信条件              達成状況     優先度
1    08/01   100万PV, 女性        11万PV    30
     08/31
2    …..     枠売り, 20~30歳代      10万PV
3    …..     100万PV, 東京在住      11万PV     12
                                              今回選ばれた広告
4    …..     1000万PV           438万PV   100

~    …..     …..               …..
80   …..     Context(不動産,賃貸)   56000円
             CPC@30円 予算10万
81   …..     BT(保険) 100万PV     48万PV     35
82   …..     BT(家電) 200万PV     190万PV    14


      その瞬間において一番優先度が高
      いものを配信する
                                                 13
Railsによる実装例

class AdsvrController < ApplicationController
  render :text Schedules.find(:all)
      .grep{|sched| sched.can_delivered?}
      .max{|sched1, sched2| sched1.priority<=>sched2.priority}
      .to_html
end




                                                                 14
Railsによる実装例(解説)

class AdsvrController < ApplicationController
  render :text
    # 全スケジュールの中から
    Schedules.find(:all)
    # 配信してよい案件を抽出して
    .grep{|sched| sched.can_delivered?}
     # 一番優先度が高いものを選択して
    .max{|sched1, sched2| sched1.priority<=>sched2.priority}
    # 最適なクリエイティブを作成
    .to_html
end
# これを超高速に処理するのが広告エンジンです

                                                               15
条件評価部
# 配信をしていい広告案件を抽出
grep{|sched| sched.can_delivered?}
def can_delivered?
   return false if @now > end_at || @now < start_at
    # 広告案件に付与された複数の条件を評価
   constrains.each do |cons|
      value ||= cons.call(@request)
      return true if value
   end
    return false
end



                                                      16
BT(行動ターゲティング)の場合


 BT_schedule =
   Schedule.new(start_at, end_at, :type => :cpm, :goal_pv =>
  1000000)
 BT_schedule.add_constraint(
   Proc.new do
     user_behaviers.include?(‘shopping’)
   end
)
 all_schedules << BT_schedule



                                                               17
エンジンが取得可能な情報


                        ページ
       問い合わせ
                        MetaDB
ブラウザ
               配信エンジン

       •IP              ユーザDB
       •Cookie
       •URL
       •browser
       •その他ヘッダ情報         IPDB

                                 18
CM(コンテンツマッチ)の場合



 CM_schedule =
   Schedule.new(start_at, :type => :cpc,
                         :goal_budget => 1000000)
 CM_schedule.add_constraint(
   Proc.new do
    @webpage.content_keywords.include?(‘car’)
   end
)
 all_schedules << CM_schedule

                                                    19
優先度評価部

# 一番優先度が高いものを選択
 .max{|sched1, sched2| sched1.priority<=>sched2.priority}

優先度を決定する要素
 案件につけられた優先度
 クリック単価が高い(優先度高)
 PV達成がやばい(優先度高)
 特別なユーザがアクセスした時(優先度高)
 自社稿(優先度低)
など



                                                            20
クリエイティブ最適化

# 最適なクリエイティブを作成
.to_html

   デバイス・表示ページにあわせた出力
   ユーザに応じた最適化


これだけでまたえらく長い話になるので、
今回は割愛します



                        21
まとめ

   広告配信エンジンのやっていることを
    簡単に説明しました。

   やってることの大半は条件評価と
    案件優先度の比較です




                        22
まとめ
オンラインメディアはマーケターさんがずっと追い求めてきた
「1to1ターゲティング」を「リアルタイムレスポンス」で
可能とする唯一のメディアです。

その中でオンライン広告システムはその一端を担うシステムで、
ビジネスとアカデミックが共存している領域なので、楽しいです。

今回なにかしら興味を持ってもらえたのなら幸いです


メンバー募集中です!大量配信・大規模集計やりたい人はぜひ。
バイト・インターンも可です(yama@scaleout.jpまで)

                                    23

More Related Content

30分でわかる広告エンジンの作り方