ミリオンライブ!キャスト投票のVisualization

キャスト投票の推移が面白い

アイドルマスター ミリオンライブ!では、「CD&ボイスドラマ キャスト投票キャンペーン」が行われています。

いわゆるシンデレラガールズでの総選挙とは違って、投票券がガチャで貰えるタイプ*1ではないため、Pたちの駆け引きが繰り広げられているようです*2

駆け引きの起きる理由と、その動きについては次の記事などを参考にしてください。

ch.nicovideo.jp

こんな時はデータを眺めるに限りますね。

幸いデータはどなたかがTwitter botとして投稿してくださっていたので、それを利用します。

ミリオンキャスト選挙bot (@ml_castvote) | Twitter

「勇者」もつれ合う登り龍の如く

f:id:AOI-CAT:20160424210408p:plain

一番の注目は「勇者」役です。事実上「七尾百合子(H.N. lily_knight)」「望月杏奈(H.N. vivid_rabit)」のトップ争いです。

これを書いている時点で1位:杏奈(41,264票)、2位:百合子(41,055票)で得票差は209票です!

接戦の行方

接戦が続く「勇者」役と同じく、いくつかの役は数百票の差で1位争いが行われています。

  • 悪徳組長」役は、1位:木下ひなた(30,121票)、2位:徳川まつり(29,964票)で157票差。
  • 「用心棒」役は、1位:福田のり子(16,537票)、2位:北沢志保(15,721票)で816票差。
  • 「幼なじみ」役は、1位:所恵美(24,843票)、2位:佐竹美奈子(24,227票)で616票差。
  • 「転校生」役は、1位:島原エレナ(14,765票)、2位:篠宮可憐(14,373票)で392票差。
  • 「霊」役は、1位:北上麗花(21,231票)、2位:高山紗代子(21,027票)で204票差。
  • 「四天王」役は、1位:松田亜利沙(18,947票)、2位:横山奈緒(18,872票)で75票差。

競っていると伸びるのか

まずは、役ごとの最大得票数の推移を見てみましょう。

f:id:AOI-CAT:20160424212808p:plain

最大得票数が多い役は、上記の得票差が少なく競っている役が多いです。 逆にトップが固まりつつある役は、最大得票数も落ち着いている傾向があります。 f:id:AOI-CAT:20160424212854p:plain

なお、「部長」「お嬢」も2位が追いすがっているのか、2位が逆転されたかつてトップだったのか、最大得票数が多いです。

アイドル別最大得票数

各アイドルが獲得した最大の投票数を並べてみました。 f:id:AOI-CAT:20160424213457p:plain

得票数が少ないアイドルについては、忸怩たる思いのPもいらっしゃるでしょうが、「今回は合う役が無いから、次回に向けてどんな役がいいか」など前向きに話している姿を見かけるなどして、かなり担当毎に傾向が違うようです*3

今後の推移が楽しみですね。(私の投票行動は秘密です)

データ取得環境など

Elasticsearch 2.2.0 + Kibana 4.4.2

mapping

最初はnestedなデータ構造でindexを作成しましたが、Kibanaはnestedなデータを扱えないので、下のような構造にしました。

// nestedなmapping
{"mappings": {
    "voting": {
        "properties": {
            "ranking": {
                "properties": {
                    "vote": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "rank": {
                        "type": "integer"
                    }
                },
                "type": "nested"
            },
            "dateTime": {
                "format": "yyyy-MM-dd'T'HH:mm",
                "type": "date"
            },
            "role": {
                "type": "string",
                "index": "not_analyzed"
            },
            "id": {
                "index": "not_analyzed",
                "type": "string"
            }
        }
    }
}}
//今回使ったもの
{"mappings": {
    "voting": {
        "properties": {
            "rank": {
                "type": "integer"
            },
            "dateTime": {
                "format": "yyyy-MM-dd'T'HH:mm:ss",
                "type": "date"
            },
            "vote": {
                "type": "integer"
            },
            "name": {
                "index": "not_analyzed",
                "type": "string"
            },
            "role": {
                "index": "not_analyzed",
                "type": "string"
            }
        }
    }
}}
curl -s XPUT myserver:9200/index_name -d @/path/to/mapping.js

Twitter Webページから取れる時間書式は悪夢だったので、data-timeというunix time値を取得しました。

なお、指定できるフォーマットはhttp://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.htmlを参照。日付と時刻の区切り文字'T'を指定するのにカンマを忘れて詰まりました。

JSONデータ

{ "dateTime": "2016-04-18T23:14:14", "role": "お嬢", "rank": 1, "name": "周防桃子", "vote": 447}
{ "dateTime": "2016-04-18T23:14:14", "role": "お嬢", "rank": 2, "name": "二階堂千鶴", "vote": 320}

*1:ひとり最大100枚獲得できる

*2:このネットワーク越しの対人戦感覚を「これぞアイマス」と感じている人もいらっしゃるとか。

*3:担当アイドルに似る、特に志保Pは志保さんに似ている気がします