ドラマの視聴率を予測する(1)〜初回視聴率を予測して、キャストの視聴率を算出する。

こんにちは、ソーシャルビッグデータサイエンティストです。


最近のデータ解析ブームの流れにのって何か面白いデータ解析でもやってみようと思い、データサイエンティストこじらせた結果、
「今まで機械学習的な方法論使ってないところに機械学習的な方法論使うと面白いんじゃないか。」と思って
今回ドラマの視聴率で予測モデルの構築を試してみたのですが、結論を先に言うと、ニューラルネットワークやRFとか、小難しい方法尽く試した結果、失敗しました。


残念なクオリティですが、放送年度と時間帯と言った基本的な数値だけで予測モデルを構築、メモとして、一旦ブログに残しておきます。


1.データの取得
データについてはこちらのドラマ視聴率を参考に、足りないデータはWikipediaで補完して取得しました。

取得データ:ドラマの各話視聴率、キャスト、タイトル、また、Wikipediaを参考にドラマのジャンルを取得しました。
対象期間:2003年1月期〜2013年1月期
対象放送局:日本テレビ、TBS、テレビ朝日、フジテレビ
対象放送時間帯:20〜23時台

ドラマのジャンルは1ドラマが1ジャンルに所属するように以下のジャンルにWikipeddiaのページの内容を
元に機械的に推論したものを手作業で修正をかけて取得しました。
ジャンルの振り方については恣意性は否めないですが、どうせ有意差なかったので、いまやどうでもいいです。



2.ドラマの視聴率に与える要因を考えてみる。
ドラマの視聴率に影響を与える要因って色々なものが考えられると思うのですが、多分以下の様な要因かなと思っています。


ドラマの視聴率に影響を与えそうな要因
年度(長期トレンド)、4半期(周期的要因)、放送曜日、局、時間、キャスト、脚本家、同時間帯の前ドラマの最終回視聴率、ジャンル、面白さ、裏番組の強さ


ドラマの面白さや脚本家の効果が少なくなるように、連続ドラマの第1話の視聴率を予測する変数としています(理由は後述)。
今回は、最後の3つを除いてデータを取得していることになります。


3.機械学習モデルの構築と失敗
最初に作った予測モデルは、ランダムフォレストの回帰木を用いました。
時間帯やある程度主要なキャストにのみフォーカスして、各キャストの出演を表すダミー変数を作成しました。
時間帯や年度ジャンルを表すダミー変数も作成して、m=1000程度の予測変数でデータ数n=500のドラマの第1話視聴率を予測してみましたが、色々無理でした。

その後、PLSやリッジ回帰等も試して見ましたが、決定係数は0.3くらいで全然ダメ。結局、別の方法を考えてることに。



4.分析の基本、散布図と箱ひげ図に立ち返る。
やっぱりキャストの数含めて圧倒的にダミー変数が多すぎるのが問題であるので、モデル構築は一旦忘れて、
分析の基本、散布図と箱ひげ図に立ち返って、各要因を眺めてみたいと思います。
次の表はドラマの視聴率のヒストグラムです。



正規分布というよりはポワソン分布っぽい形に見える気がします。


・時系列的な要因(年度と4半期)
Rのdecompose関数を用いて、ドラマの初回視聴率を加法モデルでトレンド要因と4半期ごとの季節要因と誤差に分けたのが以下の図です。



以下がR上で出力したトレンド成分の元データです。

>dets$trend
         Qtr1     Qtr2     Qtr3     Qtr4
2003       NA       NA 14.14831 14.22333
2004 14.33354 14.70851 14.82425 15.05177
2005 15.44164 15.47893 15.55655 15.66856
2006 15.43191 15.16733 15.01629 14.67898
2007 14.38083 14.31211 14.02714 13.68280
2008 13.57845 13.47857 13.34959 13.15587
2009 12.93400 12.67909 12.36387 12.50027
2010 12.75232 12.79947 13.08385 13.01115
2011 12.73606 12.83365 12.86635 12.69154
2012 12.55217 12.29805       NA       NA


よくドラマの視聴率は下がっていると言われますが実際に下がっているようです。


2005年第4四半期の視聴率15.6685%

2012年第2四半期の視聴率12.2980%


と最高時の視聴率から最新の視聴率が3.3%も下がっています。


総務省の情報通信白書によると、時間帯別TV全体の視聴率が

2005年11月43.2%(21:00)

2012年11月40.2%(21:00)

なので、ドラマの下がり具合がTV全体の視聴率の低下同程度となっています。


