そこのブログ

そこのオタクのブログ

「積み」の効果を統計的に検証する

この記事は eeic Advent Calendar 2017 その2 の22日目の記事です。

qiita.com

こんにちは、eeic2017のそこのオタクです。この冬学期に、学科の実験でデータの解析・可視化について勉強したので、実際に自分の興味のあるデータを使ってちょっとした分析をしてみました。

はじめに

  • 「CDやBlu-rayに1つ付いてくるシリアルコードを打ち込むと、ライブに1口応募できる」
  • 「チケットの当選確率を上げるために、そのCDやBlu-rayをたくさん買おう」

…という経験は、声優やアイドルのファンにとっては身近なものではないでしょうか。

「当選確率を上げるために同じ商品をたくさん買うこと」をネットスラングとして「積む」と表現することがありますが、積むことでどの程度当選確率が上がるのかという点については、公演の主催者側からは公表されることはなく、そのメカニズムはブラックボックスになっています(当たり前ですが)。

CDやBlu-rayは決して安い買い物ではないので、それらを積むことに効果があったかどうかはオタクにとっては死活問題になってきます。

そこで今回、積むという行為に効果があるかどうかを検証するために、アンケートを行いその結果を統計的に分析することを思いつきました。

本記事では、今年夏に開催された『ラブライブ!サンシャイン!! Aqours 2nd LIVEツアー』のBlu-ray最速先行を対象に、私が独自に実施したアンケートの結果をPythonで統計的に分析していきます。

TL;DR

要点を2点にまとめると、Aqours 2nd LIVEツアーのBD最速先行では

  • 積みの効果はないとは言えないが限定的で、積んだ枚数の分だけくじが引ける、という仕組みではない
  • 名古屋or神戸が当たると埼玉は当たりにくい

…といったことが言えそう、という結果となりました。

アンケートの実施

今回のアンケートの対象となった、Aqours 2nd LIVEツアー BD最速先行のルールについて整理します。

  1. ラブライブ!サンシャイン!!TVアニメ1期のBlu-ray第5,6,7巻にシリアルコードがついてくる
  2. それぞれのシリアルコードは、2ndツアー名古屋(5巻)・神戸(6巻)・埼玉(7巻)の各公演(それぞれ2daysの公演でした)の両日に1口ずつ応募できる

上記のルールを踏まえ、以下の質問項目を設定しました。

  • e+アカウントへの登録住所の都道府県(任意)
  • 3会場全6公演のシリアルの積み枚数
  • 3会場全6公演のチケットの当選枚数

アンケートの実施にあたっては、Google フォームを利用し、Twitterで回答を求めました (回答期間は既に終了しました。ご回答ありがとうございました)。

データの概要

アンケートの結果、630件の回答をいただきました。まずはこのデータから、回答ミスと思われる回答*1を除外しました。

整形後のデータの概要は以下の通りです。

会場 応募数 (a) 当選数 (b) 当選確率
(b / a)
倍率
(a / b)
キャパ
名古屋 430件 147件 0.34 2.92倍 10,000人*2
神戸 377件 84件 0.22 4.49倍 8,000人*3
埼玉 514件 477件 0.93 1.08倍 33,556人*4

各会場のキャパも一緒に記載しました。これらをグラフにまとめると、各会場のキャパと当選確率には比例関係があることが分かりました。

f:id:soko-no-otaku:20171222234701p:plain

会場ごとの抽選結果の独立性の検定

データの概要は把握できたのですが、1回答には13変数もあり、次に何から手を着けていいか分かりませんでした。 そこで、問題を適当に分割するために以下の仮説を立てました。

  • 【仮説】名古屋・神戸・埼玉の各会場ごとの抽選結果は、他の会場の抽選結果に影響を与えない

仮説を検証するためにカイ2乗検定を使用しました。カイ2乗検定は変数同士の独立性を判定することができます。具体的なプロセスは以下の通りです。

  1. アンケートの回答を各会場ごとの当落でグループ分けする
  2. 各グループに属する回答の数を集計した表(クロス集計表)を作る
  3. クロス集計表からp値を計算する
  4. p値から会場同士の抽選結果の独立性を判定する

p値はその表の回答の偏りが偶然に起こる確率を表しているので、有意水準を5%として p < 0.05 になると、その回答の偏りが偶然ではないのではないか、つまり、各会場ごとの抽選結果が互いに何らかの影響を受けているのではないか、と言えることになります。

Pythonの科学技術計算用ライブラリSciPyには、クロス集計表からカイ2乗検定をしてくれる関数 scipy.stats.chi2_contingency があって、簡単にカイ2乗検定を行うことができます。今回はこちらを使用しました。

名古屋・神戸・埼玉公演のうち2つの組み合わせについて、それぞれ両方の会場に申込のある回答を対象にして、合計3セットのカイ2乗検定を行いました。*5

名古屋 × 神戸

クロス集計表は以下の通りです。

名古屋・当選 名古屋・落選
神戸・当選 24 60 84
神戸・落選 123 274 397
147 334 481

この表から計算すると、p=0.76となります。独立性があると言えそうです。

神戸 × 埼玉

クロス集計表は以下の通りです。

神戸・当選 神戸・落選
埼玉・当選 64 413 477
埼玉・落選 20 75 95
84 488 572

