はじめに
これは、YouTube動画の再生パフォーマンスをデータで分析するシリーズの2本目です。
このYouTube分析シリーズの記事はこちらです。今後の記事もここに追加していきます。
- 第1回: YouTube動画はどんな要素が再生パフォーマンスに関連しているのか?
- 第2回: この記事
- 第3回: AIが勝手にロバスト標準誤差を入れてきたので、回帰分析コードを読んでみた
- 第4回: YouTube動画は「どのチャンネルか」でどこまで変わるのか?固定効果で回帰分析を見直す
- 第5回: 固定効果の次に、階層ベイズで「チャンネル差」をもう少し丁寧に見る
- 第6回: 広告クリエイティブを個人で集めようとして分かったこと
1本目では、YouTube Data APIで取得した公開メタデータを使って、YouTube動画の再生パフォーマンスを重回帰分析しました。
1本目で一番強く見えたのは、やはり登録者数でした。
これは直感的には自然です。登録者数が多いチャンネルは、既存ファンも多く、ブランド力もあり、動画が見られやすい。だから、再生パフォーマンスを説明しようとすると登録者数が強く出る。
ただ、そんな結論でいいんだろうか、とも思いました。
それは本当に「動画ごとの当たりやすさ」を見ているのか。それとも、単に「チャンネルの強さ」を見ているだけなのか。
これは、マーケティングサイエンス的にも気になる問いです。ブランド力や既存ファン基盤のような強さと、個別コンテンツの上振れをどう切り分けるのか、という話に近いからです。
そこで今回は、問いを変えます。
チャンネル全体として強いかどうかではなく、同じチャンネルの中で、その動画は相対的に当たったのか。
言い換えると、今回の問いは「動画の再生数そのものを伸ばせるか」ではありません。チャンネルの人気度や規模の影響を弱めたうえで、動画単位の上振れをどこまで捉えられるか、という問題設定に近いです。
この問いにするために、今回はロジスティック回帰を使いました。
先に結果を書くと、1本目とは違う見え方になりました。
1本目では強かった登録者数が、今回はほとんど効かなくなりました。
一方で、公開後日数や投稿タイミング、ジャンルを足すと、少しだけ判別性能が上がりました。
つまり、問いを変えると、データの見え方も変わるということです。
ただし、今回も探索的な分析です。「こうすればYouTubeで伸びる」という実践指針ではありません。公開メタデータを使って、見え方の違いを確認するための記録です。
ロジスティック回帰とは
ロジスティック回帰は、目的変数が 0 か 1 のような二値データのときに使う回帰分析です。
1本目の重回帰分析では、views_per_day の大きさを見ていました。つまり、「どれくらい再生されたか」を見る分析です。
一方で、ロジスティック回帰では、目的変数を 0 / 1 にします。
今回は次のようにしました。
- 同じチャンネル内で
views_per_dayが中央値を超えた動画:1 - 同じチャンネル内で
views_per_dayが中央値以下の動画:0
つまり、動画ごとの再生数の大きさそのものではなく、その動画がチャンネル内で相対的に当たった側に入るかどうかを分析します。
ここが1本目との大きな違いです。
| 分析 | 目的変数 | 見ているもの |
|---|---|---|
| 重回帰分析 | 連続値 | パフォーマンスの大きさ |
| ロジスティック回帰 | 0 / 1 | ある状態になる確率 |
補足:なぜ二値化するのか
ロジスティック回帰は、連続的な数値をそのまま目的変数にする方法ではありません。
そのため、
views_per_dayをそのまま入れるのではなく、何らかの基準で0/1に変換します。累積再生数を使って「上位25%なら1、それ以外なら0」のようにすることもできます。ただし、累積再生数は公開後日数の影響を強く受けます。古い動画ほど、再生数を積み上げる時間が長いからです。
そこで今回は、まず
views_per_dayを使い、さらにチャンネル内中央値を基準にして二値化しました。
データ
今回も、1本目と同じYouTube公開メタデータを使っています。データ取得の詳しい条件は、1本目の記事を参照する形にします。
この2本目では、ロジスティック回帰用に目的変数を作り直しました。また、チャンネル内中央値を使うため、今回の取得期間内で動画数が少なすぎるチャンネルは除外しました。
具体的には、直近6ヶ月の取得動画数が5本未満だったチャンネルを除外しています。対象チャンネルは58チャンネルあり、そのうち5チャンネルを除外しました。個別のチャンネル名は公開しません。
| 項目 | 内容 |
|---|---|
| 対象動画数 | 1,192本 |
| 対象チャンネル数 | 53チャンネル |
| 除外前のチャンネル数 | 58チャンネル |
| 除外条件 | 直近6ヶ月の取得動画数が5本未満のチャンネルを除外 |
hit_median = 1 の割合 |
0.490 |
目的変数は、ほぼ半分が 1、半分が 0 になっています。これは中央値を基準にしているため、自然な結果です。
技術スタック
今回の分析は、Pythonで行いました。
主に使ったものは次の通りです。
| 用途 | 使用したもの |
|---|---|
| データ加工 | pandas |
| 数値計算 | NumPy |
| ロジスティック回帰 | statsmodels |
| グラフ作成 | Matplotlib |
ロジスティック回帰は、statsmodels の一般化線形モデル(GLM)で、二項分布・ロジットリンクを使っています。
モデル
モデルは、1本目の重回帰分析と同じように、変数を順番に足していきます。
| モデル | 入れたもの |
|---|---|
| L0 | 登録者数だけ |
| L1 | L0 + 動画尺 |
| L2 | L1 + 投稿頻度 proxy、公開後日数、18〜21時公開、週末公開 |
| L3 | L2 + ジャンル |
重回帰のA2では、公開時刻と曜日を細かいカテゴリで入れていました。
ただ、ロジスティック回帰では、一部の時間帯が少なすぎると係数が不安定になりやすいです。そのため今回は、公開時刻を 18〜21時公開、曜日を 週末公開 に圧縮しました。
結果
モデルの性能は次の通りです。
| モデル | McFadden疑似R² | Accuracy | AUC | AIC |
|---|---|---|---|---|
| L0_subscriber_only | 0.000 | 0.510 | 0.500 | 1656.0 |
| L1_duration | 0.002 | 0.518 | 0.523 | 1657.4 |
| L2_posting_timing | 0.049 | 0.617 | 0.639 | 1586.6 |
| L3_genre | 0.056 | 0.618 | 0.660 | 1584.7 |
ここで注目したいのは、L0です。
L0は登録者数だけのモデルですが、AccuracyもAUCもほぼ0.5です。AUCが0.5に近いということは、ざっくり言えば、ランダムに近い判別しかできていないということです。
1本目では、登録者数は強く見えました。
しかし、「同じチャンネル内で相対的に当たったか」という問いに変えると、登録者数だけではほとんど判別できません。
これは、目的変数の作り方を変えることで、チャンネル規模の影響を少し弱められている可能性があります。
一方で、L2とL3ではAccuracyとAUCが少し改善しています。投稿タイミングや公開後日数、ジャンルを足すと、同じチャンネル内で相対的に当たった動画かどうかを少しだけ見分けやすくなっています。
補足:Accuracy、AUC、AIC、McFadden疑似R²とは
Accuracy(アキュラシー) は、予測がどれくらい当たったかを見る指標です。今回でいえば、モデルが
hit_median = 1か0かを予測して、それが実際の値と一致した割合です。AUC は、モデルが
1の動画を0の動画より高く順位づけできているかを見る指標です。0.5ならランダムに近く、1に近いほど判別がうまいと考えます。AIC は、モデルの当てはまりの良さと複雑さのバランスを見る指標です。比較しているモデル同士では、AICが小さい方がよいと読みます。
McFadden疑似R² は、ロジスティック回帰で使う説明力の目安です。重回帰のR²とまったく同じものではありません。何も説明変数を入れないモデルと比べて、どれくらい当てはまりが改善したかを見る指標です。
どの変数が効いていそうか
次に、L3モデルの主要なオッズ比を確認します。
ロジスティック回帰では、係数そのものよりも、オッズ比で見ると直感的です。
L3モデルの主要なオッズ比は次の通りです。
| 変数 | オッズ比 | 95%信頼区間 | p値 |
|---|---|---|---|
| 動画尺 | 1.003 | [0.995, 1.010] | 0.477 |
| 動画尺^2 | 1.000 | [1.000, 1.000] | 0.604 |
| 登録者数(log) | 1.010 | [0.902, 1.132] | 0.859 |
| 投稿頻度 proxy | 0.745 | [0.461, 1.203] | 0.229 |
| 公開後日数 | 0.984 | [0.980, 0.987] | < 0.001 |
| 18〜21時公開 | 1.009 | [0.767, 1.326] | 0.951 |
| 週末公開 | 0.905 | [0.696, 1.177] | 0.457 |
L3では、公開後日数のオッズ比が1未満です。
これは、公開後の日数が長い動画ほど views_per_day が落ち着きやすく、チャンネル内中央値超えになりにくい、という見え方を拾っている可能性があります。
投稿頻度 proxy も1未満に出ていますが、これは指標が粗いので慎重に読む必要があります。
単純に投稿本数が多いほど不利というより、チャンネルごとの投稿スタイルや動画の種類が混ざっている可能性があります。
動画尺については、今回のロジスティック回帰では大きな効果としては見えません。
少なくとも、「長い動画ならチャンネル内で当たりやすい」と断定できる結果ではありません。
補足:オッズ比とは
オッズ比 は、ロジスティック回帰でよく使う「なりやすさの倍率」です。
今回でいえば、
hit_median = 1、つまり同じチャンネル内でviews/dayが中央値を超える「なりやすさ」が、説明変数によってどれくらい変わるかを見ています。オッズ比が1より大きい場合は、
hit_median = 1になりやすい方向です。オッズ比が1に近い場合は、ほとんど変化がないと読みます。オッズ比が1より小さい場合は、hit_median = 1になりにくい方向です。ただし、オッズ比は「再生数が何倍になる」という意味ではありません。たとえばオッズ比が1.2でも、再生数が1.2倍になるわけではありません。あくまで、今回定義した
hit_median = 1になるなりやすさの変化として読みます。
今回分かったこと
今回分かったことは、シンプルです。
登録者数は、チャンネル間の規模差を見るには強い。けれど、同じチャンネル内でどの動画が相対的に当たるかを見るには、それだけでは足りない。
1本目の重回帰では、登録者数が強く出ました。
今回のロジスティック回帰では、登録者数だけのモデルはほぼランダムに近い判別でした。
これは矛盾ではなく、見ている問いが違うということだと思います。
「大きいチャンネルは再生されやすいのか」と、「同じチャンネルの中で、どの動画が上振れするのか」は、別の問いです。
そのため、今回の結果は「動画の再生数を伸ばす方法」を直接示しているわけではありません。むしろ、チャンネルの人気度や規模とは少し切り離したところで、動画単位の上振れをどう扱うか、という分析です。
この違いが、今回の分析で一番おもしろかったところです。
限界
今回の分析にも、山ほど限界があります。
-
中央値超えにしたことで、情報を落としている
中央値超えという目的変数は分かりやすい一方で、情報をかなり捨てています。少しだけ中央値を超えた動画も、大きく当たった動画も、同じ
1になります。 -
除外条件には任意性がある
チャンネル内動画数が少ない場合、中央値の基準は不安定になります。今回は直近6ヶ月の取得動画数が5本未満のチャンネルを除外しましたが、この閾値の置き方にも任意性があります。
-
因果効果は言えない
今回も観察データなので、因果効果は言えません。ロジスティック回帰にしても、「この特徴があるから当たった」とは言えません。
-
見ていない要素が多い
今回のモデルはまだ素朴です。サムネイル、企画内容、出演者、視聴者層、競合動画、外部流入などは見ていません。
-
チャンネルごとの違いを十分に扱えていない
今回の分析では、全チャンネルを横断して1つのモデルにまとめています。そのため、「全体として見ると中央値超えと関連しそうな要素」は見ていますが、「各チャンネルごとに何が上振れにつながるのか」を十分に評価できているわけではありません。
実際には、動画が上振れする理由は、チャンネル独自のコンテンツの性質、視聴者層、企画の型、シリーズ性などに大きく左右される可能性があります。
したがって、今回の結果を「どのチャンネルにも共通する上振れの法則」として読むのは難しいです。
次にやるなら
次にやるなら、チャンネルごとの違いをもっと明示的に扱いたいです。
今回の分析では、目的変数をチャンネル内中央値で作ることで、チャンネル規模の影響を弱めました。ただし、全チャンネルを横断した1つのモデルにしているため、チャンネルごとに何が上振れにつながるのかまでは十分に評価できていません。
次の段階では、まずチャンネル固定効果を入れて、チャンネルごとの基準値の違いを調整した分析を行いたいです。
そのうえで、さらに進めるなら、階層ベイズ的なアプローチも検討したいです。特に、チャンネルごとに説明変数の効き方が違うのか、たとえば動画尺や公開タイミングの効果がチャンネルによって変わるのかを見たいと考えています。
ただし、階層ベイズまで一足飛びに進むと、モデルの解釈も難しくなります。
今回も、コードのかなりの部分はAIに支援してもらっています。正直、私ごときがこの短時間でここまで実装できていること自体、控えめに言って破壊的だと感じています。
実装コストだけを見ると、複雑なモデルに進むハードルはかなり下がっています。
一方で、結果が出たあとに、それをどう解釈すべきかは別問題です。むしろ、モデルが複雑になるほど、出てきた係数や分布をどう読むのかに、人間のおじさんの頭をもろに使います。
そのため、まずは固定効果モデルでチャンネル差を整理し、その次に階層モデルへ進むのがよさそうです。
今回もまだ探索的な分析です。
ただ、重回帰で見えていた「登録者数が強い」という結果を、目的変数を変えて捉え直すと、違う見え方になることが分かりました。
統計って、やっぱり面白いです。
マーケティングサイエンスって、やっぱり深い。
またさらにもっとやっていきます。

