検索アップデートが着地すると、いつもの流れは決まっている。公開のボラティリティトラッカーが赤くなり、業界のチャットが盛り上がり、誰もが自分のトラフィック低下がそれに関係しているのか推測し始める。この流れの問題は、他人のデータから始まっているという点にある。公開トラッカーが計測しているのは、あなたのものではないキーワード群であり、あなたが展開していないかもしれない市場であり、あなたが競合していないかもしれない業種だ。それはどこかの天気を教えてくれるだけで、あなたのアカウントに雨が降っているかどうかは教えてくれない。
もしすでにランクデータを日次で収集しているなら、その問いに直接答えるために必要なものはすべて揃っている。ランクトラッキングのデータセットをボラティリティシグナルに変える方法、アルゴリズムイベントを自サイトの変更から切り分ける方法、そして起きてもいないアップデートをチームが追いかけてしまう偽陽性を避ける方法を以下にまとめる。
まず前提: 計測がクリーンでなければ、自分自身のノイズを計測することになる
これは前提条件であり、これを飛ばすことがファントムアップデートの最大の原因になる。
検索結果は、場所によって、検索者がログインしているかどうかによって、デバイスによって、そして問い合わせた瞬間によって変わる。これらのうちどれか一つでも収集の間でぶれれば、その差はデータ上で「動き」として現れる。そしてボラティリティ指標がまさに探しているのはその「動き」だ。トラッカーがひそかにexitの場所を変えていたり、ある日は09:00に、別の日は18:00に実行していたりすれば、何もないところからボラティリティを作り出してしまう。
したがって求められるのは完璧さではなく一貫性だ。キーワードごとに場所を固定し、それを維持する。パーソナライゼーションが紛れ込まないよう、クリーンなセッションでログアウト状態で収集する。デバイスプロファイルを固定する。毎日同じ時刻にサンプリングする。詳しい手法は正確なキーワードランキングの測定にあり、場所がなぜこれほど支配的なのかはローカライズされたGoogle検索結果で扱っている。ボラティリティの分析においては、絶対的な正確さよりも一貫性の方がむしろ重要だ。同じ視点から一貫して測定されたランクは、他のツールが報告する絶対数値と多少異なっていても、実際の変化を確実に示してくれる。
自分の順位だけでなく、結果セット全体を収集する
ほとんどのランクトラッカーはキーワードごとに一つの数字、つまり自分が何位だったかしか保存しない。それではアップデートを検知するには不十分だ。なぜなら、自分の順位が完全に安定していても、その周囲のSERP全体が並べ替わっている可能性があり、その並べ替わりこそが最も早いシグナルだからだ。
キーワードごと、日ごとに、上位10件または上位20件のURLをすべて保存する。結果の機能要素の有無や位置も保存すべきだ。なぜなら、機能要素の変化こそがアップデートそのものであることが多いからだ。3分の1のキーワードにAIオーバービューが現れる、ローカルパックがオーガニック枠を置き換える、ショッピングユニットが拡大する、サイトリンクの形が変わる、こうしたことはすべて、数値自体は動いていなくてもランキングの価値を変えてしまう。
ここでのボリュームの影響は現実的なものだ。数千件のキーワードを複数の市場にわたって、日次で結果セット全体を取得するのは、スプレッドシートというよりも本格的な収集ジョブであり、それゆえインフラの側面が重要になり、SEOモニタリングのためのローテーティングレジデンシャルプロキシというトピックが存在する。
ボラティリティスコアを計算する
有用な指標は自分自身の順位の変化ではなく、結果セット内のchurn(入れ替わり)だ。あるキーワードの今日の上位10件を昨日のものと比較し、どれだけが違うかを問う。
最もシンプルなバージョンは集合の重なりだ。昨日の上位10件のうち何件が今日の上位10件にも残っているかを数える。10件から6件への減少はかなりのchurnだ。より良いバージョンは順位で重み付けする。2位での変化は9位での変化よりも重要だからであり、また残ったが移動したURLも考慮に入れる。
def churn(prev, curr, k=10):
"""0.0 = identical top-k, 1.0 = completely different."""
prev, curr = prev[:k], curr[:k]
left = len(set(prev) - set(curr)) / k # how much dropped out
moved = sum(
abs(prev.index(u) - curr.index(u)) for u in set(prev) & set(curr)
) / (k * k) # how far survivors moved
return round(min(1.0, left + moved * 0.5), 3)
# daily index across the whole keyword set
def volatility_index(pairs): # [(prev_urls, curr_urls), ...]
scores = [churn(p, c) for p, c in pairs]
return sum(scores) / len(scores)
これをキーワードセット全体で実行して平均すれば、自分のポートフォリオの日次ボラティリティインデックスが得られる。1日分の数値だけでは何も意味しない。重要なのはベースラインだ。過去数週間の移動平均と標準偏差を計算し、インデックスが通常のバンドから大きく外れた日にフラグを立てる。通常のSERPは毎日多少はchurnするものなので、閾値は恣意的な数字ではなく自分自身の履歴から導き出すべきだ。
平均だけでなくキーワードごとのスコアも保持しておくべきだ。なぜなら分布こそが診断の拠り所だからだ。すべてのキーワードがわずかに動いたためにインデックスが上昇したのと、15%のキーワードが大きく動いたためにインデックスが上昇したのとでは、まったく異なる事象だ。
アルゴリズムアップデートとそれ以外を切り分ける
高いボラティリティの読み取りにはいくつかの原因が考えられ、分析とは消去法のことだ。4つのチェックがその大半をこなす。
自分だけか、それとも全員か。 競合のURLが順位を維持している間に自分のURLだけが動いたなら、それはアルゴリズムイベントではなく、自サイトに関する何か、つまりデプロイ、コンテンツの変更、技術的な後退、インデックスの問題、あるいは手動によるペナルティだ。本物のアップデートは結果セット全体を動かす。SERP全体を保存することが重要なのはこのためであり、自分の順位しか記録しないトラッカーでは文字通りこの問いに答えられない。
広範囲か、それとも一つのセグメントか。 キーワードをトピック、意図、市場ごとにグループ化し、グループごとにインデックスを計算する。アップデートはすべてを一度に襲うのではなく、特定の業種やクエリタイプを狙い撃ちすることが多い。したがって、トランザクション系のクエリだけにスパイクが集中し、情報系のクエリは平坦なままというのは、一律の動きとは異なる、より実行可能な発見だ。
複数の市場にまたがって現れるか。 同じコアキーワードを複数の国で実行する。広範なコアアップデートは、似たような期間に多くの市場にわたって現れる傾向がある。一方、単一市場内の動きは、その地域特有のローカル競合、ローカルインデックスの変化、あるいは収集上の問題である可能性の方が高い。マルチマーケットのカバレッジこそが、自分のデータを単一市場の公開トラッカーよりも情報価値の高いものにする理由だ。
ランキングではなくレイアウトが変わったのか。 機能要素の有無を独自の時系列として追跡する。churnが、自分のキーワードのうちAIオーバービューやローカルパックを表示する割合の急上昇と一致するなら、その事象はプレゼンテーションの変化である可能性があり、それは順位よりもクリック率に影響し、まったく異なる対応を要求する。
何よりもまず排除すべき偽陽性
何かを結論づける前に、そのスパイクが自分自身に起因するものではないことを確認する。
収集のギャップは典型例だ。ある地域で昨日の収集が失敗し、今日を2日前の最後に成功した実行と比較すると、2日分の変動が1回分の読み取りに圧縮されて見えてしまう。パイプラインは「変化なし」と「データなし」を区別する必要がある。地域ごとの成功率とともにパイプラインを監視することがボラティリティチャートと並んで必要なのはこのためだ。
関連して、より厄介なのが部分的な、あるいは劣化したレスポンスだ。チャレンジページや切り詰められた結果セットは、パースすると短いURLリストになり、まさに大規模なchurnのように見える。取得したSERPがデータセットに入る前に、それが本物のSERPであることを検証すること。ブロックされたコンテンツや偽のコンテンツを検知するで説明している通りだ。
その次に、ありふれた説明を確認する。収集時刻がずれていないか。プロキシのexitの場所がずれて、あるキーワードが別の都市から計測されていないか。誰かがキーワードセットに追加や削除を行い、動きではなく構成によって平均が変わっていないか。単純にサンプルが小さすぎないか。50件のキーワードでは、1つの変動の激しいクエリだけでインデックスが動いてしまう。
運用に落とし込む
いくつかの習慣が、この時間経過にわたるシグナルの信頼性を保つ。
自分では決して最適化せず、決して手を触れないコントロールセットのキーワードを、各業種にまたがって保持しておく。インデックスがスパイクしたとき、コントロールセットはその動きが外部要因かどうかを教えてくれる。なぜなら、それらについては自分側で何も変わっていないことが確実にわかっているからだ。
自分自身のタイムラインに注釈をつける。デプロイ、コンテンツの公開、移行、技術的な変更をボラティリティの系列と並べて記録する。「アルゴリズムアップデート」の調査の半分は、その週にリリースされたものを誰かが思い出して終わる。注釈付きのチャートなら数秒でそれを見つけられる。
計算済みのスコアだけでなく、生のSERPスナップショットを保存する。2週間後に、どの競合が伸びたのかを知りたくなったとき、答えられるのは生データだけだ。すでに変わってしまったSERPを遡って収集することはできない。
1日だけの動きではなく、持続的な動きにアラートを出す。本物のアップデートは通常、数日にわたってロールアウトされ、1週間以上かけて落ち着く。したがって、連続して2日か3日高い状態が続くことを要求する閾値にすれば、重要なものを見逃すことなくノイズを大幅に削減できる。
シグナルが本物だった場合の対応
反応する前に待つ。結果はロールアウト中に上下することが一般的であり、アップデートの最中に行った変更は、後になって自分の変更なのか進行中のボラティリティなのか区別がつかなくなる。落ち着くのを待つこと。
その間に、自分のデータだけが可能にする分析を行う。自分のどのページが失い、どのページが維持したか。どの競合が伸び、勝ったページに何が共通しているか。損失は意図、テンプレート、トピックによって偏っているか。同じパターンがすべての市場に現れるのか、それとも一部だけか。この分析は、そのアップデートについての公開の論評よりもはるかに価値がある。なぜなら、それは自分のキーワード、自分の競合、自分の市場についてのものだからだ。
結論
検索アップデートが起きたことを知るために、公開トラッカーを待つ必要はない。すでにランクデータを日次で収集しているなら、自分の順位だけでなく結果セット全体を取得し、ポートフォリオ全体にわたってchurnベースのボラティリティインデックスを計算し、固定の閾値ではなく自分自身の移動平均ベースラインと比較する。そして消去法で診断する。自分だけの動きはサイトの問題であり、セグメント特有の動きは狙い撃ちされたアップデートであり、複数市場にまたがる動きは広範な何かを示唆し、機能要素の出現割合の急上昇はレイアウトの変化だ。収集のギャップ、劣化したレスポンス、場所や時刻のずれを、何かを信じる前に除外すること。なぜなら、計測上の問題とアルゴリズムアップデートはチャート上ではまったく同じに見えるからだ。そして基礎となる計測が一貫していることを確認すること。一貫性のない収集の上に構築されたボラティリティ指標は、検索結果ではなく自分自身のパイプラインを計測してしまう。
これらすべては、関心のあるすべての市場で毎日ジオ整合性のあるSERPを収集することの上に成り立っている。それこそがレジデンシャルプロキシによるSEOモニタリングの設計思想であり、各市場をその内側から計測するための国・都市ターゲティング、本物のSERPを取得するためのクリーンな家庭用アドレス、そして日次のマルチマーケットキーワードセットが必要とするボリュームでのローテーションを提供する。その基盤にあるレジデンシャルプロキシネットワークはGBあたりで課金される。これはこのワークロードに適しており、SERPチェックは小さく頻繁であるため、コストが実際に取得したデータに追従する。