これは、23時のドラマが2007年頃から増えたため、ドラマの四半期別視聴率が
最新のものほど下がっているのではないかと思ったのですが、


以下の20時代から22時台の年度別平均(ドラマの初回視聴率)でも、同様の傾向が見られたので、
どうやらそうでもないようで、ドラマ自体が厳しい状況があるようです。

> aggregate(x$rating.1, list(x$year), FUN=mean)
   Group.1        x
1     2003 14.00392
2     2004 14.93478
3     2005 15.46279
4     2006 15.10213
5     2007 14.25455
6     2008 13.30339
7     2009 12.08305
8     2010 12.38966
9     2011 12.44000
10    2012 11.58033
11    2013 11.50667


・放送時間帯(放送曜日+放送局+時間)
放送曜日と放送局と時間帯をあわせて放送時間帯と定義しました。平たく言うと「フジの月9」みたいなアレです。


以下は放送時間帯別初回視聴率の箱ひげ図です(日テレ木曜24時は横軸にありますがデータは存在しません)。



以下は各時間帯の平均初回視聴率からドラマ全体の平均視聴率を引いたものです。
こうして見ると各時間帯が持っているブランド価値みたいなのがよく見えて生々しいですね。
下位にランクインしているものはことごとく放送を終了しています。

> sort(timezoneeffect, decreasing=TRUE)
  フジ 月 21    TBS 日 21   フジ 木 22   フジ 火 21 日テレ 土 21 テレ朝 水 21    TBS 金 22   フジ 火 22 
   5.3181673    3.3284878    1.8840884    1.2284878    0.4233596    0.2490006    0.2104042    0.1981673 
日テレ 水 22    TBS 日 22 テレ朝 木 21    TBS 木 21   フジ 水 21 日テレ 火 22    TBS 木 22 テレ朝 金 21 
   0.1310519   -0.2843327   -0.6600084   -1.0109994   -1.3843327   -1.6718327   -1.9748089   -2.1474906 
   TBS 土 20    TBS 月 20    TBS 水 21   フジ 日 21 テレ朝 金 23   フジ 土 23    TBS 水 22 日テレ 月 22 
  -2.5570600   -2.9954438   -3.1843327   -3.3065549   -3.3787771   -3.7986184   -4.1843327   -5.5843327 
テレ朝 日 23 
  -6.2843327 


以下はおまけで放送曜日、放送局、時間のそれぞれの箱ひげ図です。





流石は俺達のフジテレビさんだ!


・前回のドラマの最終話視聴率
前回のドラマの最終話視聴率を横軸に、新ドラマの視聴率の初回視聴率を縦軸に取ったのが以下のプロットです。
ある程度の相関が見られるようですが、外れ値なんかも結構有りそうなので、
前処理を丁寧に行えば予測精度を上げられたんじゃないかと今は後悔しています。



・ジャンル
ドラマのジャンル別の視聴率が以下の通りです。


下記で結構強引な予測モデルを構築していながら、分散分析で有意差なんかも見ているのですが、残念ながらジャンルの効果だけありませんでした。
グッバイ!俺のジャンル集め作業、4時間。


6.上記の4つの要因を数字に置き換えて予測モデルを構築する。
ここでちょっと強引なことをします。先ほどの、各4半期での季節要因を除去したトレンドの視聴率*1、放送時間帯別視聴率の偏差、ジャンル別の平均視聴率偏差、前回ドラマの最終話の視聴率*2を予測変数として、
ドラマの初回視聴率を被説明変数とする、線形回帰モデル*3を構築します。モデルのマリーはこんなところです。

> summary(m)

Call:
lm(formula = rating.1 ~ trendp + timezonep + genrep + rating.lastdrama, 
    data = bcdf.model)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.6682 -1.9878 -0.1363  1.4224 14.2938 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      12.90161    0.39895  32.339  < 2e-16 ***
trendp            0.72435    0.12642   5.730 1.72e-08 ***
timezonep         0.91070    0.05926  15.368  < 2e-16 ***
genrep            0.03528    0.19275   0.183   0.8548    
rating.lastdrama  0.06130    0.02954   2.075   0.0385 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.939 on 512 degrees of freedom
Multiple R-squared: 0.4611,	Adjusted R-squared: 0.4569 
F-statistic: 109.5 on 4 and 512 DF,  p-value: < 2.2e-16 


うーん、イマイチ。まぁ、要らない変数もあったみたいですが、細かいことは気にしません(え)。
これを元にモデル構築に用いなかった2013年度1月期のドラマの初回視聴率を予測した結果が以下の図です。



