背景
- スポーツくじは、日本スポーツ振興センター(JAPAN SPORT COUNCIL)が運営する業務の一つで、「スポーツ振興」のための資金を得るために販売しています。日本スポーツ振興センター:スポーツ振興投票等業務
- スポーツくじで最高当選金6億円の「BIG」を超える「MEGA BIG」が今月から発売されます。
- 「BIG」は勝ち・分け・負けで14試合が対象で「MEGA BIG」はスコア合計で1点以下・2点・3点・4点以上で12試合が対象となります。
種別 | 対象試合 | 投票種類 | 確率 | % |
---|---|---|---|---|
BIG | 14 | 1,0,2 | 1/4,782,969 | 0.00000020907 |
MEGA BIG | 12 | 1,2,3,4 | 1/16,777,216 | 0.0000000596 |
- 絶望的な「BIG」を超えて、形容する言葉すらない「MEGA BIG」です。
本題
- Jリーグの試合では、スコア合計はどんな分布になっているだろうか?
- J3リーグが始まった2014年から2019年までの6年間で6,130試合を対象にした。
- 内訳は、J1:1,836試合、J2:2,772試合、J3:1,522試合です。
処理の流れ
- 2014年から2019年までJleague Data Siteの日程・結果ページからデータを取得する
- 1)で取得したCSVファイルを読み込み
DataFrame
を作成する。 - さらにJ1・J2・J3のみの
DataFrame
を別途作成する。 -
matplotlib
で4つのグラフを作成する。 - 「スコア合計」を「MEGA BIG」の1点以下・2点・3点・4点以上に集計する。
- その集計結果をグラフにする。
コード
①2014年から2019年までJleague Data Siteの日程・結果ページからデータを取得する
年度 | 大会 | 節 | 試合日 | K/O時刻 | ホーム | スコア | アウェイ | スタジアム | 入場者 | TV放送 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014 | J1 | 第1節第1日 | 03/01(土) | 14:04 | C大阪 | 0-1 | 広島 | ヤンマー | 37079 | スカパー!/スカパー!プレミアムサービス/NHK総合 |
1 | 2014 | J1 | 第1節第1日 | 03/01(土) | 14:04 | 名古屋 | 2-3 | 清水 | 豊田ス | 21657 | スカパー!/スカパー!プレミアムサービス/NHK名古屋/NHK静岡 |
2 | 2014 | J1 | 第1節第1日 | 03/01(土) | 14:05 | 鳥栖 | 5-0 | 徳島 | ベアスタ | 14296 | スカパー!/スカパー!プレミアムサービス/NHK徳島/NHK佐賀 |
3 | 2014 | J1 | 第1節第1日 | 03/01(土) | 14:05 | 甲府 | 0-4 | 鹿島 | 国立 | 13809 | スカパー!/スカパー!プレミアムサービス/NHK甲府/NHK水戸 |
4 | 2014 | J1 | 第1節第1日 | 03/01(土) | 14:05 | 仙台 | 1-2 | 新潟 | ユアスタ | 15852 | スカパー!/スカパー!プレミアムサービス/NHK仙台/NHK新潟 |
② ①で取得したCSVファイルを読み込みDataFrame
を作成する。
col_name = ['年度','大会','節','試合日','K/O時刻','ホーム','スコア','アウェイ','スタジアム','入場者','TV放送']
results = pd.DataFrame(index=[], columns=col_name)
for f in files:
tmp_data = pd.read_csv(f, sep=',', encoding='utf-8')
results = results.append(tmp_data, ignore_index=True, sort=False)
③さらにJ1・J2・J3のみDataFrame
を別途作成する。
# J1・J2・J3のみデータのスコア合計
score_J1 = score_data[score_data['大会'] == 'J1']
idx_J1 = sorted(score_J1['スコア合計'].unique())
scoreJ1 = pd.DataFrame({'スコア合計':idx_J1, 'cnt':score_J1['スコア合計'].value_counts()}, index=idx_J1)
scoreJ1 = scoreJ1.reset_index().drop('index', axis=1)
score_J2 = score_data[score_data['大会'] == 'J2']
idx_J2 = sorted(score_J2['スコア合計'].unique())
scoreJ2 = pd.DataFrame({'スコア合計':idx_J2, 'cnt':score_J2['スコア合計'].value_counts()}, index=idx_J2)
scoreJ2 = scoreJ2.reset_index().drop('index', axis=1)
score_J3 = score_data[score_data['大会'] == 'J3']
idx_J3 = sorted(score_J3['スコア合計'].unique())
scoreJ3 = pd.DataFrame({'スコア合計':idx_J3, 'cnt':score_J3['スコア合計'].value_counts()}, index=idx_J3)
scoreJ3 = scoreJ3.reset_index().drop('index', axis=1)
④ matplotlib
で4つのグラフを作成する。
# J1・J2・J3・全体をグラフ化
fig = plt.figure(figsize=(16,9),dpi=144)
fig.subplots_adjust(hspace=0.4)
# オリジナルのグラフスタイル設定
plt.style.use("mystyle")
plt.rcParams["font.family"] = "IPAexGothic"
# グラフオブジェクトの格納用
axes = []
score_list = [scoreJ1['スコア合計'], scoreJ2['スコア合計'], scoreJ3['スコア合計'], score_all['スコア合計']]
cnt_list = [scoreJ1['cnt'], scoreJ2['cnt'], scoreJ3['cnt'], score_all['cnt']]
cat_list = ['J1', 'J2', 'J3', 'ALL']
# J1・J2・J3・ALLの4つのグラフをループで
for i in range(4):
axes.append(fig.add_subplot(4,1,i+1))
axes[i].bar(score_list[i], cnt_list[i])
[axes[i].text(score_list[i][s], cnt_list[i][s]+25, str(score), size=12, color='r', ha='center') for s, score in enumerate(cnt_list[i])]
axes[i].set_xticks(np.arange(0,16,1))
axes[i].set_ylabel(cat_list[i])
axes[i].set_ylim(0,1500)
axes[i].text(15-1, 1500-200, 'n:'+str(sum(cnt_list[i])))
plt.xlabel('スコア合計')
txt1 = 'Jリーグで試合のスコア合計を可視化してみた。'
fig.text(.05, .9, txt1, fontsize=32, horizontalalignment="left")
txt2 = "引用元:JLeague Data Site"
fig.text(.9, .05, txt2, fontsize=14, horizontalalignment="right")
plt.savefig('./img/score.png')
plt.show()
⑤「スコア合計」を「MEGA BIG」の1点以下・2点・3点・4点以上で「Mega」列を追加
# MEGAのスコア分類にする
def mega(df):
if df in (2, 3):
return df
elif df <= 1:
return 1
elif df >=4:
return 4
score_data['Mega'] = score_data['スコア合計'].apply(mega)
まとめ
- どのリーグでも0点・1点・2点・3点の累積で全体の約75%となる。
- 0点・1点・2点・3点・4点以上の5種類とするより、出現率を平均化して、0点と1点を1として4種類としたのではないかと思われる?(推測)
- 技術的な共有は少なく、事実の共有が中心となりました。
- グラフで複数の描画を
for
にループや内包表記
でコード量が少なくできた。 - スポーツくじは、残念ながらさらに**「見返りのない寄付」**色が強くなったという話。