中目黒で『青の洞窟』というライトアップイベントが2014/11/23(日)〜12/25(木)まで開催されている。
イタリアの青の洞窟をモチーフに、今年ノーベル賞を受賞した青色LEDによるものだ。
しかし、イベント開始後2週間であまりの混雑により、土日祝日のライトアップは中止となった。
さて、こうなるとカップルのイシュー(私は行けそうもありませんが、。)は、
クリスマス週のライトアップ日である、
12/22(月)、12/24(水)、12/25(木)、一体いつが一番混むのか、ということになる。
先日公開された東京メトロOPEN API DATAをうまく使えないか、と思いましたが、
列車のリアルタイムの運行状況となっているため、乗降客数は、さすがにリアルタイムでわからない。[ref]東急線の駅ごとの平均乗降客数は東急により公開されております。[/ref]
そこで、困ったときの「リアルタイム検索データ」ということで、
11/23(日)以降の「青の洞窟」を含むtwitter検索数推移を用いて時系列予測モデルを作成することにしました。
※tweetの多い日は実際の来場者も多いはず、という仮説でして、これはのちほど検証します。
まずデータ収集。
Yahoo!リアルタイム検索では、「24時間」「7日間」「30日間」の3つのスパンごとに
twitterデータが公開されております。
このうち、時刻別でのtweet数を確認できるのは「24時間」「7日間」となります。
分析には「30日間」の1ヶ月間の日別データを用いることにし、
必要なら「7日間」の時刻別(2時間おき)データで前処理すべきか考えることにしました。
まずは、今回のアプローチがおおむね良さそうか、「7日間」の時刻別データを確認しておくことにします。
【12/14〜12/20までの「青の洞窟」tweet数時刻別推移】
【12/14〜12/20までの「青の洞窟」tweet数時刻別集計】
こちらを見ると、おおよそ16:00以降、徐々に増加し、20:00〜24:00くらいにピークがあることがわかります。
点灯時間が17:00〜21:00であることを考えると、
点灯前くらいから徐々にtweetが増加し、点灯中、点灯後2,3時間ほどにtweetされていることがわかります。
実際にリアルタイム検索のtweetの中身を見ても、それを裏付けることができそうです。
よって、以下2点の仮説をおいて、議論を進めることにします。
(1) tweetは、実際に来場している時間帯に集中し、それ以外の時間帯は少ないことから、来場した人のtweetが多数。
よって、tweetから、おおよその来場者の推移(実数というより相対値)を想定することは可能かと思われる。
(2) 時刻別の分布によっては、17:00-21:00までの時間内のtweetに絞って集計すべきかと思いましたが、
その前処理をしなくても、そもそも多くのtweetが点灯中の時間内および行った人の
点灯時間後2,3時間に集中していたことからそのままの日別データを使うことにします。[ref]もし1ヶ月間の時間別のデータを、オープンデータ(つまりはリアルタイム検索経由)で収集しようとしたら、
1週間ごとにリアルタイム検索することになりますかね、。
※twitter api経由のtweet取得の場合は1リクエスト100件までのオープンストリームからのデータ[/ref]
さて、では日別tweetデータを用いて分析していきます。
今回、tweetデータを「曜日」「祝日フラグ」「クリスマスへのカウント」「バズフラグ」という要因があるとしました。
※クリスマスへのカウント:11/23から12/25までベースとしては徐々に盛り上がっていくという仮説で、1週ごとにカウント。
※バズフラグ:イベント中止などの外部要因で突発的な伸びがあるか。
今回は下記期間をバズフラグとして設定
11/23〜11/26:開始直後のバズ
12/07〜12/08:12/6(土)の混雑により、12/7が中止決定となったことによるバズ
12/11〜12/13:以降の土日祝日は点灯中止が決定となったことによるバズ
day | tweet | sun | mon | tue | wed | thu | fri | holiday1 | week | buzz |
11/23 | 1060 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
11/24 | 2010 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
11/25 | 1944 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
11/26 | 1121 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
11/27 | 673 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
11/28 | 906 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
11/29 | 1062 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
11/30 | 1026 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
12/01 | 1155 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
12/02 | 835 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 2 | 0 |
12/03 | 769 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 |
12/04 | 813 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 0 |
12/05 | 606 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 |
12/06 | 912 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
12/07 | 1195 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 1 |
12/08 | 1456 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 1 |
12/09 | 1038 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 3 | 0 |
12/10 | 1352 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 3 | 0 |
12/11 | 1725 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 3 | 1 |
12/12 | 1695 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 3 | 1 |
12/13 | 2328 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 1 |
12/14 | 1427 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 |
12/15 | 619 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 4 | 0 |
12/16 | 1245 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 4 | 0 |
12/17 | 1011 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 4 | 0 |
12/18 | 1580 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 0 |
12/19 | 1617 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 4 | 0 |
12/20 | 1611 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 |
こちらをRstudioにインポートして、重回帰した結果が以下となります。
【要因ごとの係数】
Estimate | Std. Error | t value | Pr(>|t|) | ||
(Intercept) | 873.11 | 215.69 | 4.048 | 0.000755 | *** |
sun | -455.12 | 222.00 | -2.050 | 0.055213 | . |
mon | -543.13 | 239.13 | -2.271 | 0.035638 | * |
tue | -212.75 | 219.39 | -0.970 | 0.345033 | |
wed | -415.00 | 219.39 | -1.892 | 0.074748 | . |
thu | -280.50 | 219.39 | -1.279 | 0.217300 | |
fri | -272.25 | 219.39 | -1.241 | 0.230561 | |
holiday | 884.03 | 381.04 | 2.320 | 0.032289 | * |
week | 180.51 | 55.86 | 3.231 | 0.004634 | ** |
buzz | 615.48 | 135.78 | 4.533 | 0.000258 | *** |
決定係数が0.67となりました。これをどう考えるかですが
今回の目的は正確なtweet予測というより、12/22、12/24、12/25のtweet予測比較ですので、
このモデルを採用することにします。[ref]こちらの記事でジャンルごとの重回帰の決定係数の目安がご紹介されております。
※ちなみに、曜日変数でいくつか90%有意でないものがありますね、。(気にせず進めます。。)
続いて、ニューラルネットワークでも予測モデルを作成してみます。
ちなみに、Rでニューラルネットワークを使うには、nnetあるいはneuralというパッケージがあります。
neuralは最新の3系では対応していないようなので、2.7あたりを
ニューラルネットワーク処理用に別バージョンとして持っておくと何かと便利かと思います。
中間レイヤーは2層で、第1レイヤーに5つ、第2レイヤーに3つのノードを設定し、
1000回の繰り返しで学習しました。
ちなみに重回帰や決定木と異なり、
ニューラルネットワークは決定要因の解釈が難しいですが、
むしろ人間では言語化できない複雑な要因の組み合わせを機械に学習させるときに
ニューラルネットワークは向いていると思います。
さて、予測モデルによる、12/21以降のtweet数はどうなったかというと、、
下記のとおりです。
※青線:実測値
紫線:重回帰の予測値
赤線:ニューラルネットワークの予測値
【「青の洞窟」tweet数の予測値推移】
ニューラルネットワークのほうが、イベント初動の推移および、
直近の変動をうまく表現できているようです。
そして、、どちらもモデルでも、
「12/25(木)」が最もtweetが多くなる(混雑する可能性がある)
ということなりました。
補足しますと、モデル上は12/23のtweetがそこそこ多くなっておりますが、
実際にはもっと少なくなると思います。
実は12/11の祝日点灯中止発表以降で、祝日がなかったため
「点灯中止のときの祝日はどれだけ普段時よりtweetが下がるか」の要因が分析できていないためです。
また、12/22は月曜日であるものの、
翌日が休日である、ということがどこまで来場に影響するか、、未知数ですね。
さて、実際にはどういう結果になりますでしょうか。
繰り返しますが、残念ながら、私は行くことができなそうです、。