すのふら

すのふら

日々の備忘録

ラジカツスターズ!のコーナーの未来を予測する

f:id:snofra:20170415025404p:plain

このタイトルだとあまりにも壮大な感じ。
アイカツスターズ!』のラジオ『ラジカツスターズ!』のコーナー「私達、AIKATSU☆STARS!です!!スターズ!!!」で正解数が50になるのは何回目の放送か予測する。

「私達、AIKATSU☆STARS!です!!スターズ!!!」というコーナーは、ひとつに質問に対して回答を合わせるという趣旨のもの。

正解数は積み上がっていって、目標値まで到達するとご褒美ゲットの仕組み。目標値は非公開なので何問正解したらいいのかは分からない。

ご褒美は1回ゲットしていて、そのときは30問正解だった。
ご褒美はラジオのテーマソング「ラン・ラン・ドゥ・ラン・ラン! ~NEXT LAP~」が制作決定だったので、次はライブとかですかね?

前回30問だったので、次回は大体50問正解くらいなんじゃないかなーと思っているので、50回到達するのに放送何回目になるのかと思ったのが最初。


50回正解するならどのくらいだろと考えてみたとして、このコーナー1回での質問数は大体3~4問くらい

放送1回につきパーソナリティは2名のローテーションなので、3問全部答えられるなら17回目くらい。

ただそんなことはありえないかなーと思うので、バッファで1.5掛けて25回目くらいで50問正解余裕だろ。

というざっくり見積もり。
それが意外にあってるんだが、折角なのでちゃんと分析してみる。


条件

  • 計算対象の回は放送30回目~56回目とする
  • コーナーがお休みの場合は0でカウント
  • 欠損している50回目は0でカウントする(誤差程度しか変わらないので大丈夫。きっと)
  • 放送54回目は1問正解だが、ボーナス3ポイントなので3でカウント

なぜ放送30回目からかというと、放送29回目で30ポイント貯まってご褒美ゲット。
再スタートしているからです。


結果から言うと

50問正解は79回目で迎えられるみたい。

1回放送につき1問正解のペース。遅い。
2017/06/05現在で61回目放送なので、あと18回、あと5ヶ月くらいかかる計算。先長すぎ問題


50問正解時の放送回数を算出

算出するにあたって回帰分析(線形回帰)を使用。分からなくてもスルーでOK。俺も正直細かく知らねえっす。

正解数からグラフを作ってみる。縦が正解数の合計(積み上げた値)で横が放送回数。

f:id:snofra:20170605144908p:plain

このグラフを元に50回目を予測するんだけど、このグラフって中学生の時に見たヤツ。
「y=ax+b」のグラフですわな。

manapedia.jp


縦が正解数の合計(y)で、横が放送回数(x)なので、
aとbが分かれば計算可能だよねってことで計算するんだけど、自力でやるには俺の学が足らなすぎるのでpythonにお願いする。


ここからもうちょっと細かい話になってしまうので結論から言うと、

y = 1.3723076923076918x -42.621538461538449

これがこのグラフの計算式。
正解数50回目だから、50 = 1.3723076923076918x - 42.621538461538449で計算して「79.05651604」。

大体79回目で50問正解するという推測。


全体を通して100問正解するのは

放送1回目~56回目とするとグラフはこんな感じ。
50問正解はしているので、100問正解するのはいつだろっていうのを見てみると

f:id:snofra:20170605145352p:plain

こんな感じ。

でもって、傾きを算出すると

y = 1.1511619958988382x -3.8616883116883187

こんな感じ。

これを使って計算すると90.7304351573なので、大体90回目には100問正解する予定。(達成するとは言っていない)


もうちょっと細かく

回帰分析で算出するにあたってaとb、つまり相関係数を知りたい。
ついでにそもそも、縦が正解数の合計で、横が放送回数って関係してんの?ってのを出す。

pythonに線形回帰のライブラリがあるので、それを使ってさくっと出してみる。

f:id:snofra:20170605145748p:plain


パッと見まったくもって意味わからないところもあるんだけど、coefってのが相関係数で、それをみると「1.3723」と「-42.6215」となってるので、それがaとbなんだなあと。

次にそもそも縦が正解数の合計で、横が放送回数って関係してんの?ってところだけど、決定係数を見ればわかる。
R-squaredって書いているところが「0.981」で1に近いほど正確なので正しいといえる。
まあ回数重ねれば正解数が積み上がるので、当たり前だろ!って話ではある。


算出に使用したデータ

f:id:snofra:20170605150319p:plain

f:id:snofra:20170605150327p:plain


以下pythonコード。


pythonコード

メモとして

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
%pylab inline --no-import-all
 
#csvファイルのロード
df = pd.read_csv('C:/xxx/yyy.csv')
 
#放送日と30回放送以降のデータを取得
crr_rst=df[df['correct_reset_all'] == True].correct_reset
on_air=df[df['correct_reset_all'] == True].on_air
 
#線形回帰
#X軸に切片を付けるためにadd_constantを設定。これがないと切片でない
mod = sm.OLS(crr_rst, sm.add_constant(on_air))
res = mod.fit()
 
#線形回帰の結果を出力
print(res.summary())
 
#相関係数を取得
a, b= res.params
 
#y=ax+bの計算する(グラフ式のと記号逆転)
y=50
print(y / b -a)
 
#グラフのプロット
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
plt.tick_params(labelsize=18)
plt.plot(on_air, crr_rst, marker='o', color='lightblue', ms=18)
plt.plot(on_air, a+b*on_air, lw=10, alpha=0.5, ls='-', color='blue')
plt.savefig('rajikatsu1.png')
 
 
#おまけ
#放送日と全放送回以降のデータを取得
crr_rst_all=df.correct_all_sum
on_air_all=df.on_air
 
#線形回帰してグラフのプロットまで
mod = sm.OLS(crr_rst_all, sm.add_constant(on_air_all))
res = mod.fit()
a, b= res.params
plt.figure(figsize=(20, 10), dpi=100, linewidth = 100)
plt.tick_params(labelsize=18)
plt.plot(on_air_all, crr_rst_all, marker='o', color='lightblue', ms=18)
plt.plot(on_air_all, a+b*on_air_all, lw=10, alpha=0.5, ls='-', color='blue')
plt.savefig('rajikatsu2.png')
 
#y=ax+bの計算する
y=100
print(y / b -a)

参考

Pyplot tutorial — Matplotlib 2.0.2 documentation
Linear Regression — statsmodels 0.9.0 documentation
statsmodels.regression.linear_model.OLS — statsmodels v0.10.0.dev0+868.g14fb572ce documentation
 
statsmodels で線形回帰 - Qiita
statsmodelsで多次元とか多項式の最小二乗法 | mwSoft
 
単回帰出力結果の読み方 - hnami.net_Pukiwiki
決定係数 (R-squared) - MATLAB & Simulink - MathWorks 日本