過去2.5回は過去の総選挙結果をWebスクレイピングにより取得し、あわせて第7回の選挙結果については最小二乗法を用い、上位50名の推定獲得票数を算出した。
今回は過去7回全ての選挙結果に対し推定獲得票数を算出し、簡単な分析をしていきたいと思う。
#####過去作
- 三村かな子をシンデレラガールにするためのデータ戦略(1) ーデータの準備ー
- 三村かな子をシンデレラガールにするためのデータ戦略(2) ー三村の現在地と全体概要の把握ー
- 三村かな子をシンデレラガールにするためのデータ戦略(2.5) ー全総選挙データの取り込みー
第1回から第7回の推定獲得票集の算出
前提条件として以下の条件を設定する。
- 推定獲得票数は獲得票数が判明しているアイドルの選挙結果より最小二乗法で算出する
- ランク圏外のアイドルについては一律51位(第1回のみ31位)とする。
- ランク圏外の総得票数からランク圏内のアイドルの票数を弾いたものを一律分配する。
これらの前提のもと、第1回から第7回までの全アイドルの各得票数を算出した。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
# おまじない
plt.rcParams["font.family"] = "TakaoPGothic"
plt.style.use('ggplot')
elections = [pd.read_csv('data/election{}.csv'.format(i)) for i in range(1,8)]
master_df = pd.read_csv('data/mobamasdata.csv').rename(columns={'Unnamed: 0':'type','名前':'name'}).set_index('name')
for i,df in enumerate(elections):
v = 'votes_{}th'.format(i+1)
r = 'rank_{}th'.format(i+1)
df[v] = df['votes']
df[r] = df['rank']
df['name'] = df['name'].str.strip()
# マスターdfに結合する
df = df.set_index('name')
master_df = pd.concat([master_df,df[[v,r]]],axis=1)
# 獲得票数の推測値を求める
master_df['log_votes'] = master_df[v].astype(float).map(lambda x : math.log(x))
master_df['log_rank'] = master_df[r].astype(float).map(lambda x : math.log(x))
temp_df = master_df.dropna(subset=['log_votes']).copy()
X = temp_df['log_rank']
Y = temp_df['log_votes']
A = np.array([X,np.ones(len(X))])
A = A.T
a,b = np.linalg.lstsq(A,Y)[0]
master_df['pred_votes'] =master_df['log_rank'].map(lambda x: math.exp(a*x+b))
# votesが欠損の場合のみpred_voteの値を代入する
master_df.loc[master_df[v].isnull(),v] = master_df['pred_votes']
# 圏外の順位を入れる(第1回のみ31位、以降は51位)
kengai = 51 if i >= 1 else 31
master_df[r] = master_df[r].fillna(kengai)
# 圏外の票数を割り当てる((想定総得票数-ランク圏内総得票数)/ランク圏外アイドル数)
kengai_total_votes = master_df['pred_votes'].sum() - master_df['pred_votes'][:kengai].sum()
kengai_ave_votes = kengai_total_votes/(master_df.shape[0]-(kengai-1))
master_df[v] = master_df[v].fillna(kengai_ave_votes)
master_df.drop(['log_votes','log_rank','pred_votes'],inplace=True,axis=1)
次に、出来上がったデータフレームから獲得票数のみを抽出した別テーブルを作る
#投票結果のDataFrameを作成する
v_df = master_df.loc[:, master_df.columns.str.contains('votes_')]
今回はこのテーブルを使って、三村かな子の得票数の推移を見ていこうと思う。
三村かな子の得票数の推移
ではまず、三村の過去7回の総選挙における想定獲得票数の推移をグラフ化してみる。
plt.plot(v_df.loc['三村かな子'].astype(int),color='#f4abb4')
plt.title('三村かな子')
こう見ると、三村は順調に獲得票数を伸ばしており人気がでてきているように見える。
ただし、これにはからくりがある。
第5回は投票券の発行の仕組みに変更により、第7回はアイドルマスターシンデレラガールズスターライトステージからも投票できるようになったことにより、全体の票数自体がが大きく伸びているのである。
実際に、推定総票数の推移についてプロットしたものがコチラである。
plt.plot(v_df.sum(),label=idol)
plt.title('総合')
このようにかなり近い推移をしているのがわかるだろう。
獲得票数の変化率
では、これらを同一の視点で見るためにそれぞれの変化率をプロットしてみる。
plt.plot(v_df.loc['三村かな子'].astype(int).pct_change(),label='三村かな子',color='#f4abb4')
plt.plot(v_df.sum().pct_change(),label='総合', linewidth = 2.0, color='gray',linestyle='dashed')
plt.title('変化率 三村かな子/総合')
plt.legend()
傾きの小さいランク内下位をキープしているので当然かもしれないが、ほぼ一致していると行ってもいいのではないだろうか。
三村はもしかするとみんなにそれなりに愛されるアイドルなのかもしれない。
さて、実は三村の友人の緒方智絵里ちゃんも結構似た動きをしているので紹介したい。
plt.plot(v_df.loc['三村かな子'].astype(int).pct_change(),label='三村かな子',color='#f4abb4')
plt.plot(v_df.loc['緒方智絵里'].astype(int).pct_change(),label='緒方智絵里',color='#69b64c')
plt.plot(v_df.sum().pct_change(),label='総合', linewidth = 2.0, color='gray',linestyle='dashed')
plt.title('変化率 三村かな子/緒方智絵里')
plt.legend()
二名とも総票数の変化率とかなり近い推移を示しており非常に仲が良い。
では他のアイドルではどうか。他のシンデレラプロジェクトのCuメンバーと、佐久間まゆ、輿水幸子、小日向美穂の3名の変化率の推移と比較してみたい。
plt.plot(v_df.loc['島村卯月'].astype(int).pct_change(),label='島村卯月',color='#ec7092')
plt.plot(v_df.loc['双葉杏'].astype(int).pct_change(),label='双葉杏',color='#f19db4')
plt.plot(v_df.loc['前川みく'].astype(int).pct_change(),label='前川みく',color='#ca113a')
plt.plot(v_df.sum().pct_change(),label='総合', linewidth = 2.0, color='gray',linestyle='dashed')
plt.title('変化率 島村卯月/双葉杏/前川みく')
plt.legend()
かなりバラバラとしている印象を受ける。
やはり彼女たちはトップランカーになる能力があるように見えるし、それが原因で浮き沈みが激しいようにも見える。
plt.plot(v_df.loc['佐久間まゆ'].astype(int).pct_change(),label='佐久間まゆ',color='#d1197b')
plt.plot(v_df.loc['輿水幸子'].astype(int).pct_change(),label='輿水幸子',color='#ccaacf')
plt.plot(v_df.loc['小日向美穂'].astype(int).pct_change(),label='小日向美穂',color='#c64796')
plt.plot(v_df.sum().pct_change(),label='総合', linewidth = 2.0, color='gray',linestyle='dashed')
plt.title('変化率 佐久間まゆ/輿水幸子/小日向美穂')
plt.ylim(-1,7)
plt.legend()
こちらはより顕著である。というよりも、第2回が異常にぶれている。特に、輿水幸子は第1回から第2回の得票数が、約10倍に増え、佐久間まゆに至っては、大きくはみ出しているが40倍に増えている。恐ろしい限りである。
ユニット別獲得票数の推移
さて、こうなってくるとどの選挙においても過剰人気せずかと行って不当に下がりもしない三村の票数は非常に理想的と言えるかもしれない。既に現時点であえてシンデレラガールになる必要もないのではないかとも考えている。
ただデレステからも投票できるようになった第7回の総選挙における変化から、何かしらのヒントを掴みたいのも事実である。
なので今回はユニット毎の獲得票数の推移をプロットすることにより何かヒントを見つけたいと思う。
シンデレラプロジェクトユニットごとの獲得票数の推移
そこで取り敢えず、アニメ「アイドルマスターシンデレラガールズ」でメインヒロインとなったシンデレラプロジェクトのユニットごとの各得票数をプロットしてみた。
units={'new generations':['島村卯月','渋谷凛','本田未央'],
'CANDY ISLAND':['双葉杏','三村かな子','緒方智絵里'],
'凸レーション':['諸星きらり','城ヶ崎莉嘉','赤城みりあ'],
'Rosenburg Engel':['神崎蘭子'],
'LOVE LAIKA':['アナスタシア','新田美波'],
'*':['多田李衣菜','前川みく']}
fig = plt.figure(figsize=(16,8))
for i, (unit, idols) in enumerate(units.items()):
plt.subplot(2,3,i+1)
plt.ylim(0,2e6)
plt.title(unit)
for idol in idols:
plt.plot(v_df.loc[idol].astype(int),label=idol)
plt.legend()
plt.tight_layout()
こうしてみると意外とCANDY ISLANDが人気ユニット(厳密には個人人気がある)であるということがわかる。
ただその中で、三村の票数の伸びが他のユニットも含め他としてもかなり低い原因がわからない。
STARLIGHT MASTERユニットごとの獲得票数の推移
では切り口を変えてみるとどうだろうか。
デレステの影響を考えるため、デレステオリジナルのSTARLIGHT MASTERシリーズの5人組ユニットごとに、得票数の推移を出してみる。
units={'Snow Wings':['島村卯月','渋谷凛','本田未央','大槻唯','上条春菜',],
'LiPPS':['速水奏','塩見周子','城ヶ崎美嘉','宮本フレデリカ','一ノ瀬志希',],
'L.M.B.G':['佐々木千枝','櫻井桃華','市原仁奈','龍崎薫','赤城みりあ',],
'アインフェリア':['新田美波','鷺沢文香','橘ありす','相葉夕美','高森藍子',],
'炎陣':['向井拓海','藤本里奈','木村夏樹','松永涼','大和亜季',],
'Masque:Rade':['北条加蓮','佐久間まゆ','小日向美穂','緒方智絵里','多田李衣菜',],
'サマプリ':['川島瑞樹','日野茜','堀裕子','上田鈴帆','難波笑美',],
'宵乙女':['高垣楓','佐藤心','三船美優','安部菜々','片桐早苗',],
'Sweetches':['三村かな子','十時愛梨','森久保乃々','椎名法子','及川雫',],
'春霞':['依田芳乃','小早川紗枝','道明寺歌鈴','浜口あやめ','脇山珠美',],
'NEX-US':['アナスタシア','神谷奈緒','中野有香','前川みく','星輝子',],
'Love Yell':['五十嵐響子','乙倉悠貴','水本ゆかり','諸星きらり','姫川友紀',],
'LittlePOPS':['双葉杏','城ヶ崎莉嘉','二宮飛鳥','白坂小梅','早坂美玲',],}
fig = plt.figure(figsize=(17,10))
for i, (unit, idols) in enumerate(units.items()):
plt.subplot(4,4,i+1)
plt.ylim(0,2e6)
plt.title(unit)
for idol in idols:
plt.plot(v_df.loc[idol].astype(int),label=idol)
plt.legend()
plt.tight_layout()
これを見る限りユニットに大きくばらつきがあるように見える。特にLippsやアインフェリア、Masque:Radeなどは(もともと人気が高いメンバーで構成されている可能性はあるものの)全体的に票数を伸ばしている。
少なくとも、デレステでの曲の人気が影響ないとは言えないだろう。
##好きなMVトップテン歌唱ユニットの得票数の推移
ではさらに、6周年アンケートより、「好きなMVのでレステ曲」トップ10を歌唱しているユニットごとの各得票数を見てみよう。
units={'Yes! Party Time!!':['島村卯月','渋谷凛','本田未央','安部菜々','赤城みりあ',],
'ラブレター':['島村卯月','小日向美穂','五十嵐響子',],
'イリュージョニスタ!':['本田未央','佐久間まゆ','鷺沢文香','輿水幸子','新田美波',],
'Kawaii make MY day!':['中野有香','水本ゆかり','椎名法子',],
'こいかぜ':['高垣楓',],
'Tulip':['速水奏','塩見周子','城ヶ崎美嘉','宮本フレデリカ','一ノ瀬志希',],
'Love∞Destiny':['北条加蓮','佐久間まゆ','小日向美穂','緒方智絵里','多田李衣菜',],
'∀NSWER':['早坂美玲','森久保乃々','星輝子',],
'双翼の独奏歌':['神崎蘭子','二宮飛鳥',],
'三村かな子':['三村かな子',],}
fig = plt.figure(figsize=(17,10))
for i, (unit, idols) in enumerate(units.items()):
plt.subplot(4,4,i+1)
plt.ylim(0,2e6)
plt.title(unit)
for idol in idols:
plt.plot(v_df.loc[idol].astype(int),label=idol)
plt.legend()
plt.tight_layout()
こちらも卵が先か鶏が先かという問題はあるものの、シンデレラプロジェクトでの比較より全体的によく伸びているように見える。
この結果だけを元にデレステの影響力と結論付けるのは乱暴だが、それなりに影響があるのは確実だろう。
#次回に向けて
次回は、今回作成したデータをさらに深堀してもいいと思っているし、別のことをしてみてもいいかもしれないと考えている。
いま興味があるのは、ユニットやカップリングなどでは測れないアイドル同士の関係性なので、そちらも一度分析してみたい。