最近ある YouTuber に急にハマった。その人は音楽系やゲーム系などいろんな YouTuber たちとコラボしていて、誰と誰が繋がっているのか把握するのが難しかったので、図にしてみようと思った。
方法
YouTuber 同士の繋がりやコラボレーションを可視化しているプロジェクトはいくつかあったので、参考になる方法がないか探してみた。
おすすめチャンネル欄を使う
この記事では、あるチャンネルが別のチャンネルをおすすめチャンネル欄で紹介していれば、そこに繋がりがあると判定して、その繋がりを可視化していた。
けれどおすすめ欄には大抵サブチャンネルやグループのメンバーのチャンネルくらいしか入っておらず、逐一コラボ相手を載せる人は少ないので、この方法では不十分そうだった。
Twitter を使う
ここに載っているネットワーク図の例では、YouTuber の Twitter 上でのコミュニケーションを辿ることによって人間関係を可視化している。
確かに Twitter は人間関係の把握に適していそうだけど、私の好きな YouTuber は度重なる凍結によって過去のデータが消されているので、この方法も使えなかった。
顔認識・声認識を使う
Collaborations on YouTube: From Unsupervised Detection to the Impact on Video and Channel Popularity や、その続編の Detection and Analysis of Content Creator Collaborations in YouTube Videos using Face- and Speaker-Recognition では、YouTuber 同士のコラボレーションを検出するために顔認識と声認識を使っていた。
技術的にはすごいけど、ここまで本格的なことをやる根気はないし、そもそも YouTube の動画のダウンロードは規約違反なはずなので却下した。
動画の概要欄を使う
上記の方法が全部使えないので、結局自分で方法を考えた。
コラボした動画ではコラボ相手へのリンクを概要欄に貼るという慣習があるようなので、それを利用して、「互いに相手のチャンネルや動画へのリンクを貼っていればコラボ済み」と見なすことにした。
- 中心となる YouTuber を一人決める
- その人の動画の概要欄を全部取得して、チャンネルや動画のリンクを一つ一つ取り出す
- リンク先の人の動画の概要欄も同様に取得して、リンク返しをされていれば、その2人はコラボしたと見なす
というふうに辿っていって、そのデータを D3.js でネットワークとして可視化した。
また、それぞれのジャンル(音楽、ゲームなど)の YouTuber たちがどういうふうに関わり合っているかも見たいので、チャンネルに紐付けられている topicIds
からジャンルを推定して色分けしてみた。
結果
こういう図ができた。
今回中心に据えた人は音楽系(緑)だったので、周りも音楽系の人が多い。その中でも、右の方は音楽を通して笑いを提供するチャンネル、左の方は真面目に演奏するチャンネルというふうに固まっていたのが面白かった。
ネットワークの右半分を占めるエンタメ(ピンク)や生活系(黄)は、YouTuber の代表格のようなジャンル。よく仲の良さをアピールしているというイメージがあったけど、それに違わずコラボの密度も高かった。
左上のゲーム系(水色)は、ゲーマー同士でゆるく固まりつつ、エンタメ系や生活系とも適度にコラボしていそう。
左下にちょっと固まっているのは VTuber の人たちだった。そういえば VTuber の人が実体のある YouTuber とコラボしているところを見たことがない気がしたので、実際どうなんだろうと思って、有名 VTuber を中心としたグラフも出してみた。
きれいに分断されていた。
追記: 上の図のキャプションがわかりにくい表現だったので書き直しました。
追記: 中心の人から直接繋がっていない YouTuber に関しては、チャンネル登録者数が100万人を超える人のみ表示しています。
YouTube の URL
動画の概要欄で言及されている YouTube チャンネルを抜き出すためには、貼られた URL からチャンネル情報を取得する必要があったんだけど、URL にはいろいろ種類があってややこしかった。調べた範囲では以下のようなものがあった。
- チャンネル ID が入った URL
- 形式:
https://www.youtube.com/channel/{channel_id}
- チャンネル情報の取得方法: Channels: list で
id
からチャンネルを取得
- 形式:
- ユーザー名 が入った URL
- 形式:
https://www.youtube.com/user/{username}
- チャンネル情報の取得方法: Channels: list で
forUsername
からチャンネルを取得
- 形式:
- チャンネルのカスタム URL
- 形式:
https://www.youtube.com/c/{custom_name}
- チャンネル情報の取得方法: Search: list で
q
にカスタム URL を入れてヒットするチャンネル一覧を取得し、その詳細情報を Channels: list で取得した上で、カスタム URL がマッチするものを絞り込む*1
- 形式:
- 動画の URL
- 形式:
https://www.youtube.com/watch?v={video_id}
- チャンネル情報の取得方法: Videos: list で
id
から動画を取得し、そのsnippet.channelId
を使って Channels: list からチャンネルを取得
- 形式:
- 動画の URL(短縮版)
- 形式:
https://youtu.be/{video_id}
- チャンネル情報の取得方法: 同上
- 形式:
このうちカスタム URL からチャンネル情報を取得する方法については、API の quota を一気に100も消費する高級エンドポイントを使う必要があるので、実装しなかった。それでもやっぱり1日分の quota では全然足りないので、4日間くらいかけてちまちまデータを取得していた。