ランダムおすすめ記事

ホームページ作りました

SIGNATEの 【練習問題】Jリーグの観客動員数予測をやってみたい!!①

前回までデータ分析の環境構築の話をしました。その後Udemyの講座でデータ分析の導入部分を勉強しました。 最終的にベルマーレの環境動員数を予測するなにかをweb上で公開できるといいねぇ、なんて思っていたところ、データ分析のサイトであるSAGNATEに 【練習問題】Jリーグの観客動員数予測 Sign In | SIGNATE - Data Science Competition というのがありましたのでここでいろいろ研究してみることにしました。

早速やってみよう

評価関数

・精度評価は、評価関数「RMSE(Root Mean Squared Error 平均二乗誤差)」を使用します。

・評価値は0以上の値をとり、精度が高いほど小さな値となります。

応募方法

・予測する変数は、スタジアムの入場者数です。

・応募ファイルの形式はcsv(カンマ区切り)のヘッダーなしファイルです。

・検証用データの1列目にある値をインデックスとし、2列目に予測値を記述します。

本コンペでは、2012年~2014年シーズン前半までのデータを使って、 「2014年後半戦J1,J2全試合の観客動員数を予測するモデル」 を作成していただきます。

と書いてあるのでまずは単回帰法と重回帰法を使って分析をしてみましょう。(できるといいな)

まずはpython3を選択して新規にファイルを立ち上げ。 f:id:sr2460:20190219105804p:plain ここでリネームします。 f:id:sr2460:20190219110245p:plain 確か講座では基礎分析が大事・・・と言ってた気がします。なのでまず与えられたデータをチェックしてみましょう。 f:id:sr2460:20190219111834p:plain csvを読み込むことでデータの閲覧がjupyter notebook上で可能に。

train.describe()で基礎データを読み出してみます。

count 1721.000000 1721.000000 1721.000000 mean 15045.691458 10662.395119 2012.815224 std 648.205749 8106.877159 0.757613 min 13994.000000 0.000000 2012.000000 25% 14474.000000 4750.000000 2012.000000 50% 15044.000000 8650.000000 2013.000000 75% 15528.000000 13431.000000 2013.000000 max 16237.000000 54905.000000 2014.000000

J1とJ2の全データが対象です。 下の25%が4750人で全てのデータを集計したちょうど真ん中(100個データがあったら50番目のデータという意味)の値でも8650人。 8650人って2014年のベルマーレの平均くらいでしたっけね? 上25%の一番下でも13431人なのに一番入ったのは54905人なんですね。
これって\1万3000人程度入れば上位25%の観客動員数なのにレッズが55000人くらい入れてるからレッズの動員が突出していて、お客さんがすごく入っているってことでしょうね!

平均値

train["y"].mean()

10662人

中央値

train["y"].median()

8650人

でした!

観客動員数が13431人以上の試合を見てみよう

ここで大まかなんですけれど観客動員数が上位25%。つまり13431人以上の試合を見てみましょう。 おそらくなんですけれどほとんどJ1の試合になると思うんですよね。

train[train["y"]>=13431]

431 rows × 11 columnsと出て全部は表示されませんでした。 全部表示する方法あるのかな?

train[train["y"]>=20000]

186 rows × 11 columns

僕の予想だと23000人くらいになると収容人数の関係から急に少なくなるはず。 と思ったら
148 rows × 11 columns

f:id:sr2460:20190219120931p:plain

あ~。このころまだレイソル戦とかが国立であったのとアルビレックスがまだ23000人くらい入れてたからか。
ちなみに30000人超えの試合も70試合ありました。
そりゃJ1だけで統計とったら17000~18000人くらい行くはずだわ。

ちなみに

train[train["y"]>=30000].sort_values(by="y", ascending=False)

こんな感じで叩くと30000人以上の観客動員数(yのカラムが観客動員数。ascendingは降順だが上から多い順になるので見やすい)をsortしてくれます。

f:id:sr2460:20190219122459p:plain

う~~んさすが上位はレッズしかない。

ちなみにベルマーレのaway動員力を調べたい!!とかなったら

train[train["away"]=="湘南ベルマーレ"]



多い順にソートしたいとかになったら