グラフにしてしまうと、予測モデルとしてイケている感じしかしないのは僕だけでしょうか?
ちなみにこの場合、このグラフの見方としては斜線の右下にあるのは、予測値に対して実績値が下回っているので、
2013年1月期にいちばんイケてないのは・・・おや誰か来たよう(ry


ここで、予測された初回視聴率はドラマのキャストや脚本家によらない、ドラマの初回視聴率ということになると思います。


7.キャストによらない初回視聴率からキャストの視聴率を算出する。
さらにここで強引なことをします。ここで予測された視聴率を実際の視聴率から引いたもの(偏差)をキャストが持っている視聴率と考えます。
(実は初回視聴率を使っているのは、初回視聴率であれば脚本家による脚本の面白さみたいな効果が出てこないと考えたためです。このキャスト視聴率を他の分析に活用したいと考え初回視聴率を予測対象としました。)



数式として意味のあるものではないですが、脳内推論として


初回視聴率実績 = 時間帯 + 放送年度 + ジャンル + 前回ドラマの最終回視聴率 + キャスト + 誤差

初回視聴率実績 - キャストによらない視聴率予測 = キャスト + 誤差


こんな感じの展開をしています。


この偏差を主要5キャストで分配します。これを各俳優で過去にこれまでに主要5キャストとして出演したドラマによる平均を取ります。
例えば、俳優XがドラマA(主演)、ドラマB(2番手)、ドラマC(4番手)で出演している場合、俳優Xの視聴率は


俳優Xの視聴率=(
(ドラマAの初回視聴率実績-ドラマAの初回視聴率予測)×[主演の分配重みつけ]+
(ドラマBの初回視聴率実績-ドラマBの初回視聴率予測)×[2番手の分配重みつけ]+
(ドラマCの初回視聴率実績-ドラマCの初回視聴率予測)×[4番手の分配重みつけ]
)/3


となります。


まぁ、ややこしく話しましたが単純にキャストの過去実績から時間帯や主演年度など考えうる効果を排除した上での視聴率を按分、集計してキャスト視聴率としているだけです。


以下はキャスト視聴率の高い俳優BEST30です。

  no.木村拓哉 no.松嶋菜々子   no.福山雅治   no.吉岡秀隆 no.矢田亜希子   no.柴咲コウ   no.深津絵里 
         3.08          2.68          2.09          1.55          1.51          1.40          1.17 
no.京野ことみ   no.勝村政信     no.平泉成     no.赤西仁   no.生瀬勝久   no.岡田准一     no.阿部寛 
         1.08          0.99          0.99          0.94          0.86          0.84          0.83 
no.仲間由紀恵   no.時任三郎       no.小雪 no.綾瀬はるか   no.八嶋智人 no.黄川田将也   no.高木雄也 
         0.82          0.78          0.77          0.75          0.73          0.73          0.72 
    no.堤真一   no.江口洋介     no.渡辺大   no.賀集利樹     no.松尾諭     no.筧利夫   no.市原隼人 
         0.70          0.66          0.65          0.64          0.64          0.63          0.62 
  no.内野聖陽   no.鹿賀丈史 
         0.60          0.60 

まぁ、知らない人もいますが・・・1位がキムタク兄さんで安心しました*4


全部のキャスト視聴率を見てみたい放送関係者の方がいればデータをあげるのは公開しなければ無問題なので、知り合いの方を介してください。


8.最後に
このキャスト視聴率を用いて今後の分析をしようと思っているのですが、ちょっとこの予測モデルを作っている間に無理ゲーっぽいようで心が折れたので、
尻切れトンボですが、今回はここまで。ちなみにキャスト視聴率を予測モデルに入れた際の効果をk交差検証法で検証してみたところ、平均して、
決定係数5.5〜6程度で推移していたので、結構いい線いったのかもしれませんが、失敗ですね。


飽きてきたので、もう少し扱いやすいデータをしばらく触ってみて、気が向いたらこのデータをもう一度触ってみようと思います。
俺達の戦いはまだハジマッタばかりだ!

*1:値のつかない箇所は端の値で補完します。

*2:前回ドラマがないものは当該時間帯の平均視聴率で補完しています

*3:glm関数でもモデル色々変えて試したけど、大して結果変わらなかったので、線形回帰の結果を使用しています。

*4:個人的にはキムタク兄さんダミー変数は初期の機械学習モデルから残して予測モデルを作っても良かったような気もします。キムタク兄さんだけで残りの誤差、全部説明出来るような気がします。