この表から計算すると、p=0.078となります。有意水準5%とした場合ギリギリ独立性がないとは言えなさそうです。この調子で埼玉×名古屋間の抽選結果にも独立性があることが分かれば、その後の検証が楽になりそうです。

埼玉 × 名古屋

クロス集計表は以下の通りです。

埼玉・当選 埼玉・落選
名古屋・当選 104 43 147
名古屋・落選 373 61 434
477 104 581

この表から計算すると、p=0.000056となります。 この値から、埼玉公演の抽選結果と名古屋公演の抽選結果は独立でないということが言えます。

…ということで、名古屋公演と神戸公演の抽選結果の間には特に関係はなさそうですが、埼玉公演と名古屋公演(もしかしたら神戸公演と埼玉公演も?)の抽選結果の間には何かしらの関係があることが分かりました。

実際クロス集計表を見ると、埼玉が当選すると名古屋or神戸が当たりにくいという傾向がある気がします。ここでは変数同士の関係性を見たかったので、今回はこの件についてはこれ以上掘り下げないことにします。

「積み」は有意差を生むか

会場ごとの抽選結果の関係が分かったところで、本題である「積み」行為の有効性を検証していきます。

以下のグラフは、横軸に積んだ枚数*6、縦軸に当選確率*7をプロットしたものです。

f:id:soko-no-otaku:20171221072935p:plain

…いかがでしょうか?

積み枚数を増やすと名古屋公演と埼玉公演に関しては確率が少しは増えている気がします。しかしこれが偶然によるものなのか、それとも積んだことによる効果なのかははっきりとはしていません。神戸公演に至っては積み枚数が増えるにつれて当選確率が下がっているように見えます。

そこで、積んだことの効果の有無を検証するために二項検定を使用しました。二項検定は、当たりか外れかのような2つに分類されるデータの比率が、理論的な予想と比べて有意に偏っているかどうかを判定できます。具体的なプロセスは以下の通りです。

  1. 「1枚だけ積んだグループ」の平均当選確率と、「2枚以上積んだグループ」の回答数・当選数からp値を計算する
  2. p値から両グループ間で当選確率に有意な差があるか判定する

p値はカイ2乗検定の時と同じような意味を持っていて、その回答数と当選数の比率が偶然に起こる確率を表しています。 有意水準を5%として p < 0.05 になると、「積み」に何らかの効果があった、ということになります。

結果は以下の表です。

名古屋 神戸 埼玉
p値 0.020 0.36 0.00072

この結果からは、少なくとも名古屋公演と埼玉公演に関しては、積みに何らかの効果があったと言えそうです。 神戸公演についても、積みに効果がなかったとは言い切れません。

ただし、仮に積むという行為に何かしらの効果があったとしても、このグラフを見る限りでは、積んだ枚数の分だけくじが引ける、という仕組みではないことは言えそうです。

「地域補正」について

(後日追記します)

まとめ

以上の知見をまとめると、

  • 各会場のキャパとチケットの当選確率との間には、おおよそ比例関係がある
  • 名古屋公演(or神戸公演)が当たると埼玉公演は当たりにくいという関係がある
  • 「積む」という行為に全く効果がないとは言えないが、積んだ枚数の分だけくじが引ける、というほどの効果があるわけではない

ということが言えそうでした。

感想・反省

今回分析をしてみて、自分の想像よりもはるかに「積み」の効果は少ないんだ、ということに驚きました。各会場のキャパとチケットの当選確率との間に比例関係があるということも面白いな〜と思いました。

大学の数理手法の授業などで何となく聞き流していた統計的な検定手法が、実際に自分に関わってきそうなデータを解析することに使うとなると、興味を持って勉強できてよかったです。ほとんど触ったことのなかったPythonのツールに少しでも慣れることができたのもよかったです(jupyter notebookは神)。

自分の不勉強のせいもあって、分析の各段階で恣意的なことをしていたり、データを無駄にしてしまったような気がするのが反省点です(例えば、積み枚数と当選確率のグラフは、各公演片方の日にしか申込のない回答を考慮できていません)。 もしまたこのような分析をすることがあったとしたら、もっと慎重に分析したいと思います。

分析に使用したデータ・スクリプトはこちらのGitHubレポジトリに置いています。 アンケートに協力していただいたみなさん、誠にありがとうございました。 そして、アンケートの実施方法の相談から記事の校正まで、全面的に協力してくださったeeic2015のことえりさん、ありがとうございました。また今度台湾まぜそば食べに行きたいです。

参考文献

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

*1:「申込していない会場に当選した」という回答と、「1アカウントで3枚以上当選した」という回答。後者はあり得ないことはないですが、全体で3件しかなかったことと、Twitter等を調べてもそのような報告はほぼなかったことからの判断です。

*2:日本ガイシ スポーツプラザ [施設案内/施設概要]

*3:施設概要 | 施設案内 | ワールド記念ホール(主催者様)

*4:メットライフドーム概要|埼玉西武ライオンズ

*5:3×3のクロス集計表を作って独立性の検定をやれば一度に終わるはずなんですが、その場合3会場全てに申込のある回答だけを対象にしなければならず、使える回答数が少なくなってしまうので、2会場ごとに検定するという形をとりました。

*6:条件を統一するため、両日に同数積んだ回答だけを対象にしています。例えば両日2枚ずつなら2とカウントします。

*7:(n枚積んだという回答のうち、1枚でも当選したという回答の数)÷(n枚積んだという回答の総数)