にじさんじの Twitter フォロワー分析

概要

にじさんじに所属する全ライバーの Twitter フォロワー情報を取得し、

  • にじさんじ全体の(重複を除く)フォロワー数
  • 1人のファンがフォローするライバー数の分布
  • フォロワーの重複度合いを基に(t-SNE で)図示したライバーの位置関係

を分析しました。

背景

にじさんじは、執筆時点で合計 73 人のライバーを抱える最大規模の VTuber グループです。他のグループや事務所と比較して特徴的な点は:

  • 編集された動画よりも長時間のライブ配信がメイン
  • グループ内でのコラボが活発
  • 非常に速いペースで所属ライバーが増え続けている

特に最近はにじさんじ全体で YouTube チャンネルの登録者が大きく伸びているため、ファンの一人として嬉しく感じています。 一方で、「ライバーの増加により延べ登録者数が増えただけで、新規層の獲得はできていない」のではないかと疑問を抱いていました。 というのも、「頻繁にコラボ配信をするライバー同士は、視聴者層が重複しやすい」と予想できるため、「一人で多数のにじさんじライバーをフォローしている人が多い」だろうと考えられるからです。

そこで、上記のカギカッコで囲まれた推測の真偽を検証するために、にじさんじライバーの Twitter フォロワーを分析しました。

分析結果

にじさんじ全体のフォロワー数

にじさんじに所属するライバーの全フォロワー ID を取得しました。これを基ににじさんじ全体のフォロワー数を合計した結果:

  • ID の重複もカウントすると約 430 万人
  • ID の重複を除外すると約 47 万人

となりました。

1人のファンがフォローするライバー数の分布

各フォロワー ID ごとに出現回数をカウントすることで、「にじさんじのフォロワーは 1 人あたり何人のライバーをフォローしているか」を計測しました。 その結果をヒストグラムにしたのが下図です。横軸はフォロー中のライバー数、縦軸は該当するフォロワー数(対数スケール)を表しています。

f:id:P_N_D:20190525232408p:plain

また、同じ結果を以下の表にも示しました。

フォロー中のライバー数 該当フォロワー数
1 182385
2 60070
3 36276
4 23799
5 17270
... ...
69 1164
70 1082
71 1854
72 1603
73 5991

おもしろい特徴として、 フォロー 72 人から 73 人(全ライバー数)のところで該当数が大きく跳ねているのが見て取れます。 「数人取りこぼすくらいならいっそ全部フォローしたい」というコレクター精神が働いた結果でしょうか。

ライバーの位置関係の図示

2 つの Twitter アカウントのフォロワーを比較して、「フォロワーの重複の度合い」を数値のスコア(Dice 係数など)で表すことができます。 そのスコアを t-SNE と呼ばれるアルゴリズムに入力して、にじさんじライバーの位置関係を 2 次元のグラフ上で視覚化しました。このグラフでは

  • フォロワーの重複が多いライバーはグラフ上で近く
  • フォロワーの重複が少ないライバーはグラフ上で遠く

という関係を満たすように、各ライバーを表す点を自動的に配置しています。

f:id:P_N_D:20190526001415p:plain

上図を見ると、デビュー時期が近いライバーが近くに固まって配置されています。 よりわかりやすくするため、にじさんじ統合前のグループと、統合後に同時期にデビューしたライバーたちを囲んで下図に示しました。

f:id:P_N_D:20190526001437p:plain

更に、大きなクラスタの中に着目すると、 JK 組や舞元力一など頻繁にコラボ配信をするライバー同士が特に密集していることもわかります。

この結果から、「デビュー時期が近かったり頻繁にコラボ配信したりするライバー同士は、フォロワーが重複しやすい」という至極当然な推測が裏付けられました。

技術的な詳細

今回の分析には Python と Jupyter Notebook を使用しました。

Twitter API

にじさんじライバーのリストの取得

にじさんじ公式の Twitter アカウントが全ライバーのリストを作成しているので、今回はそこからライバーの情報を入手しました。

Twitter APIlists/members にリクエストすると、リストに含まれている全ユーザーの情報( ID 、スクリーンネーム、アイコン画像など)を取得できます。このとき、リストの owner_screen_nameslug の指定が必要です。リストの URL は

https://twitter.com/{owner_screen_name}/lists/{slug}

の形式になっているので、手動で確認することもできます。また、 owner_screen_name がわかれば /lists/list から slug を取得することも可能です。

フォロワーの取得

Twitter APIfollowers/ids に対して、ユーザー ID (e.g. 958737597336928256 )またはスクリーンネーム (e.g. @MitoTsukino ) を引数に入れてリクエストすると、全フォロワーのユーザー ID を取得できます。

1 回のリクエストでは最大 5000 件のフォロワーしか取得できず、また、リクエストは 15 分あたり 15 回までに限定されています。従って、記事執筆時点でのにじさんじフォロワー延べ 430 万人 を全て取得するためには 14 時間以上必要になります。

集合の類似度

任意のライバーのペアに対して、フォロワー ID の集合の類似度を Jaccard 係数、 Dice 係数、 Simpson 係数で計算しました。 notebook では 3 種類の類似度全てについて埋め込み結果を図示しましたが、この記事には Dice 係数を用いた結果だけを掲載しています。

t-SNE による 2 次元埋め込み

次元圧縮

ライバーに関する距離行列が前述の類似度によって与えられるので、次元圧縮で 2 次元ユークリッド空間に埋め込み可視化します。次元圧縮のアルゴリズムとして有名なものに

などがありますが、今回は特に t-SNE を使用しました。

パラメーター調整

t-SNE には perplexity というパラメータが存在します。原論文によれば:

The performance of SNE is fairly robust to changes in the perplexity, and typical values are between 5 and 50.

とのことですが、実際には perplexity の値によってかなり結果は変動します。少なくとも、 sklearn のデフォルト値をそのまま使うと、収束前に停止したり解釈困難な結果を出力したりすることが多々あります。

再び原論文から引用すると:

The perplexity can be interpreted as a smooth measure of the effective number of neighbors.

これは、 n 個の要素に関する一様分布の perplexity が  n になる事実から類推できます。 "the effective number of neighbors" はデータの性質やサンプル数によって大きく変動するはずなので、それに合わせて perplexity も設定する必要があると考えられます。特に今回はサンプル数が 73 と少ないので、 perplexity を 5 に設定して実験しました。

perplexity の影響については、この解説記事も参考になります。パラメーターを変えた結果をインタラクティブに確認できるので、ぜひ一度試してみてください。

結論

分析結果を踏まえると、最初に述べた推測はいずれも妥当なものだと言えそうです:

  • ライバーの増加により延べ登録者数は増えたが、新規層はあまり獲得できていない
  • 一人で多数のにじさんじライバーをフォローしている人が多い
  • 頻繁にコラボ配信をするライバー同士は、視聴者層が重複しやすい

1 人のファンが実際に追いきれるライバーの数には限度がある(長時間の配信が多いと尚更)ため、もしこのままの状況が今後も続くと、にじさんじ全体の収益はほぼ頭打ちになってしまうかもしれません。