リスティング広告のキーワード戦略:効果的な選定と除外設定のコツ

**Googleは毎日行われる検索の約15%が“これまで見たことがない新しいクエリ”だと公表しています。**¹ またAlphabetの決算ではSearch & Otherが全社売上の中核を占め、競争は年々激化しています。² 公開ベンチマークを見ると、同一業種でも上位四分位と下位四分位で獲得単価が大きく開く(倍程度まで拡大するケースがある)ことも示唆されています。差が生まれる主因はクリエイティブだけではありません。編集画面からは見えにくい、クエリ(実際に入力された検索語句)レベルでの“意図の整流”と“除外設計”の精度が、アカウントの健全性とスケールの上限を決めます。私はエンジニアリング組織のリーダーがこの領域を“オペ作業”ではなく“制御問題”として扱うべきだと考えています。すなわち、データで意図をモデル化し、ルーティング(どのキャンペーンに流すか)と除外をコードで担保するという発想です。
データから始めるキーワード戦略の設計図
成果を出すアカウントは例外なく、ビジネス目標(KPI)と検索意図を一枚絵で結びます。まずは北極星となるKPIを明確にし、ブランド・汎用・競合の三層、そして情報収集・比較検討・意思決定という意図の深さの軸でマップを作ります。このマップに対して、完全一致は意図が深いところの刈り取り、フレーズ一致はセマンティック(意味的)に近い周辺を拡張、広く一致(一般的には“部分一致”)はリーチを広げる用途に限定しつつ、検索語句の観測と除外でリークを抑えるという役割分担を置きます。ここで重要なのは、広告グループの粒度を“単語”ではなく“意図”で決めることです。単語主導のSKAG(Single Keyword Ad Group)は、類似パターンの拡張(Close Variant)の進展により現状ではメンテナンス負荷が高く、信号も分散します。意図主導でのSTAG(Single Theme Ad Group)やテーマ集約のほうが、RSAs(レスポンシブ検索広告)の学習にも整合します。⁴
設計の起点は観測可能性(データが見える状態)です。Google Adsの検索語句レポート(SQR)はプライバシー保護の観点で全件を返しませんが、実効支出の大半は可視化されます。³ GAQL(Google Ads Query Language)で検索語句、マッチタイプ、コンバージョン、入札戦略などを日次で取得し、BigQuery(GoogleのDWH)に蓄積してn-gram(語句をn語の塊に分解する手法)やクラスタ分析を走らせます。ここでのポイントは、キーワードではなくクエリを一次データとみなし、キーワードはルーティングのための“制御点”だと捉えることです。下のクエリは最小限ですが、クエリ面の把握に役立ちます。
-- GAQL (Google Ads API / Ads Scripts) の例: 検索語句の主要メトリクス
SELECT segments.date,
campaign.id,
ad_group.id,
segments.search_term AS query,
segments.keyword.info.match_type AS match_type,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM search_term_view
WHERE segments.date BETWEEN '2025-07-01' AND '2025-07-31'
AND segments.search_term_match_type != 'EXACTLY_MATCHED_NEGATIVE'
このデータを意図マップに重ねて、どの意図バケットがどのキャンペーン・広告グループに流れているかを可視化します。ブランド語句が汎用側に落ちていないか、競合指名が意図せぬRSAsに吸われていないか、フレーズ一致が広すぎて情報収集クエリに偏っていないかなど、漏れとダブりを計測します。クエリの偏りが見えたら、入札上限のガードレール(上限や制約)、広告グループの再編、そして除外キーワードによるルーティングの補強を施します。
マッチタイプの再定義とクエリスカルプティング
完全一致は“刈り取り”の主力とし、入札やクリエイティブも強気に最適化します。フレーズ一致はセマンティックに近い周辺意図を探索する装置と考え、SQR(検索語句レポート)の学習サイクルを短く回します。広く一致(部分一致)はデータシグナルが強い場合に限定し、アカウントまたはキャンペーンレベルの除外でリークを制御します。ここで機能するのがクエリスカルプティング(意図に応じた流し分け)です。意図の深い語句は完全一致の広告グループに優先ルーティングし、同一語幹がフレーズ一致や広く一致側に落ちないよう、キーワード間の“否定関係”を明示します。共有除外リスト(共通の除外語句リスト)を活用し、ブランド語句を汎用キャンペーンから一括遮断、競合指名は専用キャンペーン以外を遮断、といった交通整理を恒久化します。実装はAPIで行うと再現性が上がります。
# Google Ads API (python-google-ads) で共有除外リストを作成して適用
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.v15.enums.types import KeywordMatchType
client = GoogleAdsClient.load_from_storage()
customer_id = "1234567890"
# 共有除外リストの作成
neg_list_service = client.get_service("SharedSetService")
shared_set_operation = client.get_type("SharedSetOperation")
shared_set = shared_set_operation.create
shared_set.name = "Brand_Negatives"
shared_set.type_ = client.enums.SharedSetType.NEGATIVE_KEYWORDS
neg_list_response = neg_list_service.mutate_shared_sets(
customer_id=customer_id, operations=[shared_set_operation]
)
shared_set_resource = neg_list_response.results[0].resource_name
# 除外語句の登録
shared_criterion_service = client.get_service("SharedCriterionService")
ops = []
for term in ["求人", "価格表", "無料", "意味", "とは", "wiki"]:
op = client.get_type("SharedCriterionOperation")
crit = op.create
crit.shared_set = shared_set_resource
crit.keyword.text = term
crit.keyword.match_type = KeywordMatchType.PHRASE
ops.append(op)
shared_criterion_service.mutate_shared_criteria(
customer_id=customer_id, operations=ops
)
# キャンペーンへ共有除外リストを紐づけ
campaign_shared_set_service = client.get_service("CampaignSharedSetService")
link_op = client.get_type("CampaignSharedSetOperation")
link = link_op.create
link.campaign = client.get_service("GoogleAdsService").campaign_path(
customer_id, "1111111111"
)
link.shared_set = shared_set_resource
campaign_shared_set_service.mutate_campaign_shared_sets(
customer_id=customer_id, operations=[link_op]
)
このように否定関係をコードで宣言すると、運用者の属人的な判断を減らし、意図ルーティングの一貫性を担保できます。
ブランド・汎用・競合の三層分割と入札ガードレール
三層分割は単純にキャンペーンを分ける話ではなく、予算配分と入札強度のルールセットを指します。ブランドは指名需要の刈り取りであるため、CPAやROASの目標を厳密に合わせつつ、インプレッションシェアの欠損を監視します。汎用は最もボラティリティが高いので、キーワードを意図で束ね、学習に必要なシグナル密度を確保しながら、除外で下流の刈り取り面にリークしないようにします。競合はクリック単価が跳ね上がりがちなので、上限CPCやTarget CPA/ROASのガードレールを設計し、過剰学習を防ぎます。これらを統括するのがアカウントレベル除外と共有リストで、外部意図(採用、株価、意味調べ、学生レポートなど)を層全体から排除します。
除外キーワードの設計とガバナンス
除外の設計は“ブラックリストを増やす作業”ではありません。意図の境界をマシンに理解させる作業です。まずはタクソノミ(分類体系)になぞらえた階層を持たせます。アカウント横断の恒久除外、キャンペーン共通のテーマ除外、広告グループ特有の微調整という三層です。次に、検索語句からの発見と登録のループを自動化します。除外候補を生成するロジックはルールと統計のハイブリッドが現実的です。例えばクリックが一定以上、コンバージョンがゼロ、類似語も含めてCPAが許容幅を外れる、といった条件を組み合わせます。さらにn-gram分析で個別語句に執着せず、意味のノイズを束で捉えると発見効率が上がります。
n-gram分析で無駄クリックを特定する
検索語句を単語に分割し、単語や二語句の出現と損益を集計すると、表記ゆれをまたいでノイズを浮かび上がらせられます。BigQueryでエクスポートしたレポートに対して、以下のようなクエリを走らせます。テーブル名や列名は環境に合わせてください。
-- BQ: 検索語句をn-gram化し、コストとCVを集計
WITH base AS (
SELECT date, campaign_id, ad_group_id, query,
clicks, cost_micros/1e6 AS cost, conversions
FROM `project.dataset.search_terms`
WHERE date BETWEEN '2025-07-01' AND '2025-07-31'
),
terms AS (
SELECT *, SPLIT(LOWER(REGEXP_REPLACE(query, r"[^\p{L}\p{N}\s]", "")), " ") AS tokens
FROM base
),
unigram AS (
SELECT t.date, t.campaign_id, token AS gram,
SUM(t.clicks) AS clicks, SUM(t.cost) AS cost, SUM(t.conversions) AS conv
FROM terms t, UNNEST(t.tokens) AS token
GROUP BY 1,2,3
),
bigram AS (
SELECT t.date, t.campaign_id,
CONCAT(ngrams.offsets[SAFE_OFFSET(0)][SAFE_OFFSET(0)], ":",
ngrams.ngram) AS gram,
SUM(t.clicks) AS clicks, SUM(t.cost) AS cost, SUM(t.conversions) AS conv
FROM terms t,
ML.NGRAMS(STRUCT(t.tokens AS tokens), [2]) AS ngrams
GROUP BY 1,2,3
),
combined AS (
SELECT * FROM unigram
UNION ALL
SELECT * FROM bigram
)
SELECT gram,
SUM(clicks) AS clicks,
SUM(cost) AS cost,
SUM(conv) AS conv,
SAFE_DIVIDE(SUM(cost), NULLIF(SUM(conv),0)) AS cpa
FROM combined
GROUP BY gram
HAVING SUM(clicks) >= 30 AND SUM(conv) = 0 AND SUM(cost) >= 50
ORDER BY cost DESC
LIMIT 200;
抽出されたn-gramを人間が一瞥し、恒久的な外部意図なのか、クリエイティブのメッセージで改善できるのか、別キャンペーンにルーティングすべきなのかを判断します。恒久除外と判断したものは共有リストに登録し、その他はキャンペーンや広告グループに近接的に適用します。ここで正例の保護も重要です。除外は強力な刃物なので、意図が二義的なn-gramには注意ラベルを付け、完全一致の保護語句を補助的に追加するなど逆方向の制御も同時に設計します。
除外の自動化(Ads Scripts / GAQL / 正規表現)
週次での手動SQRは漏れが出ます。Google Ads Scriptsで候補抽出とスプレッドシート提示、承認後の自動適用までを整えると、継続的に燃えカスを減らせます。新UIのスクリプトはGAQLを使えるため、実装はシンプルです。⁸
// Google Ads Scripts: GAQLで除外候補を抽出し、共有リストに追加
function main() {
const customerId = AdsApp.currentAccount().getCustomerId();
const sharedSetName = "Auto_Negatives";
const negatives = [];
const query = `
SELECT segments.search_term, metrics.clicks, metrics.cost_micros, metrics.conversions
FROM search_term_view
WHERE segments.date DURING LAST_14_DAYS
AND metrics.clicks >= 20 AND metrics.conversions = 0
`;
const rows = AdsApp.search(query);
while (rows.hasNext()) {
const r = rows.next();
const term = r["segments.search_term"].toString().toLowerCase();
const cost = Number(r["metrics.cost_micros"]) / 1e6;
if (cost >= 30 && isIrrelevant(term)) negatives.push(term);
}
if (negatives.length === 0) return;
// 共有除外セットを取得/作成
const sharedSet = getOrCreateSharedSet(sharedSetName);
// 共有除外セットに語句を一括追加
negatives.forEach(text => {
AdsApp.newSharedNegativeKeywordBuilder()
.withText(text)
.withMatchType("PHRASE")
.withSharedSet(sharedSet) // 共有セットを明示
.build();
});
}
function getOrCreateSharedSet(name) {
const sets = AdsApp.sharedSets().withCondition("Name = '" + name + "'").get();
if (sets.hasNext()) return sets.next();
return AdsApp.newSharedSetBuilder()
.withName(name)
.withType("NEGATIVE_KEYWORDS")
.build()
.getResult();
}
function isIrrelevant(q) {
const re = /(求人|採用|給料|年収|ハローワーク|意味|とは|wiki|無料|テンプレ|サンプル|評判|解約|ログイン)/;
return re.test(q);
}
パターンのメンテナンスは正規表現で管理し、コードの外に定義ファイルを持たせると拡張が容易です。採用・就職・学生レポート・価格のみを探す意図など、恒久除外のコアは比較的安定しており、学習を阻害せずに無駄を抑制できます。
クリエイティブとキーワードの相互作用
RSAs(レスポンシブ検索広告)は多くの見出しと説明文を組み合わせて最適化しますが、入力の質が低ければ学習は進みません。意図で束ねた広告グループに対して、その意図を言語化した見出し群と、差別化要因を明確に述べる説明文を与えます。ピン留めは必要最小限に留め、機械が組み合わせの自由度を持てるようにしつつ、ディープな意図グループにはテイラードなUSPを差し込みます。⁷ クエリスカルプティングと連動させて、強い意図のクエリは強い社会的証明やCTAに接続し、情報収集系はホワイトペーパーや比較表へのソフトコンバージョンで追跡可能性を高めます。これにより、同じ費用でも学習に寄与するシグナルが増え、入札戦略の安定性が高まります。
DSA/PMaxと共存するための否定設計
DSA(動的検索広告)やPMax(パフォーマンスマックス)はカバレッジを広げる強力な手段ですが、意図の混線が起きやすい面もあります。アカウントレベル除外やブランド除外を適用し、既存の検索キャンペーンで刈り取りたいクエリをPMaxに吸われないよう配慮します。最新の管理画面ではアカウントレベルの除外キーワード、PMaxのブランド適用除外、検索語句レポートからの否定が利用可能になっています。⁵ ⁶ これらを用い、DSAはサイトマップやフィードで範囲を限定しつつ、除外で明確に意図の境界を引きます。検索キャンペーン側では、意図深度の高いクエリを完全一致で確保し、同語幹がDSAへ回らないように共有除外でガードします。こうしてチャネル間の責任分界点を明確にすれば、学習シグナルの希釈を防ぎ、成果指標の揺らぎも抑えられます。
運用KPIとアラート設計
キーワード戦略と除外設計の成熟度は、数個の実務KPIで評価できます。無関係支出率(ゼロCVかつ指定n-gram群を含む支出の比率)、完全一致シェア(コンバージョンのうち完全一致由来の割合)、ブランド漏れ率(ブランドクエリが非ブランドキャンペーンで消費した費用の割合)、クエリ多様性指数(上位クエリの集中度とロングテールのバランス)、そして検索語句観測率(可視化されたクエリが総クリックに占める割合)です。これらを週次で可視化し、しきい値を超えたらアラートを上げ、先述の整流ルールに従って自動修復または人間の承認待ちのキューを生成します。BigQueryとLooker Studioを使えば、ダッシュボードは短時間で構築できます。以下は観測率と漏れ率を計算するシンプルな例です。³
-- 可視化クエリ例: 観測率とブランド漏れ率
WITH s AS (
SELECT date, clicks, cost, is_brand, match_type, query_visible, campaign_type, conversions
FROM `project.dataset.daily_agg`
)
SELECT date,
SAFE_DIVIDE(SUM(IF(query_visible, clicks, 0)), SUM(clicks)) AS query_visibility_rate,
SAFE_DIVIDE(SUM(IF(is_brand AND campaign_type != 'BRAND', cost, 0)), SUM(IF(is_brand, cost, 0))) AS brand_leakage_rate,
SAFE_DIVIDE(SUM(IF(match_type='EXACT', conversions, 0)), SUM(conversions)) AS exact_conv_share
FROM s
GROUP BY date
ORDER BY date;
運用の現場では、七日で回る改善ループが有効です。最初の二日でデータを収集し、三日目にn-gramのアノテーションと候補生成、四日目に共有除外リストとクエリスカルプティングの適用、五日目にRSAsの見出し群を意図に合わせて差し替え、六日目に入札パラメータと予算の再配分、七日目に影響評価とロールバック条件の確認というリズムを繰り返します。ここで小さく適用し、早く観測し、明確にロールバックするという原則を徹底すると、安定した改善勾配が得られます。
意思決定を“人の感覚”から“検定可能な仮説”へ
除外やルーティングの変更は、RSAsや入札と強く相互作用します。テストはA/Aやベイジアン切り替えなど、統計的に健全な枠組みを採用し、十分な事後確率が確保できるまで大規模な変更を避けます。予算が限られるB2Bではマイクロコンバージョンの質を担保し、最終CVとの相関を定期的に再検証します。イベントスキーマはCRMと突き合わせ、キーワード群ごとのLTV(顧客生涯価値)と回収期間で評価すると、短期のCPAだけでない意思決定が可能になります。
まとめ:エンジニアリングでROIを“設計”する
検索の十五パーセントが未知という事実は、偶然の最適化では勝てないことを示唆しています。¹ 意図でマップを作り、マッチタイプとクエリスカルプティングで流路を整え、n-gramと自動化で不純物を取り除く。この一連の工程をコードとダッシュボードで恒常化すれば、運用のばらつきは抑えられます。今日からできる第一歩として、検索語句のデータ基盤を整え、共有除外リストの初期セットをコードで宣言し、七日サイクルの改善リズムをカレンダーに組み込んでみてください。やがて**“うまくいく時もある”運用から“再現可能な成果を積み上げる”運用へ**と、組織の手触りが変わっていくはずです。次にダッシュボードを開くとき、クエリの流れはどこで滞っているでしょうか。最初のバルブを、今週ひとつだけ締め直してみませんか。
参考文献
- Google revisits 15% unseen queries statistic in context of AI Search — Search Engine Journal
- Alphabet Q4 2024 earnings report — CNBC
- About the search terms report — Google Ads Help
- Google 検索広告のクエリマッチング更新まとめ — Anagrams
- Google PMax negative keyword exclusions — Search Engine Land
- Google rolling out PMax negative keyword exclusions (beta) — Search Engine Land
- Responsive Search Ads: Best Practices — WordStream
- インテントマッチと自動入札の組み合わせ時代の運用 — ALLIS BLOG