YouTube動画分析ダッシュボード構築
散歩系YouTubeチャンネル「Rambalac」の動画データを分析するダッシュボードを1日で構築した。メタデータ取得、可視化、ロケーション分類、コメント分析まで一通り揃えた記録。
背景
自分たちのチャンネル企画の参考として、同ジャンルで実績のあるチャンネルの傾向を定量的に把握したかった。再生数やコメントの中身を眺めるだけでなく、ロケーション別・時系列での傾向を構造的に見られる環境がほしかった。
yt-dlpでメタデータ取得
cp932エンコーディングエラーとの戦い
Windows環境でyt-dlpを動かすと、日本語タイトルの出力時にcp932エンコーディングエラーが出る。stdoutをUTF-8に設定して回避した。
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
YouTubeボット検出への対処
素のyt-dlpではボット検出に引っかかり、途中で弾かれた。ブラウザのCookieを渡して回避する方法を試したところ、Chrome・Edgeは使えず、Firefoxから書き出したCookieでのみ通った。
yt-dlp --cookies cookies-firefox.txt --flat-playlist ...
バッチ処理で安定化
約1,500件の動画メタデータを一括取得するとタイムアウトしがちだったので、50件/バッチに分割して30バッチで回した。途中経過をSQLiteに保存し、中断しても再開できるようにした。全体で約22分で完走。
ダッシュボードの構築
dashboard/ ディレクトリにVite + Vue 3のSPAとして構築。ランディングページ用の site/ とは独立した開発環境。
4ページ構成
| ページ | 内容 |
|---|---|
| Overview | チャンネル全体の統計サマリー |
| Trends | 投稿頻度・再生数の時系列推移 |
| Locations | 撮影地の分類と再生数分布 |
| Videos | 個別動画の一覧・検索 |
Chart.jsで棒グラフ・折れ線・ドーナツチャートなどを表示。SQLiteからJSONに変換したデータを静的にインポートする形で、APIサーバーは立てていない。
Miller Columnレイアウトへの全面移行
途中でUI方針を変えて、全ページをMiller Columnレイアウトに統一した。mdx-playgroundの理科コンテンツで作ったMiller Column実装を参考にして移植。
ロケーション分類では「地方 > 都道府県 > 地名」の3階層を設定し、左から順に絞り込んでいく操作感にした。たとえば「関東 > 東京都 > 秋葉原」と選択すると、秋葉原で撮影された動画の一覧と統計が右カラムに出る。
コメント分析
YouTube Data APIでコメント取得
再生数Top 100の動画に対してYouTube Data APIでコメントを取得。合計9,859件のコメントを収集した。APIのクォータ管理のため、1動画あたりのコメント取得数に上限を設けた。
サブエージェントによる並列分析
100動画のコメント分析を10バッチに分け、Claude Codeのサブエージェント(Task tool)で並列処理した。各バッチで以下を抽出:
- テーマ分類(風景、音、歩行ルート、季節感など)
- キーワード頻出度
- Top Commentsの選定
視聴要因の構造化
コメントから読み取れる「なぜこのチャンネルが見られているのか」を構造化し、別ページにまとめた。具体的な分析結果はここでは割愛するが、映像以外の要素(環境音、歩行リズム、季節の変化など)への言及が多かったのは参考になった。
Top 100サマリーページ
サムネイル付きのカードUIで100動画を一覧表示。各カードには日本語タイトル、再生数、コメント数、コメント分析のサマリーを掲載した。
技術的なポイント
- TypeScript型チェック: ダッシュボード全体にTSを適用し、SQLiteから読み込むデータの型を定義
- Chrome DevToolsでの動作確認: MCP経由でリモートデバッグポートに接続し、レイアウト崩れやチャート描画の確認を実施
- 静的データ戦略: SQLite → JSON変換スクリプトを用意し、ビルド前にデータを生成。SPAなのでバックエンド不要
ふりかえり
1日でメタデータ取得からダッシュボード完成まで持っていけたのは、既存のMiller Column実装を流用できたのが大きい。yt-dlpのボット検出回避はFirefox Cookieという地味な解法だったが、Chrome/Edgeで動かないのは盲点だった。
コメント分析の並列処理は、10バッチに分けてサブエージェントに投げるパターンが安定した。1バッチ10動画程度ならコンテキストウィンドウにも収まり、分析精度も保てる。
ロケーション分類の3階層(地方 > 都道府県 > 地名)は手動で定義したが、動画タイトルやdescriptionからの自動分類も今後試してみたい。