3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スポーツくじでスコア合計の新しいくじが始まるみたいだけど、

Posted at

背景

  • スポーツくじは、日本スポーツ振興センター(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試合です。

処理の流れ

  1. 2014年から2019年までJleague Data Siteの日程・結果ページからデータを取得する
  2. 1)で取得したCSVファイルを読み込みDataFrameを作成する。
  3. さらにJ1・J2・J3のみのDataFrameを別途作成する。
  4. matplotlibで4つのグラフを作成する。
  5. 「スコア合計」を「MEGA BIG」の1点以下・2点・3点・4点以上に集計する。
  6. その集計結果をグラフにする。

コード

①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()
score.png

⑤「スコア合計」を「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)

⑥その集計結果をグラフにする。
mega_plot.png

まとめ

  • どのリーグでも0点・1点・2点・3点の累積で全体の約75%となる。
  • 0点・1点・2点・3点・4点以上の5種類とするより、出現率を平均化して、0点と1点を1として4種類としたのではないかと思われる?(推測)
  • 技術的な共有は少なく、事実の共有が中心となりました。
  • グラフで複数の描画をforにループや内包表記でコード量が少なくできた。
  • スポーツくじは、残念ながらさらに**「見返りのない寄付」**色が強くなったという話。
3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?