train[train["away"]=="湘南ベルマーレ"].sort_values(by="y", ascending=False)


になりますね!


ちなみにいろいろコマンド打ち込んでたらカマタマーレとかのデータは極端に少ない。ナンデ?
f:id:sr2460:20190219184051p:plain f:id:sr2460:20190219184054p:plain


グラフを書いてもっとわかりやすく

ベルマーレの試合の観客動員数を抜き出しています。横軸をは節数の方が分かりやすいと思いますが元のcsvに書いてない。
時系列はintergerデータじゃないのでエラーが出るかもしれないのと、そもそもx軸とy軸を自由に設定する方法が分かりませんw
f:id:sr2460:20190219155346p:plain


これはJリーグの観客動員数をヒストグラム化したもの。
10000万人を切る試合に偏っているんですね。J2の方が試合数多いですしそりゃそうか。 f:id:sr2460:20190219155350p:plain



欠損値や相関関係を見てみる

欠損値とはデータに欠損。つまりデータが入っていない状態のことです。
以下のコードでチェックできます。

train.isnull().any()





id         False
y          False
year       False
stage      False
match      False
gameday    False
time       False
home       False
away       False
stadium    False
tv         False
dtype: bool



特にないみたいです。

さてここでデータの相関関係を見てみましょう。まずダミー変数化して質的データを数値にカテゴライズしないと相関関係を導き出せないものがあります。



では相関関係をチェックしてみましょう。



trainX = pd.get_dummies(train[["home", "away"]])



trainX.corr()


あるチームがhomeゲームであるチームがawayチームの時の観客動員数の相関関係を知りたい!!
とか思ってまず上のプログラムを書いてみたんですが・・・。
f:id:sr2460:20190221164028p:plain

これは違うな。
そもそも質的データ同志の相関関係ってこの手法じゃないんじゃないのか???

ここ(教えてもらった)にも書いてるようになんか質的データ同士の手法ではない気がするwよく分からんけど。

データ尺度の違いによる相関関係を数値化する方法の種類 | 統計学が わかった!

ここも教えてもらった。

Python 3.x - 質的データの相関について|teratail


ただawayレッズのところを見てみるとJ1チームには正の相関関係が、J2チームには負の相関関係があるんですよね。
でもこれは多分それだけのデータだと思う・・・。
ちょっとやり方を変えてyを突っ込むと何か見える気がします。

trainX = pd.get_dummies(train[["y", "home"]])


trainX.corr()



f:id:sr2460:20190221170552p:plain



あっ!これはすごく分かりやすい!!!

home浦和レッズとyをチェックすると非常に強い正の相関関係がありますね。レッズがホームの場合観客動員数が増えるということが分かります。
われらが湘南ベルマーレは-0.053656。観客動員数に関しては弱い負の相関関係が見られます。
ただ、僕が見たいのってもっと細かいことで、横浜FCホームに対するアウェイベルマーレの場合強い正の相関関係があるはずじゃないですか?
逆に同じアウェイベルマーレでも大分トリニータ戦なんかは場所が遠いからほぼ相関関係は薄まるはず。
統計学って実はやったことないから(笑)こういう表現の方法で良いのか分からないんですが多分そういうことなんですよ。
これって最初のデータの取り方で工夫するかデータ自体を分けなきゃいけない気がするなあ・・・。

ちなみにawayチームで測ってみると相関関係は弱まったもののレッズはやはり観客動員数に対して正の相関がありました。

ベルマーレは負の相関関係が弱まりましたw新スタジアム出来ればお客さんが増えて正の相関関係になるはず!!!


これで基礎分析は終わり。

結論としてまず統計分析の知識がないので分析手法が分からないw
だからプログラムを知っててもどうしていいのかわからないw
ということがよく分かりましたw(これって当たり前のことじゃんw)
というわけでまず今の知識でできる分析手法でなにか作ってみる!!!
その後できれば統計分析のプログラミングをしながらデータ分析の手法や基礎知識が学べるような資料や講座を探す。


webとかアプリだとだととりあえず作りたいもの作ればいいけれどこういう分野はそうは行かないのね。
当たり前のことだけど勉強になった!

とりあえず今ある知識で何か分析してなにか作りますよ!!!