【Tableau】ビデオリサーチの視聴率ランキングを勝手にTableauで再現する【Data Saber Apprentice】

この記事は Tableau DATA Saber Apprenticeのコミュニティポイント稼ぎの記事です。

 

視聴率ってありますよね。ビデオリサーチさんが提供しているアレです。そして何よりテレビ局はじめ業界では”通貨”として使われている、非常に重要なデータです。

そんなビデオリサーチさん、ホームページ上にて週間視聴率ランキングを公開しています。

www.videor.co.jp

このランキング、見ている分にはそれなりに楽しいのですが、もっと期間やジャンル・エリアを操作できるなど、動的なインタラクションが欲しくなるのもまたあるかと思います。特に期間は、過去分や区切り方を変えたデータも簡単に出力できるとすっごく楽しいですよね。

ということで、今回は上記コンテンツをTableau上で再現してみようという試みです*1

 

そもそも、どんなデータなのか?

ランキングから読み取れるデータの仕様を簡単に整理すると、下記の通り。

  • エリアごとの集計(今は関東のみ)
  • ジャンルごとに切り替え可能
  • 同じ番組が対象期間に何度か放映された場合は、視聴率が最大のものを使用*2
  • 「平均視聴率」を用いてランク付け(1分ごとの視聴率を平均?)
  • 放映時間が15分に満たない番組はランキング対象外

ということは、ビデオリサーチさんの収集している視聴率データのローデータは、どんなに粗くとも1分粒度になっていると思われます。CM接触をより正確に判定したかったり、チャンネル切り替えの影響を詳細に見たかったりすれば、15秒〜30秒単位で収集している可能性も高いですが、そのへんは今回のランキングからはわかりません。

ともあれ、1分粒度のデータを関東2700世帯から収集し続けているとすると、1日あたりのテレビ視聴時間が180分程度として、ビデオリサーチさんの保持するローデータは関東だけで1日約50万レコード程度でしょうか*3

ダッシュボード用のダミーデータを用意する

とはいえ、日次で50万レコードずつ増えていくログ(しかも文字列情報が多い)を、いちいちhyperに変換してTableauで頑張って扱っていくのは、流石にパフォーマンスが悪くなっちゃうんじゃないかと思うわけです。

ということで、今回はデータベース上でエリア×日時×番組粒度の接触率テーブルまで集計してしまって、そこからTableauで操作していると想定します。

結果、1ヶ月分のインプットデータは下記のとおりになりました*4。当然、放送日も視聴率も適当です。

f:id:meow3571:20200419145306p:plain 

番組ごとの最大視聴率を判定してみる

ここからダッシュボードの作成に移ります。

まず調べたいのは、「期間を可変(フィルターで操作)したときに、番組ごとに視聴率が最大だったのはいつ(どのレコード)か? 」ということ。 

エリア×番組×放送日粒度のデータに対して、エリア×番組粒度の集計をするので、LOD表現が使えます。LODについては、下記のようにいろんなサイトで解説されていますね。私はよくわかりません。

data-viz-lab.com

 

さて、下記の2パターンのLOD表現を用いて、エリア×番組ごとの最大視聴率を求めました。

f:id:meow3571:20200419150456p:plain

f:id:meow3571:20200419150546p:plain

結果は下記の通り、一致しています。

f:id:meow3571:20200419150221p:plain

 

結果が一致しているので一見どちらを用いても良さそうですが、実はそう単純な話ではありません。

下図は期間をフィルターで絞り込んで、4月後半だけのデータで判定した場合です。

f:id:meow3571:20200419151210p:plain

『3年A組』では引き続き両者が一致していますが、『3年B組金八先生』『1リットルの涙』 では、excludeとfixedでの結果が異なっています。『1リットルの涙』を例に取ると、フィルターで期間を絞ったにもかかわらず、フィルターで対象外になったはずの4/7の視聴率が最大値として計算されています。

 

そう、これこそが、かの有名なクエリパイプラインの為せる業でございます。

Tableau上での処理の順番には決まりがあって、今回に関連する範囲でいうと、

fixed → ディメンションフィルター(日付の絞り込み) → exclude

という順序で処理が行われるらしいです。今日の最重要ポイントです。

引き続き『1リットルの涙』を例に出すと、

  • fixedで計算して、4/7の値を最大値として持ってきたよ!
    → フィルターでレコードを4/15以降に絞ったよ!(でも4/7の最大値は覚えてるよ)
  • フィルターでレコードを4/15以降に絞ったよ!
    → excludeで今あるデータから最大値を計算したら、4/16の値だったよ!

という処理順序の違いが原因だったのです。なので、今回の場合はexcludeを使うのが適切です*5

ランキングを作成してみる

ここまで来たらあとは簡単。下記のように最大視聴率flgでも作ってから、フィルターで該当レコードに絞り込んでしまえば、後は残ったレコードを視聴率の降順で並び替えてあげるだけ。f:id:meow3571:20200419152957p:plain

フィルターによるエリア・ジャンルの切り替え機能や、URLアクションによる番組検索機能もつけて、出来上がりがこちら。

f:id:meow3571:20200419153521p:plain

33分探偵』『ウレロ☆未体験少女』のような深夜ドラマの名作がきちんと上位にランクインしていますね。乱数なんですけど。 期間の自由度がビデオリサーチよりも高い点が特徴です。 

参考までに、URLアクションの設定はこんなかんじです。

f:id:meow3571:20200419153830p:plain 

まとめ

「ビデオリサーチさんの視聴率ランキングをTableau化したらどうなる?」をお題に色々と遊んでみました。個人的には書籍やサイトの事例トレース以外で初めてLOD表現を使ってきました。特にクエリパイプラインを意識したfixed, excludeの挙動の違いを確認できたのは非常にいい機会になりました。

ところで、上記のダッシュボードをTableau Publicにアップロードしたら、URLアクションが思うように機能してくれなかったのですが、これはTableauの作り方の問題なのか、PC(ブラウザ)側の設定の問題なのか、よく分からなかったです。今後の課題。

ということですので、ビデオリサーチ様(やその競合の皆さま)、いつでもお仕事お待ちしておりますm(_ _)m

*1:もちろん、当然のことながら私とビデオリサーチには何の関係もございません。新卒採用で落ちたのが人生最大の接点です。

*2:この記事を執筆中に確認した4/6~4/12のランキングではNHKニュース7が2回登場して原則に反するのですが、4/7の安倍首相による緊急事態宣言の会見の臨時中継をニュース7扱いしていると思われます。

*3:ちなみにビデオリサーチさんは2020年4月から視聴率データを大幅リニューアルしたので、全国ではその数倍のログを取得しているはずです。

*4:今回は面倒だったので、エリア:東京、ジャンル:ドラマだけしか作ってません。データはこちらからどうぞ。

*5:fixedを使う場合はコンテキストフィルターにすると良いです。クエリパイプライン、重要ですね!!!