YouTube Analytics APIにimpressionsを渡すと400エラーが返る。公式ドキュメントには明記されておらず、実装して初めて気づいた。取得できていた数字を「インプレッションが伸びている」という仮説の根拠に使い続け、気づくまで1ヶ月かかった話。
「取得できた指標」と「欲しかった指標」が違うものだったとどうやって気づいたかの経緯。YouTube Analytics APIで実際に返るエラーメッセージの文言と、Studio CSVの「合計行は信頼できるが明細行は間引かれる」というデータの読み方の落とし穴。
YouTubeチャンネルの分析ツールを自作していて、動画ごとの表示回数(インプレッション)を集計する処理を足そうとした。YouTube Analytics APIのメトリクス指定にimpressionsを渡せば取れるだろう、と考えるのは自然だ。YouTube Studioの管理画面には「インプレッション数」という項目が確かに存在するのだから。
返ってきたのは400 Unknown identifier given in field parameters.metrics。存在しないフィールド名を指定した、というエラーだ。公式のAPIリファレンスを読み直しても、利用可能なメトリクス一覧にimpressionsは載っていない。Studioの画面には表示されている数字が、同じ製品のAPIからは取得できない——このギャップは、ドキュメントの目次を眺めているだけでは気づけなかった。
手元のツール(tools/youtube_longform_analysis.py)には、このときの結論をそのままコードのコメントとして残してある。
"impressions": "Unavailable from YouTube Analytics API query;
Reach reports require YouTube Reporting API or Studio."
ここで止まっていれば実害は無かった。実際には、代わりに取得できる別の指標を、そのまま「インプレッションの近似値」として使い始めてしまった。
YouTube Analytics APIで動画のトラフィックを見るには、insightTrafficSourceTypeというディメンションを使う。フィルタにRELATED_VIDEOを指定すれば「関連動画欄からクリックされて再生された回数」が取れる。これは実在する指標で、エラーにもならない。だが、これは表示された回数(インプレッション)ではなく、クリックされて再生された回数だ。分母(何回表示され)と分子(何回見られたか)のうち、分子しか見えていなかった。
SURPLUS長尺・犯罪統計ラボの2チャンネルを比較する分析で、「チャンネルが育つにつれてインプレッションが伸びている」という仮説を立てていた。実際に見ていたのは関連動画経由の再生回数の推移であって、表示回数そのものではない。再生が増えていても、表示が同じペースで増えているとは限らない——両者を同じ指標として扱っていたのが誤りだった。
気づいたきっかけは、ユーザーがYouTube Studioの「トラフィックソース」CSVをSURPLUS長尺14本分エクスポートしてくれたことだった。CSVには本物のインプレッション数・CTRが列として存在する。APIで集計していた数字と突き合わせたところ、指標そのものが別物だったと分かった。
CSVを読み込んで検算する過程でも、もう一段別の罠があった。CSVの「合計」行(動画全体のインプレッション数・CTR・視聴回数)と、個別のトラフィックソースごとの明細行を突き合わせると、数字が合わない動画があった。
ある動画は、合計行のインプレッション数が6,274なのに対し、YT_RELATED(関連動画)の明細行を合計しても600にしかならない。10倍以上の差だ。原因は、Studioの「インプレッションと総再生時間の関係」パネルで同じ動画を確認して判明した。この動画のインプレッション6,292のうち、「YouTubeによるおすすめ」経由は42.2%しかなく、残りは検索・チャンネルページなど他の経路だった。明細行は低頻度のソースが個別列挙されず合計に埋没するため、合計行より小さく出る。一方で視聴回数の明細合計は合計行とほぼ一致していた——視聴の帰属元だけは正確に記録されている。
同じCSVの中でも、行によって信頼度が違う。「合計」行はその動画の実数。「個別ソースの明細」行は、頻度の低いソースが間引かれて合計より過小に出ることがある。どちらの行を見ているかで、同じCSVから逆の結論を導ける——これに気づかずに明細だけを積み上げていたら、インプレッションを過小評価したまま分析を続けていたはずだ。
合計行を正として14本分を集計し直すと、合計インプレッション36,673・視聴249・全体CTR0.68%(動画別0.00%〜1.28%)。ここで最初に立てていた「チャンネルが育つにつれてインプレッションが伸びる」という仮説を検算した。公開順とインプレッション数の相関係数は0.086——ほぼ無相関だった。実際、最新本(公開2日)が2番目に多い6,274インプレッションを獲得しており、経過日数だけで説明できるモデルではない。
さらに14本の日別視聴回数を、公開日からの経過日数で正規化して合算すると、別のパターンが見えた。全視聴の約79%(203/256)がday0-1(公開後48時間以内)に集中し、全14本が遅くともday8までに視聴ゼロへ完全停止する。最長22日観測できた動画でも、それ以降は一貫してゼロだった。
ただし日別のインプレッション数そのものはStudio CSVに存在せず、視聴回数の停止から間接的に推定した内容である点は留保が必要だ。この停止パターンは、YouTubeが新規動画に対して公開後の一定期間だけサンプル的に露出させ、その後打ち切る「テスト配信期間」の存在を示唆する傍証として記録している。
YouTube固有の話に見えるが、「公式APIで取れる指標名」と「管理画面に表示されている指標名」が違う、という構造自体はどの外部APIでも起こり得る。
この分析は_dashboard/strategy_hypotheses.mdのSTR-029として記録し、判定を保留している項目に紐づけている。「気づいた」で終わらせず、どの仮説がまだ検証途中で、何を追加取得すれば確定できるかまで書き残すところまでが、この種の誤読の再発防止になる。